diff --git a/AUTHORS b/AUTHORS
index 92071bd8..3489adf1 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -167,7 +167,6 @@
 Claudio DeSouza <claudiomdsjr@gmail.com>
 Clemens Fruhwirth <clemens@endorphin.org>
 Clement Scheelfeldt Skau <clementskau@gmail.com>
-Clinton Staley <clintstaley@chromium.org>
 Clinton Staley <clintstaley@gmail.com>
 Connor Pearson <cjp822@gmail.com>
 Craig Schlenter <craig.schlenter@gmail.com>
@@ -219,7 +218,6 @@
 Dominik Röttsches <dominik.rottsches@intel.com>
 Don Woodward <woodward@adobe.com>
 Donghee Na <corona10@gmail.com>
-Dongheun Kang <dongheun.kang@lge.com>
 Dongie Agnir <dongie.agnir@gmail.com>
 Dongjun Kim <djmix.kim@samsung.com>
 Dongseong Hwang <dongseong.hwang@intel.com>
@@ -282,7 +280,6 @@
 Girish Kumar M <mck.giri@samsung.com>
 Gitanshu Mehndiratta <g.mehndiratt@samsung.com>
 Giuseppe Iuculano <giuseppe@iuculano.it>
-Glenn Adams <glenn@chromium.org>
 Gnanasekar Somanathan <gnanasekar.s@samsung.com>
 Gordana Cmiljanovic <gordana.cmiljanovic@imgtec.com>
 Goutham Jagannatha <wrm364@motorola.com>
@@ -343,7 +340,6 @@
 Isaac Reilly <reillyi@amazon.com>
 Ivan Naydonov <samogot@gmail.com>
 Ivan Sham <ivansham@amazon.com>
-J. Ryan Stinnett <jryans@chromium.org>
 Jack Bates <jack@nottheoilrig.com>
 Jacob Clark <jacob.jh.clark@googlemail.com>
 Jacob Mandelson <jacob@mandelson.org>
@@ -352,7 +348,6 @@
 Jaekyeom Kim <btapiz@gmail.com>
 Jaemin Seo <jaemin86.seo@samsung.com>
 Jaeseok Yoon <yjaeseok@gmail.com>
-Jaideep Bajwa <bjaideep@ca.ibm.com>
 Jaime Soriano Pastor <jsorianopastor@gmail.com>
 Jake Helfert <jake@helfert.us>
 Jake Hendy <me@jakehendy.com>
@@ -399,7 +394,6 @@
 Jingwei Liu <kingweiliu@gmail.com>
 Jingyi Wei <wjywbs@gmail.com>
 Jinho Bang <jinho.bang@samsung.com>
-Jinkyu Seong <jinkyu.seong@lge.com>
 Jinsong Fan <fanjinsong@sogou-inc.com>
 Jinwoo Song <jinwoo7.song@samsung.com>
 Jinyoung Hur <hurims@gmail.com>
@@ -592,7 +586,6 @@
 Miran Karic <miran.karic@imgtec.com>
 Mirela Budaes <mbudaes@adobe.com>
 Mirela Budaes <mbudaes@gmail.com>
-Mitchell Rosen <mitchellwrosen@chromium.org>
 Miyoung Shin <myid.shin@samsung.com>
 Mohamed I. Hammad <ibraaaa@gmail.com>
 Mohamed Mansour <m0.interactive@gmail.com>
@@ -656,8 +649,6 @@
 Peng Hu <penghu@tencent.com>
 Peng Jiang <leiyi.jp@gmail.com>
 Peng Xinchao <pxinchao@gmail.com>
-Petar Jovanovic <petarj@mips.com>
-Peter Beverloo <peter@chromium.org>
 Peter Bright <drpizza@quiscalusmexicanus.org>
 Peter Brophy <pbrophy@adobe.com>
 Peter Collingbourne <peter@pcc.me.uk>
@@ -818,7 +809,6 @@
 Sunchang Li <johnstonli@tencent.com>
 Suneel Kota <suneel.kota@samsung.com>
 Sungguk Lim <limasdf@gmail.com>
-Sunghoon Kim <shoon.kim@lge.com>
 Sungmann Cho <sungmann.cho@gmail.com>
 Sungmann Cho <sungmann.cho@navercorp.com>
 Sunil Ratnu <sunil.ratnu@samsung.com>
@@ -882,15 +872,12 @@
 Vivek Galatage <vivek.vg@samsung.com>
 Volker Sorge <volker.sorge@gmail.com>
 Waihung Fu <fufranci@amazon.com>
-Wanchang Ryu <wanchang.ryu@lge.com>
-Wang Qing <wangqing-hf@loongson.cn>
 WenSheng He <wensheng.he@samsung.com>
 Wesley Lancel <wesleylancel@gmail.com>
 Wesley Wigham <t-weswig@microsoft.com>
 Wesley Wigham <wwigham@gmail.com>
 Will Hirsch <chromium@willhirsch.co.uk>
 Will Shackleton <w.shackleton@gmail.com>
-William Xie <william.xie@chromium.org>
 William Xie <william.xie@intel.com>
 Xiang Long <xiang.long@intel.com>
 Xiangze Zhang <xiangze.zhang@intel.com>
@@ -909,7 +896,6 @@
 Xunran Ding <xunran.ding@samsung.com>
 Xunran Ding <dingxunran@gmail.com>
 Yael Aharon <yael.aharon@intel.com>
-Yair Yogev <progame@chromium.org>
 Yan Wang <yan0422.wang@samsung.com>
 Yang Gu <yang.gu@intel.com>
 Yannic Bonenberger <contact@yannic-bonenberger.com>
@@ -931,7 +917,6 @@
 Yoonjae Cho <yoonjae.cho92@gmail.com>
 Yoshinori Sano <yoshinori.sano@gmail.com>
 Youngho Seo <hazivoo@gmail.com>
-Youngho Yoo <youngho33.yoo@lge.com>
 Youngjin Choi <cyjin9.yc@gmail.com>
 YoungKi Hong <simon.hong81@gmail.com>
 Youngmin Yoo <youngmin.yoo@samsung.com>
@@ -940,7 +925,6 @@
 Yuhong Sha <yuhong.sha@samsung.com>
 Yumikiyo Osanai <yumios.art@gmail.com>
 Yunchao He <yunchao.he@intel.com>
-Yunsik Jang <yunsik.jang@lge.com>
 Yupei Wang <perryuwang@tencent.com>
 Yura Yaroshevich <yura.yaroshevich@gmail.com>
 Yuri Gorobets <yuri.gorobets@gmail.com>
diff --git a/DEPS b/DEPS
index 7c404d9..498e858a 100644
--- a/DEPS
+++ b/DEPS
@@ -105,7 +105,7 @@
   # 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': '8af4c40014e3db976bc7da21fbc9c991d68b109b',
+  'skia_revision': 'bc6f9c9a8c6b83bc91496c28d85541855747a5da',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -117,7 +117,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'c43cdad25851a5602698fedbf1a96bf5673d69a2',
+  'angle_revision': '9b6a3f92603260e8b324fa3e0e2936f4bf5ae414',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
@@ -129,7 +129,7 @@
   # 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': '60627d6eafd025dde711e532eee6866840c04bef',
+  'pdfium_revision': '4174b5ab6ac9024acb9b42acbb61d628a2a679e3',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -165,7 +165,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'bca7d20ad76a1d8c3e594443e9100ba4999a266c',
+  'catapult_revision': '0d25dda9b148bcd2dad9e1080b1dc57eaf9d2c2a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -213,7 +213,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.
-  'spv_tools_revision': '2d9a325264e3fc81317acc0a68a098f0546c352d',
+  'spv_tools_revision': '714bf84e58abd9573488fc365707fb8f288ca73c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -552,7 +552,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '5570c88a3dce00f73a26cb5e60033f54949355d6',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '3e655b0ac271f1add5830b990b6138e23743dfa8',
       'condition': 'checkout_linux',
   },
 
@@ -577,7 +577,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'dd5051fa529e0935fe279279d39cb00cbf856c14',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '284b5e0c60ac489df16a7926207c5d255d2ca6d6',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
diff --git a/WATCHLISTS b/WATCHLISTS
index f07f6ea..e48f29c 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -855,6 +855,10 @@
                   'media/cdm/|' \
                   'third_party/widevine/cdm/'
     },
+    'explore_sites': {
+      'filepath': 'chrome/browser/android/explore_sites/|' \
+                  'chrome/android/java/src/org/chromium/chrome/browser/explore_sites/'
+    },
     'extension': {
       'filepath': 'extension',
     },
@@ -2082,6 +2086,10 @@
     'drive': ['tfarina@chromium.org'],
     'drive_resource_metadata': ['hashimoto+watch@chromium.org'],
     'eme': ['eme-reviews@chromium.org'],
+    'explore_sites': ['chili+watch@chromium.org',
+                      'dewittj+watch@chromium.org',
+                      'dimich+watch@chromium.org',
+                      'freedjm+watch@chromium.org'],
     'extension': ['chromium-apps-reviews@chromium.org',
                   'extensions-reviews@chromium.org'],
     'feature_policy': ['loonybear@chromium.org',
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index a721ac1..04db3b4 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -727,6 +727,7 @@
     "//components/metrics:gpu",
     "//components/metrics:net",
     "//components/metrics:ui",
+    "//components/minidump_uploader",
     "//components/navigation_interception",
     "//components/network_session_configurator/common",
     "//components/policy:generated",
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn
index 31fead04..c123c40 100644
--- a/android_webview/test/BUILD.gn
+++ b/android_webview/test/BUILD.gn
@@ -115,6 +115,7 @@
   deps = [
     "//android_webview:common",
     "//components/heap_profiling:test_support",
+    "//components/minidump_uploader",
   ]
   configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
   configs += [ "//build/config/android:hide_all_but_jni" ]
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 9ad989d..f8abb0f 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -68,6 +68,7 @@
     "assistant/assistant_interaction_controller.h",
     "assistant/assistant_notification_controller.h",
     "assistant/assistant_screen_context_controller.h",
+    "assistant/assistant_setup_controller.h",
     "assistant/assistant_ui_controller.h",
     "assistant/model/assistant_interaction_model.h",
     "assistant/model/assistant_interaction_model_observer.h",
@@ -734,6 +735,7 @@
     "assistant/assistant_interaction_controller.cc",
     "assistant/assistant_notification_controller.cc",
     "assistant/assistant_screen_context_controller.cc",
+    "assistant/assistant_setup_controller.cc",
     "assistant/assistant_ui_controller.cc",
     "assistant/model/assistant_interaction_model.cc",
     "assistant/model/assistant_query.cc",
@@ -1911,6 +1913,7 @@
     "wm/ash_focus_rules_unittest.cc",
     "wm/client_controlled_state_unittest.cc",
     "wm/container_finder_unittest.cc",
+    "wm/default_window_resizer_unittest.cc",
     "wm/drag_window_resizer_unittest.cc",
     "wm/fullscreen_window_finder_unittest.cc",
     "wm/gestures/overview_gesture_handler_unittest.cc",
diff --git a/ash/app_launch_unittest.cc b/ash/app_launch_unittest.cc
index 820fddd..d4101b7 100644
--- a/ash/app_launch_unittest.cc
+++ b/ash/app_launch_unittest.cc
@@ -35,16 +35,7 @@
   DISALLOW_COPY_AND_ASSIGN(AppLaunchTest);
 };
 
-#if defined(ADDRESS_SANITIZER)
-// TODO: fix. See https://crbug.com/838520
-#define MAYBE_TestQuickLaunch DISABLED_TestQuickLaunch
-#elif defined(MEMORY_SANITIZER)
-// TODO: fix. See https://crbug.com/725095
-#define MAYBE_TestQuickLaunch DISABLED_TestQuickLaunch
-#else
-#define MAYBE_TestQuickLaunch TestQuickLaunch
-#endif
-TEST_F(AppLaunchTest, MAYBE_TestQuickLaunch) {
+TEST_F(AppLaunchTest, TestQuickLaunch) {
   connector()->StartService(mojom::kServiceName);
   connector()->StartService(quick_launch::mojom::kServiceName);
 
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc
index c549ccd1..f59c912 100644
--- a/ash/app_list/views/app_list_view.cc
+++ b/ash/app_list/views/app_list_view.cc
@@ -588,6 +588,7 @@
   auto* const keyboard_controller = keyboard::KeyboardController::Get();
   if (keyboard_controller->enabled() &&
       keyboard_controller->IsKeyboardVisible()) {
+    search_box_view_->NotifyGestureEvent();
     keyboard_controller->HideKeyboardByUser();
     return;
   }
@@ -1011,6 +1012,9 @@
       break;
     case ui::ET_SCROLL_FLING_START:
     case ui::ET_GESTURE_SCROLL_BEGIN:
+      // If the search box is active when we start our drag, let it know.
+      if (search_box_view_->is_search_box_active())
+        search_box_view_->NotifyGestureEvent();
       // Avoid scrolling events for the app list in tablet mode.
       if (is_side_shelf_ || IsHomeLauncherEnabledInTabletMode())
         return;
diff --git a/ash/ash_service_unittest.cc b/ash/ash_service_unittest.cc
index 66bf8bb3..6aafc69 100644
--- a/ash/ash_service_unittest.cc
+++ b/ash/ash_service_unittest.cc
@@ -17,6 +17,7 @@
 #include "services/ui/public/interfaces/window_manager.mojom.h"
 #include "services/ui/public/interfaces/window_tree.mojom.h"
 #include "services/ui/public/interfaces/window_tree_constants.mojom.h"
+#include "ui/aura/client/aura_constants.h"
 #include "ui/aura/env.h"
 #include "ui/aura/mus/property_converter.h"
 #include "ui/aura/mus/window_tree_client.h"
@@ -91,16 +92,7 @@
   ASSERT_TRUE(success);
 }
 
-#if defined(ADDRESS_SANITIZER)
-// TODO: fix. See https://crbug.com/838520
-#define MAYBE_OpenWindow DISABLED_OpenWindow
-#elif defined(MEMORY_SANITIZER)
-// TODO: fix. See https://crbug.com/725095
-#define MAYBE_OpenWindow DISABLED_OpenWindow
-#else
-#define MAYBE_OpenWindow OpenWindow
-#endif
-TEST_F(AshServiceTest, MAYBE_OpenWindow) {
+TEST_F(AshServiceTest, OpenWindow) {
   display::ScreenBase screen;
   screen.display_list().AddDisplay(
       display::Display(1, gfx::Rect(0, 0, 200, 200)),
@@ -126,6 +118,8 @@
       aura::CreateInitParamsForTopLevel(client.get(), std::move(properties)));
   window_tree_host_mus.InitHost();
   aura::Window* child_window = new aura::Window(nullptr);
+  child_window->SetProperty(aura::client::kEmbedType,
+                            aura::client::WindowEmbedType::EMBED_IN_OWNER);
   child_window->Init(ui::LAYER_NOT_DRAWN);
   window_tree_host_mus.window()->AddChild(child_window);
 
diff --git a/ash/assistant/assistant_controller.cc b/ash/assistant/assistant_controller.cc
index ba508f4..213e384b 100644
--- a/ash/assistant/assistant_controller.cc
+++ b/ash/assistant/assistant_controller.cc
@@ -8,6 +8,7 @@
 #include "ash/assistant/assistant_interaction_controller.h"
 #include "ash/assistant/assistant_notification_controller.h"
 #include "ash/assistant/assistant_screen_context_controller.h"
+#include "ash/assistant/assistant_setup_controller.h"
 #include "ash/assistant/assistant_ui_controller.h"
 #include "ash/assistant/util/deep_link_util.h"
 #include "ash/new_window_controller.h"
@@ -28,6 +29,8 @@
           std::make_unique<AssistantNotificationController>(this)),
       assistant_screen_context_controller_(
           std::make_unique<AssistantScreenContextController>(this)),
+      assistant_setup_controller_(
+          std::make_unique<AssistantSetupController>(this)),
       assistant_ui_controller_(std::make_unique<AssistantUiController>(this)),
       voice_interaction_binding_(this),
       weak_factory_(this) {
@@ -81,9 +84,12 @@
   assistant_image_downloader_ = std::move(assistant_image_downloader);
 }
 
+// TODO(dmblack): Call SetAssistantSetup directly on AssistantSetupController
+// instead of going through AssistantController.
 void AssistantController::SetAssistantSetup(
     mojom::AssistantSetupPtr assistant_setup) {
   assistant_setup_ = std::move(assistant_setup);
+  assistant_setup_controller_->SetAssistantSetup(assistant_setup_.get());
 }
 
 void AssistantController::SetWebContentsManager(
@@ -168,23 +174,9 @@
       // UI and behavior for Assistant.
       Shell::Get()->new_window_controller()->OpenFeedbackPage();
       break;
-    case DeepLinkType::kOnboarding:
-      if (GetDeepLinkParamAsBool(params, DeepLinkParam::kRelaunch)) {
-        assistant_setup_->StartAssistantOptInFlow(base::BindOnce(
-            [](AssistantUiController* ui_controller, bool completed) {
-              if (completed)
-                ui_controller->ShowUi(AssistantSource::kSetup);
-            },
-            // |assistant_setup_| and |assistant_ui_controller_| are both owned
-            // by this class, so a raw pointer is safe here.
-            assistant_ui_controller_.get()));
-      } else {
-        assistant_setup_->StartAssistantOptInFlow(base::DoNothing());
-      }
-      assistant_ui_controller_->HideUi(AssistantSource::kSetup);
-      break;
     case DeepLinkType::kUnsupported:
     case DeepLinkType::kExplore:
+    case DeepLinkType::kOnboarding:
     case DeepLinkType::kQuery:
     case DeepLinkType::kReminders:
     case DeepLinkType::kSettings:
diff --git a/ash/assistant/assistant_controller.h b/ash/assistant/assistant_controller.h
index 6bdcdc5..b3bbafa 100644
--- a/ash/assistant/assistant_controller.h
+++ b/ash/assistant/assistant_controller.h
@@ -35,6 +35,7 @@
 class AssistantInteractionController;
 class AssistantNotificationController;
 class AssistantScreenContextController;
+class AssistantSetupController;
 class AssistantUiController;
 
 class ASH_EXPORT AssistantController
@@ -129,6 +130,11 @@
     return assistant_screen_context_controller_.get();
   }
 
+  AssistantSetupController* setup_controller() {
+    DCHECK(assistant_setup_controller_);
+    return assistant_setup_controller_.get();
+  }
+
   AssistantUiController* ui_controller() {
     DCHECK(assistant_ui_controller_);
     return assistant_ui_controller_.get();
@@ -182,6 +188,8 @@
   std::unique_ptr<AssistantScreenContextController>
       assistant_screen_context_controller_;
 
+  std::unique_ptr<AssistantSetupController> assistant_setup_controller_;
+
   std::unique_ptr<AssistantUiController> assistant_ui_controller_;
 
   mojo::Binding<mojom::VoiceInteractionObserver> voice_interaction_binding_;
diff --git a/ash/assistant/assistant_setup_controller.cc b/ash/assistant/assistant_setup_controller.cc
new file mode 100644
index 0000000..d6ee356
--- /dev/null
+++ b/ash/assistant/assistant_setup_controller.cc
@@ -0,0 +1,68 @@
+// 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 "ash/assistant/assistant_setup_controller.h"
+
+#include "ash/assistant/assistant_controller.h"
+#include "ash/assistant/assistant_ui_controller.h"
+#include "ash/assistant/util/deep_link_util.h"
+
+namespace ash {
+
+AssistantSetupController::AssistantSetupController(
+    AssistantController* assistant_controller)
+    : assistant_controller_(assistant_controller) {
+  assistant_controller_->AddObserver(this);
+}
+
+AssistantSetupController::~AssistantSetupController() {
+  assistant_controller_->RemoveObserver(this);
+}
+
+void AssistantSetupController::SetAssistantSetup(
+    mojom::AssistantSetup* assistant_setup) {
+  assistant_setup_ = assistant_setup;
+}
+
+void AssistantSetupController::OnDeepLinkReceived(
+    assistant::util::DeepLinkType type,
+    const std::map<std::string, std::string>& params) {
+  using namespace assistant::util;
+
+  if (type != DeepLinkType::kOnboarding)
+    return;
+
+  base::Optional<bool> relaunch =
+      GetDeepLinkParamAsBool(params, DeepLinkParam::kRelaunch);
+
+  StartOnboarding(relaunch.value_or(false));
+}
+
+void AssistantSetupController::OnOptInButtonPressed() {
+  StartOnboarding(/*relaunch=*/true);
+}
+
+void AssistantSetupController::StartOnboarding(bool relaunch) {
+  if (!assistant_setup_)
+    return;
+
+  if (relaunch) {
+    assistant_setup_->StartAssistantOptInFlow(base::BindOnce(
+        [](AssistantController* assistant_controller, bool completed) {
+          if (completed) {
+            assistant_controller->ui_controller()->ShowUi(
+                AssistantSource::kSetup);
+          }
+        },
+        // AssistantController owns |assistant_setup_| so a raw pointer is safe.
+        assistant_controller_));
+  } else {
+    assistant_setup_->StartAssistantOptInFlow(base::DoNothing());
+  }
+
+  // Assistant UI should be hidden while the user onboards.
+  assistant_controller_->ui_controller()->HideUi(AssistantSource::kSetup);
+}
+
+}  // namespace ash
diff --git a/ash/assistant/assistant_setup_controller.h b/ash/assistant/assistant_setup_controller.h
new file mode 100644
index 0000000..74e5da3
--- /dev/null
+++ b/ash/assistant/assistant_setup_controller.h
@@ -0,0 +1,50 @@
+// 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 ASH_ASSISTANT_ASSISTANT_SETUP_CONTROLLER_H_
+#define ASH_ASSISTANT_ASSISTANT_SETUP_CONTROLLER_H_
+
+#include <map>
+#include <string>
+
+#include "ash/assistant/assistant_controller_observer.h"
+#include "ash/assistant/ui/main_stage/assistant_opt_in_view.h"
+#include "ash/public/interfaces/assistant_setup.mojom.h"
+#include "base/macros.h"
+
+namespace ash {
+
+class AssistantController;
+
+class AssistantSetupController : public AssistantControllerObserver,
+                                 public AssistantOptInDelegate {
+ public:
+  explicit AssistantSetupController(AssistantController* assistant_controller);
+  ~AssistantSetupController() override;
+
+  // Sets the controller's internal |assistant_setup_| reference.
+  void SetAssistantSetup(mojom::AssistantSetup* assistant_setup);
+
+  // AssistantControllerObserver:
+  void OnDeepLinkReceived(
+      assistant::util::DeepLinkType type,
+      const std::map<std::string, std::string>& params) override;
+
+  // AssistantOptInDelegate:
+  void OnOptInButtonPressed() override;
+
+ private:
+  void StartOnboarding(bool relaunch);
+
+  AssistantController* const assistant_controller_;  // Owned by Shell.
+
+  mojom::AssistantSetup* assistant_setup_ =
+      nullptr;  // Owned by AssistantController.
+
+  DISALLOW_COPY_AND_ASSIGN(AssistantSetupController);
+};
+
+}  // namespace ash
+
+#endif  // ASH_ASSISTANT_ASSISTANT_SETUP_CONTROLLER_H_
diff --git a/ash/assistant/assistant_ui_controller.cc b/ash/assistant/assistant_ui_controller.cc
index 05c1347..0f9abadf 100644
--- a/ash/assistant/assistant_ui_controller.cc
+++ b/ash/assistant/assistant_ui_controller.cc
@@ -197,8 +197,9 @@
 }
 
 void AssistantUiController::OnUrlOpened(const GURL& url) {
-  // We close Assistant UI when opening a URL in a new tab.
-  HideUi(AssistantSource::kUnspecified);
+  // We go into mini UI mode when opening a URL in a new tab.
+  if (assistant_ui_model_.visible())
+    UpdateUiMode(AssistantUiMode::kMiniUi);
 }
 
 void AssistantUiController::OnUiVisibilityChanged(bool visible,
@@ -218,8 +219,10 @@
   if (!Shell::Get()->voice_interaction_controller()->settings_enabled())
     return;
 
+  // TODO(dmblack): Show a more helpful message to the user.
   if (Shell::Get()->voice_interaction_controller()->voice_interaction_state() ==
       mojom::VoiceInteractionState::NOT_READY) {
+    ShowToast(kUnboundServiceToastId, IDS_ASH_ASSISTANT_ERROR_GENERIC);
     return;
   }
 
diff --git a/ash/assistant/ui/assistant_container_view.cc b/ash/assistant/ui/assistant_container_view.cc
index 7998c29b..f0efe38 100644
--- a/ash/assistant/ui/assistant_container_view.cc
+++ b/ash/assistant/ui/assistant_container_view.cc
@@ -4,6 +4,8 @@
 
 #include "ash/assistant/ui/assistant_container_view.h"
 
+#include <memory>
+
 #include "ash/assistant/assistant_controller.h"
 #include "ash/assistant/assistant_ui_controller.h"
 #include "ash/assistant/model/assistant_ui_model.h"
@@ -15,7 +17,7 @@
 #include "ui/display/screen.h"
 #include "ui/views/bubble/bubble_dialog_delegate.h"
 #include "ui/views/bubble/bubble_frame_view.h"
-#include "ui/views/layout/fill_layout.h"
+#include "ui/views/layout/layout_manager.h"
 #include "ui/views/view.h"
 #include "ui/wm/core/shadow_types.h"
 
@@ -28,8 +30,81 @@
 constexpr int kCornerRadiusDip = 20;
 constexpr int kMarginDip = 8;
 
+// AssistantContainerLayout ----------------------------------------------------
+
+// The AssistantContainerLayout calculates preferred size to fit the largest
+// visible child. Children that are not visible are not factored in. During
+// layout, children are horizontally centered and bottom aligned.
+class AssistantContainerLayout : public views::LayoutManager {
+ public:
+  AssistantContainerLayout() = default;
+  ~AssistantContainerLayout() override = default;
+
+  // views::LayoutManager:
+  gfx::Size GetPreferredSize(const views::View* host) const override {
+    int preferred_width = 0;
+
+    for (int i = 0; i < host->child_count(); ++i) {
+      const views::View* child = host->child_at(i);
+
+      // We do not include invisible children in our size calculation.
+      if (!child->visible())
+        continue;
+
+      // Our preferred width is the width of our largest visible child.
+      preferred_width =
+          std::max(child->GetPreferredSize().width(), preferred_width);
+    }
+
+    return gfx::Size(preferred_width,
+                     GetPreferredHeightForWidth(host, preferred_width));
+  }
+
+  int GetPreferredHeightForWidth(const views::View* host,
+                                 int width) const override {
+    int preferred_height = 0;
+
+    for (int i = 0; i < host->child_count(); ++i) {
+      const views::View* child = host->child_at(i);
+
+      // We do not include invisible children in our size calculation.
+      if (!child->visible())
+        continue;
+
+      // Our preferred height is the height of our largest visible child.
+      preferred_height =
+          std::max(child->GetHeightForWidth(width), preferred_height);
+    }
+
+    return preferred_height;
+  }
+
+  void Layout(views::View* host) override {
+    const int host_width = host->width();
+    const int host_height = host->height();
+
+    for (int i = 0; i < host->child_count(); ++i) {
+      views::View* child = host->child_at(i);
+
+      const gfx::Size child_size = child->GetPreferredSize();
+
+      // Children are horizontally centered and bottom aligned.
+      int child_left = (host_width - child_size.width()) / 2;
+      int child_top = host_height - child_size.height();
+
+      child->SetBounds(child_left, child_top, child_size.width(),
+                       child_size.height());
+    }
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(AssistantContainerLayout);
+};
+
 }  // namespace
 
+// AssistantContainerView ------------------------------------------------------
+
 AssistantContainerView::AssistantContainerView(
     AssistantController* assistant_controller)
     : assistant_controller_(assistant_controller) {
@@ -46,8 +121,6 @@
 
   // These attributes can only be set after bubble creation:
   GetBubbleFrameView()->bubble_border()->SetCornerRadius(kCornerRadiusDip);
-  SetAlignment(views::BubbleBorder::BubbleAlignment::ALIGN_EDGE_TO_ANCHOR_EDGE);
-  SetArrowPaintType(views::BubbleBorder::PAINT_NONE);
 
   // The AssistantController owns the view hierarchy to which
   // AssistantContainerView belongs so is guaranteed to outlive it.
@@ -93,23 +166,20 @@
 }
 
 void AssistantContainerView::Init() {
-  SetLayoutManager(std::make_unique<views::FillLayout>());
+  SetLayoutManager(std::make_unique<AssistantContainerLayout>());
 
   // Main view.
-  assistant_main_view_ =
-      std::make_unique<AssistantMainView>(assistant_controller_);
-  assistant_main_view_->set_owned_by_client();
+  assistant_main_view_ = new AssistantMainView(assistant_controller_);
+  AddChildView(assistant_main_view_);
 
   // Mini view.
-  assistant_mini_view_ =
-      std::make_unique<AssistantMiniView>(assistant_controller_);
+  assistant_mini_view_ = new AssistantMiniView(assistant_controller_);
   assistant_mini_view_->set_delegate(assistant_controller_->ui_controller());
-  assistant_mini_view_->set_owned_by_client();
+  AddChildView(assistant_mini_view_);
 
   // Web view.
-  assistant_web_view_ =
-      std::make_unique<AssistantWebView>(assistant_controller_);
-  assistant_web_view_->set_owned_by_client();
+  assistant_web_view_ = new AssistantWebView(assistant_controller_);
+  AddChildView(assistant_web_view_);
 
   // Update the view state based on the current UI mode.
   OnUiModeChanged(assistant_controller_->ui_controller()->model()->ui_mode());
@@ -135,17 +205,21 @@
 }
 
 void AssistantContainerView::OnUiModeChanged(AssistantUiMode ui_mode) {
-  RemoveAllChildViews(/*delete_children=*/false);
+  for (int i = 0; i < child_count(); ++i) {
+    child_at(i)->SetVisible(false);
+  }
 
   switch (ui_mode) {
     case AssistantUiMode::kMiniUi:
-      AddChildView(assistant_mini_view_.get());
+      assistant_mini_view_->SetVisible(true);
       break;
     case AssistantUiMode::kMainUi:
-      AddChildView(assistant_main_view_.get());
+      assistant_main_view_->SetVisible(true);
+      if (GetWidget() && GetWidget()->IsActive())
+        RequestFocus();
       break;
     case AssistantUiMode::kWebUi:
-      AddChildView(assistant_web_view_.get());
+      assistant_web_view_->SetVisible(true);
       break;
   }
 
diff --git a/ash/assistant/ui/assistant_container_view.h b/ash/assistant/ui/assistant_container_view.h
index e417d1bff..29dd49f4 100644
--- a/ash/assistant/ui/assistant_container_view.h
+++ b/ash/assistant/ui/assistant_container_view.h
@@ -5,8 +5,6 @@
 #ifndef ASH_ASSISTANT_UI_ASSISTANT_CONTAINER_VIEW_H_
 #define ASH_ASSISTANT_UI_ASSISTANT_CONTAINER_VIEW_H_
 
-#include <memory>
-
 #include "ash/assistant/model/assistant_ui_model_observer.h"
 #include "base/macros.h"
 #include "ui/views/bubble/bubble_dialog_delegate.h"
@@ -42,9 +40,9 @@
 
   AssistantController* const assistant_controller_;  // Owned by Shell.
 
-  std::unique_ptr<AssistantMainView> assistant_main_view_;
-  std::unique_ptr<AssistantMiniView> assistant_mini_view_;
-  std::unique_ptr<AssistantWebView> assistant_web_view_;
+  AssistantMainView* assistant_main_view_;  // Owned by view hierarchy.
+  AssistantMiniView* assistant_mini_view_;  // Owned by view hierarchy.
+  AssistantWebView* assistant_web_view_;    // Owned by view hierarchy.
 
   DISALLOW_COPY_AND_ASSIGN(AssistantContainerView);
 };
diff --git a/ash/assistant/ui/assistant_main_view.cc b/ash/assistant/ui/assistant_main_view.cc
index bb9bc5d..20c6b58 100644
--- a/ash/assistant/ui/assistant_main_view.cc
+++ b/ash/assistant/ui/assistant_main_view.cc
@@ -65,11 +65,15 @@
 }
 
 gfx::Size AssistantMainView::CalculatePreferredSize() const {
-  // |min_height_dip_| <= |preferred_height| <= |kMaxHeightDip|.
-  int preferred_height = GetHeightForWidth(kPreferredWidthDip);
-  preferred_height = std::min(preferred_height, kMaxHeightDip);
-  preferred_height = std::max(preferred_height, min_height_dip_);
-  return gfx::Size(kPreferredWidthDip, preferred_height);
+  return gfx::Size(kPreferredWidthDip, GetHeightForWidth(kPreferredWidthDip));
+}
+
+int AssistantMainView::GetHeightForWidth(int width) const {
+  // |min_height_dip_| <= |height| <= |kMaxHeightDip|.
+  int height = views::View::GetHeightForWidth(width);
+  height = std::min(height, kMaxHeightDip);
+  height = std::max(height, min_height_dip_);
+  return height;
 }
 
 void AssistantMainView::OnBoundsChanged(const gfx::Rect& prev_bounds) {
diff --git a/ash/assistant/ui/assistant_main_view.h b/ash/assistant/ui/assistant_main_view.h
index 35e94a1..2505051d 100644
--- a/ash/assistant/ui/assistant_main_view.h
+++ b/ash/assistant/ui/assistant_main_view.h
@@ -23,6 +23,7 @@
 
   // views::View:
   gfx::Size CalculatePreferredSize() const override;
+  int GetHeightForWidth(int width) const override;
   void ChildPreferredSizeChanged(views::View* child) override;
   void ChildVisibilityChanged(views::View* child) override;
   void OnBoundsChanged(const gfx::Rect& prev_bounds) override;
diff --git a/ash/assistant/ui/assistant_mini_view.cc b/ash/assistant/ui/assistant_mini_view.cc
index 43a2436f..08252e4b 100644
--- a/ash/assistant/ui/assistant_mini_view.cc
+++ b/ash/assistant/ui/assistant_mini_view.cc
@@ -8,6 +8,8 @@
 
 #include "ash/assistant/assistant_controller.h"
 #include "ash/assistant/assistant_interaction_controller.h"
+#include "ash/assistant/assistant_ui_controller.h"
+#include "ash/assistant/model/assistant_query.h"
 #include "ash/assistant/ui/assistant_ui_constants.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/strings/grit/ash_strings.h"
@@ -41,9 +43,11 @@
   // AssistantController indirectly owns the view hierarchy to which
   // AssistantMiniView belongs so is guaranteed to outlive it.
   assistant_controller_->interaction_controller()->AddModelObserver(this);
+  assistant_controller_->ui_controller()->AddModelObserver(this);
 }
 
 AssistantMiniView::~AssistantMiniView() {
+  assistant_controller_->ui_controller()->RemoveModelObserver(this);
   assistant_controller_->interaction_controller()->RemoveModelObserver(this);
 }
 
@@ -87,10 +91,8 @@
   label_->SetLineHeight(kLineHeightDip);
   AddChildView(label_);
 
-  // Trigger input modality changed event to initialize view state.
-  OnInputModalityChanged(assistant_controller_->interaction_controller()
-                             ->model()
-                             ->input_modality());
+  // Initialize the prompt.
+  UpdatePrompt();
 }
 
 void AssistantMiniView::ButtonPressed(views::Button* sender,
@@ -100,6 +102,55 @@
 }
 
 void AssistantMiniView::OnInputModalityChanged(InputModality input_modality) {
+  UpdatePrompt();
+}
+
+void AssistantMiniView::OnResponseChanged(const AssistantResponse& response) {
+  // When a response changes, the committed query becomes active. We'll cache
+  // the text for that query to use as our prompt when not using the stylus.
+  const AssistantQuery& committed_query =
+      assistant_controller_->interaction_controller()
+          ->model()
+          ->committed_query();
+
+  switch (committed_query.type()) {
+    case AssistantQueryType::kText: {
+      const AssistantTextQuery& text_query =
+          static_cast<const AssistantTextQuery&>(committed_query);
+      last_active_query_ = text_query.text();
+      break;
+    }
+    case AssistantQueryType::kVoice: {
+      const AssistantVoiceQuery& voice_query =
+          static_cast<const AssistantVoiceQuery&>(committed_query);
+      last_active_query_ = voice_query.high_confidence_speech() +
+                           voice_query.low_confidence_speech();
+      break;
+    }
+    case AssistantQueryType::kEmpty:
+      // It shouldn't be possible to commit a query of type kEmpty.
+      NOTREACHED();
+      break;
+  }
+
+  UpdatePrompt();
+}
+
+void AssistantMiniView::OnUiVisibilityChanged(bool visible,
+                                              AssistantSource source) {
+  if (visible)
+    return;
+
+  // Reset state for the next Assistant UI session.
+  last_active_query_.reset();
+  UpdatePrompt();
+}
+
+void AssistantMiniView::UpdatePrompt() {
+  InputModality input_modality = assistant_controller_->interaction_controller()
+                                     ->model()
+                                     ->input_modality();
+
   switch (input_modality) {
     case InputModality::kStylus:
       label_->SetText(
@@ -107,8 +158,12 @@
       break;
     case InputModality::kKeyboard:
     case InputModality::kVoice:
+      // If we've cached an active query, we'll use that as our prompt. If not,
+      // we fall back to our default prompt string.
       label_->SetText(
-          l10n_util::GetStringUTF16(IDS_ASH_ASSISTANT_PROMPT_DEFAULT));
+          last_active_query_.has_value()
+              ? base::UTF8ToUTF16(last_active_query_.value())
+              : l10n_util::GetStringUTF16(IDS_ASH_ASSISTANT_PROMPT_DEFAULT));
       break;
   }
 }
diff --git a/ash/assistant/ui/assistant_mini_view.h b/ash/assistant/ui/assistant_mini_view.h
index 969c4143..cf06035 100644
--- a/ash/assistant/ui/assistant_mini_view.h
+++ b/ash/assistant/ui/assistant_mini_view.h
@@ -5,8 +5,12 @@
 #ifndef ASH_ASSISTANT_UI_ASSISTANT_MINI_VIEW_H_
 #define ASH_ASSISTANT_UI_ASSISTANT_MINI_VIEW_H_
 
+#include <string>
+
 #include "ash/assistant/model/assistant_interaction_model_observer.h"
+#include "ash/assistant/model/assistant_ui_model_observer.h"
 #include "base/macros.h"
+#include "base/optional.h"
 #include "ui/views/controls/button/button.h"
 
 namespace views {
@@ -32,7 +36,8 @@
 
 class AssistantMiniView : public views::Button,
                           public views::ButtonListener,
-                          public AssistantInteractionModelObserver {
+                          public AssistantInteractionModelObserver,
+                          public AssistantUiModelObserver {
  public:
   explicit AssistantMiniView(AssistantController* assistant_controller);
   ~AssistantMiniView() override;
@@ -47,6 +52,10 @@
 
   // AssistantInteractionModelObserver:
   void OnInputModalityChanged(InputModality input_modality) override;
+  void OnResponseChanged(const AssistantResponse& response) override;
+
+  // AssistantUiModelObserver:
+  void OnUiVisibilityChanged(bool visible, AssistantSource source) override;
 
   void set_delegate(AssistantMiniViewDelegate* delegate) {
     delegate_ = delegate;
@@ -54,12 +63,17 @@
 
  private:
   void InitLayout();
+  void UpdatePrompt();
 
   AssistantController* const assistant_controller_;  // Owned by Shell.
   views::Label* label_;                              // Owned by view hierarchy.
 
   AssistantMiniViewDelegate* delegate_ = nullptr;
 
+  // The most recent active query for the current Assistant UI session. If there
+  // has been no active query for the current UI session, this is empty.
+  base::Optional<std::string> last_active_query_;
+
   DISALLOW_COPY_AND_ASSIGN(AssistantMiniView);
 };
 
diff --git a/ash/assistant/ui/main_stage/assistant_footer_view.cc b/ash/assistant/ui/main_stage/assistant_footer_view.cc
index 4dcbfefe..48cc602 100644
--- a/ash/assistant/ui/main_stage/assistant_footer_view.cc
+++ b/ash/assistant/ui/main_stage/assistant_footer_view.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "ash/assistant/assistant_controller.h"
+#include "ash/assistant/assistant_setup_controller.h"
 #include "ash/assistant/ui/main_stage/assistant_opt_in_view.h"
 #include "ash/assistant/ui/main_stage/suggestion_container_view.h"
 #include "ui/views/layout/fill_layout.h"
@@ -55,6 +56,7 @@
   // Opt in view.
   opt_in_view_ = new AssistantOptInView();
   opt_in_view_->SetVisible(false);
+  opt_in_view_->set_delegate(assistant_controller_->setup_controller());
   AddChildView(opt_in_view_);
 }
 
diff --git a/ash/assistant/ui/main_stage/assistant_opt_in_view.cc b/ash/assistant/ui/main_stage/assistant_opt_in_view.cc
index 5c9cfee5..ac4127d 100644
--- a/ash/assistant/ui/main_stage/assistant_opt_in_view.cc
+++ b/ash/assistant/ui/main_stage/assistant_opt_in_view.cc
@@ -70,7 +70,7 @@
 
 // AssistantOptInView ----------------------------------------------------------
 
-AssistantOptInView::AssistantOptInView() {
+AssistantOptInView::AssistantOptInView() : views::Button(/*listener=*/this) {
   InitLayout();
 }
 
@@ -140,4 +140,10 @@
   container->AddChildView(label_);
 }
 
+void AssistantOptInView::ButtonPressed(views::Button* sender,
+                                       const ui::Event& event) {
+  if (delegate_)
+    delegate_->OnOptInButtonPressed();
+}
+
 }  // namespace ash
diff --git a/ash/assistant/ui/main_stage/assistant_opt_in_view.h b/ash/assistant/ui/main_stage/assistant_opt_in_view.h
index ad133aa..3d6a6be 100644
--- a/ash/assistant/ui/main_stage/assistant_opt_in_view.h
+++ b/ash/assistant/ui/main_stage/assistant_opt_in_view.h
@@ -6,7 +6,7 @@
 #define ASH_ASSISTANT_UI_MAIN_STAGE_ASSISTANT_OPT_IN_VIEW_H_
 
 #include "base/macros.h"
-#include "ui/views/view.h"
+#include "ui/views/controls/button/button.h"
 
 namespace views {
 class StyledLabel;
@@ -14,20 +14,40 @@
 
 namespace ash {
 
-class AssistantOptInView : public views::View {
+// AssistantOptInDelegate ------------------------------------------------------
+
+class AssistantOptInDelegate {
+ public:
+  // Invoked when the Assistant opt in button is pressed.
+  virtual void OnOptInButtonPressed() = 0;
+
+ protected:
+  virtual ~AssistantOptInDelegate() = default;
+};
+
+// AssistantOptInView ----------------------------------------------------------
+
+class AssistantOptInView : public views::Button, public views::ButtonListener {
  public:
   AssistantOptInView();
   ~AssistantOptInView() override;
 
-  // views::View:
+  // views::Button:
   void ChildPreferredSizeChanged(views::View* child) override;
   void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
 
+  // views::ButtonListener:
+  void ButtonPressed(views::Button* sender, const ui::Event& event) override;
+
+  void set_delegate(AssistantOptInDelegate* delegate) { delegate_ = delegate; }
+
  private:
   void InitLayout();
 
   views::StyledLabel* label_;  // Owned by view hierarchy.
 
+  AssistantOptInDelegate* delegate_ = nullptr;
+
   DISALLOW_COPY_AND_ASSIGN(AssistantOptInView);
 };
 
diff --git a/ash/display/screen_ash.cc b/ash/display/screen_ash.cc
index 28a23d3..cf61b7a 100644
--- a/ash/display/screen_ash.cc
+++ b/ash/display/screen_ash.cc
@@ -168,6 +168,17 @@
 }
 
 display::Display ScreenAsh::GetPrimaryDisplay() const {
+  if (!WindowTreeHostManager::HasValidPrimaryDisplayId()) {
+    // This should only be allowed temporarily when there are no displays
+    // available and hence no primary display. In this case we return a default
+    // display to avoid crashes for display observers trying to get the primary
+    // display when notified with the removal of the last display.
+    // https://crbug.com/866714.
+    DCHECK(
+        Shell::Get()->window_tree_host_manager()->GetAllRootWindows().empty());
+    return display::Display::GetDefaultDisplay();
+  }
+
   return GetDisplayManager()->GetDisplayForId(
       WindowTreeHostManager::GetPrimaryDisplayId());
 }
diff --git a/ash/display/screen_ash_unittest.cc b/ash/display/screen_ash_unittest.cc
index 76c3dd7..3efbe4f 100644
--- a/ash/display/screen_ash_unittest.cc
+++ b/ash/display/screen_ash_unittest.cc
@@ -7,6 +7,7 @@
 #include "ash/test/ash_test_base.h"
 #include "ui/aura/test/test_window_delegate.h"
 #include "ui/aura/window.h"
+#include "ui/display/manager/display_manager.h"
 
 namespace ash {
 
@@ -47,4 +48,71 @@
   EXPECT_EQ(displays[1].id(), screen->GetDisplayForNewWindows().id());
 }
 
+namespace {
+
+// Simulates an observer that tries to get the primary display when notified of
+// displays addition or removal when switching to or from the Unified Desktop
+// mode.
+class TestDisplayRemoveObserver : public display::DisplayObserver {
+ public:
+  TestDisplayRemoveObserver() = default;
+  ~TestDisplayRemoveObserver() override = default;
+
+  int added_displays() const { return added_displays_; }
+  int removed_displays() const { return removed_displays_; }
+
+  // display::DisplayObserver:
+  void OnDisplayAdded(const display::Display& new_display) override {
+    TestPrimaryDisplay();
+    ++added_displays_;
+  }
+
+  void OnDisplayRemoved(const display::Display& old_display) override {
+    TestPrimaryDisplay();
+    ++removed_displays_;
+  }
+
+ private:
+  void TestPrimaryDisplay() const {
+    auto display = display::Screen::GetScreen()->GetPrimaryDisplay();
+    DCHECK_NE(display.id(), display::kInvalidDisplayId);
+  }
+
+  int added_displays_ = 0;
+  int removed_displays_ = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(TestDisplayRemoveObserver);
+};
+
+}  // namespace
+
+// Switching to Unified Desktop removes all current displays (including primary
+// display) and replaces them with the unified display. The display manager
+// notifies observers of display removals before display additions. At this
+// point if an observer tries to get the primary display, it could lead to a
+// crash because all displays have been removed. This test makes sure doesn't
+// happen anymore. https://crbug.com/866714.
+TEST_F(ScreenAshTest, TestNoCrashesOnGettingPrimaryDisplayOnDisplayRemoved) {
+  UpdateDisplay("400x500,300x200");
+
+  TestDisplayRemoveObserver observer;
+  display_manager()->AddObserver(&observer);
+
+  // Enter Unified Mode.
+  display_manager()->SetUnifiedDesktopEnabled(true);
+  EXPECT_TRUE(display_manager()->IsInUnifiedMode());
+
+  EXPECT_EQ(observer.added_displays(), 1);
+  EXPECT_EQ(observer.removed_displays(), 2);
+
+  // Exit Unified Mode, there shouldn't be any crashes either.
+  display_manager()->SetUnifiedDesktopEnabled(false);
+  EXPECT_FALSE(display_manager()->IsInUnifiedMode());
+
+  EXPECT_EQ(observer.added_displays(), 3);
+  EXPECT_EQ(observer.removed_displays(), 3);
+
+  display_manager()->RemoveObserver(&observer);
+}
+
 }  // namespace ash
diff --git a/ash/display/window_tree_host_manager.cc b/ash/display/window_tree_host_manager.cc
index 086db35..0d6f803 100644
--- a/ash/display/window_tree_host_manager.cc
+++ b/ash/display/window_tree_host_manager.cc
@@ -265,6 +265,11 @@
   return primary_display_id;
 }
 
+// static
+bool WindowTreeHostManager::HasValidPrimaryDisplayId() {
+  return primary_display_id != display::kInvalidDisplayId;
+}
+
 aura::Window* WindowTreeHostManager::GetPrimaryRootWindow() {
   // If |primary_tree_host_for_replace_| is set, it means |primary_display_id|
   // is kInvalidDisplayId.
diff --git a/ash/display/window_tree_host_manager.h b/ash/display/window_tree_host_manager.h
index cf6ccd9..cb70b14 100644
--- a/ash/display/window_tree_host_manager.h
+++ b/ash/display/window_tree_host_manager.h
@@ -100,6 +100,9 @@
   // TODO(oshima): Move this out from WindowTreeHostManager;
   static int64_t GetPrimaryDisplayId();
 
+  // Returns true if the current primary display ID is valid.
+  static bool HasValidPrimaryDisplayId();
+
   CursorWindowController* cursor_window_controller() {
     return cursor_window_controller_.get();
   }
diff --git a/ash/frame/custom_frame_view_ash_unittest.cc b/ash/frame/custom_frame_view_ash_unittest.cc
index 8de42a08..9b5c9e97 100644
--- a/ash/frame/custom_frame_view_ash_unittest.cc
+++ b/ash/frame/custom_frame_view_ash_unittest.cc
@@ -646,7 +646,8 @@
       static_cast<HeaderView*>(custom_frame_view->GetHeaderView());
   widget->Maximize();
 
-  WideFrameView* wide_frame_view = WideFrameView::Create(widget.get());
+  std::unique_ptr<WideFrameView> wide_frame_view =
+      std::make_unique<WideFrameView>(widget.get());
   wide_frame_view->GetWidget()->Show();
 
   HeaderView* wide_header_view = wide_frame_view->header_view();
@@ -722,7 +723,8 @@
   std::unique_ptr<views::Widget> widget = CreateTestWidget(
       delegate, kShellWindowId_DefaultContainer, gfx::Rect(100, 0, 400, 500));
 
-  WideFrameView* wide_frame_view = WideFrameView::Create(widget.get());
+  std::unique_ptr<WideFrameView> wide_frame_view =
+      std::make_unique<WideFrameView>(widget.get());
   wide_frame_view->GetWidget()->Show();
   HeaderView* header_view = wide_frame_view->header_view();
   FrameCaptionButtonContainerView::TestApi test_api(
@@ -842,7 +844,8 @@
   window->SetProperty(ash::kFrameActiveColorKey, new_active_color);
   window->SetProperty(ash::kFrameInactiveColorKey, new_inactive_color);
 
-  WideFrameView* wide_frame_view = WideFrameView::Create(widget.get());
+  std::unique_ptr<WideFrameView> wide_frame_view =
+      std::make_unique<WideFrameView>(widget.get());
   HeaderView* wide_header_view = wide_frame_view->header_view();
   DefaultFrameHeader* header =
       static_cast<DefaultFrameHeader*>(wide_header_view->GetFrameHeader());
diff --git a/ash/frame/header_view.cc b/ash/frame/header_view.cc
index 20b1089..14848c6 100644
--- a/ash/frame/header_view.cc
+++ b/ash/frame/header_view.cc
@@ -241,7 +241,8 @@
 void HeaderView::OnTabletModeStarted() {
   caption_button_container_->UpdateCaptionButtonState(true /*=animate*/);
   parent()->Layout();
-  if (Shell::Get()->tablet_mode_controller()->ShouldAutoHideTitlebars(
+  if (target_widget_ &&
+      Shell::Get()->tablet_mode_controller()->ShouldAutoHideTitlebars(
           target_widget_)) {
     target_widget_->non_client_view()->Layout();
   }
@@ -250,12 +251,16 @@
 void HeaderView::OnTabletModeEnded() {
   caption_button_container_->UpdateCaptionButtonState(true /*=animate*/);
   parent()->Layout();
-  target_widget_->non_client_view()->Layout();
+  if (target_widget_)
+    target_widget_->non_client_view()->Layout();
 }
 
 void HeaderView::OnWindowPropertyChanged(aura::Window* window,
                                          const void* key,
                                          intptr_t old) {
+  if (!target_widget_)
+    return;
+
   DCHECK_EQ(target_widget_->GetNativeWindow(), window);
   if (key == kFrameImageActiveKey || key == kFrameImageInactiveKey ||
       key == kFrameImageOverlayActiveKey ||
@@ -278,6 +283,8 @@
 
 void HeaderView::OnWindowDestroying(aura::Window* window) {
   window_observer_.Remove(window);
+  // A HeaderView may outlive the target widget.
+  target_widget_ = nullptr;
 }
 
 views::View* HeaderView::avatar_icon() const {
@@ -327,7 +334,9 @@
   in_immersive_mode_ = false;
   fullscreen_visible_fraction_ = 0;
   DestroyLayer();
-  parent()->Layout();
+  parent()->InvalidateLayout();
+  if (target_widget_)
+    target_widget_->non_client_view()->Layout();
 }
 
 void HeaderView::SetVisibleFraction(double visible_fraction) {
@@ -349,7 +358,7 @@
 }
 
 void HeaderView::PaintHeaderContent(gfx::Canvas* canvas) {
-  if (!should_paint_)
+  if (!should_paint_ || !target_widget_)
     return;
 
   bool paint_as_active =
diff --git a/ash/frame/wide_frame_view.cc b/ash/frame/wide_frame_view.cc
index af03f9e..98ea286 100644
--- a/ash/frame/wide_frame_view.cc
+++ b/ash/frame/wide_frame_view.cc
@@ -53,26 +53,6 @@
 }  // namespace
 
 // static
-WideFrameView* WideFrameView::Create(views::Widget* target) {
-  auto* widget = new views::Widget;
-  WideFrameView* frame_view = new WideFrameView(target, widget);
-
-  views::Widget::InitParams params;
-  params.type = views::Widget::InitParams::TYPE_POPUP;
-  params.delegate = frame_view;
-  params.bounds = GetFrameBounds(target);
-  params.name = "WideFrameView";
-  params.parent = target->GetNativeWindow();
-  params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
-  widget->Init(params);
-
-  aura::Window* window = widget->GetNativeWindow();
-  window->SetEventTargeter(
-      std::make_unique<WideFrameTargeter>(frame_view->header_view()));
-  return frame_view;
-}
-
-// static
 gfx::Rect WideFrameView::GetFrameBounds(views::Widget* target) {
   static const int kFrameHeight =
       GetAshLayoutSize(AshLayoutSize::kNonBrowserCaption).height();
@@ -91,22 +71,14 @@
   controller->Init(this, target_, header_view_);
 }
 
-void WideFrameView::Show() {
-  widget_->Show();
-}
-
-void WideFrameView::Close() {
-  widget_->Close();
-}
-
 void WideFrameView::SetCaptionButtonModel(
     std::unique_ptr<CaptionButtonModel> model) {
   header_view_->caption_button_container()->SetModel(std::move(model));
   header_view_->UpdateCaptionButtons();
 }
 
-WideFrameView::WideFrameView(views::Widget* target, views::Widget* widget)
-    : target_(target), widget_(widget) {
+WideFrameView::WideFrameView(views::Widget* target)
+    : target_(target), widget_(std::make_unique<views::Widget>()) {
   Shell::Get()->AddShellObserver(this);
   display::Screen::GetScreen()->AddObserver(this);
 
@@ -115,9 +87,26 @@
   header_view_ = new HeaderView(target);
   AddChildView(header_view_);
   GetTargetHeaderView()->SetShouldPaintHeader(false);
+
+  views::Widget::InitParams params;
+  params.type = views::Widget::InitParams::TYPE_POPUP;
+  params.delegate = this;
+  params.bounds = GetFrameBounds(target);
+  params.name = "WideFrameView";
+  params.parent = target->GetNativeWindow();
+  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+  params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
+
+  widget_->Init(params);
+
+  aura::Window* window = widget_->GetNativeWindow();
+  window->SetEventTargeter(std::make_unique<WideFrameTargeter>(header_view()));
+  set_owned_by_client();
 }
 
 WideFrameView::~WideFrameView() {
+  if (widget_)
+    widget_->CloseNow();
   Shell::Get()->RemoveShellObserver(this);
   display::Screen::GetScreen()->RemoveObserver(this);
   if (target_) {
@@ -126,6 +115,11 @@
   }
 }
 
+void WideFrameView::DeleteDelegate() {
+  // WideFrameView is owned by a client, not its widget, so don't delete
+  // here.
+}
+
 void WideFrameView::Layout() {
   int onscreen_height = header_view_->GetPreferredOnScreenHeight();
   if (onscreen_height == 0 || !visible()) {
diff --git a/ash/frame/wide_frame_view.h b/ash/frame/wide_frame_view.h
index 351d9c66..5fd8506 100644
--- a/ash/frame/wide_frame_view.h
+++ b/ash/frame/wide_frame_view.h
@@ -22,10 +22,12 @@
 class HeaderView;
 class ImmersiveFullscreenController;
 
-// WideFrameView is used for the case where the widget's
-// maximzed/fullscreen doesn't cover the entire workarea/display area
-// but the caption frame should occupy the full width and placed at the top
-// of the display.
+// WideFrameView is used for the case where the widget's maximzed/fullscreen
+// doesn't cover the entire workarea/display area but the caption frame should
+// occupy the full width and placed at the top of the display. Its widget is
+// created as WIDGET_OWNS_NATIVE_WIDGET and caller is supposed to own and manage
+// its lifetime.
+//
 // TODO(oshima): Currently client is responsible for hooking this up to
 // the target widget because ImmersiveFullscreenController is not owned by
 // CustomFrameViewAsh. Investigate if we integrate this into
@@ -37,18 +39,13 @@
       public ash::ImmersiveFullscreenControllerDelegate,
       public ash::ShellObserver {
  public:
-  // Creates wide frame for |target| widget. It's caller's responsibility
-  // to Close when the wide frame is no longer necessary.
-  static WideFrameView* Create(views::Widget* target);
+  explicit WideFrameView(views::Widget* target);
+  ~WideFrameView() override;
 
   // Initialize |immersive_fullscreen_controller| so that the controller reveals
   // and |hides_header_| in immersive mode.
   void Init(ash::ImmersiveFullscreenController* controller);
 
-  // Show/Closes the frame.
-  void Show();
-  void Close();
-
   // Set the caption model for caption buttions on this frame.
   void SetCaptionButtonModel(std::unique_ptr<ash::CaptionButtonModel> mode);
 
@@ -57,8 +54,8 @@
  private:
   static gfx::Rect GetFrameBounds(views::Widget* target);
 
-  WideFrameView(views::Widget* target, views::Widget* frame_widget);
-  ~WideFrameView() override;
+  // views::WidgetDelegateView:
+  void DeleteDelegate() override;
 
   // views::View:
   void Layout() override;
@@ -88,8 +85,7 @@
   // The target widget this frame will control.
   views::Widget* target_;
 
-  // The widget that hosts the wide frame.
-  views::Widget* widget_;
+  std::unique_ptr<views::Widget> widget_;
 
   ash::HeaderView* header_view_ = nullptr;
 
diff --git a/ash/login/login_screen_controller.cc b/ash/login/login_screen_controller.cc
index cfce5b6..c76e74d 100644
--- a/ash/login/login_screen_controller.cc
+++ b/ash/login/login_screen_controller.cc
@@ -128,9 +128,6 @@
   if (!login_screen_client_)
     return;
   login_screen_client_->AttemptUnlock(account_id);
-
-  Shell::Get()->metrics()->login_metrics_recorder()->SetAuthMethod(
-      LoginMetricsRecorder::AuthMethod::kSmartlock);
 }
 
 void LoginScreenController::HardlockPod(const AccountId& account_id) {
@@ -462,11 +459,6 @@
   int dummy_value;
   bool is_pin =
       authenticated_by_pin && base::StringToInt(password, &dummy_value);
-
-  Shell::Get()->metrics()->login_metrics_recorder()->SetAuthMethod(
-      is_pin ? LoginMetricsRecorder::AuthMethod::kPin
-             : LoginMetricsRecorder::AuthMethod::kPassword);
-
   login_screen_client_->AuthenticateUser(
       account_id, password, is_pin,
       base::BindOnce(&LoginScreenController::OnAuthenticateComplete,
diff --git a/ash/login/ui/lock_screen.cc b/ash/login/ui/lock_screen.cc
index 1858c2a5..83ed4522 100644
--- a/ash/login/ui/lock_screen.cc
+++ b/ash/login/ui/lock_screen.cc
@@ -162,7 +162,6 @@
 
   if (!locked)
     Destroy();
-  Shell::Get()->metrics()->login_metrics_recorder()->Reset();
 }
 
 }  // namespace ash
diff --git a/ash/login/ui/login_bubble.cc b/ash/login/ui/login_bubble.cc
index 017c3db3..ea9de9f 100644
--- a/ash/login/ui/login_bubble.cc
+++ b/ash/login/ui/login_bubble.cc
@@ -558,7 +558,6 @@
   widget->AddObserver(this);
   widget->StackAtTop();
   aura::client::GetFocusClient(widget->GetNativeView())->AddObserver(this);
-  bubble_view_->SetAlignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE);
 
   ScheduleAnimation(true /*visible*/);
 
diff --git a/ash/magnifier/magnification_controller.cc b/ash/magnifier/magnification_controller.cc
index 2509b3d..3c73b211 100644
--- a/ash/magnifier/magnification_controller.cc
+++ b/ash/magnifier/magnification_controller.cc
@@ -50,9 +50,6 @@
 constexpr float kInitialMagnifiedScale = 2.0f;
 constexpr float kScrollScaleChangeFactor = 0.00125f;
 
-constexpr float kZoomGestureLockThreshold = 0.2f;
-constexpr float kScrollGestureLockThreshold = 20000.0f;
-
 // Default animation parameters for redrawing the magnification window.
 constexpr gfx::Tween::Type kDefaultAnimationTweenType = gfx::Tween::EASE_OUT;
 constexpr int kDefaultAnimationDurationInMs = 100;
@@ -537,7 +534,6 @@
   // Reset state once no point is touched on the screen.
   if (touch_points_ == 0) {
     consume_touch_event_ = false;
-    locked_gesture_ = NO_GESTURE;
 
     // Jump back to exactly 1.0 if we are just a tiny bit zoomed in.
     if (scale_ < kMinMagnifiedScaleThreshold) {
@@ -775,40 +771,33 @@
       if (!consume_touch_event_)
         cancel_pressed_touches = true;
     } else if (gesture->type() == ui::ET_GESTURE_PINCH_UPDATE) {
-      if (locked_gesture_ == NO_GESTURE || locked_gesture_ == ZOOM) {
-        float scale = GetScale() * details.scale();
-        ValidateScale(&scale);
+      float scale = GetScale() * details.scale();
+      ValidateScale(&scale);
 
-        if (locked_gesture_ == NO_GESTURE &&
-            std::abs(scale - original_scale_) > kZoomGestureLockThreshold) {
-          locked_gesture_ = MagnificationController::ZOOM;
-        }
+      // |details.bounding_box().CenterPoint()| return center of touch points
+      // of gesture in non-dip screen coordinate.
+      gfx::PointF gesture_center =
+          gfx::PointF(details.bounding_box().CenterPoint());
 
-        // |details.bounding_box().CenterPoint()| return center of touch points
-        // of gesture in non-dip screen coordinate.
-        gfx::PointF gesture_center =
-            gfx::PointF(details.bounding_box().CenterPoint());
+      // Root transform does dip scaling, screen magnification scaling and
+      // translation. Apply inverse transform to convert non-dip screen
+      // coordinate to dip logical coordinate.
+      root_window_->GetHost()->GetInverseRootTransform().TransformPoint(
+          &gesture_center);
 
-        // Root transform does dip scaling, screen magnification scaling and
-        // translation. Apply inverse transform to convert non-dip screen
-        // coordinate to dip logical coordinate.
-        root_window_->GetHost()->GetInverseRootTransform().TransformPoint(
-            &gesture_center);
+      // Calcualte new origin to keep the distance between |gesture_center|
+      // and |origin| same in screen coordinate. This means the following
+      // equation.
+      // (gesture_center.x - origin_.x) * scale_ =
+      //   (gesture_center.x - new_origin.x) * scale
+      // If you solve it for |new_origin|, you will get the following formula.
+      const gfx::PointF origin = gfx::PointF(
+          gesture_center.x() -
+              (scale_ / scale) * (gesture_center.x() - origin_.x()),
+          gesture_center.y() -
+              (scale_ / scale) * (gesture_center.y() - origin_.y()));
 
-        // Calcualte new origin to keep the distance between |gesture_center|
-        // and |origin| same in screen coordinate. This means the following
-        // equation.
-        // (gesture_center.x - origin_.x) * scale_ =
-        //   (gesture_center.x - new_origin.x) * scale
-        // If you solve it for |new_origin|, you will get the following formula.
-        const gfx::PointF origin = gfx::PointF(
-            gesture_center.x() -
-                (scale_ / scale) * (gesture_center.x() - origin_.x()),
-            gesture_center.y() -
-                (scale_ / scale) * (gesture_center.y() - origin_.y()));
-
-        RedrawDIP(origin, scale, 0, kDefaultAnimationTweenType);
-      }
+      RedrawDIP(origin, scale, 0, kDefaultAnimationTweenType);
     } else if (gesture->type() == ui::ET_GESTURE_SCROLL_BEGIN) {
       original_origin_ = origin_;
 
@@ -816,23 +805,12 @@
       if (!consume_touch_event_)
         cancel_pressed_touches = true;
     } else if (gesture->type() == ui::ET_GESTURE_SCROLL_UPDATE) {
-      if (locked_gesture_ == NO_GESTURE || locked_gesture_ == SCROLL) {
-        // Divide by scale to keep scroll speed same at any scale.
-        float new_x = origin_.x() + (-1.0f * details.scroll_x() / scale_);
-        float new_y = origin_.y() + (-1.0f * details.scroll_y() / scale_);
+      // Divide by scale to keep scroll speed same at any scale.
+      float new_x = origin_.x() + (-1.0f * details.scroll_x() / scale_);
+      float new_y = origin_.y() + (-1.0f * details.scroll_y() / scale_);
 
-        if (locked_gesture_ == NO_GESTURE) {
-          float diff_x = (new_x - original_origin_.x()) * scale_;
-          float diff_y = (new_y - original_origin_.y()) * scale_;
-          float squared_distance = (diff_x * diff_x) + (diff_y * diff_y);
-          if (squared_distance > kScrollGestureLockThreshold) {
-            locked_gesture_ = SCROLL;
-          }
-        }
-
-        RedrawDIP(gfx::PointF(new_x, new_y), scale_, 0,
-                  kDefaultAnimationTweenType);
-      }
+      RedrawDIP(gfx::PointF(new_x, new_y), scale_, 0,
+                kDefaultAnimationTweenType);
     }
   }
 
diff --git a/ash/magnifier/magnification_controller.h b/ash/magnifier/magnification_controller.h
index c726a2b..eb1c4993 100644
--- a/ash/magnifier/magnification_controller.h
+++ b/ash/magnifier/magnification_controller.h
@@ -142,8 +142,6 @@
  private:
   class GestureProviderClient;
 
-  enum LockedGestureType { NO_GESTURE, ZOOM, SCROLL };
-
   // ui::ImplicitAnimationObserver overrides:
   void OnImplicitAnimationsCompleted() override;
 
@@ -279,10 +277,6 @@
 
   ScrollDirection scroll_direction_ = SCROLL_NONE;
 
-  // MagnificationController locks gesture once user performs either scroll or
-  // pinch gesture above those thresholds.
-  LockedGestureType locked_gesture_ = NO_GESTURE;
-
   // If true, MagnificationController consumes all touch events.
   bool consume_touch_event_ = false;
 
diff --git a/ash/magnifier/magnification_controller_unittest.cc b/ash/magnifier/magnification_controller_unittest.cc
index 72174da..53543e9 100644
--- a/ash/magnifier/magnification_controller_unittest.cc
+++ b/ash/magnifier/magnification_controller_unittest.cc
@@ -894,63 +894,6 @@
   EXPECT_EQ(delta, delta_zoomed * 2);
 }
 
-TEST_F(MagnificationControllerTest, GestureLock) {
-  GetMagnificationController()->SetEnabled(true);
-  ASSERT_EQ(2.0f, GetMagnificationController()->GetScale());
-
-  // Perform pinch zoom gesture.
-  base::TimeTicks time = base::TimeTicks::Now();
-  ui::PointerDetails pointer_details1(ui::EventPointerType::POINTER_TYPE_TOUCH,
-                                      0);
-  ui::PointerDetails pointer_details2(ui::EventPointerType::POINTER_TYPE_TOUCH,
-                                      1);
-
-  DispatchTouchEvent(ui::ET_TOUCH_PRESSED, gfx::Point(900, 10), time,
-                     pointer_details1);
-  DispatchTouchEvent(ui::ET_TOUCH_PRESSED, gfx::Point(1100, 10), time,
-                     pointer_details2);
-
-  DispatchTouchEvent(ui::ET_TOUCH_MOVED, gfx::Point(800, 10), time,
-                     pointer_details1);
-  DispatchTouchEvent(ui::ET_TOUCH_MOVED, gfx::Point(1200, 10), time,
-                     pointer_details2);
-
-  // Confirm that zoom level has changed.
-  float zoomed_scale = GetMagnificationController()->GetScale();
-  EXPECT_LT(2.0f, zoomed_scale);
-
-  // Confirms that zoom level has changed more than threshold to lock gesture
-  // type.
-  ASSERT_LT(0.2f, zoomed_scale - 2.0f);
-
-  gfx::Point initial_position =
-      GetMagnificationController()->GetWindowPosition();
-
-  // Perform scroll gesture.
-  DispatchTouchEvent(ui::ET_TOUCH_MOVED, gfx::Point(800, 100), time,
-                     pointer_details1);
-  DispatchTouchEvent(ui::ET_TOUCH_MOVED, gfx::Point(1200, 100), time,
-                     pointer_details2);
-
-  DispatchTouchEvent(ui::ET_TOUCH_RELEASED, gfx::Point(800, 100), time,
-                     pointer_details1);
-  DispatchTouchEvent(ui::ET_TOUCH_RELEASED, gfx::Point(1200, 100), time,
-                     pointer_details2);
-
-  // Confirm that scale is the same.
-  EXPECT_EQ(zoomed_scale, GetMagnificationController()->GetScale());
-
-  // The above touch events for simulating scroll gesture cause two pinch
-  // gesture events. Those events cancel each other and set scale back to the
-  // original value. Viewport origin moves with them as well and it can move a
-  // little after those calculation. Accept 1 pixel difference for those
-  // calculation.
-  gfx::Rect accept_position =
-      gfx::Rect(initial_position.x() - 1, initial_position.y() - 1, 2, 2);
-  EXPECT_TRUE(accept_position.Contains(
-      GetMagnificationController()->GetWindowPosition()));
-}
-
 TEST_F(MagnificationControllerTest, ZoomsIntoCenter) {
   UpdateDisplay("0+0-500x500");
 
diff --git a/ash/main.cc b/ash/main.cc
index 4557744..a8acfb8 100644
--- a/ash/main.cc
+++ b/ash/main.cc
@@ -6,6 +6,7 @@
 #include "ash/ash_service.h"
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
+#include "base/logging.h"
 #include "base/path_service.h"
 #include "services/service_manager/public/cpp/service_runner.h"
 #include "ui/base/material_design/material_design_controller.h"
@@ -15,6 +16,7 @@
 // This path is only hit in testing, not production. Production launches ash by
 // way of the utility process, which does not use this.
 MojoResult ServiceMain(MojoHandle service_request_handle) {
+  logging::SetLogPrefix("ash");
   // Load ash resources and strings.
   // TODO: investigate nuking ash_service_resources and use the same resources
   // that are used when AshService is launched via the utility process.
diff --git a/ash/message_center/notifier_settings_view.cc b/ash/message_center/notifier_settings_view.cc
index c4b5f2193..d184887 100644
--- a/ash/message_center/notifier_settings_view.cc
+++ b/ash/message_center/notifier_settings_view.cc
@@ -300,9 +300,7 @@
       notifier_id_(notifier_ui_data.notifier_id),
       icon_view_(new views::ImageView()),
       name_view_(new views::Label(notifier_ui_data.name)),
-      checkbox_(new views::Checkbox(base::string16(),
-                                    this /* listener */,
-                                    true /* force_md */)) {
+      checkbox_(new views::Checkbox(base::string16(), this /* listener */)) {
   name_view_->SetAutoColorReadabilityEnabled(false);
   name_view_->SetEnabledColor(features::IsSystemTrayUnifiedEnabled()
                                   ? kUnifiedMenuTextColor
diff --git a/ash/metrics/login_metrics_recorder.cc b/ash/metrics/login_metrics_recorder.cc
index 5f0cd13..48018f9 100644
--- a/ash/metrics/login_metrics_recorder.cc
+++ b/ash/metrics/login_metrics_recorder.cc
@@ -7,7 +7,6 @@
 #include "ash/login/ui/lock_screen.h"
 #include "ash/session/session_controller.h"
 #include "ash/shell.h"
-#include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 
@@ -57,39 +56,6 @@
 LoginMetricsRecorder::LoginMetricsRecorder() = default;
 LoginMetricsRecorder::~LoginMetricsRecorder() = default;
 
-void LoginMetricsRecorder::SetAuthMethod(AuthMethod method) {
-  DCHECK_NE(method, AuthMethod::kMethodCount);
-  if (Shell::Get()->session_controller()->GetSessionState() !=
-      session_manager::SessionState::LOCKED)
-    return;
-
-  // Record usage of PIN / Password / Smartlock in lock screen.
-  const bool is_tablet_mode = Shell::Get()
-                                  ->tablet_mode_controller()
-                                  ->IsTabletModeWindowManagerEnabled();
-  if (is_tablet_mode) {
-    UMA_HISTOGRAM_ENUMERATION("Ash.Login.Lock.AuthMethod.Used.TabletMode",
-                              method, AuthMethod::kMethodCount);
-  } else {
-    UMA_HISTOGRAM_ENUMERATION("Ash.Login.Lock.AuthMethod.Used.ClamShellMode",
-                              method, AuthMethod::kMethodCount);
-  }
-
-  if (last_auth_method_ != method) {
-    // Record switching between unlock methods.
-    UMA_HISTOGRAM_ENUMERATION("Ash.Login.Lock.AuthMethod.Switched",
-                              FindSwitchType(last_auth_method_, method),
-                              AuthMethodSwitchType::kSwitchTypeCount);
-
-    last_auth_method_ = method;
-  }
-}
-
-void LoginMetricsRecorder::Reset() {
-  // Reset local state.
-  last_auth_method_ = AuthMethod::kPassword;
-}
-
 void LoginMetricsRecorder::RecordNumLoginAttempts(int num_attempt,
                                                   bool success) {
   if (Shell::Get()->session_controller()->GetSessionState() !=
@@ -183,28 +149,4 @@
   }
 }
 
-// static
-LoginMetricsRecorder::AuthMethodSwitchType LoginMetricsRecorder::FindSwitchType(
-    AuthMethod previous,
-    AuthMethod current) {
-  DCHECK_NE(previous, current);
-  switch (previous) {
-    case AuthMethod::kPassword:
-      return current == AuthMethod::kPin
-                 ? AuthMethodSwitchType::kPasswordToPin
-                 : AuthMethodSwitchType::kPasswordToSmartlock;
-    case AuthMethod::kPin:
-      return current == AuthMethod::kPassword
-                 ? AuthMethodSwitchType::kPinToPassword
-                 : AuthMethodSwitchType::kPinToSmartlock;
-    case AuthMethod::kSmartlock:
-      return current == AuthMethod::kPassword
-                 ? AuthMethodSwitchType::kSmartlockToPassword
-                 : AuthMethodSwitchType::kSmartlockToPin;
-    case AuthMethod::kMethodCount:
-      NOTREACHED();
-      return AuthMethodSwitchType::kSwitchTypeCount;
-  }
-}
-
 }  // namespace ash
diff --git a/ash/metrics/login_metrics_recorder.h b/ash/metrics/login_metrics_recorder.h
index b4056de..2d0e4f9 100644
--- a/ash/metrics/login_metrics_recorder.h
+++ b/ash/metrics/login_metrics_recorder.h
@@ -10,35 +10,12 @@
 
 namespace ash {
 
-// A metrics recorder that records login authentication related metrics.
-// This keeps track of the last authentication method we used and records
-// switching between different authentication methods.
+// A metrics recorder that records user activity in login screen.
 // This is tied to UserMetricsRecorder lifetime.
+// Authentication related metrics are captured in LoginAuthRecorder in chrome
+// side.
 class ASH_EXPORT LoginMetricsRecorder {
  public:
-  // Authentication method to unlock the screen. This enum is used to back an
-  // UMA histogram and new values should be inserted immediately above
-  // kMethodCount.
-  enum class AuthMethod {
-    kPassword = 0,
-    kPin,
-    kSmartlock,
-    kMethodCount,
-  };
-
-  // The type of switching between auth methods. This enum is used to back an
-  // UMA histogram and new values should be inserted immediately above
-  // kSwitchTypeCount.
-  enum class AuthMethodSwitchType {
-    kPasswordToPin = 0,
-    kPasswordToSmartlock,
-    kPinToPassword,
-    kPinToSmartlock,
-    kSmartlockToPin,
-    kSmartlockToPassword,
-    kSwitchTypeCount,
-  };
-
   // User clicks target on the lock screen. This enum is used to back an UMA
   // histogram and new values should be inserted immediately above kTargetCount.
   enum class LockScreenUserClickTarget {
@@ -94,22 +71,12 @@
   LoginMetricsRecorder();
   ~LoginMetricsRecorder();
 
-  // Called when user attempts authentication using AuthMethod |type|.
-  void SetAuthMethod(AuthMethod type);
-
-  // Called when lock state changed.
-  void Reset();
-
   // Used to record UMA stats.
   void RecordNumLoginAttempts(int num_attempt, bool success);
   void RecordUserTrayClick(TrayClickTarget target);
   void RecordUserShelfButtonClick(ShelfButtonClickTarget target);
 
  private:
-  static AuthMethodSwitchType FindSwitchType(AuthMethod previous,
-                                             AuthMethod current);
-
-  AuthMethod last_auth_method_ = AuthMethod::kPassword;
 
   DISALLOW_COPY_AND_ASSIGN(LoginMetricsRecorder);
 };
diff --git a/ash/metrics/login_metrics_recorder_unittest.cc b/ash/metrics/login_metrics_recorder_unittest.cc
index 490c6df..a00d1cd 100644
--- a/ash/metrics/login_metrics_recorder_unittest.cc
+++ b/ash/metrics/login_metrics_recorder_unittest.cc
@@ -28,18 +28,12 @@
 namespace ash {
 namespace {
 
-constexpr char kAuthMethodUsageAsTabletHistogramName[] =
-    "Ash.Login.Lock.AuthMethod.Used.TabletMode";
-constexpr char kAuthMethodUsageAsClamShellHistogramName[] =
-    "Ash.Login.Lock.AuthMethod.Used.ClamShellMode";
 constexpr char kNumAttemptTilSuccessHistogramName[] =
     "Ash.Login.Lock.NumPasswordAttempts.UntilSuccess";
 constexpr char kNumAttemptTilFailureHistogramName[] =
     "Ash.Login.Lock.NumPasswordAttempts.UntilFailure";
 constexpr char kUserClicksOnLockHistogramName[] = "Ash.Login.Lock.UserClicks";
 constexpr char kUserClicksOnLoginHistogramName[] = "Ash.Login.Login.UserClicks";
-constexpr char kAuthMethodSwitchHistogramName[] =
-    "Ash.Login.Lock.AuthMethod.Switched";
 
 // Test fixture for the LoginMetricsRecorder class.
 class LoginMetricsRecorderTest : public LoginTestBase {
@@ -65,23 +59,6 @@
     return Shell::Get()->metrics()->login_metrics_recorder();
   }
 
-  void SetAuthMethod(LoginMetricsRecorder::AuthMethod auth_method) {
-    metrics_recorder()->SetAuthMethod(auth_method);
-  }
-
-  void ExpectBucketCount(const std::string& name,
-                         LoginMetricsRecorder::AuthMethod method,
-                         int count) {
-    histogram_tester_->ExpectBucketCount(name, static_cast<int>(method), count);
-  }
-
-  void ExpectBucketCount(const std::string& name,
-                         LoginMetricsRecorder::AuthMethodSwitchType switch_type,
-                         int count) {
-    histogram_tester_->ExpectBucketCount(name, static_cast<int>(switch_type),
-                                         count);
-  }
-
   void ExpectBucketCount(const std::string& name,
                          LoginMetricsRecorder::LockScreenUserClickTarget target,
                          int count) {
@@ -104,92 +81,6 @@
 
 }  // namespace
 
-// Verifies that different unlock attempts get recorded in UMA.
-TEST_F(LoginMetricsRecorderTest, UnlockAttempts) {
-  GetSessionControllerClient()->SetSessionState(
-      session_manager::SessionState::LOCKED);
-
-  std::unique_ptr<MockLoginScreenClient> client = BindMockLoginScreenClient();
-  client->set_authenticate_user_callback_result(false);
-  auto* contents = new LockContentsView(
-      mojom::TrayActionState::kNotAvailable, LockScreen::ScreenType::kLock,
-      data_dispatcher(),
-      std::make_unique<FakeLoginDetachableBaseModel>(data_dispatcher()));
-  LockContentsView::TestApi test_api(contents);
-  SetUserCount(1);
-  std::unique_ptr<views::Widget> widget = CreateWidgetWithContent(contents);
-  LoginAuthUserView::AuthMethods auth_method = LoginAuthUserView::AUTH_PASSWORD;
-  AccountId primary_user = test_api.primary_big_view()
-                               ->GetCurrentUser()
-                               ->basic_user_info->account_id;
-
-  EXPECT_NE(nullptr, test_api.primary_big_view()->auth_user());
-  EXPECT_EQ(test_api.primary_big_view()->auth_user()->auth_methods(),
-            auth_method);
-  EXPECT_CALL(*client,
-              AuthenticateUser_(primary_user, testing::_, false, testing::_));
-  EXPECT_CALL(*client, OnFocusPod(primary_user));
-
-  // Authentication attempt with password "abc1";
-  ui::test::EventGenerator* generator = GetEventGenerator();
-  generator->PressKey(ui::KeyboardCode::VKEY_A, 0);
-  generator->PressKey(ui::KeyboardCode::VKEY_B, 0);
-  generator->PressKey(ui::KeyboardCode::VKEY_C, 0);
-  generator->PressKey(ui::KeyboardCode::VKEY_1, 0);
-  generator->PressKey(ui::KeyboardCode::VKEY_RETURN, 0);
-
-  // Run the loop to get the system salt and flush
-  // LoginScreenClient::AuthenticateUser mojo call.
-  base::RunLoop().RunUntilIdle();
-  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsClamShellHistogramName,
-                                      1);
-  histogram_tester_->ExpectBucketCount(
-      kAuthMethodUsageAsClamShellHistogramName,
-      static_cast<int>(LoginMetricsRecorder::AuthMethod::kPassword), 1);
-
-  // Authentication attempt with pin "1111"
-  test_api.primary_big_view()->auth_user()->SetAuthMethods(
-      auth_method | LoginAuthUserView::AUTH_PIN);
-  EXPECT_EQ(test_api.primary_big_view()->auth_user()->auth_methods(),
-            (auth_method | LoginAuthUserView::AUTH_PIN));
-  EXPECT_CALL(*client,
-              AuthenticateUser_(primary_user, testing::_, true, testing::_));
-  generator->PressKey(ui::KeyboardCode::VKEY_1, 0);
-  generator->PressKey(ui::KeyboardCode::VKEY_1, 0);
-  generator->PressKey(ui::KeyboardCode::VKEY_1, 0);
-  generator->PressKey(ui::KeyboardCode::VKEY_1, 0);
-  generator->PressKey(ui::KeyboardCode::VKEY_RETURN, 0);
-
-  // Run the loop to get the system salt and flush
-  // LoginScreenClient::AuthenticateUser mojo call.
-  base::RunLoop().RunUntilIdle();
-  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsClamShellHistogramName,
-                                      2);
-  histogram_tester_->ExpectBucketCount(
-      kAuthMethodUsageAsClamShellHistogramName,
-      static_cast<int>(LoginMetricsRecorder::AuthMethod::kPin), 1);
-
-  // Authentication attempt with easy unlock tap.
-  test_api.primary_big_view()->auth_user()->SetAuthMethods(
-      auth_method | LoginAuthUserView::AUTH_TAP);
-  EXPECT_EQ(test_api.primary_big_view()->auth_user()->auth_methods(),
-            (auth_method | LoginAuthUserView::AUTH_TAP));
-  EXPECT_CALL(*client, AttemptUnlock(primary_user));
-  generator->MoveMouseTo(MakeLoginAuthTestApi(contents, AuthTarget::kPrimary)
-                             .user_view()
-                             ->GetBoundsInScreen()
-                             .CenterPoint());
-  generator->ClickLeftButton();
-
-  // Flush LoginScreenClient::AttemptUnlock mojo call.
-  Shell::Get()->login_screen_controller()->FlushForTesting();
-  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsClamShellHistogramName,
-                                      3);
-  histogram_tester_->ExpectBucketCount(
-      kAuthMethodUsageAsClamShellHistogramName,
-      static_cast<int>(LoginMetricsRecorder::AuthMethod::kSmartlock), 1);
-}
-
 // Verifies that click on the note action button is recorded correctly.
 TEST_F(LoginMetricsRecorderTest, NoteActionButtonClick) {
   GetSessionControllerClient()->SetSessionState(
@@ -218,94 +109,6 @@
       1);
 }
 
-// Verifies that auth method usage is recorded correctly.
-TEST_F(LoginMetricsRecorderTest, AuthMethodUsage) {
-  GetSessionControllerClient()->SetSessionState(
-      session_manager::SessionState::LOCKED);
-
-  EnableTabletMode(false);
-  SetAuthMethod(LoginMetricsRecorder::AuthMethod::kPassword);
-  ExpectBucketCount(kAuthMethodUsageAsClamShellHistogramName,
-                    LoginMetricsRecorder::AuthMethod::kPassword, 1);
-  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsTabletHistogramName, 0);
-
-  SetAuthMethod(LoginMetricsRecorder::AuthMethod::kPin);
-  ExpectBucketCount(kAuthMethodUsageAsClamShellHistogramName,
-                    LoginMetricsRecorder::AuthMethod::kPin, 1);
-  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsTabletHistogramName, 0);
-
-  SetAuthMethod(LoginMetricsRecorder::AuthMethod::kSmartlock);
-  ExpectBucketCount(kAuthMethodUsageAsClamShellHistogramName,
-                    LoginMetricsRecorder::AuthMethod::kSmartlock, 1);
-  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsTabletHistogramName, 0);
-  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsClamShellHistogramName,
-                                      3);
-
-  EnableTabletMode(true);
-  SetAuthMethod(LoginMetricsRecorder::AuthMethod::kPassword);
-  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsClamShellHistogramName,
-                                      3);
-  ExpectBucketCount(kAuthMethodUsageAsTabletHistogramName,
-                    LoginMetricsRecorder::AuthMethod::kPassword, 1);
-
-  SetAuthMethod(LoginMetricsRecorder::AuthMethod::kPin);
-  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsClamShellHistogramName,
-                                      3);
-  ExpectBucketCount(kAuthMethodUsageAsTabletHistogramName,
-                    LoginMetricsRecorder::AuthMethod::kPin, 1);
-
-  SetAuthMethod(LoginMetricsRecorder::AuthMethod::kSmartlock);
-  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsClamShellHistogramName,
-                                      3);
-  ExpectBucketCount(kAuthMethodUsageAsTabletHistogramName,
-                    LoginMetricsRecorder::AuthMethod::kSmartlock, 1);
-}
-
-// Verifies that auth method switching is recorded correctly.
-TEST_F(LoginMetricsRecorderTest, AuthMethodSwitch) {
-  GetSessionControllerClient()->SetSessionState(
-      session_manager::SessionState::LOCKED);
-
-  SetAuthMethod(LoginMetricsRecorder::AuthMethod::kPassword);
-  histogram_tester_->ExpectTotalCount(kAuthMethodSwitchHistogramName, 0);
-
-  // Switch from password to pin.
-  SetAuthMethod(LoginMetricsRecorder::AuthMethod::kPin);
-  ExpectBucketCount(kAuthMethodSwitchHistogramName,
-                    LoginMetricsRecorder::AuthMethodSwitchType::kPasswordToPin,
-                    1);
-
-  // Switch from pin to smart lock.
-  SetAuthMethod(LoginMetricsRecorder::AuthMethod::kSmartlock);
-  ExpectBucketCount(kAuthMethodSwitchHistogramName,
-                    LoginMetricsRecorder::AuthMethodSwitchType::kPinToSmartlock,
-                    1);
-
-  // Switch from smart lock to password.
-  SetAuthMethod(LoginMetricsRecorder::AuthMethod::kPassword);
-  ExpectBucketCount(
-      kAuthMethodSwitchHistogramName,
-      LoginMetricsRecorder::AuthMethodSwitchType::kSmartlockToPassword, 1);
-
-  // Switch from password to smart lock.
-  SetAuthMethod(LoginMetricsRecorder::AuthMethod::kSmartlock);
-  ExpectBucketCount(
-      kAuthMethodSwitchHistogramName,
-      LoginMetricsRecorder::AuthMethodSwitchType::kPasswordToSmartlock, 1);
-
-  // Switch from smart lock to pin.
-  SetAuthMethod(LoginMetricsRecorder::AuthMethod::kPin);
-  ExpectBucketCount(kAuthMethodSwitchHistogramName,
-                    LoginMetricsRecorder::AuthMethodSwitchType::kSmartlockToPin,
-                    1);
-
-  // Switch from pin to password.
-  SetAuthMethod(LoginMetricsRecorder::AuthMethod::kPassword);
-  ExpectBucketCount(kAuthMethodSwitchHistogramName,
-                    LoginMetricsRecorder::AuthMethodSwitchType::kPinToPassword,
-                    1);
-}
-
 // Verifies that number of auth attempts are recorded correctly.
 TEST_F(LoginMetricsRecorderTest, RecordNumLoginAttempts) {
   GetSessionControllerClient()->SetSessionState(
diff --git a/ash/session/session_controller.cc b/ash/session/session_controller.cc
index c174cdf..fa62825 100644
--- a/ash/session/session_controller.cc
+++ b/ash/session/session_controller.cc
@@ -244,7 +244,7 @@
 }
 
 PrefService* SessionController::GetUserPrefServiceForUser(
-    const AccountId& account_id) {
+    const AccountId& account_id) const {
   auto it = per_user_prefs_.find(account_id);
   if (it != per_user_prefs_.end())
     return it->second.get();
@@ -252,6 +252,12 @@
   return nullptr;
 }
 
+PrefService* SessionController::GetPrimaryUserPrefService() const {
+  const mojom::UserSession* session = GetPrimaryUserSession();
+  return session ? GetUserPrefServiceForUser(session->user_info->account_id)
+                 : nullptr;
+}
+
 PrefService* SessionController::GetLastActiveUserPrefService() const {
   return last_active_user_prefs_;
 }
diff --git a/ash/session/session_controller.h b/ash/session/session_controller.h
index b862cf0..e82f29e 100644
--- a/ash/session/session_controller.h
+++ b/ash/session/session_controller.h
@@ -149,7 +149,11 @@
   PrefService* GetSigninScreenPrefService() const;
 
   // Returns the PrefService for |account_id| or null if one does not exist.
-  PrefService* GetUserPrefServiceForUser(const AccountId& account_id);
+  PrefService* GetUserPrefServiceForUser(const AccountId& account_id) const;
+
+  // Returns the PrefService for the primary user or null if no user is signed
+  // in or the PrefService connection hasn't been established.
+  PrefService* GetPrimaryUserPrefService() const;
 
   // Returns the PrefService for the last active user that had one or null if no
   // PrefService connection has been successfully established.
diff --git a/ash/shelf/shelf_tooltip_bubble.cc b/ash/shelf/shelf_tooltip_bubble.cc
index 5ae2525..a8992b8 100644
--- a/ash/shelf/shelf_tooltip_bubble.cc
+++ b/ash/shelf/shelf_tooltip_bubble.cc
@@ -31,9 +31,6 @@
 const int kArrowTopBottomOffset = 1;
 const int kArrowLeftRightOffset = 1;
 
-// Tooltip's border interior thickness that defines its minimum height.
-const int kBorderInteriorThickness = kTooltipHeight / 2;
-
 ShelfTooltipBubble::ShelfTooltipBubble(views::View* anchor,
                                        views::BubbleBorder::Arrow arrow,
                                        const base::string16& text)
@@ -65,11 +62,6 @@
   set_anchor_view_insets(insets);
 
   views::BubbleDialogDelegateView::CreateBubble(this);
-  if (!ui::MaterialDesignController::IsSecondaryUiMaterial()) {
-    // These must both be called after CreateBubble.
-    SetArrowPaintType(views::BubbleBorder::PAINT_TRANSPARENT);
-    SetBorderInteriorThickness(kBorderInteriorThickness);
-  }
 }
 
 gfx::Size ShelfTooltipBubble::CalculatePreferredSize() const {
diff --git a/ash/shelf/shelf_tooltip_preview_bubble.cc b/ash/shelf/shelf_tooltip_preview_bubble.cc
index aaa7d11..8aa0333 100644
--- a/ash/shelf/shelf_tooltip_preview_bubble.cc
+++ b/ash/shelf/shelf_tooltip_preview_bubble.cc
@@ -33,9 +33,6 @@
   set_margins(gfx::Insets(kTooltipPaddingTop, kTooltipPaddingLeftRight,
                           kTooltipPaddingBottom, kTooltipPaddingLeftRight));
   views::BubbleDialogDelegateView::CreateBubble(this);
-  // This must be done after creating the bubble (a segmentation fault happens
-  // otherwise).
-  SetArrowPaintType(views::BubbleBorder::PAINT_TRANSPARENT);
 }
 
 ShelfTooltipPreviewBubble::~ShelfTooltipPreviewBubble() = default;
diff --git a/ash/shell/content/client/shell_main_delegate.cc b/ash/shell/content/client/shell_main_delegate.cc
index fddb6784..9427af0 100644
--- a/ash/shell/content/client/shell_main_delegate.cc
+++ b/ash/shell/content/client/shell_main_delegate.cc
@@ -13,6 +13,7 @@
 #include "ash/shell/content/client/shell_content_browser_client.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
+#include "base/logging.h"
 #include "base/path_service.h"
 #include "content/public/utility/content_utility_client.h"
 #include "services/service_manager/public/cpp/service.h"
@@ -26,15 +27,18 @@
 namespace {
 
 std::unique_ptr<service_manager::Service> CreateQuickLaunch() {
+  logging::SetLogPrefix("quick");
   return std::make_unique<quick_launch::QuickLaunchApplication>();
 }
 
 std::unique_ptr<service_manager::Service> CreateShortcutViewer() {
+  logging::SetLogPrefix("shortcut");
   return std::make_unique<
       keyboard_shortcut_viewer::ShortcutViewerApplication>();
 }
 
 std::unique_ptr<service_manager::Service> CreateTapVisualizer() {
+  logging::SetLogPrefix("tap");
   return std::make_unique<tap_visualizer::TapVisualizerApp>();
 }
 
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index 331fcbc..84eb2da 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">ቀኝ</translation>
 <translation id="1351937230027495976">ምናሌ ሰብስብ</translation>
 <translation id="1383876407941801731">ፍለጋ </translation>
+<translation id="1419738280318246476">የማሳወቅ እርምጃውን ለማከናወን መሣሪያን ይክፈቱ</translation>
 <translation id="1467432559032391204">ግራ</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">ማስጀመሪያ</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">ይህ መሣሪያ በ<ph name="DOMAIN" /> ነው የሚቀናበረው።</translation>
 <translation id="2050339315714019657">በቁመት</translation>
 <translation id="2067602449040652523">የቁልፍ ሰሌዳ ብሩህነት</translation>
-<translation id="2075212959500165896">ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።</translation>
 <translation id="2081529251031312395">$1 አሁንም በኋላ ላይ በመለያ መግባት ይችላሉ።</translation>
 <translation id="2127372758936585790">አነስተኛ ኃይል ያለው ባትሪ መሙያ</translation>
 <translation id="2135456203358955318">የተተከለ ማጉያ</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">በአንድ ጊዜ ብዙ መግባት ላይ እስከ <ph name="MULTI_PROFILE_USER_LIMIT" /> መለያዎች ድረስ ብቻ ነው ሊኖርዎት የሚችለው።</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{ከአንድ መሣሪያ ጋር ተገናኝቷል}one{ከ# መሣሪያዎች ጋር ተገናኝቷል}other{ከ# መሣሪያዎች ጋር ተገናኝቷል}}</translation>
 <translation id="3236488194889173876">ምንም የተንቀሳቃሽ ስልክ አውታረ መረብ የለም</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">እንግዳ</translation>
 <translation id="332587331255250389">እባክዎ ባትሪውን ይተኩት</translation>
 <translation id="3351879221545518001">አሁን ላይ ማያ ገጽን cast እያደረጉ ነው።</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">ዳግም ይጀምሩ እና ዳግም ያቀናብሩ</translation>
 <translation id="4961318399572185831">የCast ማያ ገጽ</translation>
 <translation id="5069971504769299223">የመሣሪያው አስተዳዳሪ የእርስዎን እንቅስቃሴ ሊከታተል ይችላል።</translation>
+<translation id="5083553833479578423">ተጨማሪ የረዳት ባህሪያትን ያስከፍቱ።</translation>
 <translation id="5136175204352732067">የተለየ የቁልፍ ሰሌዳ ተገናኝቷል</translation>
 <translation id="5168181903108465623">የCast መሣሪያዎች ይገኛሉ</translation>
 <translation id="5207949376430453814">የጽሑፍ ድፋቱን አድምቅ</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">ብሉቱዝ በርቷል</translation>
 <translation id="639644700271529076">CAPS LOCK ጠፍቷል</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">ሁሉንም ማሳወቂያዎች አጽዳ</translation>
 <translation id="643147933154517414">ሁሉም ተከናውኗል</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> በ<ph name="RECEIVER_NAME" /> ላይ</translation>
 <translation id="6452181791372256707">አይቀበሉ</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">የሙሉ ማያ ገጽ ማጉያውን አቋራጭ ተጭነዋል። ሊያበሩት ይፈልጋሉ?</translation>
 <translation id="8190698733819146287">ቋንቋዎችን እና ግብአቶችን አብጅ...</translation>
 <translation id="8191230140820435481">መተግበሪያዎችዎን፣ ቅጥያዎችዎን እና ገጽታዎችዎን ያቀናብራል</translation>
+<translation id="8192202700944119416">ማሳወቂያዎች ተደብቀዋል</translation>
 <translation id="8261506727792406068">ሰርዝ</translation>
 <translation id="8297006494302853456">ደካማ</translation>
 <translation id="8308637677604853869">ቀዳሚ ምናሌ</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">ማስታወሻን ይፍጠሩ</translation>
 <translation id="8392451568018454956">የ<ph name="USER_EMAIL_ADDRESS" /> አማራጮች ምናሌ</translation>
 <translation id="8406981827175133772">የሙሉ ማያ ገጽ ማጉያ</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">USB-C መሣሪያ (የቀኝ ወደብ ከኋላ በኩል)</translation>
 <translation id="8940956008527784070">ባትሪ ዝቅተኛ ነው (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">ፈጣን ማስጀመሪያ</translation>
+<translation id="899350903320462459">የማሳወቅ እርምጃውን ለማከናወን መሣሪያን እንደ <ph name="LOGIN_ID" /> ይክፈቱ</translation>
 <translation id="8995603266996330174">የተቀናበረው በ<ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">የAdobe Flash Player ዝማኔ ይገኛል</translation>
 <translation id="9056839673611986238">መሣሪያ ይቀነሳል</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index f350b41..7db000f9 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">يمين</translation>
 <translation id="1351937230027495976">تصغير القائمة</translation>
 <translation id="1383876407941801731">البحث</translation>
+<translation id="1419738280318246476">إلغاء قفل الجهاز لتنفيذ إجراء الإشعارات</translation>
 <translation id="1467432559032391204">اليسار</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">المشغّل</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">تتم إدارة هذا الجهاز بواسطة <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">رأسي</translation>
 <translation id="2067602449040652523">سطوع لوحة المفاتيح</translation>
-<translation id="2075212959500165896">تمّ إجراء محاولات كثيرة. يُرجى إعادة المحاولة لاحقًا.</translation>
 <translation id="2081529251031312395">سيظل بإمكان $1 تسجيل الدخول لاحقًا.</translation>
 <translation id="2127372758936585790">شاحن منخفض الطاقة</translation>
 <translation id="2135456203358955318">المكبّر الذي تم إرساؤه</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">يمكنك الحصول فقط على ما يصل إلى <ph name="MULTI_PROFILE_USER_LIMIT" /> حساب في الدخول المتعدد.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{تم الاتصال بجهاز واحد}zero{تم الاتصال بـ # جهاز}two{تم الاتصال بجهازين (#)}few{تم الاتصال بـ # أجهزة}many{تم الاتصال بـ # جهازًا}other{تم الاتصال بـ # جهاز}}</translation>
 <translation id="3236488194889173876">ليست هناك شبكة جوّال متاحة</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">ضيف</translation>
 <translation id="332587331255250389">يُرجى استبدال البطارية</translation>
 <translation id="3351879221545518001">أنت حاليًا تبث محتوى الشاشة.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">إعادة التشغيل وإعادة الضبط</translation>
 <translation id="4961318399572185831">إرسال الشاشة</translation>
 <translation id="5069971504769299223">قد يتمكَّن مدير الجهاز من مراقبة نشاطك.</translation>
+<translation id="5083553833479578423">فتح المزيد من ميزات "المساعد"</translation>
 <translation id="5136175204352732067">تم توصيل لوحة مفاتيح مختلفة</translation>
 <translation id="5168181903108465623">أجهزة البث متاحة</translation>
 <translation id="5207949376430453814">تمييز علامة إقحام النص</translation>
@@ -298,6 +298,7 @@
 <translation id="6376931439017688372">تم تفعيل البلوتوث</translation>
 <translation id="639644700271529076">‏مفتاح CAPS LOCK قيد الإيقاف</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">محو جميع الإشعارات</translation>
 <translation id="643147933154517414">ليس لديك أي إشعارات</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> في <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">رفض</translation>
@@ -399,9 +400,11 @@
 <translation id="8152119955266188852">لقد ضغطت على اختصار المُكبِّر بملء الشاشة. هل ترغب في تفعيله؟</translation>
 <translation id="8190698733819146287">تخصيص اللغات والإدخال...</translation>
 <translation id="8191230140820435481">إدارة التطبيقات والإضافات والمظاهر</translation>
+<translation id="8192202700944119416">يتم إخفاء الإشعارات.</translation>
 <translation id="8261506727792406068">حذف</translation>
 <translation id="8297006494302853456">ضعيفة</translation>
 <translation id="8308637677604853869">القائمة السابقة</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">إنشاء ملاحظة</translation>
 <translation id="8392451568018454956">قائمة الخيارات لـ <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">مُكبِّر بوضع ملء الشاشة</translation>
@@ -443,6 +446,7 @@
 <translation id="8938800817013097409">‏جهاز USB-C (المنفذ الأيمن في الخلف)</translation>
 <translation id="8940956008527784070">طاقة البطارية منخفضة (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">التشغيل السريع</translation>
+<translation id="899350903320462459">إلغاء قفل الجهاز من خلال <ph name="LOGIN_ID" /> لتنفيذ إجراء الإشعارات</translation>
 <translation id="8995603266996330174">مدار بواسطة <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">‏هناك تحديث جديد لتطبيق Adobe Flash Player</translation>
 <translation id="9056839673611986238">سيتم إغلاق الجهاز.</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb
index 9b98619..22ea9e4e 100644
--- a/ash/strings/ash_strings_bg.xtb
+++ b/ash/strings/ash_strings_bg.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Надясно</translation>
 <translation id="1351937230027495976">Свиване на менюто</translation>
 <translation id="1383876407941801731">Търсене</translation>
+<translation id="1419738280318246476">Отключете устройството, за да се изпълни действието от известието</translation>
 <translation id="1467432559032391204">Наляво</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Стартов панел</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Това устройство се управлява от <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Вертикално</translation>
 <translation id="2067602449040652523">Яркост на клавиатурата</translation>
-<translation id="2075212959500165896">Твърде много опити. Опитайте отново по-късно.</translation>
 <translation id="2081529251031312395">$1 пак може да влезе в профила си по-късно.</translation>
 <translation id="2127372758936585790">Зарядно устройство с малка мощност</translation>
 <translation id="2135456203358955318">Лупа в прикрепен режим</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Можете да използвате най-много <ph name="MULTI_PROFILE_USER_LIMIT" /> профила с функцията за централизиран вход.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Установена е връзка с едно устройство}other{Установена е връзка с # устройства}}</translation>
 <translation id="3236488194889173876">Няма мобилни мрежи</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Гост</translation>
 <translation id="332587331255250389">Моля, заменете батерията</translation>
 <translation id="3351879221545518001">Понастоящем предавате екрана.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Рестартиране и нулиране</translation>
 <translation id="4961318399572185831">Предаване на екрана</translation>
 <translation id="5069971504769299223">Мениджърът на устройството може да е в състояние да наблюдава активността ви.</translation>
+<translation id="5083553833479578423">Отключете още функции на Асистент.</translation>
 <translation id="5136175204352732067">Свързана е различна клавиатура</translation>
 <translation id="5168181903108465623">Налице са устройства Cast</translation>
 <translation id="5207949376430453814">Открояване на точката на вмъкване в текста</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Функцията за Bluetooth е включена</translation>
 <translation id="639644700271529076">„CAPS LOCK“ е изключен</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Изчистване на всички известия</translation>
 <translation id="643147933154517414">Всичко е готово</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> се предава към „<ph name="RECEIVER_NAME" />“</translation>
 <translation id="6452181791372256707">Отхвърляне</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Използвахте клавишната комбинация за лупата за увеличаване на целия екран. Искате ли да включите функцията?</translation>
 <translation id="8190698733819146287">Персонализиране на езиците и въвеждането...</translation>
 <translation id="8191230140820435481">Управление на вашите приложения, разширения и теми</translation>
+<translation id="8192202700944119416">Известията са скрити.</translation>
 <translation id="8261506727792406068">Изтриване</translation>
 <translation id="8297006494302853456">Слаб</translation>
 <translation id="8308637677604853869">Предишно меню</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Създаване на бележка</translation>
 <translation id="8392451568018454956">Меню с опции за <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Лупа за увеличаване на целия екран</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">Устройство с USB-C (десният порт на гърба)</translation>
 <translation id="8940956008527784070">Батерията е изтощена (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Бързо стартиране</translation>
+<translation id="899350903320462459">Отключете устройството като <ph name="LOGIN_ID" />, за да се изпълни действието от известието</translation>
 <translation id="8995603266996330174">Управлявано от <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Налице е актуализация на Adobe Flash Player</translation>
 <translation id="9056839673611986238">Устройството ще бъде върнато към по-ранна версия</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb
index 0f5c4bc..870010c 100644
--- a/ash/strings/ash_strings_bn.xtb
+++ b/ash/strings/ash_strings_bn.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">এই ডিভাইস <ph name="DOMAIN" /> দ্বারা পরিচালিত হয়৷</translation>
 <translation id="2050339315714019657">প্রতিকৃতি</translation>
 <translation id="2067602449040652523">কীবোর্ডের উজ্জ্বলতা</translation>
-<translation id="2075212959500165896">অনেকবার চেষ্টা করা হয়েছে। পরে আবার চেষ্টা করুন।</translation>
 <translation id="2081529251031312395">এখনও $1 পরে সাইন-ইন করতে পারেন।</translation>
 <translation id="2127372758936585790">নিম্ন শক্তির চার্জার</translation>
 <translation id="2135456203358955318">ডক করা ম্যাগনিফায়ার</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">একধিক সাইন-ইনে আপনার কেবলমাত্র <ph name="MULTI_PROFILE_USER_LIMIT" />টি পর্যন্ত অ্যাকাউন্ট থাকতে পারে।</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{একটি ডিভাইসে কানেক্ট রয়েছে}one{#টি ডিভাইসে কানেক্ট রয়েছে}other{#টি ডিভাইসে কানেক্ট রয়েছে}}</translation>
 <translation id="3236488194889173876">কোনো মোবাইল নেটওয়ার্ক উপলব্ধ নেই</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">অতিথি</translation>
 <translation id="332587331255250389">অনুগ্রহ করে ব্যাটারি পাল্টান</translation>
 <translation id="3351879221545518001">আপনি বর্তমানে স্ক্রিন কাস্ট করছেন।</translation>
@@ -255,7 +253,7 @@
 <translation id="5744083938413354016">ট্যাপ করে টেনে আনা</translation>
 <translation id="5750765938512549687">ব্লুটুথ বন্ধ আছে</translation>
 <translation id="5777841717266010279">স্ক্রিন শেয়ার করা থামাবেন?</translation>
-<translation id="57838592816432529">নিঃশব্দ করুন</translation>
+<translation id="57838592816432529">মিউট করুন</translation>
 <translation id="5805697420284793859">উইন্ডো ম্যানেজার</translation>
 <translation id="5820394555380036790">Chromium OS</translation>
 <translation id="5832805196449965646">একজন ব্যক্তিকে যোগ করুন</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb
index 8f9be39..d3f505c8 100644
--- a/ash/strings/ash_strings_ca.xtb
+++ b/ash/strings/ash_strings_ca.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">A la dreta</translation>
 <translation id="1351937230027495976">Replega el menú</translation>
 <translation id="1383876407941801731">Cerca</translation>
+<translation id="1419738280318246476">Desbloqueja el dispositiu per dur a terme l'acció que indica la notificació</translation>
 <translation id="1467432559032391204">A l'esquerra</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Menú d'aplicacions</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Aquest dispositiu està gestionat per <ph name="DOMAIN" /></translation>
 <translation id="2050339315714019657">Vertical</translation>
 <translation id="2067602449040652523">Brillantor del teclat</translation>
-<translation id="2075212959500165896">S'han fet massa intents. Torna-ho a provar més tard.</translation>
 <translation id="2081529251031312395">$1 pot iniciar la sessió més tard.</translation>
 <translation id="2127372758936585790">Carregador de baix consum</translation>
 <translation id="2135456203358955318">Lupa acoblada</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Només pots tenir <ph name="MULTI_PROFILE_USER_LIMIT" /> comptes com a màxim en un inici de sessió múltiple.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Connectat a un dispositiu}other{Connectat a # dispositius}}</translation>
 <translation id="3236488194889173876">No hi ha cap xarxa mòbil disponible</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation>
 <translation id="3294437725009624529">Convidat</translation>
 <translation id="332587331255250389">Canvia la bateria</translation>
 <translation id="3351879221545518001">Estàs emetent la pantalla.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Reinicia i restableix</translation>
 <translation id="4961318399572185831">Emet la pantalla</translation>
 <translation id="5069971504769299223">Pot ser que el gestor del dispositiu pugui supervisar la teva activitat.</translation>
+<translation id="5083553833479578423">Desbloqueja més funcions de l'Assistent.</translation>
 <translation id="5136175204352732067">S'ha connectat un altre teclat</translation>
 <translation id="5168181903108465623">Dispositius d'emissió disponibles</translation>
 <translation id="5207949376430453814">Ressalta la marca d'inserció de text</translation>
@@ -239,7 +239,7 @@
 <translation id="544691375626129091">Ja s'han afegit tots els usuaris disponibles a aquesta sessió.</translation>
 <translation id="5457599981699367932">Navega com a convidat</translation>
 <translation id="54609108002486618">Gestionat</translation>
-<translation id="5496819745535887422">L'administrador està revertint el dispositiu a una versió anterior. Quan es reiniciï el dispositiu, se'n suprimiran totes les dades.</translation>
+<translation id="5496819745535887422">L'administrador està canviant la versió del dispositiu a una d'anterior. Quan es reiniciï el dispositiu, se'n suprimiran totes les dades.</translation>
 <translation id="553675580533261935">S'està tancant la sessió</translation>
 <translation id="5537725057119320332">Emet</translation>
 <translation id="5548285847212963613">L'extensió "<ph name="EXTENSION_NAME" />" pot ajudar a connectar-se a aquesta xarxa.</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Bluetooth està activat</translation>
 <translation id="639644700271529076">Bloq Maj està desactivat</translation>
 <translation id="6406704438230478924">AltGr</translation>
+<translation id="642644398083277086">Esborra totes les notificacions</translation>
 <translation id="643147933154517414">Fet</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> a <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Rebutja</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Has premut la drecera de la lupa de pantalla completa. Vols activar-la?</translation>
 <translation id="8190698733819146287">Personalitza idiomes i introducció de text...</translation>
 <translation id="8191230140820435481">Gestionar les aplicacions, les extensions i els temes</translation>
+<translation id="8192202700944119416">S'han amagat les notificacions.</translation>
 <translation id="8261506727792406068">Suprimeix</translation>
 <translation id="8297006494302853456">Feble</translation>
 <translation id="8308637677604853869">Menú anterior</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Crea una nota</translation>
 <translation id="8392451568018454956">Menú d'opcions per a <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Lupa de pantalla completa</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">Dispositiu USB-C (port posterior dret)</translation>
 <translation id="8940956008527784070">Bateria baixa (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Inici ràpid</translation>
+<translation id="899350903320462459">Desbloqueja el dispositiu com a <ph name="LOGIN_ID" /> per dur a terme l'acció que indica la notificació</translation>
 <translation id="8995603266996330174">Gestionat per <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Hi ha disponible una actualització d'Adobe Flash Player</translation>
 <translation id="9056839673611986238">El dispositiu es revertirà a una versió anterior</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb
index 7b18fd7..11c30d63 100644
--- a/ash/strings/ash_strings_cs.xtb
+++ b/ash/strings/ash_strings_cs.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Doprava</translation>
 <translation id="1351937230027495976">Sbalit nabídku</translation>
 <translation id="1383876407941801731">Vyhledávání</translation>
+<translation id="1419738280318246476">Chcete-li provést akci s oznámením, odemkněte zařízení</translation>
 <translation id="1467432559032391204">Doleva</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Spouštěč</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Zařízení je spravováno doménou <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Na výšku</translation>
 <translation id="2067602449040652523">Jas klávesnice</translation>
-<translation id="2075212959500165896">Příliš mnoho pokusů. Zkuste to později.</translation>
 <translation id="2081529251031312395">$1 se bude moci později přihlásit.</translation>
 <translation id="2127372758936585790">Nabíječka má příliš nízký výkon</translation>
 <translation id="2135456203358955318">Zadokovaná lupa</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Počet účtů, které lze v rámci vícenásobného přihlášení používat, je omezen na <ph name="MULTI_PROFILE_USER_LIMIT" />.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Připojeno k zařízení}few{Připojeno k # zařízením}many{Připojeno k # zařízení}other{Připojeno k # zařízením}}</translation>
 <translation id="3236488194889173876">Není k dispozici žádná mobilní síť</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Host</translation>
 <translation id="332587331255250389">Vyměňte prosím baterii</translation>
 <translation id="3351879221545518001">Právě odesíláte obrazovku.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Restartovat a resetovat</translation>
 <translation id="4961318399572185831">Odesílání obrazovky</translation>
 <translation id="5069971504769299223">Správce zařízení může mít možnost sledovat vaši aktivitu.</translation>
+<translation id="5083553833479578423">Odemkněte další funkce Asistenta.</translation>
 <translation id="5136175204352732067">Je připojena jiná klávesnice</translation>
 <translation id="5168181903108465623">Dostupná zařízení Cast</translation>
 <translation id="5207949376430453814">Zvýraznit textový kurzor</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Rozhraní Bluetooth je zapnuté</translation>
 <translation id="639644700271529076">CAPS LOCK je vypnutý</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Vymazat všechna oznámení</translation>
 <translation id="643147933154517414">Vše je hotovo</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> na přijímači <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Odmítnout</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Stiskli jste klávesovou zkratku pro lupu celé obrazovky. Chcete ji zapnout?</translation>
 <translation id="8190698733819146287">Personalizovat jazyky a zadávání...</translation>
 <translation id="8191230140820435481">Spravovat aplikace, rozšíření a motivy</translation>
+<translation id="8192202700944119416">Oznámení jsou skryta.</translation>
 <translation id="8261506727792406068">Smazat</translation>
 <translation id="8297006494302853456">Slabý</translation>
 <translation id="8308637677604853869">Předchozí nabídka</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Vytvořit poznámku</translation>
 <translation id="8392451568018454956">Nabídka možností pro uživatele <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Lupa celé obrazovky</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">Zařízení USB Type-C (pravý zadní port)</translation>
 <translation id="8940956008527784070">Slabá baterie (<ph name="PERCENTAGE" /> %)</translation>
 <translation id="8984179138335769204">Rychlé spuštění</translation>
+<translation id="899350903320462459">Chcete-li provést akci s oznámením, odemkněte zařízení jako <ph name="LOGIN_ID" /></translation>
 <translation id="8995603266996330174">Správce: <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Je k dispozici aktualizace přehrávače Adobe Flash Player</translation>
 <translation id="9056839673611986238">V zařízení bude obnovena předchozí verze systému</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index 1f38646..9845565 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Højre</translation>
 <translation id="1351937230027495976">Skjul menu</translation>
 <translation id="1383876407941801731">Søg</translation>
+<translation id="1419738280318246476">Lås enheden op for at udføre underretningshandlingen</translation>
 <translation id="1467432559032391204">Venstre</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Appliste</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Denne enhed administreres af <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Stående</translation>
 <translation id="2067602449040652523">Lysstyrke for tastatur</translation>
-<translation id="2075212959500165896">Du har prøvet for mange gange. Prøv igen senere.</translation>
 <translation id="2081529251031312395">$1 kan stadig logge ind senere.</translation>
 <translation id="2127372758936585790">Oplader ved lav kraft</translation>
 <translation id="2135456203358955318">Fastgjort lupvindue</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Du kan kun have op til <ph name="MULTI_PROFILE_USER_LIMIT" /> konti i samlet login fra flere konti.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Forbundet til en enhed}one{Forbundet til # enhed}other{Forbundet til # enheder}}</translation>
 <translation id="3236488194889173876">Der er ingen tilgængelige mobilnetværk</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gæst</translation>
 <translation id="332587331255250389">Udskift batteriet</translation>
 <translation id="3351879221545518001">Du caster i øjeblikket skærmen.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Genstart og nulstil</translation>
 <translation id="4961318399572185831">Cast skærm</translation>
 <translation id="5069971504769299223">Enhedsadministratoren kan muligvis overvåge din aktivitet.</translation>
+<translation id="5083553833479578423">Få adgang til endnu flere Assistent-funktioner.</translation>
 <translation id="5136175204352732067">Du har tilsluttet et andet tastatur</translation>
 <translation id="5168181903108465623">Tilgængelige Cast-enheder</translation>
 <translation id="5207949376430453814">Fremhæv tekstmarkør</translation>
@@ -298,6 +298,7 @@
 <translation id="6376931439017688372">Bluetooth er slået til</translation>
 <translation id="639644700271529076">CAPS LOCK er deaktiveret</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Ryd alle underretninger</translation>
 <translation id="643147933154517414">Færdig</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> på <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Afvis</translation>
@@ -399,9 +400,11 @@
 <translation id="8152119955266188852">Du trykkede på genvejen for forstørrelse af fuld skærm. Vil du aktivere indstillingen?</translation>
 <translation id="8190698733819146287">Tilpas sprog og indtastning...</translation>
 <translation id="8191230140820435481">Administrere dine apps, udvidelser og temaer</translation>
+<translation id="8192202700944119416">Underretninger er skjult.</translation>
 <translation id="8261506727792406068">Slet</translation>
 <translation id="8297006494302853456">Svag</translation>
 <translation id="8308637677604853869">Forrige menu</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Opret note</translation>
 <translation id="8392451568018454956">Menuen Indstillinger for <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Forstørrelse af fuld skærm</translation>
@@ -443,6 +446,7 @@
 <translation id="8938800817013097409">USB-C-enhed (porten bagpå i højre side)</translation>
 <translation id="8940956008527784070">Batteriniveauet er lavt (<ph name="PERCENTAGE" /> %)</translation>
 <translation id="8984179138335769204">Hurtig start</translation>
+<translation id="899350903320462459">Lås enheden op som <ph name="LOGIN_ID" /> for at udføre underretningshandlingen</translation>
 <translation id="8995603266996330174">Administreres af <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Der er en tilgængelig Adobe Flash Player-opdatering</translation>
 <translation id="9056839673611986238">En tidligere version gendannes på enheden</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb
index d389bf5..bda3cab 100644
--- a/ash/strings/ash_strings_de.xtb
+++ b/ash/strings/ash_strings_de.xtb
@@ -21,10 +21,11 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Schwaches Signal</translation>
 <translation id="1293264513303784526">USB-C-Gerät (Port links)</translation>
-<translation id="1302880136325416935">Einstellungen für Bedienungshilfen anzeigen. <ph name="STATE_TEXT" /></translation>
+<translation id="1302880136325416935">Bluetooth-Einstellungen anzeigen. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Rechts</translation>
 <translation id="1351937230027495976">Menü minimieren</translation>
 <translation id="1383876407941801731">Suchen</translation>
+<translation id="1419738280318246476">Wenn Sie die Benachrichtigungsaktion ausführen möchten, entsperren Sie das Gerät</translation>
 <translation id="1467432559032391204">Links</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Übersicht</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Dieses Gerät wird durch <ph name="DOMAIN" /> verwaltet.</translation>
 <translation id="2050339315714019657">Hochformat</translation>
 <translation id="2067602449040652523">Tastaturhelligkeit</translation>
-<translation id="2075212959500165896">Zu viele Versuche. Bitte versuchen Sie es später noch einmal.</translation>
 <translation id="2081529251031312395">$1 kann sich später weiterhin anmelden.</translation>
 <translation id="2127372758936585790">Schwachstrom-Ladegerät</translation>
 <translation id="2135456203358955318">Angedockte Lupe</translation>
@@ -82,7 +82,7 @@
 <translation id="2303600792989757991">Fensterübersicht umschalten</translation>
 <translation id="2338501278241028356">Aktivieren Sie Bluetooth, damit Geräte in der Nähe gefunden werden</translation>
 <translation id="2339073806695260576">Tippen Sie auf die Eingabestift-Schaltfläche in der Ablage, um Notizen oder Screenshots zu erstellen, den Laserpointer oder die Vergrößerungsfunktion zu verwenden.</translation>
-<translation id="2341729377289034582">Vertikale Ausrichtung fixiert</translation>
+<translation id="2341729377289034582">Nur vertikale Ausrichtung</translation>
 <translation id="2352467521400612932">Eingabestift-Einstellungen</translation>
 <translation id="2354174487190027830"><ph name="NAME" /> wird aktiviert</translation>
 <translation id="2359808026110333948">Weiter</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Bei der Mehrfachanmeldung sind maximal <ph name="MULTI_PROFILE_USER_LIMIT" /> Konten zulässig.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Mit einem Gerät verbunden}other{Mit # Geräten verbunden}}</translation>
 <translation id="3236488194889173876">Kein Mobilfunknetz verfügbar</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" />, <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gast</translation>
 <translation id="332587331255250389">Bitte tauschen Sie die Batterien aus</translation>
 <translation id="3351879221545518001">Sie streamen gerade den Bildschirm.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Neu starten und zurücksetzen</translation>
 <translation id="4961318399572185831">Bildschirmübertragung</translation>
 <translation id="5069971504769299223">Der Geräteadministrator kann Ihre Aktivitäten möglicherweise überwachen.</translation>
+<translation id="5083553833479578423">Möchten Sie weitere Assistant-Funktionen freischalten?</translation>
 <translation id="5136175204352732067">Andere Tastatur angeschlossen</translation>
 <translation id="5168181903108465623">Übertragungsgeräte verfügbar</translation>
 <translation id="5207949376430453814">Textcursor hervorheben</translation>
@@ -287,7 +287,7 @@
 <translation id="615957422585914272">Bildschirmtastatur anzeigen</translation>
 <translation id="6164005077879661055">Durch das Entfernen des betreuten Nutzers werden alle mit ihm verknüpften Dateien und lokalen Daten endgültig gelöscht. Besuchte Websites und Einstellungen des betreuten Nutzers kann der Manager möglicherweise weiterhin unter <ph name="MANAGEMENT_URL" /> einsehen.</translation>
 <translation id="6165508094623778733">Weitere Informationen</translation>
-<translation id="6254629735336163724">Horizontale Ausrichtung fixiert</translation>
+<translation id="6254629735336163724">Nur horizontale Ausrichtung</translation>
 <translation id="6259254695169772643">Verwenden Sie den Eingabestift, um Ihre Auswahl zu treffen</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Wird aktiviert...</translation>
 <translation id="6284232397434400372">Auflösung geändert</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Bluetooth ist aktiviert</translation>
 <translation id="639644700271529076">Feststelltaste Aus</translation>
 <translation id="6406704438230478924">AltGr</translation>
+<translation id="642644398083277086">Alle Benachrichtigungen löschen</translation>
 <translation id="643147933154517414">Fertig</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> auf <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Ablehnen</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Sie haben die Tastenkombination für die Vollbildlupe gedrückt. Möchten Sie sie aktivieren?</translation>
 <translation id="8190698733819146287">Sprache und Eingabe anpassen...</translation>
 <translation id="8191230140820435481">Apps, Erweiterungen und Designs verwalten</translation>
+<translation id="8192202700944119416">Benachrichtigungen sind ausgeblendet.</translation>
 <translation id="8261506727792406068">Löschen</translation>
 <translation id="8297006494302853456">Schwach</translation>
 <translation id="8308637677604853869">Vorheriges Menü</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" /> <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Notiz erstellen</translation>
 <translation id="8392451568018454956">Optionsmenü für <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Vollbildlupe</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">USB-C-Gerät (rechter Port hinten)</translation>
 <translation id="8940956008527784070">Niedriger Akkustand (<ph name="PERCENTAGE" /> %)</translation>
 <translation id="8984179138335769204">Schnellstart</translation>
+<translation id="899350903320462459">Wenn Sie die Benachrichtigungsaktion ausführen möchten, entsperren Sie das Gerät als <ph name="LOGIN_ID" /></translation>
 <translation id="8995603266996330174">Verwaltet von <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Update für den Adobe Flash Player verfügbar</translation>
 <translation id="9056839673611986238">Das Gerät wird zurückgesetzt</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb
index 33be9dbb..f63ee57 100644
--- a/ash/strings/ash_strings_el.xtb
+++ b/ash/strings/ash_strings_el.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Δεξιά</translation>
 <translation id="1351937230027495976">Σύμπτυξη μενού</translation>
 <translation id="1383876407941801731">Αναζήτηση</translation>
+<translation id="1419738280318246476">Ξεκλειδώστε τη συσκευή για εκτέλεση της ενέργειας ειδοποίησης</translation>
 <translation id="1467432559032391204">Αριστερά</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Λειτουργία εκκίνησης</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Η διαχείριση της συσκευής γίνεται από τον τομέα <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Κάθετα</translation>
 <translation id="2067602449040652523">Φωτεινότητα πληκτρολογίου</translation>
-<translation id="2075212959500165896">Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά αργότερα.</translation>
 <translation id="2081529251031312395">Ο χρήστης $1 μπορεί να συνδεθεί αργότερα.</translation>
 <translation id="2127372758936585790">Χαμηλή ισχύς φορτιστή</translation>
 <translation id="2135456203358955318">Μεγεθυντικός φακός σε παράθυρο</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Μπορείτε να χρησιμοποιήσετε έως <ph name="MULTI_PROFILE_USER_LIMIT" /> λογαριασμούς στη λειτουργία σύνδεσης σε πολλούς λογαριασμούς.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Συνδέθηκε σε κάποια συσκευή}other{Συνδέθηκε σε # συσκευές}}</translation>
 <translation id="3236488194889173876">Δεν υπάρχουν διαθέσιμα δίκτυα κινητής τηλεφωνίας</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Επισκέπτης</translation>
 <translation id="332587331255250389">Αντικαταστήστε την μπαταρία</translation>
 <translation id="3351879221545518001">Αυτήν τη στιγμή πραγματοποιείτε μετάδοση της οθόνης.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Επανεκκίνηση και επαναφορά</translation>
 <translation id="4961318399572185831">Μετάδοση οθόνης</translation>
 <translation id="5069971504769299223">Ο διαχειριστής της συσκευής ίσως έχει τη δυνατότητα να παρακολουθεί τη δραστηριότητά σας.</translation>
+<translation id="5083553833479578423">Ξεκλειδώστε περισσότερες λειτουργίες του Βοηθού.</translation>
 <translation id="5136175204352732067">Συνδέθηκε διαφορετικό πληκτρολόγιο</translation>
 <translation id="5168181903108465623">Διαθέσιμες συσκευές μετάδοσης</translation>
 <translation id="5207949376430453814">Επισήμανση δρομέα κειμένου</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Το Bluetooth είναι ενεργοποιημένο</translation>
 <translation id="639644700271529076">Το CAPS LOCK είναι απενεργοποιημένο</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Διαγραφή όλων των ειδοποιήσεων</translation>
 <translation id="643147933154517414">Όλα έτοιμα</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> σε <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Απόρριψη</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Πατήσατε τη συντόμευση για τον μεγεθυντικό φακό πλήρους οθόνης. Θέλετε να τον ενεργοποιήσετε;</translation>
 <translation id="8190698733819146287">Προσαρμογή γλωσσών και εισόδου...</translation>
 <translation id="8191230140820435481">Διαχείριση των εφαρμογών, των επεκτάσεων και των θεμάτων σας</translation>
+<translation id="8192202700944119416">Οι ειδοποιήσεις είναι κρυφές.</translation>
 <translation id="8261506727792406068">Διαγραφή</translation>
 <translation id="8297006494302853456">Αδύναμο</translation>
 <translation id="8308637677604853869">Προηγούμενο μενού</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Δημιουργία σημείωσης</translation>
 <translation id="8392451568018454956">Μενού επιλογών για τη διεύθυνση <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Μεγεθυντικός φακός πλήρους οθόνης</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">Συσκευή USB-C (πίσω δεξιά θύρα)</translation>
 <translation id="8940956008527784070">Χαμηλή στάθμη μπαταρίας (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Γρήγορη εκκίνηση</translation>
+<translation id="899350903320462459">Ξεκλειδώστε τη συσκευή ως <ph name="LOGIN_ID" /> για εκτέλεση της ενέργειας ειδοποίησης</translation>
 <translation id="8995603266996330174">Έγινε διαχείριση από <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Υπάρχει διαθέσιμη ενημέρωση για το Adobe Flash Player</translation>
 <translation id="9056839673611986238">Θα γίνει επαναφορά της συσκευής</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index 4f1663b6..3127e4be 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Right</translation>
 <translation id="1351937230027495976">Collapse menu</translation>
 <translation id="1383876407941801731">Search</translation>
+<translation id="1419738280318246476">Unlock device to perform the notification action</translation>
 <translation id="1467432559032391204">Left</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Launcher</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">This device is managed by <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Portrait</translation>
 <translation id="2067602449040652523">Keyboard brightness</translation>
-<translation id="2075212959500165896">Too many attempts. Try again later.</translation>
 <translation id="2081529251031312395">$1 can still sign in later.</translation>
 <translation id="2127372758936585790">Low-power charger</translation>
 <translation id="2135456203358955318">Docked magnifier</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">You can only have up to <ph name="MULTI_PROFILE_USER_LIMIT" /> accounts in multiple sign-in.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Connected to a device}other{Connected to # devices}}</translation>
 <translation id="3236488194889173876">No mobile network available</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Guest</translation>
 <translation id="332587331255250389">Please replace the battery</translation>
 <translation id="3351879221545518001">You are currently casting the screen.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Restart and reset</translation>
 <translation id="4961318399572185831">Cast screen</translation>
 <translation id="5069971504769299223">The device manager may be able to monitor your activity.</translation>
+<translation id="5083553833479578423">Unlock more Assistant features.</translation>
 <translation id="5136175204352732067">Different keyboard connected</translation>
 <translation id="5168181903108465623">Cast devices available</translation>
 <translation id="5207949376430453814">Highlight text caret</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Bluetooth is on</translation>
 <translation id="639644700271529076">CAPS LOCK is off</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Clear all notifications</translation>
 <translation id="643147933154517414">All finished</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> on <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Reject</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">You pressed the shortcut for the full-screen magnifier. Do you want to turn it on?</translation>
 <translation id="8190698733819146287">Customise languages and input...</translation>
 <translation id="8191230140820435481">Manage your apps, extensions, and themes</translation>
+<translation id="8192202700944119416">Notifications are hidden.</translation>
 <translation id="8261506727792406068">Delete</translation>
 <translation id="8297006494302853456">Weak</translation>
 <translation id="8308637677604853869">Previous menu</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Create note</translation>
 <translation id="8392451568018454956">Options menu for <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Full-screen Magnifier</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">USB-C device (right port in the back)</translation>
 <translation id="8940956008527784070">Battery low (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Quick launch</translation>
+<translation id="899350903320462459">Unlock device as <ph name="LOGIN_ID" /> to perform the notification action</translation>
 <translation id="8995603266996330174">Managed by <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Adobe Flash Player update available</translation>
 <translation id="9056839673611986238">Device will be rolled back</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb
index c959b90..bb51452 100644
--- a/ash/strings/ash_strings_es-419.xtb
+++ b/ash/strings/ash_strings_es-419.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390"><ph name="DOMAIN" /> administra esta cuenta.</translation>
 <translation id="2050339315714019657">Vertical</translation>
 <translation id="2067602449040652523">Brillo del teclado</translation>
-<translation id="2075212959500165896">Realizaste demasiados intentos. Pruébalo de nuevo más tarde.</translation>
 <translation id="2081529251031312395">$1 podrá acceder más tarde.</translation>
 <translation id="2127372758936585790">Carga lenta</translation>
 <translation id="2135456203358955318">Lupa con vista acoplada</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">Puedes acceder a un máximo de <ph name="MULTI_PROFILE_USER_LIMIT" /> cuentas con acceso múltiple.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Conectado a un dispositivo}other{Conectado a # dispositivos}}</translation>
 <translation id="3236488194889173876">No hay redes móviles disponibles</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Invitado</translation>
 <translation id="332587331255250389">Reemplaza la batería</translation>
 <translation id="3351879221545518001">Estás transmitiendo la pantalla.</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index 7b8ab03..e4d69dc 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Derecha</translation>
 <translation id="1351937230027495976">Ocultar menú</translation>
 <translation id="1383876407941801731">Buscar</translation>
+<translation id="1419738280318246476">Desbloquea el dispositivo para hacer lo que indica la notificación</translation>
 <translation id="1467432559032391204">Izquierda</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Menú de aplicaciones</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Este dispositivo está gestionado por <ph name="DOMAIN" /></translation>
 <translation id="2050339315714019657">Vertical</translation>
 <translation id="2067602449040652523">Brillo del teclado</translation>
-<translation id="2075212959500165896">Demasiados intentos. Prueba de nuevo más tarde.</translation>
 <translation id="2081529251031312395">$1 aún podrá iniciar sesión.</translation>
 <translation id="2127372758936585790">Carga lenta</translation>
 <translation id="2135456203358955318">Lupa fijada</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Solo puedes tener un máximo de <ph name="MULTI_PROFILE_USER_LIMIT" /> cuentas en el inicio de sesión múltiple.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Conectado a 1 dispositivo}other{Conectado a # dispositivos}}</translation>
 <translation id="3236488194889173876">No hay ninguna red móvil disponible</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation>
 <translation id="3294437725009624529">Invitado</translation>
 <translation id="332587331255250389">Cambia la batería</translation>
 <translation id="3351879221545518001">Estás enviando la pantalla.</translation>
@@ -227,6 +226,7 @@
 <translation id="4924411785043111640">Reiniciar y restablecer</translation>
 <translation id="4961318399572185831">Enviar pantalla</translation>
 <translation id="5069971504769299223">Es posible que el administrador del dispositivo pueda supervisar tu actividad.</translation>
+<translation id="5083553833479578423">Descubre más funciones del Asistente.</translation>
 <translation id="5136175204352732067">Se ha conectado otro teclado</translation>
 <translation id="5168181903108465623">Dispositivos de transmisión disponibles</translation>
 <translation id="5207949376430453814">Resaltar el símbolo de intercalación del texto</translation>
@@ -298,6 +298,7 @@
 <translation id="6376931439017688372">El Bluetooth está activado</translation>
 <translation id="639644700271529076">Bloqueo de mayúsculas desactivado</translation>
 <translation id="6406704438230478924">Alt Gr</translation>
+<translation id="642644398083277086">Borrar todas las notificaciones</translation>
 <translation id="643147933154517414">Listo</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> en <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Rechazar</translation>
@@ -399,9 +400,11 @@
 <translation id="8152119955266188852">Has pulsado la combinación de teclas de la lupa de pantalla completa. ¿Quieres activarla?</translation>
 <translation id="8190698733819146287">Personalizar idiomas...</translation>
 <translation id="8191230140820435481">Administrar tus aplicaciones, extensiones y temas</translation>
+<translation id="8192202700944119416">Las notificaciones están ocultas.</translation>
 <translation id="8261506727792406068">Eliminar</translation>
 <translation id="8297006494302853456">Débil</translation>
 <translation id="8308637677604853869">Menú anterior</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Crear nota</translation>
 <translation id="8392451568018454956">Menú de opciones de <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Lupa de pantalla completa</translation>
@@ -443,6 +446,7 @@
 <translation id="8938800817013097409">Dispositivo USB tipo C (puerto derecho situado en la parte trasera)</translation>
 <translation id="8940956008527784070">Poca batería (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Inicio rápido</translation>
+<translation id="899350903320462459">Desbloque el dispositivo como <ph name="LOGIN_ID" /> para hacer lo que indica la notificación</translation>
 <translation id="8995603266996330174">Administrado por <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Actualización de Adobe Flash Player disponible</translation>
 <translation id="9056839673611986238">Se va a instalar una versión anterior en el dispositivo</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb
index 3b9fd041..46dcbaf6 100644
--- a/ash/strings/ash_strings_et.xtb
+++ b/ash/strings/ash_strings_et.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Paremale</translation>
 <translation id="1351937230027495976">Ahenda menüü</translation>
 <translation id="1383876407941801731">Otsi</translation>
+<translation id="1419738280318246476">Märguandetoimingu tegemiseks avage seade</translation>
 <translation id="1467432559032391204">Vasakule</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Käivitaja</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Seadet haldab <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Vertikaalpaigutus</translation>
 <translation id="2067602449040652523">Klaviatuuri eredus</translation>
-<translation id="2075212959500165896">Liiga palju katseid. Proovige hiljem uuesti.</translation>
 <translation id="2081529251031312395">$1 saab siiski hiljem sisse logida.</translation>
 <translation id="2127372758936585790">Väikese energiakuluga laadija</translation>
 <translation id="2135456203358955318">Dokitud luup</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Saate korraga sisse logida kuni <ph name="MULTI_PROFILE_USER_LIMIT" /> kontole.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Ühendatud ühe seadmega}other{Ühendatud # seadmega}}</translation>
 <translation id="3236488194889173876">Ühtegi mobiilsidevõrku pole saadaval</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Külaline</translation>
 <translation id="332587331255250389">Vahetage akut</translation>
 <translation id="3351879221545518001">Kannate praegu oma ekraani üle.</translation>
@@ -227,6 +226,7 @@
 <translation id="4924411785043111640">Taaskäivita ja lähtesta</translation>
 <translation id="4961318399572185831">Ekraani ülekandmine</translation>
 <translation id="5069971504769299223">Seadme haldur saab võib-olla teie tegevust jälgida.</translation>
+<translation id="5083553833479578423">Avage rohkem assistendi funktsioone.</translation>
 <translation id="5136175204352732067">Ühendatud on teine klaviatuur</translation>
 <translation id="5168181903108465623">Ülekandeseadmed on saadaval</translation>
 <translation id="5207949376430453814">Tekstisisestusmärgi esiletõstmine</translation>
@@ -298,6 +298,7 @@
 <translation id="6376931439017688372">Bluetooth on sisse lülitatud</translation>
 <translation id="639644700271529076">SUURTÄHELUKK on välja lülitatud</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Kõikide märguannete kustutamine</translation>
 <translation id="643147933154517414">Kõik on valmis</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> asukohas <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Lükka tagasi</translation>
@@ -399,9 +400,11 @@
 <translation id="8152119955266188852">Vajutasite täisekraani luubi otseteed. Kas soovite luubi sisse lülitada?</translation>
 <translation id="8190698733819146287">Keelte ja sisendi kohandamine...</translation>
 <translation id="8191230140820435481">Teie rakenduste, laienduste ja teemade haldamine</translation>
+<translation id="8192202700944119416">Märguanded on peidetud.</translation>
 <translation id="8261506727792406068">Kustuta</translation>
 <translation id="8297006494302853456">Nõrk</translation>
 <translation id="8308637677604853869">Eelmine menüü</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" /> <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Märkme loomine</translation>
 <translation id="8392451568018454956">Konto <ph name="USER_EMAIL_ADDRESS" /> valikute menüü</translation>
 <translation id="8406981827175133772">Täisekraani luup</translation>
@@ -443,6 +446,7 @@
 <translation id="8938800817013097409">C-tüüpi USB-seade (parempoolne port taga)</translation>
 <translation id="8940956008527784070">Aku tühjeneb (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Kiirkäivitus</translation>
+<translation id="899350903320462459">Märguandetoimingu tegemiseks avage seade kontoga <ph name="LOGIN_ID" /></translation>
 <translation id="8995603266996330174">Haldaja: <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Saadaval on Adobe Flash Playeri värskendus</translation>
 <translation id="9056839673611986238">Seade viiakse vanemale versioonile</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index 1328a90..30b3d3e 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">راست</translation>
 <translation id="1351937230027495976">کوچک کردن منو</translation>
 <translation id="1383876407941801731">جستجو</translation>
+<translation id="1419738280318246476">برای اجرای کنش اعلان، قفل دستگاه را باز کنید</translation>
 <translation id="1467432559032391204">چپ</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">راه‌انداز</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">این دستگاه توسط <ph name="DOMAIN" /> مدیریت می‌شود.</translation>
 <translation id="2050339315714019657">عمودی</translation>
 <translation id="2067602449040652523">روشنایی صفحه‌کلید</translation>
-<translation id="2075212959500165896">تلاش‌های ناموفق خیلی زیادی داشتید. بعداً دوباره امتحان کنید.</translation>
 <translation id="2081529251031312395">$1 همچنان می‌تواند بعداً به سیستم وارد شود.</translation>
 <translation id="2127372758936585790">شارژر برق ضعیف</translation>
 <translation id="2135456203358955318">ذره‌بین متصل</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">در ورود چندگانه به سیستم، می‌توانید حداکثر از <ph name="MULTI_PROFILE_USER_LIMIT" /> حساب استفاده کنید.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{متصل به یک دستگاه.}one{متصل به # دستگاه}other{متصل به # دستگاه}}</translation>
 <translation id="3236488194889173876">هیچ شبکه تلفن همراهی دردسترس نیست</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">مهمان</translation>
 <translation id="332587331255250389">لطفاً باتری را تعویض کنید</translation>
 <translation id="3351879221545518001">درحال ارسال محتوای صفحه هستید.</translation>
@@ -227,6 +226,7 @@
 <translation id="4924411785043111640">بازراه‌اندازی و بازنشانی</translation>
 <translation id="4961318399572185831">فرستادن صفحه</translation>
 <translation id="5069971504769299223">ممکن است مدیر دستگاه بر فعالیتتان نظارت داشته باشد.</translation>
+<translation id="5083553833479578423">باز کردن قفل ویژگی‌های بیشتری از «دستیار».</translation>
 <translation id="5136175204352732067">صفحه‌کلید دیگری متصل شد</translation>
 <translation id="5168181903108465623">دستگاه‌های فرستادن موجود هستند</translation>
 <translation id="5207949376430453814">برجسته کردن هشتک نوشتار</translation>
@@ -298,6 +298,7 @@
 <translation id="6376931439017688372">بلوتوث روشن است</translation>
 <translation id="639644700271529076">‏CAPS LOCK خاموش است</translation>
 <translation id="6406704438230478924">دگرساز راست</translation>
+<translation id="642644398083277086">پاک کردن همه اعلان‌ها</translation>
 <translation id="643147933154517414">کاملاً انجام شد</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> به <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">عدم پذیرش</translation>
@@ -399,9 +400,11 @@
 <translation id="8152119955266188852">میان‌بر مربوط به ذره‌بین تمام‌صفحه را فشار دادید. می‌خواهید آن را روشن کنید؟</translation>
 <translation id="8190698733819146287">سفارشی کردن زبان‌ها و ورودی...</translation>
 <translation id="8191230140820435481">مدیریت برنامه‌ها، افزونه‌ها و طرح‌های زمینه</translation>
+<translation id="8192202700944119416">اعلان‌ها پنهان شده است.</translation>
 <translation id="8261506727792406068">حذف</translation>
 <translation id="8297006494302853456">ضعیف</translation>
 <translation id="8308637677604853869">منوی قبلی</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">یادداشت ایجاد کنید</translation>
 <translation id="8392451568018454956">منوی گزینه‌ها برای <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">ذره‌بین تمام‌صفحه</translation>
@@ -443,6 +446,7 @@
 <translation id="8938800817013097409">‏دستگاه USB-C (درگاه عقب سمت راست)</translation>
 <translation id="8940956008527784070">باتری ضعیف است (<ph name="PERCENTAGE" />٪)</translation>
 <translation id="8984179138335769204">راه‌اندازی سریع</translation>
+<translation id="899350903320462459">به‌عنوان <ph name="LOGIN_ID" />، قفل دستگاه را باز کنید تا کنش اعلان اجرا شود</translation>
 <translation id="8995603266996330174">مدیریت شده توسط <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">‏به‌روزرسانی Adobe Flash Player دردسترس است</translation>
 <translation id="9056839673611986238">دستگاه عقب‌گرد می‌کند</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb
index 9e24448f..fcfbc9d 100644
--- a/ash/strings/ash_strings_fi.xtb
+++ b/ash/strings/ash_strings_fi.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">Tätä laitetta hallinnoi <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Pystysuunta</translation>
 <translation id="2067602449040652523">Näppäimistön kirkkaus</translation>
-<translation id="2075212959500165896">Liian monta yritystä. Yritä myöhemmin uudelleen.</translation>
 <translation id="2081529251031312395">$1 voi silti kirjautua sisään myöhemmin.</translation>
 <translation id="2127372758936585790">Pienitehoinen laturi</translation>
 <translation id="2135456203358955318">Kiinnitetty suurennus</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">Voit lisätä enintään <ph name="MULTI_PROFILE_USER_LIMIT" /> tiliä useille tileille kirjautumista varten.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Yhdistetty 1 laitteeseen}other{Yhdistetty # laitteeseen}}</translation>
 <translation id="3236488194889173876">Mobiiliverkkoja ei ole käytettävissä</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Vieras</translation>
 <translation id="332587331255250389">Vaihda paristo.</translation>
 <translation id="3351879221545518001">Suoratoistat tällä hetkellä näyttöä.</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index 621469970..0bb6bd0f 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">Pinamamahalaan ng <ph name="DOMAIN" /> ang device na ito.</translation>
 <translation id="2050339315714019657">Portrait</translation>
 <translation id="2067602449040652523">Liwanag ng keyboard</translation>
-<translation id="2075212959500165896">Masyadong maraming beses sumubok. Subukang muli sa ibang pagkakataon.</translation>
 <translation id="2081529251031312395">Maaari pa ring mag-sign in si $1 sa ibang pagkakataon.</translation>
 <translation id="2127372758936585790">Low-power charger</translation>
 <translation id="2135456203358955318">Naka-dock na magnifier</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">Maaari ka lang magkaroon ng hanggang <ph name="MULTI_PROFILE_USER_LIMIT" /> (na) account sa maraming pag-sign in.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Nakakonekta sa isang device}one{Nakakonekta sa # device}other{Nakakonekta sa # na device}}</translation>
 <translation id="3236488194889173876">Walang available na mobile network</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Bisita</translation>
 <translation id="332587331255250389">Pakipalitan ang baterya</translation>
 <translation id="3351879221545518001">Kasalukuyan kang nagka-cast ng screen.</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index 2588ecf9..fb13d0b9 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Vers la droite</translation>
 <translation id="1351937230027495976">Réduire le menu</translation>
 <translation id="1383876407941801731">Rechercher</translation>
+<translation id="1419738280318246476">Déverrouiller l'appareil pour effectuer l'action de notification</translation>
 <translation id="1467432559032391204">Vers la gauche</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Lanceur d'applications</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Cet appareil est géré par <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Portrait</translation>
 <translation id="2067602449040652523">Luminosité du clavier</translation>
-<translation id="2075212959500165896">Trop de tentatives. Réessayez plus tard.</translation>
 <translation id="2081529251031312395">$1 pourra toujours se connecter plus tard.</translation>
 <translation id="2127372758936585790">Chargeur de faible puissance</translation>
 <translation id="2135456203358955318">Loupe ancrée</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Vous ne pouvez vous connecter qu'à <ph name="MULTI_PROFILE_USER_LIMIT" /> comptes au maximum dans le cadre de la connexion multicompte.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Connecté à un appareil}one{Connecté à # appareil}other{Connecté à # appareils}}</translation>
 <translation id="3236488194889173876">Aucun réseau mobile disponible</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Invité</translation>
 <translation id="332587331255250389">Veuillez remplacer la batterie</translation>
 <translation id="3351879221545518001">Vous êtes actuellement en train de caster l'écran.</translation>
@@ -227,6 +226,7 @@
 <translation id="4924411785043111640">Redémarrer et réinitialiser</translation>
 <translation id="4961318399572185831">Diffuser l'écran</translation>
 <translation id="5069971504769299223">Il est possible que le gestionnaire de l'appareil puisse surveiller votre activité.</translation>
+<translation id="5083553833479578423">Déverrouiller plus de fonctionnalités de l'Assistant.</translation>
 <translation id="5136175204352732067">Clavier différent branché</translation>
 <translation id="5168181903108465623">Appareils Cast disponibles</translation>
 <translation id="5207949376430453814">Mettre le curseur de texte en surbrillance</translation>
@@ -298,6 +298,7 @@
 <translation id="6376931439017688372">Bluetooth activé</translation>
 <translation id="639644700271529076">La touche de verrouillage des majuscules est désactivée.</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Effacer toutes les notifications</translation>
 <translation id="643147933154517414">Terminé</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> vers <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Refuser</translation>
@@ -399,9 +400,11 @@
 <translation id="8152119955266188852">Vous avez utilisé le raccourci de la loupe plein écran. Voulez-vous l'activer ?</translation>
 <translation id="8190698733819146287">Personnaliser les langues et la saisie...</translation>
 <translation id="8191230140820435481">Gérer vos applications, vos extensions et vos thèmes</translation>
+<translation id="8192202700944119416">Les notifications sont masquées.</translation>
 <translation id="8261506727792406068">Supprimer</translation>
 <translation id="8297006494302853456">Faible</translation>
 <translation id="8308637677604853869">Menu précédent</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Créer une note</translation>
 <translation id="8392451568018454956">Menu "Options" de l'adresse e-mail <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Loupe plein écran</translation>
@@ -443,6 +446,7 @@
 <translation id="8938800817013097409">Appareil USB de type C (port situé sur l'arrière de l'appareil, à droite)</translation>
 <translation id="8940956008527784070">Batterie faible (<ph name="PERCENTAGE" /> %)</translation>
 <translation id="8984179138335769204">Lancement rapide</translation>
+<translation id="899350903320462459">Déverrouiller l'appareil en tant que <ph name="LOGIN_ID" /> pour effectuer l'action de notification</translation>
 <translation id="8995603266996330174">Géré par <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Mise à jour Adobe Flash Player disponible</translation>
 <translation id="9056839673611986238">L'appareil va être rétabli</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb
index 8646167..3be4724c 100644
--- a/ash/strings/ash_strings_gu.xtb
+++ b/ash/strings/ash_strings_gu.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">આ ઉપકરણને <ph name="DOMAIN" /> દ્વારા મેનેજ કરવામાં આવેલું છે.</translation>
 <translation id="2050339315714019657">પોર્ટ્રેટ</translation>
 <translation id="2067602449040652523">કીબોર્ડનું તેજ</translation>
-<translation id="2075212959500165896">ઘણા બધા પ્રયત્નો કર્યા. થોડા સમય પછી ફરી પ્રયાસ કરો.</translation>
 <translation id="2081529251031312395">$1 હજુ થોડા સમય પછી સાઇન ઇન કરી શકશે.</translation>
 <translation id="2127372758936585790">નિમ્ન-પાવર ચાર્જર</translation>
 <translation id="2135456203358955318">ડૉક કરેલ મૅગ્નિફાયર</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">તમે એકથી વધુ સાઇન ઇનમાં માત્ર <ph name="MULTI_PROFILE_USER_LIMIT" /> સુધી એકાઉન્ટ રાખી શકો છો.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{ઉપકરણ સાથે કનેક્ટ કર્યું}one{# ઉપકરણો સાથે કનેક્ટ કર્યું}other{# ઉપકરણો સાથે કનેક્ટ કર્યું}}</translation>
 <translation id="3236488194889173876">કોઈ મોબાઇલ નેટવર્ક ઉપલબ્ધ નથી</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">અતિથિ</translation>
 <translation id="332587331255250389">કૃપા કરીને બૅટરી બદલો</translation>
 <translation id="3351879221545518001">તમે હાલમાં સ્ક્રીનને કાસ્ટ કરી રહ્યા છો.</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index a5d08a7f..34b2239b 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">दाएं</translation>
 <translation id="1351937230027495976">मेन्यू छोटा करें</translation>
 <translation id="1383876407941801731">खोज</translation>
+<translation id="1419738280318246476">सूचना से जुड़ी कार्रवाई करने के लिए डिवाइस को अनलॉक करें</translation>
 <translation id="1467432559032391204">बाएं</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">लॉन्चर</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">यह डिवाइस <ph name="DOMAIN" /> द्वारा प्रबंधित है.</translation>
 <translation id="2050339315714019657">पोर्ट्रेट</translation>
 <translation id="2067602449040652523">कीबोर्ड की रोशनी</translation>
-<translation id="2075212959500165896">कई बार कोशिश की गई. बाद में कोशिश करें.</translation>
 <translation id="2081529251031312395">$1 अभी भी बाद में साइन इन कर सकता है.</translation>
 <translation id="2127372758936585790">कम-शक्ति वाला चार्जर</translation>
 <translation id="2135456203358955318">सामग्री को बड़ा दिखाने की डॉक की गई सुविधा</translation>
@@ -88,7 +88,7 @@
 <translation id="2359808026110333948">जारी रखें</translation>
 <translation id="2365393535144473978">मोबाइल डेटा सक्षम करने से ब्लूटूथ सक्षम हो जाएगा.</translation>
 <translation id="2391579633712104609">180°</translation>
-<translation id="239188844683466770">परेशान न करें को टॉगल करें</translation>
+<translation id="239188844683466770">'परेशान न करें' को टॉगल करें</translation>
 <translation id="2412593942846481727">अपडेट मौजूद है</translation>
 <translation id="2416346634399901812"><ph name="NETWORK_NAME" /> से कनेक्ट है</translation>
 <translation id="2429753432712299108">ब्लूटूथ डिवाइस "<ph name="DEVICE_NAME" />" युग्मित करने की अनुमति चाहता है. स्वीकार करने से पहले, कृपया दुबारा पूछें कि यह पासकुंजी उस डिवाइस पर दिखाई जा रही है: <ph name="PASSKEY" /></translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">एक से ज़्यादा साइन-इन की सुविधा में आपके पास ज़्यादा से ज़्यादा <ph name="MULTI_PROFILE_USER_LIMIT" /> खाते हो सकते हैं.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{किसी डिवाइस से कनेक्ट है}one{# डिवाइस से कनेक्ट है}other{# डिवाइस से कनेक्ट है}}</translation>
 <translation id="3236488194889173876">कोई मोबाइल नेटवर्क उपलब्ध नहीं</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">अतिथि</translation>
 <translation id="332587331255250389">कृपया बैटरी बदलें</translation>
 <translation id="3351879221545518001">आप इस समय स्क्रीन कास्ट कर रहे हैं.</translation>
@@ -227,6 +226,7 @@
 <translation id="4924411785043111640">रीस्टार्ट करें और रीसेट करें</translation>
 <translation id="4961318399572185831">स्‍क्रीन कास्‍ट करें</translation>
 <translation id="5069971504769299223">डिवाइस का एडमिन आपकी गतिविधि मॉनीटर कर सकता है.</translation>
+<translation id="5083553833479578423">Assistant की और भी सुविधाओं के बारे में जानें.</translation>
 <translation id="5136175204352732067">अलग कीबोर्ड कनेक्ट किया गया</translation>
 <translation id="5168181903108465623">कास्ट डिवाइस उपलब्ध हैं</translation>
 <translation id="5207949376430453814">लेख कैरेट हाइलाइट करें</translation>
@@ -298,6 +298,7 @@
 <translation id="6376931439017688372">ब्लूटूथ चालू है</translation>
 <translation id="639644700271529076">CAPS LOCK बंद है</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">सभी सूचनाएं हटाएं</translation>
 <translation id="643147933154517414">सभी पूरे हो गए</translation>
 <translation id="6445835306623867477"><ph name="RECEIVER_NAME" /> पर <ph name="ROUTE_TITLE" /></translation>
 <translation id="6452181791372256707">अस्‍वीकार करें</translation>
@@ -399,9 +400,11 @@
 <translation id="8152119955266188852">आपने 'सामग्री को फ़ुल-स्क्रीन पर बड़ा दिखाने वाली सेवा' का शॉर्टकट दबाया है. क्या आप इसे चालू करना चाहते हैं?</translation>
 <translation id="8190698733819146287">भाषाएं और इनपुट कस्टमाइज़ करें...</translation>
 <translation id="8191230140820435481">अपने ऐप्स , एक्सटेंशन, और थीम प्रबंधित करें</translation>
+<translation id="8192202700944119416">सूचनाएं छिपी हुई हैं.</translation>
 <translation id="8261506727792406068">हटाएं</translation>
 <translation id="8297006494302853456">कमज़ोर</translation>
 <translation id="8308637677604853869">पिछला मेनू</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">नोट बनाएं</translation>
 <translation id="8392451568018454956"><ph name="USER_EMAIL_ADDRESS" /> के लिए विकल्प मेनू</translation>
 <translation id="8406981827175133772">फ़ुलस्क्रीन पर सामग्री को बड़ा दिखाने की सुविधा</translation>
@@ -434,7 +437,7 @@
 <translation id="8825534185036233643">दो से अधिक प्रदर्शनों की मिररिंग समर्थित नहीं है.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">वापस जाएं बटन</translation>
-<translation id="8843682306134542540">रोटेशन लॉक टॉगल करें. <ph name="STATE_TEXT" /></translation>
+<translation id="8843682306134542540">रोटेशन लॉक को टॉगल करें. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">ऐप दो-स्क्रीन मोड में काम नहीं करता है.</translation>
 <translation id="8874184842967597500">कनेक्ट नहीं है</translation>
@@ -443,6 +446,7 @@
 <translation id="8938800817013097409">USB-C डिवाइस (पीछे की ओर दायां पोर्ट)</translation>
 <translation id="8940956008527784070">बैटरी कम (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">झटपट लॉन्च</translation>
+<translation id="899350903320462459">सूचना से जुड़ी कार्रवाई करने के लिए डिवाइस को <ph name="LOGIN_ID" /> के तौर पर अनलॉक करें</translation>
 <translation id="8995603266996330174"><ph name="DOMAIN" /> द्वारा प्रबंधित</translation>
 <translation id="9029474291399787231">Adobe Flash Player का अपडेट मौजूद है</translation>
 <translation id="9056839673611986238">डिवाइस बहाल कर दिया जाएगा</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb
index cb7cf14..fb5d32a 100644
--- a/ash/strings/ash_strings_hr.xtb
+++ b/ash/strings/ash_strings_hr.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Udesno</translation>
 <translation id="1351937230027495976">Sažmi izbornik</translation>
 <translation id="1383876407941801731">Traži</translation>
+<translation id="1419738280318246476">Otključajte uređaj za izvršenje radnje obavijesti</translation>
 <translation id="1467432559032391204">Ulijevo</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Pokretač</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Ovim uređajem upravlja <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Portret</translation>
 <translation id="2067602449040652523">Svjetlina tipkovnice</translation>
-<translation id="2075212959500165896">Previše pokušaja. Pokušajte ponovo kasnije.</translation>
 <translation id="2081529251031312395">Korisnik $1 može se prijaviti i kasnije.</translation>
 <translation id="2127372758936585790">Punjač male snage</translation>
 <translation id="2135456203358955318">Usidreno povećalo</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">U višestrukoj prijavi ne možete imati više od <ph name="MULTI_PROFILE_USER_LIMIT" /> računa.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Povezano s jednim uređajem}one{Povezano s # uređajem}few{Povezano s # uređaja}other{Povezano s # uređaja}}</translation>
 <translation id="3236488194889173876">Mobilne mreže nisu dostupne</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gost</translation>
 <translation id="332587331255250389">Zamijenite bateriju</translation>
 <translation id="3351879221545518001">Trenutačno emitirate zaslon.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Ponovo pokreni i vrati na prethodno</translation>
 <translation id="4961318399572185831">Emitiranje zaslona</translation>
 <translation id="5069971504769299223">Upravitelj uređaja možda će moći nadzirati vašu aktivnost.</translation>
+<translation id="5083553833479578423">Otključajte više značajki Asistenta.</translation>
 <translation id="5136175204352732067">Povezana je neka druga tipkovnica</translation>
 <translation id="5168181903108465623">Dostupni su uređaji za emitiranje</translation>
 <translation id="5207949376430453814">Istakni znak za umetanje teksta</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Bluetooth je uključen</translation>
 <translation id="639644700271529076">Tipka CAPS LOCK isključena</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Brisanje svih obavijesti</translation>
 <translation id="643147933154517414">Dovršeno</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> na uređaju <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Odbaci</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Pritisnuli ste prečac za povećalo za cijeli zaslon. Želite li ga uključiti?</translation>
 <translation id="8190698733819146287">Prilagodi jezike i unos...</translation>
 <translation id="8191230140820435481">upravljati vašim aplikacijama, proširenjima i temama</translation>
+<translation id="8192202700944119416">Obavijesti su skrivene.</translation>
 <translation id="8261506727792406068">Izbriši</translation>
 <translation id="8297006494302853456">Slab</translation>
 <translation id="8308637677604853869">Prethodni izbornik</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Izrada bilješke</translation>
 <translation id="8392451568018454956">Izbornik opcija za korisnika <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Povećalo za cijeli zaslon</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">USB-C uređaj (desni priključak sa stražnje strane)</translation>
 <translation id="8940956008527784070">Baterija je skoro prazna (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Brzo pokretanje</translation>
+<translation id="899350903320462459">Otključajte uređaj kao <ph name="LOGIN_ID" /> za izvršenje radnje obavijesti.</translation>
 <translation id="8995603266996330174">Upravlja <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Dostupno je ažuriranje za Adobe Flash Player</translation>
 <translation id="9056839673611986238">Uređaj će se vratiti na prethodnu verziju sustava</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb
index 4f7eb260..2f1d5f5e 100644
--- a/ash/strings/ash_strings_hu.xtb
+++ b/ash/strings/ash_strings_hu.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">Ezt az eszközt a(z) <ph name="DOMAIN" /> domain kezeli.</translation>
 <translation id="2050339315714019657">Álló</translation>
 <translation id="2067602449040652523">Billentyűzet világossága</translation>
-<translation id="2075212959500165896">Túl sok próbálkozás. Próbálja újra később.</translation>
 <translation id="2081529251031312395">$1 később be tud jelentkezni.</translation>
 <translation id="2127372758936585790">Kis teljesítményű töltő</translation>
 <translation id="2135456203358955318">Dokkolt nagyító</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">Legfeljebb <ph name="MULTI_PROFILE_USER_LIMIT" /> fiókot használhat a többfiókos bejelentkezés során.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Egy eszközhöz csatlakoztatva}other{# eszközhöz csatlakoztatva}}</translation>
 <translation id="3236488194889173876">Nem áll rendelkezésre mobilhálózat</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Vendég</translation>
 <translation id="332587331255250389">Cserélje ki az akkumulátort</translation>
 <translation id="3351879221545518001">Folyamatban van a képernyő átküldése.</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index 37e583eb..39bad4b7 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Kanan</translation>
 <translation id="1351937230027495976">Ciutkan menu</translation>
 <translation id="1383876407941801731">Telusuri</translation>
+<translation id="1419738280318246476">Buka kunci perangkat untuk melakukan tindakan notifikasi</translation>
 <translation id="1467432559032391204">Kiri</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Peluncur</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Perangkat ini dikelola oleh <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Potret</translation>
 <translation id="2067602449040652523">Kecerahan keyboard</translation>
-<translation id="2075212959500165896">Terlalu banyak upaya yang gagal. Coba lagi nanti.</translation>
 <translation id="2081529251031312395">$1 tetap dapat login nanti.</translation>
 <translation id="2127372758936585790">Pengisi daya rendah</translation>
 <translation id="2135456203358955318">Kaca pembesar yang dipasang ke dok</translation>
@@ -138,9 +138,8 @@
 <translation id="315116470104423982">Data seluler</translation>
 <translation id="3151786313568798007">Orientasi</translation>
 <translation id="3153444934357957346">Anda hanya dapat memiliki maksimum <ph name="MULTI_PROFILE_USER_LIMIT" /> akun dalam fitur login multipel.</translation>
-<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Tersambung ke 1 perangkat}other{Tersambung ke # perangkat}}</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Tersambung ke satu perangkat}other{Tersambung ke # perangkat}}</translation>
 <translation id="3236488194889173876">Jaringan seluler tidak tersedia</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Tamu</translation>
 <translation id="332587331255250389">Harap ganti baterai</translation>
 <translation id="3351879221545518001">Anda sedang mentransmisi layar.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Mulai ulang dan setel ulang</translation>
 <translation id="4961318399572185831">Transmisikan layar</translation>
 <translation id="5069971504769299223">Pengelola perangkat mungkin dapat memantau aktivitas Anda.</translation>
+<translation id="5083553833479578423">Dapatkan lebih banyak fitur Asisten.</translation>
 <translation id="5136175204352732067">Keyboard yang berbeda terhubung</translation>
 <translation id="5168181903108465623">Perangkat transmisi tersedia</translation>
 <translation id="5207949376430453814">Sorot tempat penyisipan teks</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Bluetooth aktif</translation>
 <translation id="639644700271529076">CAPS LOCK tidak aktif</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Hapus semua notifikasi</translation>
 <translation id="643147933154517414">Selesai</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> di <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Tolak</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Anda menekan pintasan untuk kaca pembesar layar penuh. Ingin mengaktifkannya?</translation>
 <translation id="8190698733819146287">Sesuaikan bahasa dan masukan...</translation>
 <translation id="8191230140820435481">Mengelola aplikasi, ekstensi, dan tema Anda</translation>
+<translation id="8192202700944119416">Notifikasi disembunyikan.</translation>
 <translation id="8261506727792406068">Hapus</translation>
 <translation id="8297006494302853456">Lemah</translation>
 <translation id="8308637677604853869">Menu sebelumnya</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Buat catatan</translation>
 <translation id="8392451568018454956">Menu opsi untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Kaca Pembesar Layar Penuh</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">Perangkat USB-C (port belakang sebelah kanan)</translation>
 <translation id="8940956008527784070">Baterai lemah (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Quick launch</translation>
+<translation id="899350903320462459">Buka kunci perangkat sebagai <ph name="LOGIN_ID" /> untuk melakukan tindakan notifikasi</translation>
 <translation id="8995603266996330174">Dikelola menurut <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Update Adobe Flash Player tersedia</translation>
 <translation id="9056839673611986238">Perangkat akan dipulihkan</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb
index 91a3755..c37995f 100644
--- a/ash/strings/ash_strings_it.xtb
+++ b/ash/strings/ash_strings_it.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Destra</translation>
 <translation id="1351937230027495976">Comprimi il menu</translation>
 <translation id="1383876407941801731">Cerca</translation>
+<translation id="1419738280318246476">Sblocca il dispositivo per eseguire l'azione di notifica</translation>
 <translation id="1467432559032391204">Sinistra</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Avvio applicazioni</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Questo dispositivo è gestito da <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Verticale</translation>
 <translation id="2067602449040652523">Luminosità della tastiera</translation>
-<translation id="2075212959500165896">Troppi tentativi. Riprova più tardi.</translation>
 <translation id="2081529251031312395">$1 può accedere in seguito.</translation>
 <translation id="2127372758936585790">Caricabatterie a basso consumo</translation>
 <translation id="2135456203358955318">Lente d'ingrandimento ancorata</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Puoi avere massimo <ph name="MULTI_PROFILE_USER_LIMIT" /> account per l'accesso simultaneo.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Connesso a un dispositivo}other{Connesso a # dispositivi}}</translation>
 <translation id="3236488194889173876">Nessuna rete mobile disponibile</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Ospite</translation>
 <translation id="332587331255250389">Sostituisci la batteria</translation>
 <translation id="3351879221545518001">Al momento stai trasmettendo lo schermo.</translation>
@@ -227,6 +226,7 @@
 <translation id="4924411785043111640">Riavvia e reimposta</translation>
 <translation id="4961318399572185831">Trasmetti schermo</translation>
 <translation id="5069971504769299223">L'amministratore del dispositivo potrebbe essere in grado di monitorare le tue attività.</translation>
+<translation id="5083553833479578423">Sblocca altre funzioni dell'assistente.</translation>
 <translation id="5136175204352732067">Tastiera diversa collegata</translation>
 <translation id="5168181903108465623">Dispositivi di trasmissione disponibili</translation>
 <translation id="5207949376430453814">Evidenzia il cursore di testo</translation>
@@ -298,6 +298,7 @@
 <translation id="6376931439017688372">Bluetooth attivo</translation>
 <translation id="639644700271529076">Funzione BLOC MAIUSC non attiva</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Cancella tutte le notifiche</translation>
 <translation id="643147933154517414">Operazioni completate</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> su <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Rifiuto</translation>
@@ -399,9 +400,11 @@
 <translation id="8152119955266188852">Hai premuto la scorciatoia per la lente d'ingrandimento a schermo intero. Vuoi attivarla?</translation>
 <translation id="8190698733819146287">Personalizza lingue e immissione...</translation>
 <translation id="8191230140820435481">Gestire applicazioni, estensioni e temi</translation>
+<translation id="8192202700944119416">Le notifiche sono nascoste.</translation>
 <translation id="8261506727792406068">Elimina</translation>
 <translation id="8297006494302853456">Debole</translation>
 <translation id="8308637677604853869">Menu precedente</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Crea nota</translation>
 <translation id="8392451568018454956">Menu Opzioni per <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Lente d'ingrandimento a schermo intero</translation>
@@ -443,6 +446,7 @@
 <translation id="8938800817013097409">Dispositivo USB-C (porta posteriore destra)</translation>
 <translation id="8940956008527784070">Batteria in esaurimento (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Avvio rapido</translation>
+<translation id="899350903320462459">Sblocca il dispositivo con l'account <ph name="LOGIN_ID" /> per eseguire l'azione di notifica</translation>
 <translation id="8995603266996330174">Gestito da <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Aggiornamento di Adobe Flash Player disponibile</translation>
 <translation id="9056839673611986238">Verrà eseguito il rollback del dispositivo</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index 3a7b6e7..27b24e4 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -34,7 +34,7 @@
 <translation id="15373452373711364">סמן עכבר גדול</translation>
 <translation id="1550523713251050646">לחץ לקבלת אפשרויות נוספות</translation>
 <translation id="1567387640189251553">חוברה מקלדת אחרת מאז שהזנת את הסיסמה בפעם האחרונה. ייתכן שהיא מנסה לתעד את ההקשות שלך.</translation>
-<translation id="1570871743947603115">‏החלפת מצב Bluetooth. <ph name="STATE_TEXT" /></translation>
+<translation id="1570871743947603115">‏הפעלה או השבתה של Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">הסר את המשתמש הזה</translation>
 <translation id="1621499497873603021">הזמן שנותר עד להתרוקנות הסוללה, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">מצטערים, עדיין אי אפשר לאמת את הסיסמה שלך. חשוב לדעת: אם שינית לאחרונה את הסיסמה, הסיסמה החדשה תיכנס לתוקף רק אחרי יציאה מהחשבון. צריך להשתמש כאן בסיסמה הישנה.</translation>
@@ -44,7 +44,7 @@
 <translation id="1743570585616704562">לא מזוהה</translation>
 <translation id="1746730358044914197">מנהל המערכת שלך מגדיר את שיטות הקלט.</translation>
 <translation id="1747827819627189109">המקלדת שמופיעה במסך מופעלת</translation>
-<translation id="1761222317188459878">החלפת מצב החיבור לרשת. <ph name="STATE_TEXT" /></translation>
+<translation id="1761222317188459878">הפעלה או השבתה של החיבור לרשת. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">אתרנט: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">‏Assistant (בטעינה...)</translation>
 <translation id="1841545962859478868">ייתכן שמנהל המכשיר עוקב אחרי:</translation>
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">מכשיר זה מנוהל על ידי <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">לאורך</translation>
 <translation id="2067602449040652523">בהירות מקלדת</translation>
-<translation id="2075212959500165896">יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר.</translation>
 <translation id="2081529251031312395">ל-$1 עדיין תהיה אפשרות להיכנס מאוחר יותר.</translation>
 <translation id="2127372758936585790">מטען בעל מתח נמוך</translation>
 <translation id="2135456203358955318">מגדיל במצב מעוגן</translation>
@@ -88,7 +87,7 @@
 <translation id="2359808026110333948">המשך</translation>
 <translation id="2365393535144473978">‏כשמפעילים את חבילת הגלישה, מופעלת גם תקשורת Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
-<translation id="239188844683466770">החלפת המצב של 'נא לא להפריע'</translation>
+<translation id="239188844683466770">הפעלה או השבתה של מצב 'נא לא להפריע'</translation>
 <translation id="2412593942846481727">יש עדכון זמין</translation>
 <translation id="2416346634399901812">יש חיבור אל <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">‏מכשיר ה-Bluetooth ‏"<ph name="DEVICE_NAME" />" מבקש הרשאה לבצע התאמה. לפני שתאשר, ודא שמפתח הסיסמה הבא מוצג במכשיר הזה: <ph name="PASSKEY" /></translation>
@@ -123,7 +122,7 @@
 <translation id="2946119680249604491">הוסף חיבור</translation>
 <translation id="2961963223658824723">משהו השתבש. אפשר לנסות שוב בעוד כמה שניות.</translation>
 <translation id="2963773877003373896">mod3</translation>
-<translation id="2995447421581609334">‏צפייה במכשירי CAST.</translation>
+<translation id="2995447421581609334">‏צפייה במכשירי Cast.</translation>
 <translation id="2996462380875591307">‏הזכוכית המגדלת במצב עגינה הופעלה. כדי לכבות אותה, יש להקיש שוב על Ctrl+Search+D.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> היא הפעלה ציבורית המנוהלת על ידי <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">אודיו במונו</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">אפשר לכלול עד <ph name="MULTI_PROFILE_USER_LIMIT" /> חשבונות בכניסה עם מספר חשבונות.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{מחובר למכשיר אחד}two{מחובר ל-# מכשירים}many{מחובר ל-# מכשירים}other{מחובר ל-# מכשירים}}</translation>
 <translation id="3236488194889173876">אין רשת סלולרית זמינה</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">אורח</translation>
 <translation id="332587331255250389">יש להחליף את הסוללה</translation>
 <translation id="3351879221545518001">מתבצעת עכשיו העברה של מסך.</translation>
@@ -435,7 +433,7 @@
 <translation id="8825534185036233643">אין תמיכה בשיקוף מסך עם יותר משני מסכים.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">לחצן 'הקודם'</translation>
-<translation id="8843682306134542540">החלפת המצב של נעילת הסיבוב. <ph name="STATE_TEXT" /></translation>
+<translation id="8843682306134542540">הפעלה או השבתה של נעילת הסיבוב. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">האפליקציה אינה תומכת במסך מפוצל.</translation>
 <translation id="8874184842967597500">לא מחובר</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index adf8289..a1ee2234 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">この端末は <ph name="DOMAIN" /> によって管理されています。</translation>
 <translation id="2050339315714019657">縦</translation>
 <translation id="2067602449040652523">キーボードの明るさ</translation>
-<translation id="2075212959500165896">試行回数が上限を超えました。しばらくしてからもう一度お試しください。</translation>
 <translation id="2081529251031312395">$1 が後でログインすることは引き続き可能です。</translation>
 <translation id="2127372758936585790">低電力の充電器</translation>
 <translation id="2135456203358955318">拡大鏡(ドッキング)</translation>
@@ -138,9 +137,8 @@
 <translation id="315116470104423982">モバイル データ</translation>
 <translation id="3151786313568798007">向き</translation>
 <translation id="3153444934357957346">マルチログインに使用できるのは <ph name="MULTI_PROFILE_USER_LIMIT" /> アカウントまでです。</translation>
-<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{1 個のデバイスと接続されています}other{# 個のデバイスと接続されています}}</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{1 台のデバイスと接続されています}other{# 台のデバイスと接続されています}}</translation>
 <translation id="3236488194889173876">利用できるモバイル ネットワークがありません</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">ゲスト</translation>
 <translation id="332587331255250389">バッテリーを交換してください</translation>
 <translation id="3351879221545518001">現在、画面をキャストしています。</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb
index 08a608d..0594957 100644
--- a/ash/strings/ash_strings_kn.xtb
+++ b/ash/strings/ash_strings_kn.xtb
@@ -21,7 +21,7 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">ದುರ್ಬಲ ಸಿಗ್ನಲ್</translation>
 <translation id="1293264513303784526">USB-C ಸಾಧನ (ಎಡ ಪೋರ್ಟ್)</translation>
-<translation id="1302880136325416935">ಬ್ಲೂಟೂತ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸಿ.<ph name="STATE_TEXT" /></translation>
+<translation id="1302880136325416935">ಬ್ಲೂಟೂತ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸಿ. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">ಬಲಕ್ಕೆ</translation>
 <translation id="1351937230027495976">ಮೆನುವನ್ನು ಕುಗ್ಗಿಸಿ</translation>
 <translation id="1383876407941801731">ಹುಡುಕಾಟ</translation>
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">ಈ ಸಾಧನವು <ph name="DOMAIN" /> ನಿಂದ ನಿರ್ವಹಿಸಲ್ಪಟ್ಟಿದೆ.</translation>
 <translation id="2050339315714019657">ಪೋಟ್ರೇಟ್</translation>
 <translation id="2067602449040652523">ಕೀಬೋರ್ಡ್ ಪ್ರಖರತೆ</translation>
-<translation id="2075212959500165896">ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="2081529251031312395">$1 ಆನಂತರವೂ ಸೈನ್ ಇನ್ ಮಾಡಬಹುದು.</translation>
 <translation id="2127372758936585790">ಕಡಿಮೆ ವಿದ್ಯುತ್ ಚಾರ್ಜರ್</translation>
 <translation id="2135456203358955318">ಡಾಕ್‌‌ ಮಾಡಿರುವ ವರ್ಧಕ</translation>
@@ -82,7 +81,7 @@
 <translation id="2303600792989757991">ಟಾಗಲ್ ವಿಂಡೋ ಅವಲೋಕನ</translation>
 <translation id="2338501278241028356">ಸಮೀಪದ ಸಾಧನಗಳನ್ನು ಅನ್ವೇಷಿಸಲು ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಿ</translation>
 <translation id="2339073806695260576">ಟಿಪ್ಪಣಿ, ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲು, ಲೇಸರ್‌ ಪಾಯಿಂಟರ್ ಬಳಸಲು ಅಥವಾ ಭೂತಗನ್ನಡಿ ಬಳಸಲು ಶೆಲ್ಫ್‌ನಲ್ಲಿ ಸ್ಟೈಲಸ್ ಬಟನ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ.</translation>
-<translation id="2341729377289034582">ಪರದೆಯು ವರ್ಟಿಕಲ್ ಆಗಿ ತೋರುವಂತೆ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ</translation>
+<translation id="2341729377289034582">ಪರದೆಯು ಲಂಬವಾಗಿ ತೋರುವಂತೆ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="2352467521400612932">ಸ್ಟೈಲಸ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="2354174487190027830"><ph name="NAME" /> ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="2359808026110333948">ಮುಂದುವರಿಸು</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">ಹಲವು ಪ್ರೊಫೈಲ್ ಸೈನ್-ಇನ್‌ ಮಾಡುವಾಗ ನೀವು <ph name="MULTI_PROFILE_USER_LIMIT" /> ಖಾತೆಗಳವರೆಗೆ ಮಾತ್ರ ಹೊಂದಬಹುದು.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{ಒಂದು ಸಾಧನಕ್ಕೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ}one{# ಸಾಧನಗಳಿಗೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ}other{# ಸಾಧನಗಳಿಗೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ}}</translation>
 <translation id="3236488194889173876">ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್ ಲಭ್ಯವಿಲ್ಲ</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">ಅತಿಥಿ</translation>
 <translation id="332587331255250389">ಬ್ಯಾಟರಿಯನ್ನು ಬದಲಾಯಿಸಿ</translation>
 <translation id="3351879221545518001">ನೀವು ಪ್ರಸ್ತುತ ಪರದೆಯನ್ನು ಬಿತ್ತರಿಸುತ್ತಿರುವಿರಿ.</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index 9d059229..216fe83 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">기기는 <ph name="DOMAIN" />에서 관리합니다.</translation>
 <translation id="2050339315714019657">세로 방향</translation>
 <translation id="2067602449040652523">키보드 밝기</translation>
-<translation id="2075212959500165896">시도 횟수가 너무 많습니다. 나중에 다시 시도하세요.</translation>
 <translation id="2081529251031312395">$1님이 나중에 로그인할 수 있습니다.</translation>
 <translation id="2127372758936585790">저출력 충전기</translation>
 <translation id="2135456203358955318">고정 돋보기</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">멀티 로그인에는 계정을 <ph name="MULTI_PROFILE_USER_LIMIT" />개까지만 사용할 수 있습니다.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{기기 1개에 연결됨}other{기기 #개에 연결됨}}</translation>
 <translation id="3236488194889173876">사용할 수 있는 모바일 네트워크 없음</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">손님</translation>
 <translation id="332587331255250389">배터리를 교체해 주세요</translation>
 <translation id="3351879221545518001">현재 화면을 전송하고 있습니다.</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb
index e6d547b..1d699494 100644
--- a/ash/strings/ash_strings_lt.xtb
+++ b/ash/strings/ash_strings_lt.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">Įrenginys valdomas „<ph name="DOMAIN" />“.</translation>
 <translation id="2050339315714019657">Stačias</translation>
 <translation id="2067602449040652523">Klaviatūros šviesumas</translation>
-<translation id="2075212959500165896">Per daug bandymų. Vėliau bandykite dar kartą.</translation>
 <translation id="2081529251031312395">$1 vis tiek galės vėliau prisijungti.</translation>
 <translation id="2127372758936585790">Mažos galios įkroviklis</translation>
 <translation id="2135456203358955318">Prie doko prijungtas didintuvas</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">Naudodami kelių paskyrų funkciją, galite turėti iki <ph name="MULTI_PROFILE_USER_LIMIT" /> paskyr.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Prisijungta prie įrenginio}one{Prisijungta prie # įrenginio}few{Prisijungta prie # įrenginių}many{Prisijungta prie # įrenginio}other{Prisijungta prie # įrenginių}}</translation>
 <translation id="3236488194889173876">Nėra jokių pasiekiamų mobiliojo ryšio tinklų</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" />, <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Svečias</translation>
 <translation id="332587331255250389">Pakeiskite akumuliatorių</translation>
 <translation id="3351879221545518001">Šiuo metu perduodate ekrano vaizdą.</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb
index 70d6d6eb..211a2db6 100644
--- a/ash/strings/ash_strings_lv.xtb
+++ b/ash/strings/ash_strings_lv.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Pa labi</translation>
 <translation id="1351937230027495976">Sakļaut izvēlni</translation>
 <translation id="1383876407941801731">Meklēt</translation>
+<translation id="1419738280318246476">Atbloķējiet ierīci, lai veiktu paziņojuma darbību</translation>
 <translation id="1467432559032391204">Pa kreisi</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Lietojumprogrammu palaidējs</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Šo ierīci pārvalda vietne <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Portrets</translation>
 <translation id="2067602449040652523">Tastatūras spilgtums</translation>
-<translation id="2075212959500165896">Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz.</translation>
 <translation id="2081529251031312395">$1 joprojām varēs pierakstīties vēlāk.</translation>
 <translation id="2127372758936585790">Lādētājs ar mazu strāvas padevi</translation>
 <translation id="2135456203358955318">Dokota lupa</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Vairākkārtējas pierakstīšanās laikā var izmantot ne vairāk kā <ph name="MULTI_PROFILE_USER_LIMIT" /> kontus.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Savienots ar ierīci}zero{Savienots ar # ierīcēm}one{Savienots ar # ierīci}other{Savienots ar # ierīcēm}}</translation>
 <translation id="3236488194889173876">Mobilais tīkls nav pieejams</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation>
 <translation id="3294437725009624529">Viesis</translation>
 <translation id="332587331255250389">Lūdzu, nomainiet bateriju.</translation>
 <translation id="3351879221545518001">Jūsu ekrānā šobrīd tiek veikta apraide.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Restartēt un atiestatīt</translation>
 <translation id="4961318399572185831">Ekrāna apraide</translation>
 <translation id="5069971504769299223">Jūsu darbības var uzraudzīt ierīces pārvaldnieks.</translation>
+<translation id="5083553833479578423">Piekļūstiet citām Asistenta funkcijām</translation>
 <translation id="5136175204352732067">Ir pievienota cita tastatūra</translation>
 <translation id="5168181903108465623">Pieejamas apraides ierīces</translation>
 <translation id="5207949376430453814">Izcelt teksta ievietošanas punktu</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Bluetooth ir ieslēgts</translation>
 <translation id="639644700271529076">Funkcija CAPS LOCK ir izslēgta.</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Visu paziņojumu notīrīšana</translation>
 <translation id="643147933154517414">Viss gatavs</translation>
 <translation id="6445835306623867477">“<ph name="ROUTE_TITLE" />” apraide ierīcē “<ph name="RECEIVER_NAME" />”</translation>
 <translation id="6452181791372256707">Noraidīt</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Jūs nospiedāt pilnekrāna lupas īsinājumtaustiņu. Vai vēlaties to ieslēgt?</translation>
 <translation id="8190698733819146287">Pielāgot valodas un ievadi...</translation>
 <translation id="8191230140820435481">Pārvaldīt jūsu lietotnes, paplašinājumus un motīvus</translation>
+<translation id="8192202700944119416">Paziņojumi ir paslēpti.</translation>
 <translation id="8261506727792406068">Dzēst</translation>
 <translation id="8297006494302853456">Vājš</translation>
 <translation id="8308637677604853869">Iepriekšējā izvēlne</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Izveidot piezīmi</translation>
 <translation id="8392451568018454956">Opciju izvēlne kontam <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Pilnekrāna lupa</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">USB-C ierīce (pieslēgvieta aizmugurē pa labi)</translation>
 <translation id="8940956008527784070">Akumulators gandrīz tukšs (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Ātrā palaišana</translation>
+<translation id="899350903320462459">Atbloķēt ierīci kā <ph name="LOGIN_ID" />, lai veiktu paziņojuma darbību</translation>
 <translation id="8995603266996330174">Pārvalda domēnu <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Ir pieejams Adobe Flash Player atjauninājums</translation>
 <translation id="9056839673611986238">Ierīcē tiks veikta atrite</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index 71c34dd..57a3f81 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">ഈ ഉപകരണം നിയന്ത്രിക്കുന്നത് <ph name="DOMAIN" /> ആണ്.</translation>
 <translation id="2050339315714019657">ഛായാചിത്രം</translation>
 <translation id="2067602449040652523">കീബോർഡ് തെളിച്ചം</translation>
-<translation id="2075212959500165896">വളരെയധികം ശ്രമങ്ങൾ. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="2081529251031312395">$1 എന്ന വ്യക്തിക്ക് പിന്നീട് സൈൻ ഇൻ ചെയ്യാവുന്നതാണ്.</translation>
 <translation id="2127372758936585790">കുറഞ്ഞ തോതിൽ വൈദ്യുതി പ്രവഹിക്കുന്ന ചാർജർ</translation>
 <translation id="2135456203358955318">ഡോക്ക് ചെയ്‌ത മാഗ്‌നിഫയർ</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">ഒന്നിലധികം സൈൻ ഇന്നുകളിൽ നിങ്ങൾക്ക് <ph name="MULTI_PROFILE_USER_LIMIT" /> അക്കൗണ്ടുകൾ വരെ മാത്രമേ ഉണ്ടായിരിക്കാൻ പാടുള്ളൂ.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{ഒരു ഉപകരണത്തിലേക്ക് കണക്റ്റ് ചെയ്‌തു}other{# ഉപകരണങ്ങളിലേക്ക് കണക്റ്റ് ചെയ്‌തു}}</translation>
 <translation id="3236488194889173876">മൊബൈൽ നെറ്റ്‌വർക്ക് ലഭ്യമല്ല</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">അതിഥി</translation>
 <translation id="332587331255250389">ബാറ്ററി മാറ്റി പുതിയത് വയ്ക്കുക</translation>
 <translation id="3351879221545518001">നിലവിൽ നിങ്ങൾ സ്ക്രീൻ കാസ്‌റ്റ് ചെയ്യുന്നു.</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index f50d092..abb6b56 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390"><ph name="DOMAIN" /> याद्वारे हे डिव्हाइस व्यवस्‍थापित केले जाते.</translation>
 <translation id="2050339315714019657">पोर्ट्रेट</translation>
 <translation id="2067602449040652523">कीबोर्डची चमक</translation>
-<translation id="2075212959500165896">अनेक प्रयत्न केले. नंतर पुन्हा प्रयत्न करा.</translation>
 <translation id="2081529251031312395">$1 नंतरही साइन इन करू शकतो.</translation>
 <translation id="2127372758936585790">निम्न-उर्जेचे चार्जर</translation>
 <translation id="2135456203358955318">डॉक केलेले भिंग</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">मल्टिपल साइन इन मध्ये तुमच्याकडे जास्तीत जास्त फक्त <ph name="MULTI_PROFILE_USER_LIMIT" /> खाती असू शकतात.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{डिव्हाइसशी कनेक्ट केले}one{# डिव्हाइसशी कनेक्ट केले}other{# डिव्हाइसशी कनेक्ट केले}}</translation>
 <translation id="3236488194889173876">कोणतेही मोबाइल नेटवर्क उपलब्ध नाही</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">अतिथी</translation>
 <translation id="332587331255250389">कृपया बॅटरी बदला</translation>
 <translation id="3351879221545518001">तुम्ही सध्या स्क्रीन कास्ट करत आहात.</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb
index d417d46..0dda0e2 100644
--- a/ash/strings/ash_strings_ms.xtb
+++ b/ash/strings/ash_strings_ms.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Kanan</translation>
 <translation id="1351937230027495976">Runtuhkan menu</translation>
 <translation id="1383876407941801731">Carian</translation>
+<translation id="1419738280318246476">Buka kunci peranti untuk melaksanakan tindakan pemberitahuan</translation>
 <translation id="1467432559032391204">Kiri</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Pelancar</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Peranti ini diuruskan oleh <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Potret</translation>
 <translation id="2067602449040652523">Kecerahan papan kekunci</translation>
-<translation id="2075212959500165896">Terlalu banyak percubaan. Cuba lagi nanti.</translation>
 <translation id="2081529251031312395">$1 masih dapat log masuk nanti.</translation>
 <translation id="2127372758936585790">Pengecas berkuasa rendah</translation>
 <translation id="2135456203358955318">Penggadang didok</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Anda hanya boleh memiliki sehingga <ph name="MULTI_PROFILE_USER_LIMIT" /> akaun dalam log masuk berbilang.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Disambungkan ke peranti}other{Disambungkan ke # peranti}}</translation>
 <translation id="3236488194889173876">Tiada rangkaian mudah alih tersedia</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Tetamu</translation>
 <translation id="332587331255250389">Sila gantikan bateri</translation>
 <translation id="3351879221545518001">Anda sedang menghantar skrin.</translation>
@@ -227,6 +226,7 @@
 <translation id="4924411785043111640">Mulakan semula dan tetapkan semula</translation>
 <translation id="4961318399572185831">Hantar skrin</translation>
 <translation id="5069971504769299223">Pengurus peranti mungkin dapat memantau aktiviti anda.</translation>
+<translation id="5083553833479578423">Buka kunci pelbagai lagi ciri Assistant.</translation>
 <translation id="5136175204352732067">Papan kekunci lain disambungkan</translation>
 <translation id="5168181903108465623">Peranti Cast tersedia</translation>
 <translation id="5207949376430453814">Serlahkan karet teks</translation>
@@ -298,6 +298,7 @@
 <translation id="6376931439017688372">Bluetooth dihidupkan</translation>
 <translation id="639644700271529076">Kekunci CAPS LOCK dimatikan</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Kosongkan semua pemberitahuan</translation>
 <translation id="643147933154517414">Selesai</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> pada <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Tolak</translation>
@@ -399,9 +400,11 @@
 <translation id="8152119955266188852">Anda menekan pintasan untuk penggadang skrin penuh. Adakah anda ingin menghidupkannya?</translation>
 <translation id="8190698733819146287">Sesuaikan bahasa dan input...</translation>
 <translation id="8191230140820435481">Uruskan apl, sambungan dan tema anda</translation>
+<translation id="8192202700944119416">Pemberitahuan disembunyikan.</translation>
 <translation id="8261506727792406068">Padam</translation>
 <translation id="8297006494302853456">Lemah</translation>
 <translation id="8308637677604853869">Menu sebelumnya</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Buat nota</translation>
 <translation id="8392451568018454956">Menu pilihan untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Penggadang Skrin Penuh</translation>
@@ -443,6 +446,7 @@
 <translation id="8938800817013097409">Peranti USB-C (port kanan di belakang)</translation>
 <translation id="8940956008527784070">Bateri lemah (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Lancar pantas</translation>
+<translation id="899350903320462459">Buka kunci peranti sebagai <ph name="LOGIN_ID" /> untuk melaksanakan tindakan pemberitahuan</translation>
 <translation id="8995603266996330174">Diuruskan oleh <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Kemas kini Adobe Flash Player tersedia</translation>
 <translation id="9056839673611986238">Peranti akan dibalikkan</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb
index ac444c4..bc6dc1b 100644
--- a/ash/strings/ash_strings_nl.xtb
+++ b/ash/strings/ash_strings_nl.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Rechts</translation>
 <translation id="1351937230027495976">Menu samenvouwen</translation>
 <translation id="1383876407941801731">Zoeken</translation>
+<translation id="1419738280318246476">Ontgrendel het apparaat om de meldingsactie uit te voeren</translation>
 <translation id="1467432559032391204">Links</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Launcher</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Dit apparaat wordt beheerd door <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Staand</translation>
 <translation id="2067602449040652523">Toetsenbordhelderheid</translation>
-<translation id="2075212959500165896">Te veel pogingen. Probeer het later opnieuw.</translation>
 <translation id="2081529251031312395">$1 kan later nog inloggen.</translation>
 <translation id="2127372758936585790">Laag-vermogen-lader</translation>
 <translation id="2135456203358955318">Gedockt vergrootglas</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Je kunt maximaal <ph name="MULTI_PROFILE_USER_LIMIT" /> accounts hebben in Toegang tot meerdere accounts.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Verbonden met een apparaat}other{Verbonden met # apparaten}}</translation>
 <translation id="3236488194889173876">Geen mobiel netwerk beschikbaar</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gast</translation>
 <translation id="332587331255250389">Vervang de batterij</translation>
 <translation id="3351879221545518001">Je cast momenteel een scherm.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Opnieuw opstarten en resetten</translation>
 <translation id="4961318399572185831">Scherm casten</translation>
 <translation id="5069971504769299223">De beheerder van het apparaat kan je activiteit mogelijk bekijken.</translation>
+<translation id="5083553833479578423">Ontgrendel meer functies van de Assistent.</translation>
 <translation id="5136175204352732067">Ander toetsenbord aangesloten</translation>
 <translation id="5168181903108465623">Cast-apparaten beschikbaar</translation>
 <translation id="5207949376430453814">Tekstcursor markeren</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Bluetooth is ingeschakeld</translation>
 <translation id="639644700271529076">CAPS LOCK is uitgeschakeld</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Alle meldingen verwijderen</translation>
 <translation id="643147933154517414">Klaar</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> in <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Weigeren</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Je hebt op de sneltoets voor volledig scherm vergroten gedrukt. Wil je deze functie inschakelen?</translation>
 <translation id="8190698733819146287">Talen en invoer aanpassen...</translation>
 <translation id="8191230140820435481">Je apps, extensies en thema's beheren</translation>
+<translation id="8192202700944119416">Meldingen zijn verborgen.</translation>
 <translation id="8261506727792406068">Verwijderen</translation>
 <translation id="8297006494302853456">Zwak</translation>
 <translation id="8308637677604853869">Vorig menu</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Notitie maken</translation>
 <translation id="8392451568018454956">Optiemenu voor <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Volledig scherm vergroten</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">USB-C-apparaat (poort rechts aan de achterkant)</translation>
 <translation id="8940956008527784070">Batterij is bijna leeg (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Snelstarten</translation>
+<translation id="899350903320462459">Ontgrendel het apparaat als <ph name="LOGIN_ID" /> om de meldingsactie uit te voeren</translation>
 <translation id="8995603266996330174">Beheerd door <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Update van Adobe Flash Player beschikbaar</translation>
 <translation id="9056839673611986238">Apparaat wordt teruggezet naar oudere versie</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index 37f1bfe..208cd9df 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -21,14 +21,14 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Svakt signal</translation>
 <translation id="1293264513303784526">USB-C-enhet (porten på venstre side)</translation>
-<translation id="1302880136325416935">Vis Bluetooth-innstillinger <ph name="STATE_TEXT" /></translation>
+<translation id="1302880136325416935">Vis Bluetooth-innstillinger. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Høyre</translation>
 <translation id="1351937230027495976">Skjul menyen</translation>
 <translation id="1383876407941801731">Søk</translation>
 <translation id="1467432559032391204">Venstre</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Appvelger</translation>
-<translation id="1520303207432623762">{NUM_APPS,plural, =1{Vis innstillinger for varsler Varsler er slått av for en app}other{Vis innstillinger for varsler Varsler er slått av for # apper}}</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Vis innstillinger for varsler. Varsler er slått av for en app}other{Vis innstillinger for varsler. Varsler er slått av for # apper}}</translation>
 <translation id="1525508553941733066">AVVIS</translation>
 <translation id="1537254971476575106">Lupe for hele skjermen</translation>
 <translation id="15373452373711364">Stor markør</translation>
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">Denne enheten administreres av <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Stående</translation>
 <translation id="2067602449040652523">Lysstyrke på tastaturet</translation>
-<translation id="2075212959500165896">For mange forsøk. Prøv igjen senere.</translation>
 <translation id="2081529251031312395">$1 kan likevel logge på senere.</translation>
 <translation id="2127372758936585790">Lading med lav effekt</translation>
 <translation id="2135456203358955318">Dokket lupe</translation>
@@ -88,7 +87,7 @@
 <translation id="2359808026110333948">Fortsett</translation>
 <translation id="2365393535144473978">Hvis du slår på mobildata, blir Bluetooth også slått på.</translation>
 <translation id="2391579633712104609">180°</translation>
-<translation id="239188844683466770">Slå «ikke forstyrr» på eller av</translation>
+<translation id="239188844683466770">Slå av/på «ikke forstyrr»</translation>
 <translation id="2412593942846481727">En oppdatering er tilgjengelig</translation>
 <translation id="2416346634399901812">Koblet til <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Bluetooth-enheten «<ph name="DEVICE_NAME" />» ber om tillatelse til å koble til. Før du godtar dette, må du bekrefte at denne tilgangskoden vises på den aktuelle enheten: <ph name="PASSKEY" /></translation>
@@ -138,9 +137,8 @@
 <translation id="315116470104423982">Mobildata</translation>
 <translation id="3151786313568798007">Retning</translation>
 <translation id="3153444934357957346">Du kan bare ha opptil <ph name="MULTI_PROFILE_USER_LIMIT" /> kontoer i multipålogging.</translation>
-<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Koble til en enhet}other{Koble til # enheter}}</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Koblet til en enhet}other{Koblet til # enheter}}</translation>
 <translation id="3236488194889173876">Ingen mobilnettverk er tilgjengelige</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gjest</translation>
 <translation id="332587331255250389">Bytt ut batteriet</translation>
 <translation id="3351879221545518001">Du caster for øyeblikket skjermen.</translation>
@@ -186,7 +184,7 @@
 <translation id="4072264167173457037">Middels sterkt signal</translation>
 <translation id="4200057768455216496">Du trykket på snarveien for den dokkede lupen. Vil du slå den på?</translation>
 <translation id="4217571870635786043">Diktering</translation>
-<translation id="4261870227682513959">Vis innstillinger for varsler. Varsler er av.</translation>
+<translation id="4261870227682513959">Vis innstillinger for varsler. Varsler er av</translation>
 <translation id="4274921305979314545">Koble Chromebook til telefonen</translation>
 <translation id="4279490309300973883">Speiling</translation>
 <translation id="4292681942966152062">Aktiverer <ph name="NETWORK_NAME" /></translation>
@@ -239,7 +237,7 @@
 <translation id="544691375626129091">Alle tilgjengelige brukere er allerede lagt til i denne økten.</translation>
 <translation id="5457599981699367932">Surf som gjest</translation>
 <translation id="54609108002486618">Administrert</translation>
-<translation id="5496819745535887422">Administratoren din kaller tilbake enheten din. Alle data blir slettet når enheten starter på nytt.</translation>
+<translation id="5496819745535887422">Administratoren din tilbakestiller enheten din til forrige versjon. Alle data blir slettet når enheten starter på nytt.</translation>
 <translation id="553675580533261935">Avslutning av økten</translation>
 <translation id="5537725057119320332">Cast</translation>
 <translation id="5548285847212963613">Utvidelsen «<ph name="EXTENSION_NAME" />» kan hjelpe deg med å koble deg til dette nettverket.</translation>
@@ -294,7 +292,7 @@
 <translation id="6297287540776456956">Bruk pekepennen til å velge et område</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> ble rotert til <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Tastaturoverlegg</translation>
-<translation id="6376931439017688372">Bluetooth er aktivert</translation>
+<translation id="6376931439017688372">Bluetooth er på</translation>
 <translation id="639644700271529076">CAPS LOCK er av</translation>
 <translation id="6406704438230478924">alt gr</translation>
 <translation id="643147933154517414">Ingen varsler</translation>
@@ -444,7 +442,7 @@
 <translation id="8984179138335769204">Hurtigtaster</translation>
 <translation id="8995603266996330174">Drevet av <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">En oppdatering av Adobe Flash Player er tilgjengelig</translation>
-<translation id="9056839673611986238">Enheten blir hentet tilbake</translation>
+<translation id="9056839673611986238">Enheten blir tilbakestilt til forrige versjon</translation>
 <translation id="9074739597929991885">Bluetooth</translation>
 <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation>
 <translation id="9080206825613744995">Mikrofonen er i bruk.</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index 9bab1773..498b055 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">W prawo</translation>
 <translation id="1351937230027495976">Zwiń menu</translation>
 <translation id="1383876407941801731">Szukaj</translation>
+<translation id="1419738280318246476">Odblokuj urządzenie, by zareagować na powiadomienie</translation>
 <translation id="1467432559032391204">W lewo</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Program uruchamiający</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">To urządzenie jest zarządzane przez: <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Pionowo</translation>
 <translation id="2067602449040652523">Jasność klawiatury</translation>
-<translation id="2075212959500165896">Zbyt wiele prób. Spróbuj ponownie później.</translation>
 <translation id="2081529251031312395">$1 może się wciąż zalogować później.</translation>
 <translation id="2127372758936585790">Ładowarka o małej mocy</translation>
 <translation id="2135456203358955318">Lupa zadokowana</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">W wielokrotnym logowaniu nie możesz mieć więcej kont niż <ph name="MULTI_PROFILE_USER_LIMIT" />.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Połączono z urządzeniem}few{Połączono z # urządzeniami}many{Połączono z # urządzeniami}other{Połączono z # urządzenia}}</translation>
 <translation id="3236488194889173876">Brak dostępnych sieci komórkowych</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gość</translation>
 <translation id="332587331255250389">Wymień baterię</translation>
 <translation id="3351879221545518001">Obecnie przesyłasz ekran.</translation>
@@ -227,6 +226,7 @@
 <translation id="4924411785043111640">Uruchom ponownie i zresetuj</translation>
 <translation id="4961318399572185831">Przesyłanie ekranu</translation>
 <translation id="5069971504769299223">Zarządzający urządzeniem może monitorować Twoją aktywność.</translation>
+<translation id="5083553833479578423">Odblokuj więcej funkcji Asystenta.</translation>
 <translation id="5136175204352732067">Podłączono inną klawiaturę</translation>
 <translation id="5168181903108465623">Dostępne są urządzenia przesyłające</translation>
 <translation id="5207949376430453814">Podświetlaj kursor tekstu</translation>
@@ -298,6 +298,7 @@
 <translation id="6376931439017688372">Bluetooth jest włączony</translation>
 <translation id="639644700271529076">CAPS LOCK jest wyłączony</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Wyczyść wszystkie powiadomienia</translation>
 <translation id="643147933154517414">Wszystko gotowe</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> na urządzeniu <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Odrzuć</translation>
@@ -399,9 +400,11 @@
 <translation id="8152119955266188852">Naciśnięto skrót lupy pełnoekranowej. Czy chcesz ją włączyć?</translation>
 <translation id="8190698733819146287">Dostosuj języki i metody wprowadzania...</translation>
 <translation id="8191230140820435481">Zarządzanie Twoimi aplikacjami, rozszerzeniami i motywami</translation>
+<translation id="8192202700944119416">Powiadomienia są ukryte.</translation>
 <translation id="8261506727792406068">Usuń</translation>
 <translation id="8297006494302853456">Słaby</translation>
 <translation id="8308637677604853869">Poprzednie menu</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Utwórz notatkę</translation>
 <translation id="8392451568018454956">Menu opcji dla <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Lupa pełnego ekranu</translation>
@@ -443,6 +446,7 @@
 <translation id="8938800817013097409">Urządzenie USB-C (prawy port z tyłu)</translation>
 <translation id="8940956008527784070">Niski stan baterii (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Szybkie uruchamianie</translation>
+<translation id="899350903320462459">Odblokuj urządzenie jako <ph name="LOGIN_ID" />, by zareagować na powiadomienie</translation>
 <translation id="8995603266996330174">Zarządzane przez <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Dostępna jest aktualizacja Adobe Flash Playera</translation>
 <translation id="9056839673611986238">Na urządzeniu zostanie przywrócona wcześniejsza wersja oprogramowania</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index 2eb4e96..a72250db 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Para a direita</translation>
 <translation id="1351937230027495976">Recolher menu</translation>
 <translation id="1383876407941801731">Pesquisar</translation>
+<translation id="1419738280318246476">Desbloqueie o dispositivo para executar a ação de notificação</translation>
 <translation id="1467432559032391204">Para a esquerda</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Iniciador</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Este dispositivo é gerenciado por <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Retrato</translation>
 <translation id="2067602449040652523">Brilho do teclado</translation>
-<translation id="2075212959500165896">Excesso de tentativas. Tente novamente mais tarde.</translation>
 <translation id="2081529251031312395">$1 ainda pode fazer login mais tarde.</translation>
 <translation id="2127372758936585790">Carregador de baixa potência</translation>
 <translation id="2135456203358955318">Lupa ancorada</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Só é possível ter até <ph name="MULTI_PROFILE_USER_LIMIT" /> contas em login múltiplo.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Conectado a um dispositivo}one{Conectado a # dispositivo}other{Conectado a # dispositivos}}</translation>
 <translation id="3236488194889173876">Nenhuma rede móvel disponível</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Visitante</translation>
 <translation id="332587331255250389">Substitua a bateria</translation>
 <translation id="3351879221545518001">Você está transmitindo a tela.</translation>
@@ -227,6 +226,7 @@
 <translation id="4924411785043111640">Reiniciar e redefinir</translation>
 <translation id="4961318399572185831">Transmitir tela</translation>
 <translation id="5069971504769299223">O administrador do dispositivo pode conseguir monitorar sua atividade.</translation>
+<translation id="5083553833479578423">Desbloqueie mais recursos do Assistente.</translation>
 <translation id="5136175204352732067">Teclado diferente conectado</translation>
 <translation id="5168181903108465623">Dispositivos de transmissão disponíveis</translation>
 <translation id="5207949376430453814">Destacar cursor de texto</translation>
@@ -299,6 +299,7 @@
 <translation id="6376931439017688372">Bluetooth ativado</translation>
 <translation id="639644700271529076">CAPS LOCK está desativado</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Limpar todas as notificações</translation>
 <translation id="643147933154517414">Pronto</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> para <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Rejeitar</translation>
@@ -400,9 +401,11 @@
 <translation id="8152119955266188852">Você pressionou o atalho para a lupa de tela cheia. Gostaria de ativá-la?</translation>
 <translation id="8190698733819146287">Personalizar idiomas e entrada...</translation>
 <translation id="8191230140820435481">Gerenciar seus aplicativos, extensões e temas</translation>
+<translation id="8192202700944119416">As notificações estão ocultas.</translation>
 <translation id="8261506727792406068">Excluir</translation>
 <translation id="8297006494302853456">Fraco</translation>
 <translation id="8308637677604853869">Menu anterior</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Criar nota</translation>
 <translation id="8392451568018454956">Menu de opções para <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Lupa de tela cheia</translation>
@@ -444,6 +447,7 @@
 <translation id="8938800817013097409">Dispositivo USB-C (porta traseira da direita)</translation>
 <translation id="8940956008527784070">Nível de bateria baixo (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Início rápido</translation>
+<translation id="899350903320462459">Desbloqueie o dispositivo com a conta <ph name="LOGIN_ID" /> para executar a ação de notificação</translation>
 <translation id="8995603266996330174">Gerenciado por <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Atualização do Adobe Flash Player disponível</translation>
 <translation id="9056839673611986238">O dispositivo será revertido</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb
index 35cf555..0b6085b 100644
--- a/ash/strings/ash_strings_pt-PT.xtb
+++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Direita</translation>
 <translation id="1351937230027495976">Reduzir menu</translation>
 <translation id="1383876407941801731">Pesquisar</translation>
+<translation id="1419738280318246476">Desbloqueie o dispositivo para realizar a ação de notificação.</translation>
 <translation id="1467432559032391204">Esquerda</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Iniciador</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Este aparelho é gerido por <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Vertical</translation>
 <translation id="2067602449040652523">Brilho do teclado</translation>
-<translation id="2075212959500165896">Demasiadas tentativas. Tente novamente mais tarde.</translation>
 <translation id="2081529251031312395">$1 pode iniciar sessão mais tarde.</translation>
 <translation id="2127372758936585790">Carregador de baixo consumo</translation>
 <translation id="2135456203358955318">Lupa ancorada</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Apenas pode ter, no máximo, <ph name="MULTI_PROFILE_USER_LIMIT" /> contas no início de sessão integrado.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Ligado a um dispositivo}other{Ligado a # dispositivos}}</translation>
 <translation id="3236488194889173876">Nenhuma rede móvel disponível</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Convidado</translation>
 <translation id="332587331255250389">Substitua a bateria</translation>
 <translation id="3351879221545518001">Está a transmitir atualmente o ecrã.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Reiniciar e repor</translation>
 <translation id="4961318399572185831">Transmitir ecrã</translation>
 <translation id="5069971504769299223">O administrador do dispositivo pode conseguir monitorizar a sua atividade.</translation>
+<translation id="5083553833479578423">Desbloqueie mais funcionalidades do Assistente.</translation>
 <translation id="5136175204352732067">Teclado diferente ligado</translation>
 <translation id="5168181903108465623">Dispositivos de transmissão disponíveis</translation>
 <translation id="5207949376430453814">Realçar cursor do texto</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Bluetooth ativado</translation>
 <translation id="639644700271529076">CAPS LOCK está desativado</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Limpar todas as notificações</translation>
 <translation id="643147933154517414">Tudo concluído</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> no recetor <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Rejeitar</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Premiu o atalho da lupa de ecrã inteiro. Pretende ativá-la?</translation>
 <translation id="8190698733819146287">Personalizar idiomas e introdução...</translation>
 <translation id="8191230140820435481">Gerir as suas aplicações, extensões e temas</translation>
+<translation id="8192202700944119416">As notificações estão ocultas.</translation>
 <translation id="8261506727792406068">Eliminar</translation>
 <translation id="8297006494302853456">Fraca</translation>
 <translation id="8308637677604853869">Menu anterior</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Criar nota</translation>
 <translation id="8392451568018454956">Menu de opções para <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Lupa de ecrã inteiro</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">Dispositivo USB-C (porta traseira direita)</translation>
 <translation id="8940956008527784070">Bateria fraca (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Início rápido</translation>
+<translation id="899350903320462459">Desbloqueie o dispositivo como <ph name="LOGIN_ID" /> para realizar a ação de notificação.</translation>
 <translation id="8995603266996330174">Gerido por <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Atualização do Adobe Flash Player disponível</translation>
 <translation id="9056839673611986238">O dispositivo vai ser revertido</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index a1cb93a..249305dc 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Dreapta</translation>
 <translation id="1351937230027495976">Restrânge meniul</translation>
 <translation id="1383876407941801731">Caută</translation>
+<translation id="1419738280318246476">Deblochează dispozitivul pentru efectuarea acțiunii de notificare</translation>
 <translation id="1467432559032391204">Stânga</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Lansator</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Acest dispozitiv este gestionat de <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Portret</translation>
 <translation id="2067602449040652523">Luminozitatea tastaturii</translation>
-<translation id="2075212959500165896">Prea multe încercări. Încearcă din nou mai târziu.</translation>
 <translation id="2081529251031312395">$1 se poate conecta și mai târziu.</translation>
 <translation id="2127372758936585790">Încărcător de putere joasă</translation>
 <translation id="2135456203358955318">Lupă andocată</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Conectarea multiplă acceptă maximum <ph name="MULTI_PROFILE_USER_LIMIT" /> conturi.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Conectat la un dispozitiv}few{Conectat la # dispozitive}other{Conectat la # de dispozitive}}</translation>
 <translation id="3236488194889173876">Nicio rețea mobilă disponibilă</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Invitat</translation>
 <translation id="332587331255250389">Înlocuiește bateria</translation>
 <translation id="3351879221545518001">În prezent proiectezi ecranul.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Repornește și resetează</translation>
 <translation id="4961318399572185831">Proiectează ecranul</translation>
 <translation id="5069971504769299223">Managerul de dispozitiv poate să îți monitorizeze activitatea.</translation>
+<translation id="5083553833479578423">Deblochează mai multe funcții ale Asistentului.</translation>
 <translation id="5136175204352732067">Altă tastatură conectată</translation>
 <translation id="5168181903108465623">Dispozitive de proiecție disponibile</translation>
 <translation id="5207949376430453814">Evidențiază cursorul pentru text</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Bluetooth este activat</translation>
 <translation id="639644700271529076">Tasta CAPS LOCK este dezactivată</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Șterge toate notificările</translation>
 <translation id="643147933154517414">Gata</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> pe <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Respingeți</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Ai accesat comanda rapidă pentru lupa de ecran complet. Vrei să o activezi?</translation>
 <translation id="8190698733819146287">Personalizează limbile și modul de introducere...</translation>
 <translation id="8191230140820435481">Gestionează aplicațiile, extensiile și temele dvs.</translation>
+<translation id="8192202700944119416">Notificările sunt ascunse.</translation>
 <translation id="8261506727792406068">Șterge</translation>
 <translation id="8297006494302853456">Slab</translation>
 <translation id="8308637677604853869">Meniul anterior</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Creează o notă</translation>
 <translation id="8392451568018454956">Meniu cu opțiuni pentru <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Lupă de ecran complet</translation>
@@ -426,7 +429,7 @@
 <translation id="8676770494376880701">A fost conectat un încărcător de putere joasă</translation>
 <translation id="8683506306463609433">Urmărirea performanțelor este activă</translation>
 <translation id="8734991477317290293">Aceasta ar putea încerca să înregistreze ce taste apeși</translation>
-<translation id="8735953464173050365">Afișează setările pentru tastatură. Este selectată tastatura <ph name="KEYBOARD_NAME" /></translation>
+<translation id="8735953464173050365">Afișează setările pentru tastatură. Este selectată <ph name="KEYBOARD_NAME" /></translation>
 <translation id="875593634123171288">Afișează setările VPN</translation>
 <translation id="8809737090443522491">Introdu numele unei aplicații sau al unui document</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">Dispozitiv USB-C (portul din dreapta în spate)</translation>
 <translation id="8940956008527784070">Baterie slabă (<ph name="PERCENTAGE" /> %)</translation>
 <translation id="8984179138335769204">Lansare rapidă</translation>
+<translation id="899350903320462459">Deblochează dispozitivul ca <ph name="LOGIN_ID" /> pentru efectuarea acțiunii de notificare</translation>
 <translation id="8995603266996330174">Gestionat de <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Este disponibilă o actualizare Adobe Flash Player</translation>
 <translation id="9056839673611986238">SO de pe dispozitiv va fi adus la o versiune anterioară</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index 770c3e4..75723d1 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">Это устройство находится в домене <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Книжная</translation>
 <translation id="2067602449040652523">Яркость клавиатуры</translation>
-<translation id="2075212959500165896">Слишком много попыток. Повторите позже.</translation>
 <translation id="2081529251031312395">$1 может войти в аккаунт позже.</translation>
 <translation id="2127372758936585790">Маломощное зарядное устройство</translation>
 <translation id="2135456203358955318">Закрепленная лупа</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">Для множественного входа можно использовать не более <ph name="MULTI_PROFILE_USER_LIMIT" /> аккаунтов.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Подключено одно устройство}one{Подключено # устройство}few{Подключено # устройства}many{Подключено # устройств}other{Подключено # устройства}}</translation>
 <translation id="3236488194889173876">Нет доступных мобильных сетей</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Гость</translation>
 <translation id="332587331255250389">Замените батарею в стилусе.</translation>
 <translation id="3351879221545518001">Вы транслируете изображение своего экрана.</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb
index a30db36..475a16c 100644
--- a/ash/strings/ash_strings_sk.xtb
+++ b/ash/strings/ash_strings_sk.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Doprava</translation>
 <translation id="1351937230027495976">Zbaliť ponuku</translation>
 <translation id="1383876407941801731">Vyhľadávanie</translation>
+<translation id="1419738280318246476">Ak chcete vykonať akciu s upozornením, odomknite zariadenie</translation>
 <translation id="1467432559032391204">Doľava</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Spúšťač</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Toto zariadenie je spravované doménou <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Na výšku</translation>
 <translation id="2067602449040652523">Jas klávesnice</translation>
-<translation id="2075212959500165896">Príliš veľa pokusov. Skúste to znova neskôr.</translation>
 <translation id="2081529251031312395">$1 sa bude môcť stále prihlásiť neskôr.</translation>
 <translation id="2127372758936585790">Nabíjačka s nízkym výkonom</translation>
 <translation id="2135456203358955318">Ukotvená lupa</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">V rámci viacnásobného prihlásenia môžete mať maximálne nasledujúci počet účtov: <ph name="MULTI_PROFILE_USER_LIMIT" />.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Pripojené k zariadeniu}few{Pripojené k # zariadeniam}many{Connected to # devices}other{Pripojené k # zariadeniam}}</translation>
 <translation id="3236488194889173876">Nie je k dispozícii žiadna mobilná sieť</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Hosť</translation>
 <translation id="332587331255250389">Vymeňte batériu</translation>
 <translation id="3351879221545518001">Momentálne prenášate obrazovku.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Reštartovať a resetovať</translation>
 <translation id="4961318399572185831">Prenášanie obrazovky</translation>
 <translation id="5069971504769299223">Správca zariadenia môže sledovať vašu aktivitu.</translation>
+<translation id="5083553833479578423">Odblokujte ďalšie funkcie Asistenta.</translation>
 <translation id="5136175204352732067">Bola pripojená iná klávesnica</translation>
 <translation id="5168181903108465623">Dostupné zariadenia na prenos</translation>
 <translation id="5207949376430453814">Zvýrazniť textový kurzor</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Rozhranie Bluetooth je zapnuté</translation>
 <translation id="639644700271529076">CAPS LOCK je vypnutý</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Vymazanie všetkých upozornení</translation>
 <translation id="643147933154517414">Všetko je hotové</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> do zariadenia <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Odmietnuť</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Stlačili ste skratku lupy na celú obrazovku. Chcete ju zapnúť?</translation>
 <translation id="8190698733819146287">Prebieha prispôsobenie jazykov a vstupu...</translation>
 <translation id="8191230140820435481">Spravovať vaše aplikácie, rozšírenia a motívy</translation>
+<translation id="8192202700944119416">Upozornenia sú skryté.</translation>
 <translation id="8261506727792406068">Odstrániť</translation>
 <translation id="8297006494302853456">Slabé</translation>
 <translation id="8308637677604853869">Predchádzajúca ponuka</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Vytvoriť poznámku</translation>
 <translation id="8392451568018454956">Ponuka možností pre používateľa <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Lupa na celú obrazovku</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">Zariadenie USB-C (pravý port vzadu)</translation>
 <translation id="8940956008527784070">Kapacita batérie je nízka (<ph name="PERCENTAGE" /> %)</translation>
 <translation id="8984179138335769204">Rýchle spustenie</translation>
+<translation id="899350903320462459">Ak chcete vykonať akciu s upozornením, odomknite zariadenie ako <ph name="LOGIN_ID" /></translation>
 <translation id="8995603266996330174">Spravované doménou <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">K dispozícii je aktualizácia prehrávača Adobe Flash Player</translation>
 <translation id="9056839673611986238">Zariadenie sa obnoví</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb
index 8da3536f..435d4874 100644
--- a/ash/strings/ash_strings_sl.xtb
+++ b/ash/strings/ash_strings_sl.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">V desno</translation>
 <translation id="1351937230027495976">Strni meni</translation>
 <translation id="1383876407941801731">Išči</translation>
+<translation id="1419738280318246476">Odklenite napravo zaradi izvedbe dejanja v obvestilu</translation>
 <translation id="1467432559032391204">V levo</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Zaganjalnik</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">To napravo upravlja <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Pokončno</translation>
 <translation id="2067602449040652523">Svetlost tipkovnice</translation>
-<translation id="2075212959500165896">Preveč poskusov. Poskusite znova pozneje.</translation>
 <translation id="2081529251031312395">$1 se še vedno lahko prijavi pozneje.</translation>
 <translation id="2127372758936585790">Nizkoenergijski polnilnik</translation>
 <translation id="2135456203358955318">Zasidrana lupa</translation>
@@ -88,7 +88,7 @@
 <translation id="2359808026110333948">Nadaljuj</translation>
 <translation id="2365393535144473978">Če omogočite prenos podatkov v mobilnem omrežju, bo omogočen Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
-<translation id="239188844683466770">Preklop načina ne moti</translation>
+<translation id="239188844683466770">Preklop načina »ne moti«</translation>
 <translation id="2412593942846481727">Na voljo je posodobitev</translation>
 <translation id="2416346634399901812">Povezava z omrežjem <ph name="NETWORK_NAME" /> je vzpostavljena</translation>
 <translation id="2429753432712299108">Naprava Bluetooth »<ph name="DEVICE_NAME" />« želi dovoljenje za seznanjanje. Preden sprejmete, se prepričajte, da je na napravi prikazano to geslo: <ph name="PASSKEY" /></translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">S prijavo z več računi lahko uporabljate največ toliko računov: <ph name="MULTI_PROFILE_USER_LIMIT" />.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Vzpostavljena je povezava z eno napravo}one{Vzpostavljena je povezava z # napravo}two{Vzpostavljena je povezava z # napravama}few{Vzpostavljena je povezava s # napravami}other{Vzpostavljena je povezava s # napravami}}</translation>
 <translation id="3236488194889173876">Mobilno omrežje ni na voljo</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gost</translation>
 <translation id="332587331255250389">Zamenjajte baterijo</translation>
 <translation id="3351879221545518001">Trenutno predvajate vsebino zaslona.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Znova zaženi in ponastavi</translation>
 <translation id="4961318399572185831">Predvajanje zaslona</translation>
 <translation id="5069971504769299223">Upravitelj naprave lahko morda nadzira vašo dejavnost.</translation>
+<translation id="5083553833479578423">Odklenite več funkcij Pomočnika.</translation>
 <translation id="5136175204352732067">Priklopljena je druga tipkovnica</translation>
 <translation id="5168181903108465623">Naprave za predvajanje so na voljo</translation>
 <translation id="5207949376430453814">Označitev kazalke v besedilu</translation>
@@ -287,7 +287,7 @@
 <translation id="615957422585914272">Pokaži zaslonsko tipkovnico</translation>
 <translation id="6164005077879661055">Vse datoteke in lokalni podatki, povezani z zaščitenim uporabnikom, bodo trajno izbrisani, ko ga odstranite. Obiskana spletna mesta in nastavitve tega uporabnika bodo morda še vedno vidna upravitelju na <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Več o tem</translation>
-<translation id="6254629735336163724">Zaklenjeno na vodoravno</translation>
+<translation id="6254629735336163724">Zaklenjeno na ležeče</translation>
 <translation id="6259254695169772643">Uporabite pisalo za izbiranje</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Aktiviranje ...</translation>
 <translation id="6284232397434400372">Ločljivost je bila spremenjena</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Bluetooth je vklopljen</translation>
 <translation id="639644700271529076">Tipka CAPS LOCK je izklopljena</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Izbris vseh obvestil</translation>
 <translation id="643147933154517414">Končano</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> na <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Zavrni</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Pritisnili ste bližnjico za celozaslonsko lupo. Ali jo želite vklopiti?</translation>
 <translation id="8190698733819146287">Prilagajanje jezikov in vnosa ...</translation>
 <translation id="8191230140820435481">Upravljajte aplikacije, razširitve in teme</translation>
+<translation id="8192202700944119416">Obvestila so skrita.</translation>
 <translation id="8261506727792406068">Izbriši</translation>
 <translation id="8297006494302853456">Šibek</translation>
 <translation id="8308637677604853869">Prejšnji meni</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Ustvarjanje zapiska</translation>
 <translation id="8392451568018454956">Meni z možnostmi za <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Celozaslonska lupa</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">Naprava USB-C (vrata desno zadaj)</translation>
 <translation id="8940956008527784070">Akumulator je skoraj prazen (<ph name="PERCENTAGE" /> %)</translation>
 <translation id="8984179138335769204">Hitri zagon</translation>
+<translation id="899350903320462459">Odklenite napravo kot <ph name="LOGIN_ID" />, da izvedete dejanje v obvestilu</translation>
 <translation id="8995603266996330174">Upravljavec: <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Na voljo je posodobitev za Adobe Flash Player</translation>
 <translation id="9056839673611986238">Naprava bo povrnjena na prejšnjo različico</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb
index 9abbd5c..0d87ed7 100644
--- a/ash/strings/ash_strings_sr.xtb
+++ b/ash/strings/ash_strings_sr.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Удесно</translation>
 <translation id="1351937230027495976">Скупи мени</translation>
 <translation id="1383876407941801731">Претражи</translation>
+<translation id="1419738280318246476">Откључајте уређај да бисте добили обавештење</translation>
 <translation id="1467432559032391204">Улево</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Покретач</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Овим уређајем управља домен <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Вертикално</translation>
 <translation id="2067602449040652523">Осветљеност тастатуре</translation>
-<translation id="2075212959500165896">Превише покушаја. Пробајте поново касније.</translation>
 <translation id="2081529251031312395">$1 ће и даље моћи да се пријави касније.</translation>
 <translation id="2127372758936585790">Пуњач мале снаге</translation>
 <translation id="2135456203358955318">Монтирана лупа екрана</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Можете да имате највише <ph name="MULTI_PROFILE_USER_LIMIT" /> налога за вишеструко пријављивање.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Повезани сте са једним уређајем}one{Повезани сте са # уређајем}few{Повезани сте са # уређаја}other{Повезани сте са # уређаја}}</translation>
 <translation id="3236488194889173876">Није доступна ниједна мобилна мрежа</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Гост</translation>
 <translation id="332587331255250389">Замените батерију</translation>
 <translation id="3351879221545518001">Тренутно пребацујете екран.</translation>
@@ -189,7 +188,7 @@
 <translation id="4261870227682513959">Прегледајте подешавања обавештења. Обавештења су искључена</translation>
 <translation id="4274921305979314545">Повежите Chromebook са телефоном</translation>
 <translation id="4279490309300973883">Пресликавање</translation>
-<translation id="4292681942966152062">Активира се мрежа <ph name="NETWORK_NAME" /></translation>
+<translation id="4292681942966152062">Активира се <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome ОС</translation>
 <translation id="4338109981321384717">Лупа</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Рестартуј и ресетуј</translation>
 <translation id="4961318399572185831">Пребацивање екрана</translation>
 <translation id="5069971504769299223">Менаџер уређаја може да надгледа ваше активности.</translation>
+<translation id="5083553833479578423">Откључајте још функција Помоћника.</translation>
 <translation id="5136175204352732067">Нека друга тастатура је повезана</translation>
 <translation id="5168181903108465623">Доступни су уређаји за пребацивање</translation>
 <translation id="5207949376430453814">Истакни курсор за текст</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Bluetooth је укључен</translation>
 <translation id="639644700271529076">CAPS LOCK је искључен</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Обришите сва обавештења</translation>
 <translation id="643147933154517414">Готово</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> на уређају <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Одбиј</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Притиснули сте пречицу за лупу за цео екран. Желите ли да је укључите?</translation>
 <translation id="8190698733819146287">Прилагоди језике и унос...</translation>
 <translation id="8191230140820435481">Управљање апликацијама, додацима и темама</translation>
+<translation id="8192202700944119416">Обавештења су сакривена.</translation>
 <translation id="8261506727792406068">Избриши</translation>
 <translation id="8297006494302853456">Слаб</translation>
 <translation id="8308637677604853869">Претходни мени</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Направите белешку</translation>
 <translation id="8392451568018454956">Мени са опцијама за <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Лупа за цео екран</translation>
@@ -416,7 +419,7 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Поново се повезујете...</translation>
 <translation id="8513108775083588393">Аутоматско ротирање</translation>
 <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> се можда неће пунити док је укључен.</translation>
-<translation id="8627191004499078455">Повезани сте са мрежом <ph name="DEVICE_NAME" /></translation>
+<translation id="8627191004499078455">Повезани сте са уређајем <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">Преостало је <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">Изаберите за говор</translation>
 <translation id="8652175077544655965">Затворите подешавања</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">Уређај са USB прикључком типа C (задњи десни порт)</translation>
 <translation id="8940956008527784070">Батерија је скоро празна (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Брзо покретање</translation>
+<translation id="899350903320462459">Откључајте уређај помоћу ИД-а пријављивања <ph name="LOGIN_ID" /> да бисте добили обавештење</translation>
 <translation id="8995603266996330174">Управља <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Доступно је ажурирање за Adobe Flash Player</translation>
 <translation id="9056839673611986238">Уређај ће бити враћен на ранију верзију</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb
index 7c66b74..f17b2e2 100644
--- a/ash/strings/ash_strings_sv.xtb
+++ b/ash/strings/ash_strings_sv.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Höger</translation>
 <translation id="1351937230027495976">Komprimera menyn</translation>
 <translation id="1383876407941801731">Sök</translation>
+<translation id="1419738280318246476">Lås upp enheten så att aviseringen kan göras</translation>
 <translation id="1467432559032391204">Vänster</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Startprogram</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Den här enheten hanteras av <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Stående</translation>
 <translation id="2067602449040652523">Ljusstyrka för tangentbordet</translation>
-<translation id="2075212959500165896">Du har gjort för många försök. Försök igen senare.</translation>
 <translation id="2081529251031312395">$1 kan fortfarande logga in senare.</translation>
 <translation id="2127372758936585790">Laddning med låg effekt</translation>
 <translation id="2135456203358955318">Dockad skärmförstoring</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Du kan högst använda <ph name="MULTI_PROFILE_USER_LIMIT" /> konton för multiinloggning.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Ansluten till en enhet}other{Ansluten till # enheter}}</translation>
 <translation id="3236488194889173876">Det finns inget tillgängligt mobilnätverk</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gäst</translation>
 <translation id="332587331255250389">Byt batteri</translation>
 <translation id="3351879221545518001">Skärmen castas.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Starta om och återställ</translation>
 <translation id="4961318399572185831">Casta skärmen</translation>
 <translation id="5069971504769299223">Den enhetsansvariga kan ha möjlighet att övervaka det du gör.</translation>
+<translation id="5083553833479578423">Lås upp fler funktioner för Assistent</translation>
 <translation id="5136175204352732067">Ett annat tangentbord har anslutits</translation>
 <translation id="5168181903108465623">Överföringsenheter finns tillgängliga</translation>
 <translation id="5207949376430453814">Markera textmarkören</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Bluetooth är aktiverat</translation>
 <translation id="639644700271529076">CAPS LOCK är av</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Rensa alla aviseringar</translation>
 <translation id="643147933154517414">Klart</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> på <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Avvisa</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Du tryckte på kortkommandot för helskärmsförstoring. Vill du aktivera funktionen?</translation>
 <translation id="8190698733819146287">Anpassa språk och inmatning...</translation>
 <translation id="8191230140820435481">Hantera dina appar, tillägg och teman</translation>
+<translation id="8192202700944119416">Aviseringar har dolts.</translation>
 <translation id="8261506727792406068">Radera</translation>
 <translation id="8297006494302853456">Svag</translation>
 <translation id="8308637677604853869">Föregående meny</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Skapa anteckning</translation>
 <translation id="8392451568018454956">Alternativmenyn för <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Helskärmsförstoring</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">USB-C-enhet (högra porten på baksidan)</translation>
 <translation id="8940956008527784070">Låg batterinivå (<ph name="PERCENTAGE" /> %)</translation>
 <translation id="8984179138335769204">Snabbstart</translation>
+<translation id="899350903320462459">Lås upp enheten som <ph name="LOGIN_ID" /> så att aviseringen kan göras</translation>
 <translation id="8995603266996330174">Hanteras av <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">En uppdatering av Adobe Flash Player är tillgänglig</translation>
 <translation id="9056839673611986238">Enheten återställs</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index d9a709a4..14d385ed 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Kulia</translation>
 <translation id="1351937230027495976">Kunja menyu</translation>
 <translation id="1383876407941801731">Tafuta</translation>
+<translation id="1419738280318246476">Fungua kifaa ili utekeleza kitendo cha arifa</translation>
 <translation id="1467432559032391204">Kushoto</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Kizindua</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Kifaa hiki kinadhibitiwa na <ph name="DOMAIN" /> .</translation>
 <translation id="2050339315714019657">Wima</translation>
 <translation id="2067602449040652523">Ung'avu wa kibodi</translation>
-<translation id="2075212959500165896">Umejaribu mara nyingi mno. Jaribu tena baadaye.</translation>
 <translation id="2081529251031312395">Bado $1 anaweza kuingia katika akaunti baadaye.</translation>
 <translation id="2127372758936585790">Chaja ya nguvu ya chini</translation>
 <translation id="2135456203358955318">Kikuzaji kilichofungwa</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Unaweza kuingia katika akaunti <ph name="MULTI_PROFILE_USER_LIMIT" /> pekee ukitumia kipengele cha uwezo wa kuingia katika akaunti nyingi kwa wakati mmoja.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Imeunganishwa kwenye kifaa kimoja}other{Imeunganishwa kwenye vifaa #}}</translation>
 <translation id="3236488194889173876">Mtandao wa simu haupatikani</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Mgeni</translation>
 <translation id="332587331255250389">Tafadhali badilisha betri</translation>
 <translation id="3351879221545518001">Kwa sasa unatuma skrini.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Zima kisha uwashe na uweke upya</translation>
 <translation id="4961318399572185831">Tuma skrini</translation>
 <translation id="5069971504769299223">Msimamizi wa kifaa hiki anaweza kufuatilia shughuli zako.</translation>
+<translation id="5083553833479578423">Fungua vipengele zaidi vya programu yako ya Mratibu.</translation>
 <translation id="5136175204352732067">Kibodi tofauti imeunganishwa</translation>
 <translation id="5168181903108465623">Vifaa vinavyorusha maudhui vinapatikana</translation>
 <translation id="5207949376430453814">Angazia kareti ya maandishi</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Bluetooth imewashwa</translation>
 <translation id="639644700271529076">CAPS LOCK imezimwa</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Futa arifa zote</translation>
 <translation id="643147933154517414">Hakuna arifa</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> kwenye <ph name="RECEIVER_NAME" /></translation>
 <translation id="6452181791372256707">Kataa</translation>
@@ -399,9 +400,11 @@
 <translation id="8152119955266188852">Umebofya njia ya mkato ya kikuzaji cha skrini nzima. Ungependa kukiwasha?</translation>
 <translation id="8190698733819146287">Geuza lugha na uingizaji kukufaa...</translation>
 <translation id="8191230140820435481">Kudhibiti programu, viendelezi na mandhari yako</translation>
+<translation id="8192202700944119416">Arifa zimefichwa.</translation>
 <translation id="8261506727792406068">Futa</translation>
 <translation id="8297006494302853456">Dhaifu</translation>
 <translation id="8308637677604853869">Menyu ya awali</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" />  <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Unda kidokezo</translation>
 <translation id="8392451568018454956">Menyu ya chaguo za <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Kikuzaji cha Skrini Nzima</translation>
@@ -443,6 +446,7 @@
 <translation id="8938800817013097409">Kifaa cha USB-C (mlango wa kulia nyuma)</translation>
 <translation id="8940956008527784070">Betri inaisha (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Kufungua kwa kasi</translation>
+<translation id="899350903320462459">Fungua kifaa kwa kuingia katika akaunti ukitumia <ph name="LOGIN_ID" /> ili utekeleze kitendo cha arifa</translation>
 <translation id="8995603266996330174">Inadhibitiwa na <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Sasisho la Adobe Flash Player linapatikana</translation>
 <translation id="9056839673611986238">Mipangilio ya awali itarejeshwa kwenye kifaa</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index 5704e182b..a272205 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -28,7 +28,7 @@
 <translation id="1467432559032391204">இடது</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">துவக்கி</translation>
-<translation id="1520303207432623762">{NUM_APPS,plural, =1{அறிவிப்பு அமைப்புகளைக் காண்பிக்கும். ஓர் ஆப்ஸுக்கு அறிவிப்புகள் முடக்கப்பட்டுள்ளன}other{அறிவிப்பு அமைப்புகளைக் காண்பிக்கும். # ஆப்ஸுக்கு அறிவிப்புகள் முடக்கப்பட்டுள்ளன}}</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{அறிவிப்பு அமைப்புகளைக் காண்பிக்கும். ஒரு ஆப்ஸுக்கு அறிவிப்புகள் முடக்கப்பட்டுள்ளன}other{அறிவிப்பு அமைப்புகளைக் காண்பிக்கும். # ஆப்ஸுக்கு அறிவிப்புகள் முடக்கப்பட்டுள்ளன}}</translation>
 <translation id="1525508553941733066">நிராகரி</translation>
 <translation id="1537254971476575106">முழுத்திரைப் பெரிதாக்கி</translation>
 <translation id="15373452373711364">பெரிய மவுஸ் இடஞ்சுட்டி</translation>
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390"><ph name="DOMAIN" /> ஆல் இந்த சாதனம் நிர்வகிக்கப்படுகிறது.</translation>
 <translation id="2050339315714019657">செங்குத்து நிலை</translation>
 <translation id="2067602449040652523">விசைப்பலகை ஒளிர்வு</translation>
-<translation id="2075212959500165896">பலமுறை முயன்றுவிட்டீர்கள். பிறகு முயலவும்.</translation>
 <translation id="2081529251031312395">$1 ஆல் பிறகு உள்நுழைய முடியும்.</translation>
 <translation id="2127372758936585790">குறைந்த சக்திகொண்ட சார்ஜர்</translation>
 <translation id="2135456203358955318">டாக் செய்யப்பட்ட பெரிதாக்கி</translation>
@@ -88,7 +87,7 @@
 <translation id="2359808026110333948">தொடர்க</translation>
 <translation id="2365393535144473978">மொபைல் டேட்டாவை இயக்கினால், புளூடூத் இயக்கப்படும்.</translation>
 <translation id="2391579633712104609">180°</translation>
-<translation id="239188844683466770">“தொந்தரவு செய்ய வேண்டாம்” நிலையை நிலைமாற்றும்</translation>
+<translation id="239188844683466770">'தொந்தரவு செய்ய வேண்டாம்' நிலையை நிலைமாற்றும்</translation>
 <translation id="2412593942846481727">புதுப்பிப்பு உள்ளது</translation>
 <translation id="2416346634399901812"><ph name="NETWORK_NAME" /> உடன் இணைக்கப்பட்டுள்ளது</translation>
 <translation id="2429753432712299108">புளூடூத் சாதனம் "<ph name="DEVICE_NAME" />", இணைப்பதற்கான அனுமதியை விரும்புகிறது. ஏற்றுக்கொள்வதற்கு முன்னர், இந்தக் கடவுச்சொல் அந்தச் சாதனத்தில் காண்பிக்கப்பட்டது என்பதை உறுதிப்படுத்தவும்: <ph name="PASSKEY" /></translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">பல உள்நுழைவில் <ph name="MULTI_PROFILE_USER_LIMIT" /> கணக்குகள் வரை மட்டுமே வைத்திருக்கலாம்.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{ஒரு சாதனத்துடன் இணைக்கப்பட்டுள்ளது}other{# சாதனங்களுடன் இணைக்கப்பட்டுள்ளது}}</translation>
 <translation id="3236488194889173876">மொபைல் நெட்வொர்க் இல்லை</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">விருந்தினர்</translation>
 <translation id="332587331255250389">பேட்டரியை மாற்றவும்</translation>
 <translation id="3351879221545518001">தற்போது திரையை அலைபரப்புகிறீர்கள்.</translation>
@@ -170,7 +168,7 @@
 <translation id="3784455785234192852">பூட்டு</translation>
 <translation id="3798670284305777884">ஸ்பீக்கர் (அகம்)</translation>
 <translation id="380165613292957338">வணக்கம், நான் எவ்வாறு உதவலாம்?</translation>
-<translation id="383629559565718788">விசைப்பலகை அமைப்புகளைக் காண்பிக்கும்</translation>
+<translation id="383629559565718788">கீபோர்ட் அமைப்புகளைக் காண்பிக்கும்</translation>
 <translation id="3846575436967432996">நெட்வொர்க் தகவல் எதுவும் இல்லை</translation>
 <translation id="385051799172605136">முந்தைய பக்கம்</translation>
 <translation id="3891340733213178823">வெளியேற Ctrl+Shift+Q ஐ இருமுறை அழுத்தவும்.</translation>
@@ -426,7 +424,7 @@
 <translation id="8676770494376880701">குறைந்த சக்தியிலான சார்ஜர் இணைக்கப்பட்டுள்ளது</translation>
 <translation id="8683506306463609433">செயல்திறன் டிரேஸிங் இயக்கத்தில்</translation>
 <translation id="8734991477317290293">அது உங்கள் விசை அழுத்தங்களைத் திருட முயற்சித்துக் கொண்டிருக்கக்கூடும்</translation>
-<translation id="8735953464173050365">விசைப்பலகை அமைப்புகளைக் காண்பிக்கும். <ph name="KEYBOARD_NAME" /> தேர்ந்தெடுக்கப்பட்டுள்ளது</translation>
+<translation id="8735953464173050365">கீபோர்ட் அமைப்புகளைக் காண்பிக்கும். <ph name="KEYBOARD_NAME" /> தேர்ந்தெடுக்கப்பட்டுள்ளது</translation>
 <translation id="875593634123171288">VPN அமைப்புகளைக் காண்பிக்கும்</translation>
 <translation id="8809737090443522491">பயன்பாடு அல்லது ஆவணத்தின் பெயரை உள்ளிடவும்</translation>
 <translation id="8814190375133053267">வைஃபை</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index 6bc7414..b42744c 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -7,7 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> జోడించబడింది</translation>
 <translation id="1056775291175587022">నెట్‌వర్క్‌లు లేవు</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
-<translation id="1104084341931202936">యాక్సెస్‌బిలిటి సెట్టింగ్‌లను చూపుతుంది</translation>
+<translation id="1104084341931202936">యాక్సెసిబిలిటీ సెట్టింగ్‌లను చూపుతుంది</translation>
 <translation id="1104621072296271835">మీ పరికరాలు కలిసికట్టుగా మరింత బాగా పనిచేస్తాయి</translation>
 <translation id="112308213915226829">అరను స్వయంచాలకంగా దాచు</translation>
 <translation id="1153356358378277386">జత చేసిన పరికరాలు</translation>
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">ఈ పరికరం <ph name="DOMAIN" /> ద్వారా నిర్వహించబడుతుంది.</translation>
 <translation id="2050339315714019657">నిలువు</translation>
 <translation id="2067602449040652523">కీబోర్డ్ ప్రకాశం</translation>
-<translation id="2075212959500165896">చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="2081529251031312395">ఇప్పటికీ $1 తర్వాత సైన్ ఇన్ చేయవచ్చు.</translation>
 <translation id="2127372758936585790">తక్కువ-పవర్ గల ఛార్జర్</translation>
 <translation id="2135456203358955318">డాక్ చేయబడిన మాగ్నిఫైయర్</translation>
@@ -123,7 +122,7 @@
 <translation id="2946119680249604491">కనెక్షన్‌ని జోడించండి</translation>
 <translation id="2961963223658824723">ఏదో తప్పు జరిగింది. కొన్ని క్షణాల తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="2963773877003373896">mod3</translation>
-<translation id="2995447421581609334">ప్రదర్శన పరికరాలను చూపుతుంది.</translation>
+<translation id="2995447421581609334">ప్రసార పరికరాలను చూపుతుంది.</translation>
 <translation id="2996462380875591307">డాక్ చేయబడిన మాగ్నిఫైయర్ ప్రారంభించబడింది. దాన్ని టోగుల్ ఆఫ్ చేయడానికి మళ్లీ Ctrl+Search+Dని నొక్కండి.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> అనేది <ph name="DOMAIN" /> ద్వారా నిర్వహించబడుతున్న పబ్లిక్ సెషన్</translation>
 <translation id="3000461861112256445">మోనో ఆడియో</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">మీరు బహుళ సైన్-ఇన్‌లో గరిష్టంగా <ph name="MULTI_PROFILE_USER_LIMIT" /> ఖాతాలను మాత్రమే కలిగి ఉండవచ్చు.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{పరికరానికి కనెక్ట్ చేయబడింది}other{# పరికరాలకు కనెక్ట్ చేయబడింది}}</translation>
 <translation id="3236488194889173876">మొబైల్ నెట్‌వర్క్ ఏదీ అందుబాటులో లేదు</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">అతిథి</translation>
 <translation id="332587331255250389">దయచేసి బ్యాటరీని భర్తీ చేయండి</translation>
 <translation id="3351879221545518001">ప్రస్తుతం మీరు స్క్రీన్‌ని ప్రసారం చేస్తున్నారు.</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 6997f3e..12fac24 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">อุปกรณ์นี้ได้รับการจัดการโดย <ph name="DOMAIN" /></translation>
 <translation id="2050339315714019657">แนวตั้ง</translation>
 <translation id="2067602449040652523">ความสว่างของแป้นพิมพ์</translation>
-<translation id="2075212959500165896">ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง</translation>
 <translation id="2081529251031312395">$1 ยังมีสิทธิ์ลงชื่อเข้าใช้ภายหลังได้</translation>
 <translation id="2127372758936585790">ที่ชาร์จพลังงานต่ำ</translation>
 <translation id="2135456203358955318">แว่นขยายหน้าจอบางส่วน</translation>
@@ -88,7 +87,7 @@
 <translation id="2359808026110333948">ดำเนินการต่อ</translation>
 <translation id="2365393535144473978">การเปิดใช้เน็ตมือถือจะเปิดใช้บลูทูธ</translation>
 <translation id="2391579633712104609">180°</translation>
-<translation id="239188844683466770">เปิด/ปิดห้ามรบกวน</translation>
+<translation id="239188844683466770">เปิด/ปิด "ห้ามรบกวน"</translation>
 <translation id="2412593942846481727">มีเวอร์ชันอัปเดต</translation>
 <translation id="2416346634399901812">เชื่อมต่อ <ph name="NETWORK_NAME" /> แล้ว</translation>
 <translation id="2429753432712299108">อุปกรณ์บลูทูธ "<ph name="DEVICE_NAME" />" ต้องการสิทธิ์ในการจับคู่ ก่อนที่จะยอมรับ โปรดยืนยันว่ารหัสผ่านนี้ปรากฏบนอุปกรณ์นั้น: <ph name="PASSKEY" /></translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">คุณมีบัญชีได้สูงสุด <ph name="MULTI_PROFILE_USER_LIMIT" /> บัญชีในการลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชี</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{เชื่อมต่ออุปกรณ์แล้ว 1 เครื่อง}other{เชื่อมต่ออุปกรณ์แล้ว # เครื่อง}}</translation>
 <translation id="3236488194889173876">ไม่มีเครือข่ายมือถือพร้อมใช้งาน</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">ผู้มาเยือน</translation>
 <translation id="332587331255250389">โปรดเปลี่ยนแบตเตอรี่</translation>
 <translation id="3351879221545518001">คุณกำลังแคสต์หน้าจออยู่</translation>
@@ -295,7 +293,7 @@
 <translation id="6297287540776456956">ใช้สไตลัสเพื่อเลือกพื้นที่</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> หมุนเวียนเป็น <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">การวางซ้อนแป้นพิมพ์</translation>
-<translation id="6376931439017688372">เปิดบลูทูธแล้ว</translation>
+<translation id="6376931439017688372">บลูทูธเปิดอยู่</translation>
 <translation id="639644700271529076">CAPS LOCK ปิดอยู่</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">เสร็จเรียบร้อย</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index a896b42..7332049 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">Bu cihaz <ph name="DOMAIN" /> tarafından yönetiliyor.</translation>
 <translation id="2050339315714019657">Dikey</translation>
 <translation id="2067602449040652523">Klavye parlaklığı</translation>
-<translation id="2075212959500165896">Çok fazla deneme yapıldı. Daha sonra tekrar deneyin.</translation>
 <translation id="2081529251031312395">$1 daha sonra yine oturum açabilir.</translation>
 <translation id="2127372758936585790">Düşük güçlü şarj cihazı</translation>
 <translation id="2135456203358955318">Yerleştirilmiş büyüteç</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">Çoklu oturum açmada en fazla <ph name="MULTI_PROFILE_USER_LIMIT" /> hesabınız olabilir.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Bir cihaza bağlı}other{# cihaza bağlı}}</translation>
 <translation id="3236488194889173876">Kullanılabilir mobil ağ yok</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Misafir</translation>
 <translation id="332587331255250389">Lütfen pili değiştirin</translation>
 <translation id="3351879221545518001">Şu anda ekranı yayınlıyorsunuz.</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb
index 44850e5..404782e 100644
--- a/ash/strings/ash_strings_uk.xtb
+++ b/ash/strings/ash_strings_uk.xtb
@@ -25,6 +25,7 @@
 <translation id="1346748346194534595">Праворуч</translation>
 <translation id="1351937230027495976">Згорнути меню</translation>
 <translation id="1383876407941801731">Пошук</translation>
+<translation id="1419738280318246476">Щоб виконати дію зі сповіщенням, розблокуйте пристрій</translation>
 <translation id="1467432559032391204">Ліворуч</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Панель запуску</translation>
@@ -68,7 +69,6 @@
 <translation id="2049639323467105390">Цим пристроєм керує домен <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Портретна</translation>
 <translation id="2067602449040652523">Яскравість клавіатури</translation>
-<translation id="2075212959500165896">Забагато спроб. Повторіть пізніше.</translation>
 <translation id="2081529251031312395">$1 усе одно зможе ввійти в обліковий запис.</translation>
 <translation id="2127372758936585790">Зарядний пристрій низької потужності</translation>
 <translation id="2135456203358955318">Закріплена лупа</translation>
@@ -140,7 +140,6 @@
 <translation id="3153444934357957346">Максимальна кількість паралельних входів в обліковий запис: <ph name="MULTI_PROFILE_USER_LIMIT" />.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Під’єднано до пристрою}one{Під’єднано до # пристрою}few{Під’єднано до # пристроїв}many{Під’єднано до # пристроїв}other{Під’єднано до # пристрою}}</translation>
 <translation id="3236488194889173876">Немає мобільних мереж</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Гість</translation>
 <translation id="332587331255250389">Замініть акумулятор</translation>
 <translation id="3351879221545518001">Зараз ви транслюєте екран.</translation>
@@ -226,6 +225,7 @@
 <translation id="4924411785043111640">Перезапустити й скинути</translation>
 <translation id="4961318399572185831">Трансляція екрана</translation>
 <translation id="5069971504769299223">Адміністратор пристрою може відстежувати вашу активність.</translation>
+<translation id="5083553833479578423">Розблокуйте інші функції Асистента.</translation>
 <translation id="5136175204352732067">Під’єднано іншу клавіатуру</translation>
 <translation id="5168181903108465623">Доступні пристрої для трансляції</translation>
 <translation id="5207949376430453814">Підсвічувати місце введення тексту</translation>
@@ -297,6 +297,7 @@
 <translation id="6376931439017688372">Bluetooth увімкнено</translation>
 <translation id="639644700271529076">Режим CAPS LOCK вимкнено</translation>
 <translation id="6406704438230478924">altgr</translation>
+<translation id="642644398083277086">Видаліть усі сповіщення</translation>
 <translation id="643147933154517414">Готово</translation>
 <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> транслюється на пристрій "<ph name="RECEIVER_NAME" />"</translation>
 <translation id="6452181791372256707">Відхилити</translation>
@@ -398,9 +399,11 @@
 <translation id="8152119955266188852">Ви натиснули комбінацію клавіш для лупи на весь екран. Увімкнути?</translation>
 <translation id="8190698733819146287">Налаштувати мови та введення тексту...</translation>
 <translation id="8191230140820435481">Керувати вашими програмами, розширеннями та темами</translation>
+<translation id="8192202700944119416">Сповіщення сховано.</translation>
 <translation id="8261506727792406068">Видалити</translation>
 <translation id="8297006494302853456">Слабкий</translation>
 <translation id="8308637677604853869">Попереднє меню</translation>
+<translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" /> <ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Створити нотатку</translation>
 <translation id="8392451568018454956">Меню параметрів для <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8406981827175133772">Лупа для всього екрана</translation>
@@ -442,6 +445,7 @@
 <translation id="8938800817013097409">Пристрій, під’єднаний до порту USB-C (праворуч на задній панелі)</translation>
 <translation id="8940956008527784070">Низький заряд акумулятора (<ph name="PERCENTAGE" />%)</translation>
 <translation id="8984179138335769204">Швидкий запуск</translation>
+<translation id="899350903320462459">Щоб виконати дію зі сповіщенням, розблокуйте пристрій як <ph name="LOGIN_ID" /></translation>
 <translation id="8995603266996330174">Керується доменом <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Доступне оновлення Adobe Flash Player</translation>
 <translation id="9056839673611986238">Пристрій буде відновлено до попереднього стану</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb
index d16d960..218da58 100644
--- a/ash/strings/ash_strings_vi.xtb
+++ b/ash/strings/ash_strings_vi.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">Thiết bị này được <ph name="DOMAIN" /> quản lý.</translation>
 <translation id="2050339315714019657">Khổ dọc</translation>
 <translation id="2067602449040652523">Độ sáng bàn phím</translation>
-<translation id="2075212959500165896">Bạn đã thử quá nhiều lần. Hãy thử lại sau.</translation>
 <translation id="2081529251031312395">$1 vẫn có thể đăng nhập sau.</translation>
 <translation id="2127372758936585790">Bộ sạc công suất thấp</translation>
 <translation id="2135456203358955318">Phóng to ở vị trí cố định</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">Bạn chỉ có thể có tối đa <ph name="MULTI_PROFILE_USER_LIMIT" /> tài khoản khi sử dụng tính năng đăng nhập nhiều tài khoản.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Đã kết nối với một thiết bị}other{Đã kết nối với # thiết bị}}</translation>
 <translation id="3236488194889173876">Không có mạng di động nào</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Khách</translation>
 <translation id="332587331255250389">Vui lòng thay pin</translation>
 <translation id="3351879221545518001">Bạn hiện đang truyền màn hình.</translation>
@@ -421,7 +419,7 @@
 <translation id="8639760480004882931">Còn <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">Chọn để nói</translation>
 <translation id="8652175077544655965">Đóng cài đặt</translation>
-<translation id="8653151467777939995">Hiển thị các tùy chọn cài đặt thông báo. Thông báo đang tắt</translation>
+<translation id="8653151467777939995">Hiển thị các tùy chọn cài đặt thông báo. Thông báo đang bật</translation>
 <translation id="8664753092453405566">Hiển thị danh sách mạng. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Đã kết nối bộ sạc công suất thấp</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb
index 3d768c3..efcf0b8 100644
--- a/ash/strings/ash_strings_zh-CN.xtb
+++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">此设备由 <ph name="DOMAIN" /> 管理。</translation>
 <translation id="2050339315714019657">纵向</translation>
 <translation id="2067602449040652523">键盘亮度</translation>
-<translation id="2075212959500165896">尝试次数过多,请稍后重试。</translation>
 <translation id="2081529251031312395">日后“$1”仍能登录。</translation>
 <translation id="2127372758936585790">低功率充电器</translation>
 <translation id="2135456203358955318">停靠的放大镜</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">使用多帐号登录时,一次最多只能登入 <ph name="MULTI_PROFILE_USER_LIMIT" /> 个帐号。</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{已连接到 1 台设备}other{已连接到 # 台设备}}</translation>
 <translation id="3236488194889173876">没有可用的移动网络</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">访客</translation>
 <translation id="332587331255250389">请更换电池</translation>
 <translation id="3351879221545518001">您目前正在投射屏幕。</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index 95e2572bc..e10300ce 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -68,7 +68,6 @@
 <translation id="2049639323467105390">這個裝置由 <ph name="DOMAIN" /> 管理。</translation>
 <translation id="2050339315714019657">縱向</translation>
 <translation id="2067602449040652523">鍵盤亮度</translation>
-<translation id="2075212959500165896">嘗試次數過多,請稍後再試。</translation>
 <translation id="2081529251031312395">「$1」日後仍可登入。</translation>
 <translation id="2127372758936585790">低功率充電器</translation>
 <translation id="2135456203358955318">停駐放大鏡</translation>
@@ -140,7 +139,6 @@
 <translation id="3153444934357957346">使用多帳戶登入功能時,一次最多只能登入 <ph name="MULTI_PROFILE_USER_LIMIT" /> 個帳戶。</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{已連線至一部裝置}other{已連線至 # 部裝置}}</translation>
 <translation id="3236488194889173876">沒有可用的行動網路</translation>
-<translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">訪客</translation>
 <translation id="332587331255250389">請更換電池</translation>
 <translation id="3351879221545518001">你目前正在投放畫面。</translation>
diff --git a/ash/system/power/power_prefs.cc b/ash/system/power/power_prefs.cc
index 99a3c37..0a90fada 100644
--- a/ash/system/power/power_prefs.cc
+++ b/ash/system/power/power_prefs.cc
@@ -49,8 +49,14 @@
   return pref_action;
 }
 
-PrefService* GetActivePrefService() {
-  return Shell::Get()->session_controller()->GetActivePrefService();
+// Returns the PrefService that should be used for determining power-related
+// behavior. When one or more users are logged in, the primary user's prefs are
+// used: if more-restrictive power-related prefs are set by policy, it's most
+// likely to be on this profile.
+PrefService* GetPrefService() {
+  ash::SessionController* controller = Shell::Get()->session_controller();
+  PrefService* prefs = controller->GetPrimaryUserPrefService();
+  return prefs ? prefs : controller->GetActivePrefService();
 }
 
 // Registers power prefs whose default values are the same in user prefs and
@@ -180,7 +186,7 @@
 
   screen_lock_time_ = locked ? tick_clock_->NowTicks() : base::TimeTicks();
   // OnLockStateChanged could be called before ash connects user prefs in tests.
-  if (GetActivePrefService())
+  if (GetPrefService())
     UpdatePowerPolicyFromPrefs();
 }
 
@@ -193,7 +199,7 @@
 }
 
 void PowerPrefs::UpdatePowerPolicyFromPrefs() {
-  PrefService* prefs = GetActivePrefService();
+  PrefService* prefs = GetPrefService();
   DCHECK(prefs);
 
   // It's possible to end up in a situation where a shortened lock-screen idle
diff --git a/ash/system/power/power_prefs_unittest.cc b/ash/system/power/power_prefs_unittest.cc
index 340f92d..498af911 100644
--- a/ash/system/power/power_prefs_unittest.cc
+++ b/ash/system/power/power_prefs_unittest.cc
@@ -40,8 +40,11 @@
   return Shell::Get()->session_controller()->GetSigninScreenPrefService();
 }
 
-PrefService* GetLastActiveUserPrefService() {
-  return Shell::Get()->session_controller()->GetLastActiveUserPrefService();
+// Returns prefs for the user identified by |user_email|, or null if the user's
+// prefs are unavailable (e.g. because they don't exist).
+PrefService* GetUserPrefService(const std::string& user_email) {
+  return Shell::Get()->session_controller()->GetUserPrefServiceForUser(
+      AccountId::FromUserEmail(user_email));
 }
 
 std::string GetExpectedPowerPolicyForPrefs(PrefService* prefs,
@@ -191,21 +194,49 @@
 }
 
 TEST_F(PowerPrefsTest, UserSession) {
-  SimulateUserLogin("user@test.com");
-  PrefService* prefs =
-      Shell::Get()->session_controller()->GetActivePrefService();
-  EXPECT_EQ(GetLastActiveUserPrefService(), prefs);
+  const char kUserEmail[] = "user@example.net";
+  SimulateUserLogin(kUserEmail);
+  PrefService* prefs = GetUserPrefService(kUserEmail);
+  ASSERT_TRUE(prefs);
   EXPECT_EQ(GetExpectedPowerPolicyForPrefs(prefs, ScreenLockState::UNLOCKED),
             GetCurrentPowerPolicy());
   EXPECT_EQ(GetExpectedAllowScreenWakeLocksForPrefs(prefs),
             GetCurrentAllowScreenWakeLocks());
 }
 
+TEST_F(PowerPrefsTest, PrimaryUserPrefs) {
+  // Add a user with restrictive prefs.
+  const char kFirstUserEmail[] = "user1@example.net";
+  SimulateUserLogin(kFirstUserEmail);
+  PrefService* first_prefs = GetUserPrefService(kFirstUserEmail);
+  ASSERT_TRUE(first_prefs);
+  first_prefs->SetBoolean(prefs::kPowerAllowScreenWakeLocks, false);
+  first_prefs->SetInteger(prefs::kPowerLidClosedAction,
+                          chromeos::PowerPolicyController::ACTION_SHUT_DOWN);
+
+  // Add a second user with lenient prefs.
+  const char kSecondUserEmail[] = "user2@example.net";
+  SimulateUserLogin(kSecondUserEmail);
+  PrefService* second_prefs = GetUserPrefService(kSecondUserEmail);
+  ASSERT_TRUE(second_prefs);
+  second_prefs->SetBoolean(prefs::kPowerAllowScreenWakeLocks, true);
+  second_prefs->SetInteger(prefs::kPowerLidClosedAction,
+                           chromeos::PowerPolicyController::ACTION_DO_NOTHING);
+
+  // Even though the second user is active, the first (primary) user's prefs
+  // should still be used.
+  ASSERT_EQ(second_prefs,
+            Shell::Get()->session_controller()->GetActivePrefService());
+  EXPECT_EQ(
+      GetExpectedPowerPolicyForPrefs(first_prefs, ScreenLockState::UNLOCKED),
+      GetCurrentPowerPolicy());
+}
+
 TEST_F(PowerPrefsTest, AvoidLockDelaysAfterInactivity) {
-  SimulateUserLogin("user@test.com");
-  PrefService* prefs =
-      Shell::Get()->session_controller()->GetActivePrefService();
-  EXPECT_EQ(GetLastActiveUserPrefService(), prefs);
+  const char kUserEmail[] = "user@example.net";
+  SimulateUserLogin(kUserEmail);
+  PrefService* prefs = GetUserPrefService(kUserEmail);
+  ASSERT_TRUE(prefs);
   EXPECT_EQ(GetExpectedPowerPolicyForPrefs(prefs, ScreenLockState::UNLOCKED),
             GetCurrentPowerPolicy());
 
@@ -231,10 +262,10 @@
 }
 
 TEST_F(PowerPrefsTest, DisabledLockScreen) {
-  SimulateUserLogin("user@test.com");
-  PrefService* prefs =
-      Shell::Get()->session_controller()->GetActivePrefService();
-  EXPECT_EQ(GetLastActiveUserPrefService(), prefs);
+  const char kUserEmail[] = "user@example.net";
+  SimulateUserLogin(kUserEmail);
+  PrefService* prefs = GetUserPrefService(kUserEmail);
+  ASSERT_TRUE(prefs);
 
   // Verify that the power policy actions are set to default values initially.
   EXPECT_EQ(std::vector<power_manager::PowerManagementPolicy_Action>(
diff --git a/ash/voice_interaction/voice_interaction_controller.cc b/ash/voice_interaction/voice_interaction_controller.cc
index e3a1d159..4c6fd792 100644
--- a/ash/voice_interaction/voice_interaction_controller.cc
+++ b/ash/voice_interaction/voice_interaction_controller.cc
@@ -6,9 +6,14 @@
 
 #include <utility>
 
+#include "chromeos/chromeos_switches.h"
+
 namespace ash {
 
-VoiceInteractionController::VoiceInteractionController() = default;
+VoiceInteractionController::VoiceInteractionController() {
+  if (chromeos::switches::IsAssistantEnabled())
+    voice_interaction_state_ = mojom::VoiceInteractionState::NOT_READY;
+}
 
 VoiceInteractionController::~VoiceInteractionController() = default;
 
diff --git a/ash/wm/default_window_resizer_unittest.cc b/ash/wm/default_window_resizer_unittest.cc
new file mode 100644
index 0000000..94a0795
--- /dev/null
+++ b/ash/wm/default_window_resizer_unittest.cc
@@ -0,0 +1,132 @@
+// 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 "ash/wm/default_window_resizer.h"
+
+#include "ash/root_window_controller.h"
+#include "ash/shell.h"
+#include "ash/test/ash_test_base.h"
+#include "ui/aura/client/aura_constants.h"
+#include "ui/aura/test/test_window_delegate.h"
+#include "ui/base/hit_test.h"
+#include "ui/base/ui_base_types.h"
+
+namespace ash {
+
+class DefaultWindowResizerTest : public AshTestBase {
+ public:
+  DefaultWindowResizerTest() = default;
+  ~DefaultWindowResizerTest() override = default;
+
+  void SetUp() override {
+    AshTestBase::SetUp();
+
+    UpdateDisplay("1000x1000");
+
+    delegate_.set_minimum_size(gfx::Size(10, 10));
+    delegate_.set_maximum_size(gfx::Size(500, 500));
+    aspect_ratio_window_ = std::make_unique<aura::Window>(&delegate_);
+    aspect_ratio_window_->SetType(aura::client::WINDOW_TYPE_NORMAL);
+    aspect_ratio_window_->Init(ui::LAYER_NOT_DRAWN);
+    ParentWindowInPrimaryRootWindow(aspect_ratio_window_.get());
+  }
+
+  void TearDown() override {
+    aspect_ratio_window_.reset();
+    AshTestBase::TearDown();
+  }
+
+ protected:
+  static WindowResizer* CreateDefaultWindowResizer(
+      aura::Window* window,
+      const gfx::Point& point_in_parent,
+      int window_component) {
+    return CreateWindowResizer(window, point_in_parent, window_component,
+                               ::wm::WINDOW_MOVE_SOURCE_MOUSE)
+        .release();
+  }
+
+  aura::test::TestWindowDelegate delegate_;
+  std::unique_ptr<aura::Window> aspect_ratio_window_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DefaultWindowResizerTest);
+};
+
+// Tests window dragging with a square aspect ratio.
+TEST_F(DefaultWindowResizerTest, WindowResizeWithAspectRatioSquare) {
+  aspect_ratio_window_->SetProperty(aura::client::kAspectRatio,
+                                    new gfx::SizeF(1.0, 1.0));
+
+  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
+  ASSERT_EQ(1U, root_windows.size());
+  EXPECT_EQ(root_windows[0], aspect_ratio_window_->GetRootWindow());
+
+  aspect_ratio_window_->SetBoundsInScreen(
+      gfx::Rect(200, 200, 200, 200),
+      display::Screen::GetScreen()->GetDisplayNearestWindow(root_windows[0]));
+  EXPECT_EQ("200,200 200x200", aspect_ratio_window_->bounds().ToString());
+
+  std::unique_ptr<WindowResizer> resizer(CreateDefaultWindowResizer(
+      aspect_ratio_window_.get(), gfx::Point(), HTTOPLEFT));
+  ASSERT_TRUE(resizer.get());
+
+  // Move the mouse near the top left edge.
+  resizer->Drag(gfx::Point(50, 50), 0);
+  resizer->CompleteDrag();
+  EXPECT_EQ(root_windows[0], aspect_ratio_window_->GetRootWindow());
+  EXPECT_EQ("250,250 150x150", aspect_ratio_window_->bounds().ToString());
+}
+
+// Tests window dragging with a horizontal orientation aspect ratio.
+TEST_F(DefaultWindowResizerTest, WindowResizeWithAspectRatioHorizontal) {
+  aspect_ratio_window_->SetProperty(aura::client::kAspectRatio,
+                                    new gfx::SizeF(2.0, 1.0));
+
+  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
+  ASSERT_EQ(1U, root_windows.size());
+  EXPECT_EQ(root_windows[0], aspect_ratio_window_->GetRootWindow());
+
+  aspect_ratio_window_->SetBoundsInScreen(
+      gfx::Rect(200, 200, 400, 200),
+      display::Screen::GetScreen()->GetDisplayNearestWindow(root_windows[0]));
+  EXPECT_EQ("200,200 400x200", aspect_ratio_window_->bounds().ToString());
+
+  std::unique_ptr<WindowResizer> resizer(CreateDefaultWindowResizer(
+      aspect_ratio_window_.get(), gfx::Point(), HTBOTTOMRIGHT));
+  ASSERT_TRUE(resizer.get());
+
+  // Move the mouse near the top left edge.
+  resizer->Drag(gfx::Point(50, 50), 0);
+  resizer->CompleteDrag();
+  EXPECT_EQ(root_windows[0], aspect_ratio_window_->GetRootWindow());
+  EXPECT_EQ("200,200 500x250", aspect_ratio_window_->bounds().ToString());
+}
+
+// Tests window dragging with a vertical orientation aspect ratio.
+TEST_F(DefaultWindowResizerTest, WindowResizeWithAspectRatioVertical) {
+  aspect_ratio_window_->SetProperty(aura::client::kAspectRatio,
+                                    new gfx::SizeF(1.0, 2.0));
+
+  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
+  ASSERT_EQ(1U, root_windows.size());
+  EXPECT_EQ(root_windows[0], aspect_ratio_window_->GetRootWindow());
+
+  aspect_ratio_window_->SetBoundsInScreen(
+      gfx::Rect(200, 200, 200, 400),
+      display::Screen::GetScreen()->GetDisplayNearestWindow(root_windows[0]));
+  EXPECT_EQ("200,200 200x400", aspect_ratio_window_->bounds().ToString());
+
+  std::unique_ptr<WindowResizer> resizer(CreateDefaultWindowResizer(
+      aspect_ratio_window_.get(), gfx::Point(), HTBOTTOM));
+  ASSERT_TRUE(resizer.get());
+
+  // Move the mouse near the top left edge.
+  resizer->Drag(gfx::Point(50, 50), 0);
+  resizer->CompleteDrag();
+  EXPECT_EQ(root_windows[0], aspect_ratio_window_->GetRootWindow());
+  EXPECT_EQ("200,200 225x450", aspect_ratio_window_->bounds().ToString());
+}
+
+}  // namespace ash
diff --git a/ash/wm/overview/window_grid.cc b/ash/wm/overview/window_grid.cc
index 7c81aa2..719c1aa 100644
--- a/ash/wm/overview/window_grid.cc
+++ b/ash/wm/overview/window_grid.cc
@@ -478,9 +478,10 @@
 
   window_observer_.Add(window);
   window_state_observer_.Add(wm::GetWindowState(window));
-  window_list_.push_back(
+  window_list_.insert(
+      window_list_.begin(),
       std::make_unique<WindowSelectorItem>(window, window_selector_, this));
-  window_list_.back()->PrepareForOverview();
+  window_list_.front()->PrepareForOverview();
 
   if (reposition)
     PositionWindows(animate);
diff --git a/ash/wm/overview/window_selector.cc b/ash/wm/overview/window_selector.cc
index efa6992..e699aca 100644
--- a/ash/wm/overview/window_selector.cc
+++ b/ash/wm/overview/window_selector.cc
@@ -112,25 +112,71 @@
 
 // Returns the bounds for the overview window grid according to the split view
 // state. If split view mode is active, the overview window should open on the
-// opposite side of the default snap window.
-gfx::Rect GetGridBoundsInScreen(aura::Window* root_window) {
+// opposite side of the default snap window. If |divider_changed| is true, maybe
+// clamp the bounds to a minimum size and shift the bounds offscreen.
+gfx::Rect GetGridBoundsInScreen(aura::Window* root_window,
+                                bool divider_changed) {
   SplitViewController* split_view_controller =
       Shell::Get()->split_view_controller();
-  if (split_view_controller->IsSplitViewModeActive()) {
-    SplitViewController::SnapPosition oppsite_position =
-        (split_view_controller->default_snap_position() ==
-         SplitViewController::LEFT)
-            ? SplitViewController::RIGHT
-            : SplitViewController::LEFT;
-    return split_view_controller->GetSnappedWindowBoundsInScreen(
-        root_window, oppsite_position);
-  } else {
-    return split_view_controller->GetDisplayWorkAreaBoundsInScreen(root_window);
-  }
+  const gfx::Rect work_area =
+      split_view_controller->GetDisplayWorkAreaBoundsInScreen(root_window);
+  if (!split_view_controller->IsSplitViewModeActive())
+    return work_area;
+
+  SplitViewController::SnapPosition opposite_position =
+      (split_view_controller->default_snap_position() ==
+       SplitViewController::LEFT)
+          ? SplitViewController::RIGHT
+          : SplitViewController::LEFT;
+  gfx::Rect bounds = split_view_controller->GetSnappedWindowBoundsInScreen(
+      root_window, opposite_position);
+  if (!divider_changed)
+    return bounds;
+
+  const bool landscape =
+      split_view_controller->IsCurrentScreenOrientationLandscape();
+  const int min_length =
+      (landscape ? work_area.width() : work_area.height()) / 3;
+  if ((landscape ? bounds.width() : bounds.height()) > min_length)
+    return bounds;
+
+  // Helper function which shifts and clamps |out_bounds|. Handles the
+  // orientation and whether |opposite_position| is physically on the left
+  // or top of the screen.
+  auto shift_bounds = [&min_length, &landscape](bool left_or_top,
+                                                gfx::Rect* out_bounds) {
+    // If we are shifting to the left or top we need to update the origin as
+    // well.
+    if (left_or_top) {
+      if (landscape) {
+        out_bounds->set_x(out_bounds->x() - (min_length - out_bounds->width()));
+      } else {
+        out_bounds->set_y(out_bounds->y() -
+                          (min_length - out_bounds->height()));
+      }
+    }
+
+    if (landscape)
+      out_bounds->set_width(min_length);
+    else
+      out_bounds->set_height(min_length);
+  };
+
+  // Shift the opposite direction when |primary| is false because the physical
+  // location will not be aligned with |opposite_position|.
+  const bool primary =
+      split_view_controller->IsCurrentScreenOrientationPrimary();
+  if (opposite_position == SplitViewController::LEFT)
+    shift_bounds(primary, &bounds);
+  else
+    shift_bounds(!primary, &bounds);
+
+  return bounds;
 }
 
 gfx::Rect GetTextFilterPosition(aura::Window* root_window) {
-  const gfx::Rect total_bounds = GetGridBoundsInScreen(root_window);
+  const gfx::Rect total_bounds =
+      GetGridBoundsInScreen(root_window, /*divider_changed=*/false);
   return gfx::Rect(
       total_bounds.x() +
           0.5 * (total_bounds.width() -
@@ -279,7 +325,8 @@
     }
 
     std::unique_ptr<WindowGrid> grid(
-        new WindowGrid(root, windows, this, GetGridBoundsInScreen(root)));
+        new WindowGrid(root, windows, this,
+                       GetGridBoundsInScreen(root, /*divider_changed=*/false)));
     num_items_ += grid->size();
     grid_list_.push_back(std::move(grid));
   }
@@ -893,7 +940,14 @@
 
 void WindowSelector::OnSplitViewDividerPositionChanged() {
   DCHECK(Shell::Get()->IsSplitViewModeActive());
-  OnDisplayBoundsChanged();
+  // Re-calculate the bounds for the window grids and position all the windows.
+  for (std::unique_ptr<WindowGrid>& grid : grid_list_) {
+    grid->SetBoundsAndUpdatePositions(
+        GetGridBoundsInScreen(const_cast<aura::Window*>(grid->root_window()),
+                              /*divider_changed=*/true));
+  }
+  PositionWindows(/*animate=*/false);
+  RepositionTextFilterOnDisplayMetricsChange();
 }
 
 aura::Window* WindowSelector::GetTextFilterWidgetWindow() {
@@ -967,7 +1021,8 @@
   // Re-calculate the bounds for the window grids and position all the windows.
   for (std::unique_ptr<WindowGrid>& grid : grid_list_) {
     grid->SetBoundsAndUpdatePositions(
-        GetGridBoundsInScreen(const_cast<aura::Window*>(grid->root_window())));
+        GetGridBoundsInScreen(const_cast<aura::Window*>(grid->root_window()),
+                              /*divider_changed=*/false));
   }
   PositionWindows(/*animate=*/false);
   RepositionTextFilterOnDisplayMetricsChange();
diff --git a/ash/wm/overview/window_selector_item.cc b/ash/wm/overview/window_selector_item.cc
index 6b2525c..be23e28 100644
--- a/ash/wm/overview/window_selector_item.cc
+++ b/ash/wm/overview/window_selector_item.cc
@@ -347,13 +347,16 @@
   gfx::Rect backdrop_bounds() const { return backdrop_bounds_; }
 
   void SetHeaderVisibility(HeaderVisibility visibility) {
+    DCHECK(close_button_->layer());
     DCHECK(header_view_->layer());
 
-    // Set the close button invisible if the rest of the header is to be shown.
-    // If the rest of the header is to be hidden, set the close visiblilty to
-    // true as |header_view_|'s opacity will be 0.f, hiding the close button.
-    close_button_->SetVisible(visibility !=
-                              HeaderVisibility::kCloseButtonInvisibleOnly);
+    // Make the close button invisible if the rest of the header is to be shown.
+    // If the rest of the header is to be hidden, make the close button visible
+    // as |header_view_|'s opacity will be 0.f, hiding the close button. Modify
+    // |close_button_|'s opacity instead of visibilty so the flex from its
+    // sibling views do not mess up its layout.
+    close_button_->layer()->SetOpacity(
+        visibility == HeaderVisibility::kCloseButtonInvisibleOnly ? 0.f : 1.f);
     const bool visible = visibility != HeaderVisibility::kInvisible;
     AnimateLayerOpacity(header_view_->layer(), visible);
   }
@@ -917,8 +920,8 @@
                                       : OVERVIEW_ANIMATION_RESTORE_WINDOW_ZERO;
 }
 
-bool WindowSelectorItem::GetCloseButtonVisibilityForTesting() const {
-  return close_button_->visible();
+float WindowSelectorItem::GetCloseButtonVisibilityForTesting() const {
+  return close_button_->layer()->opacity();
 }
 
 float WindowSelectorItem::GetTitlebarOpacityForTesting() const {
diff --git a/ash/wm/overview/window_selector_item.h b/ash/wm/overview/window_selector_item.h
index 625ad6e..76e5b416 100644
--- a/ash/wm/overview/window_selector_item.h
+++ b/ash/wm/overview/window_selector_item.h
@@ -238,7 +238,7 @@
   bool animating_to_close() const { return animating_to_close_; }
   void set_animating_to_close(bool val) { animating_to_close_ = val; }
 
-  bool GetCloseButtonVisibilityForTesting() const;
+  float GetCloseButtonVisibilityForTesting() const;
   float GetTitlebarOpacityForTesting() const;
   gfx::Rect GetShadowBoundsForTesting();
 
diff --git a/ash/wm/overview/window_selector_unittest.cc b/ash/wm/overview/window_selector_unittest.cc
index f0865a51..690709c0 100644
--- a/ash/wm/overview/window_selector_unittest.cc
+++ b/ash/wm/overview/window_selector_unittest.cc
@@ -2541,16 +2541,17 @@
   WindowSelectorItem* item1 = GetWindowItemForWindow(0, window1.get());
   WindowSelectorItem* item2 = GetWindowItemForWindow(0, window2.get());
   // Start the drag on |item1|. Verify the dragged item, |item1| has both the
-  // close button and titlebar hidden. All other items, |item2| should only have
-  // the close button hidden.
+  // close button and titlebar hidden. The close button opacity however is
+  // opaque as its a child of the header which handles fading away the whole
+  // header. All other items, |item2| should only have the close button hidden.
   ui::test::EventGenerator* generator = GetEventGenerator();
   generator->MoveMouseTo(item1->target_bounds().CenterPoint());
   generator->PressLeftButton();
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(0.f, item1->GetTitlebarOpacityForTesting());
-  EXPECT_TRUE(item1->GetCloseButtonVisibilityForTesting());
+  EXPECT_EQ(1.f, item1->GetCloseButtonVisibilityForTesting());
   EXPECT_EQ(1.f, item2->GetTitlebarOpacityForTesting());
-  EXPECT_FALSE(item2->GetCloseButtonVisibilityForTesting());
+  EXPECT_EQ(0.f, item2->GetCloseButtonVisibilityForTesting());
 
   // Drag |item1| in a way so that |window1| does not get activated (drags
   // within a certain threshold count as clicks). Verify the close button and
@@ -2559,9 +2560,9 @@
   generator->ReleaseLeftButton();
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1.f, item1->GetTitlebarOpacityForTesting());
-  EXPECT_TRUE(item1->GetCloseButtonVisibilityForTesting());
+  EXPECT_EQ(1.f, item1->GetCloseButtonVisibilityForTesting());
   EXPECT_EQ(1.f, item2->GetTitlebarOpacityForTesting());
-  EXPECT_TRUE(item2->GetCloseButtonVisibilityForTesting());
+  EXPECT_EQ(1.f, item2->GetCloseButtonVisibilityForTesting());
 }
 
 // Tests that overview widgets are stacked in the correct order.
@@ -4492,6 +4493,62 @@
   EXPECT_FALSE(wm::IsActiveWindow(window1.get()));
 }
 
+// Verify that if the split view divider is dragged close to the edge, the grid
+// bounds will be fixed to a third of the work area width and start sliding off
+// the screen instead of continuing to shrink.
+TEST_F(SplitViewWindowSelectorTest,
+       OverviewHasMinimumBoundsWhenDividerDragged) {
+  UpdateDisplay("600x400");
+
+  const gfx::Rect bounds(400, 400);
+  std::unique_ptr<aura::Window> window1(CreateWindow(bounds));
+  std::unique_ptr<aura::Window> window2(CreateWindow(bounds));
+
+  ToggleOverview();
+  // Snap a window to the left and test dragging the divider towards the right
+  // edge of the screen.
+  Shell::Get()->split_view_controller()->SnapWindow(window1.get(),
+                                                    SplitViewController::LEFT);
+  WindowGrid* grid = window_selector()->grid_list_for_testing()[0].get();
+  ASSERT_TRUE(grid);
+
+  // Drag the divider to the right edge.
+  gfx::Rect divider_bounds = GetSplitViewDividerBounds(/*is_dragging=*/false);
+  ui::test::EventGenerator* generator = GetEventGenerator();
+  generator->set_current_location(divider_bounds.CenterPoint());
+  generator->PressLeftButton();
+
+  // Tests that near the right edge, the grid bounds are fixed at 200 and are
+  // partially off screen to the right.
+  generator->MoveMouseTo(580, 0);
+  EXPECT_EQ(200, grid->bounds().width());
+  EXPECT_GT(grid->bounds().right(), 600);
+  generator->ReleaseLeftButton();
+
+  // Releasing close to the edge will activate the left window and exit
+  // overview.
+  ASSERT_FALSE(IsSelecting());
+  ToggleOverview();
+  // Snap a window to the right and test dragging the divider towards the left
+  // edge of the screen.
+  Shell::Get()->split_view_controller()->SnapWindow(window1.get(),
+                                                    SplitViewController::RIGHT);
+  grid = window_selector()->grid_list_for_testing()[0].get();
+  ASSERT_TRUE(grid);
+
+  // Drag the divider to the left edge.
+  divider_bounds = GetSplitViewDividerBounds(/*is_dragging=*/false);
+  generator->set_current_location(divider_bounds.CenterPoint());
+  generator->PressLeftButton();
+
+  generator->MoveMouseTo(20, 0);
+  // Tests that near the left edge, the grid bounds are fixed at 200 and are
+  // partially off screen to the left.
+  EXPECT_EQ(200, grid->bounds().width());
+  EXPECT_LT(grid->bounds().x(), 0);
+  generator->ReleaseLeftButton();
+}
+
 // Test that when splitview mode is active, minimizing one of the snapped window
 // will insert the minimized window back to overview mode if overview mode is
 // active at the moment.
diff --git a/ash/wm/splitview/split_view_controller_unittest.cc b/ash/wm/splitview/split_view_controller_unittest.cc
index 16caca96..9f58e459 100644
--- a/ash/wm/splitview/split_view_controller_unittest.cc
+++ b/ash/wm/splitview/split_view_controller_unittest.cc
@@ -2216,7 +2216,8 @@
   EXPECT_EQ(split_view_controller()->state(),
             SplitViewController::RIGHT_SNAPPED);
 
-  // Test that the new window item widget shows up.
+  // Test that the new window item widget shows up as the first one of the
+  // windows in the grid.
   WindowSelector* window_selector =
       Shell::Get()->window_selector_controller()->window_selector();
   WindowGrid* current_grid =
@@ -2230,6 +2231,7 @@
       current_grid->GetWindowSelectorItemContaining(
           new_selector_widget->GetNativeWindow());
   ASSERT_TRUE(new_selector_item);
+  EXPECT_EQ(new_selector_item, current_grid->window_list().front().get());
   const gfx::Rect new_selector_bounds = new_selector_item->target_bounds();
   DragWindowTo(resizer.get(), new_selector_bounds.CenterPoint());
   CompleteDrag(std::move(resizer));
@@ -2237,8 +2239,12 @@
   EXPECT_TRUE(Shell::Get()->window_selector_controller()->IsSelecting());
   EXPECT_EQ(split_view_controller()->state(),
             SplitViewController::RIGHT_SNAPPED);
-  // Test that the dragged window has been added to the overview mode.
+  // Test that the dragged window has been added to the overview mode, and it is
+  // added at the front of the grid.
   EXPECT_EQ(current_grid->window_list().size(), 2u);
+  WindowSelectorItem* first_selector_item =
+      current_grid->GetWindowSelectorItemContaining(window1.get());
+  EXPECT_EQ(first_selector_item, current_grid->window_list().front().get());
   EXPECT_TRUE(window_selector->IsWindowInOverview(window1.get()));
   EXPECT_TRUE(window_selector->IsWindowInOverview(window3.get()));
   // Test that the new window item widget has been destroyed.
diff --git a/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc b/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc
index 1d1b64e..7ddbc7e 100644
--- a/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc
+++ b/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc
@@ -50,11 +50,12 @@
   if (!window_grid || window_grid->empty())
     return gfx::Rect();
 
-  WindowSelectorItem* last_item = window_grid->window_list().back().get();
-  if (!window_grid->IsNewSelectorItemWindow(last_item->GetWindow()))
+  WindowSelectorItem* new_selector_item =
+      window_grid->window_list().front().get();
+  if (!window_grid->IsNewSelectorItemWindow(new_selector_item->GetWindow()))
     return gfx::Rect();
 
-  return last_item->target_bounds();
+  return new_selector_item->target_bounds();
 }
 
 // Set |transform| to |window| and its transient child windows. |transform| is
diff --git a/ash/wm/window_resizer.cc b/ash/wm/window_resizer.cc
index f1e61ea..24c73b7 100644
--- a/ash/wm/window_resizer.cc
+++ b/ash/wm/window_resizer.cc
@@ -7,6 +7,7 @@
 #include "ash/wm/root_window_finder.h"
 #include "ash/wm/window_positioning_utils.h"
 #include "ash/wm/window_state.h"
+#include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_delegate.h"
 #include "ui/base/hit_test.h"
@@ -14,6 +15,7 @@
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 #include "ui/gfx/geometry/rect.h"
+#include "ui/views/window/window_resize_utils.h"
 #include "ui/wm/core/coordinate_conversion.h"
 
 namespace ash {
@@ -27,6 +29,31 @@
          window_component == HTBOTTOMRIGHT || window_component == HTGROWBOX;
 }
 
+// Convert |window_component| to the HitTest used in views::WindowResizeUtils.
+views::HitTest GetWindowResizeHitTest(int window_component) {
+  switch (window_component) {
+    case HTBOTTOM:
+      return views::HitTest::kBottom;
+    case HTTOP:
+      return views::HitTest::kTop;
+    case HTLEFT:
+      return views::HitTest::kLeft;
+    case HTRIGHT:
+      return views::HitTest::kRight;
+    case HTTOPLEFT:
+      return views::HitTest::kTopLeft;
+    case HTTOPRIGHT:
+      return views::HitTest::kTopRight;
+    case HTBOTTOMLEFT:
+      return views::HitTest::kBottomLeft;
+    case HTBOTTOMRIGHT:
+      return views::HitTest::kBottomRight;
+    default:
+      NOTREACHED();
+      return views::HitTest::kBottomRight;
+  }
+}
+
 }  // namespace
 
 // static
@@ -127,6 +154,16 @@
   gfx::Point origin = GetOriginForDrag(delta_x, delta_y);
   gfx::Rect new_bounds(origin, size);
 
+  gfx::SizeF* aspect_ratio_size =
+      GetTarget()->GetProperty(aura::client::kAspectRatio);
+  float aspect_ratio = aspect_ratio_size ? aspect_ratio_size->width() /
+                                               aspect_ratio_size->height()
+                                         : 0.0;
+  if (aspect_ratio > 0.0) {
+    CalculateBoundsWithAspectRatio(aspect_ratio, &new_bounds);
+    return new_bounds;
+  }
+
   // Sizing has to keep the result on the screen. Note that this correction
   // has to come first since it might have an impact on the origin as well as
   // on the size.
@@ -339,4 +376,22 @@
   return height;
 }
 
+void WindowResizer::CalculateBoundsWithAspectRatio(float aspect_ratio,
+                                                   gfx::Rect* new_bounds) {
+  gfx::Size min_size = GetTarget()->delegate()
+                           ? GetTarget()->delegate()->GetMinimumSize()
+                           : gfx::Size();
+  gfx::Size max_size = GetTarget()->delegate()
+                           ? GetTarget()->delegate()->GetMaximumSize()
+                           : gfx::Size();
+  DCHECK(!min_size.IsEmpty());
+  DCHECK(!max_size.IsEmpty());
+
+  views::WindowResizeUtils::SizeMinMaxToAspectRatio(aspect_ratio, &min_size,
+                                                    &max_size);
+  views::WindowResizeUtils::SizeRectToAspectRatio(
+      GetWindowResizeHitTest(details().window_component), aspect_ratio,
+      min_size, max_size, new_bounds);
+}
+
 }  // namespace ash
diff --git a/ash/wm/window_resizer.h b/ash/wm/window_resizer.h
index 2ae3197d..52eeddf 100644
--- a/ash/wm/window_resizer.h
+++ b/ash/wm/window_resizer.h
@@ -95,6 +95,10 @@
   // Returns the height of the drag.
   int GetHeightForDrag(int min_height, int* delta_y);
 
+  // Updates |new_bounds| to adhere to the aspect ratio.
+  void CalculateBoundsWithAspectRatio(float aspect_ratio,
+                                      gfx::Rect* new_bounds);
+
   DISALLOW_COPY_AND_ASSIGN(WindowResizer);
 };
 
diff --git a/base/BUILD.gn b/base/BUILD.gn
index bb9ba9f..626e2d0 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -722,6 +722,8 @@
     "sampling_heap_profiler/lock_free_address_hash_set.h",
     "sampling_heap_profiler/module_cache.cc",
     "sampling_heap_profiler/module_cache.h",
+    "sampling_heap_profiler/module_cache_mac.cc",
+    "sampling_heap_profiler/module_cache_win.cc",
     "sampling_heap_profiler/sampling_heap_profiler.cc",
     "sampling_heap_profiler/sampling_heap_profiler.h",
     "scoped_clear_errno.h",
@@ -1173,6 +1175,7 @@
       "process/process_posix.cc",
       "profiler/native_stack_sampler_posix.cc",
       "rand_util_posix.cc",
+      "sampling_heap_profiler/module_cache_posix.cc",
       "strings/string_util_posix.h",
       "strings/sys_string_conversions_posix.cc",
       "sync_socket_posix.cc",
@@ -1421,6 +1424,7 @@
       "process/process_metrics_posix.cc",
       "profiler/native_stack_sampler_posix.cc",
       "rand_util_fuchsia.cc",
+      "sampling_heap_profiler/module_cache_posix.cc",
       "strings/string_util_posix.h",
       "strings/sys_string_conversions_posix.cc",
       "sync_socket_posix.cc",
@@ -1628,7 +1632,10 @@
 
   # Desktop Mac.
   if (is_mac) {
-    sources -= [ "profiler/native_stack_sampler_posix.cc" ]
+    sources -= [
+      "profiler/native_stack_sampler_posix.cc",
+      "sampling_heap_profiler/module_cache_posix.cc",
+    ]
     sources += [
       "mac/scoped_typeref.h",
       "memory/platform_shared_memory_region_mac.cc",
diff --git a/base/profiler/native_stack_sampler.h b/base/profiler/native_stack_sampler.h
index f5b2eb6..5d7e9b0 100644
--- a/base/profiler/native_stack_sampler.h
+++ b/base/profiler/native_stack_sampler.h
@@ -56,13 +56,6 @@
   // any NativeStackSampler object.
   static std::unique_ptr<StackBuffer> CreateStackBuffer();
 
-  // Creates a Module object for the specified memory address. If the address
-  // does not belong to a module returns an invalid module.
-  // TODO(alph): Move platform-specific module lookup code into
-  // base::ModuleCache and remove this function.
-  static StackSamplingProfiler::InternalModule GetModuleForAddress(
-      uintptr_t address);
-
   // The following functions are all called on the SamplingThread (not the
   // thread being sampled).
 
diff --git a/base/profiler/native_stack_sampler_mac.cc b/base/profiler/native_stack_sampler_mac.cc
index 116d1b7..585c00e9 100644
--- a/base/profiler/native_stack_sampler_mac.cc
+++ b/base/profiler/native_stack_sampler_mac.cc
@@ -25,6 +25,7 @@
 #include "base/mac/mach_logging.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
+#include "base/sampling_heap_profiler/module_cache.h"
 #include "base/strings/string_number_conversions.h"
 
 extern "C" {
@@ -35,93 +36,10 @@
 
 using Frame = StackSamplingProfiler::Frame;
 using InternalFrame = StackSamplingProfiler::InternalFrame;
-using Module = StackSamplingProfiler::Module;
-using InternalModule = StackSamplingProfiler::InternalModule;
 using ProfileBuilder = StackSamplingProfiler::ProfileBuilder;
 
 namespace {
 
-// ModuleCacheEntry records a module's address range (half-open) in memory and
-// the module itself.
-struct ModuleCacheEntry {
-  ModuleCacheEntry(uintptr_t start,
-                   uintptr_t end,
-                   InternalModule internal_module)
-      : base_address(start),
-        end_address(end),
-        internal_module(std::move(internal_module)){};
-
-  // Base address of the represented module.
-  uintptr_t base_address;
-
-  // First address off the end of the represented module.
-  uintptr_t end_address;
-
-  // Module information.
-  InternalModule internal_module;
-};
-
-// Module identifiers ---------------------------------------------------------
-
-// Returns the unique build ID for a module loaded at |module_addr|. Returns the
-// empty string if the function fails to get the build ID.
-//
-// Build IDs are created by the concatenation of the module's GUID (Windows) /
-// UUID (Mac) and an "age" field that indicates how many times that GUID/UUID
-// has been reused. In Windows binaries, the "age" field is present in the
-// module header, but on the Mac, UUIDs are never reused and so the "age" value
-// appended to the UUID is always 0.
-std::string GetUniqueId(const void* module_addr) {
-  const mach_header_64* mach_header =
-      reinterpret_cast<const mach_header_64*>(module_addr);
-  DCHECK_EQ(MH_MAGIC_64, mach_header->magic);
-
-  size_t offset = sizeof(mach_header_64);
-  size_t offset_limit = sizeof(mach_header_64) + mach_header->sizeofcmds;
-
-  for (uint32_t i = 0; i < mach_header->ncmds; ++i) {
-    if (offset + sizeof(load_command) >= offset_limit)
-      return std::string();
-
-    const load_command* current_cmd = reinterpret_cast<const load_command*>(
-        reinterpret_cast<const uint8_t*>(mach_header) + offset);
-
-    if (offset + current_cmd->cmdsize > offset_limit) {
-      // This command runs off the end of the command list. This is malformed.
-      return std::string();
-    }
-
-    if (current_cmd->cmd == LC_UUID) {
-      if (current_cmd->cmdsize < sizeof(uuid_command)) {
-        // This "UUID command" is too small. This is malformed.
-        return std::string();
-      }
-
-      const uuid_command* uuid_cmd =
-          reinterpret_cast<const uuid_command*>(current_cmd);
-      static_assert(sizeof(uuid_cmd->uuid) == sizeof(uuid_t),
-                    "UUID field of UUID command should be 16 bytes.");
-      // The ID is comprised of the UUID concatenated with the Mac's "age" value
-      // which is always 0.
-      return HexEncode(&uuid_cmd->uuid, sizeof(uuid_cmd->uuid)) + "0";
-    }
-    offset += current_cmd->cmdsize;
-  }
-  return std::string();
-}
-
-// Returns the size of the _TEXT segment of the module loaded at |module_addr|.
-size_t GetModuleTextSize(const void* module_addr) {
-  const mach_header_64* mach_header =
-      reinterpret_cast<const mach_header_64*>(module_addr);
-  DCHECK_EQ(MH_MAGIC_64, mach_header->magic);
-
-  unsigned long module_size;
-  getsegmentdata(mach_header, SEG_TEXT, &module_size);
-
-  return module_size;
-}
-
 // Stack walking --------------------------------------------------------------
 
 // Fills |state| with |target_thread|'s context.
@@ -210,6 +128,8 @@
       (((1 << __builtin_popcount(UNWIND_X86_64_RBP_FRAME_OFFSET))) - 1));
 }
 
+}  // namespace
+
 // True if the unwind from |leaf_frame_rip| may trigger a crash bug in
 // unw_init_local. If so, the stack walk should be aborted at the leaf frame.
 bool MayTriggerUnwInitLocalCrash(uint64_t leaf_frame_rip) {
@@ -238,11 +158,13 @@
   vm_size_t size = sizeof(unused);
   return vm_read_overwrite(current_task(),
                            reinterpret_cast<vm_address_t>(info.dli_fbase) +
-                               GetModuleTextSize(info.dli_fbase),
+                               ModuleCache::GetModuleTextSize(info.dli_fbase),
                            sizeof(unused),
                            reinterpret_cast<vm_address_t>(&unused), &size) != 0;
 }
 
+namespace {
+
 // Check if the cursor contains a valid-looking frame pointer for frame pointer
 // unwinds. If the stack frame has a frame pointer, stepping the cursor will
 // involve indexing memory access off of that pointer. In that case,
@@ -336,6 +258,8 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedSuspendThread);
 };
 
+}  // namespace
+
 // NativeStackSamplerMac ------------------------------------------------------
 
 class NativeStackSamplerMac : public NativeStackSampler {
@@ -351,10 +275,6 @@
       ProfileBuilder* profile_builder) override;
 
  private:
-  // Returns the InternalModule containing |instruction_pointer|, adding it to
-  // module_cache_entry_ if it's not already present.
-  InternalModule GetInternalModule(uintptr_t instruction_pointer);
-
   // Walks the stack represented by |unwind_context|, calling back to the
   // provided lambda for each frame. Returns false if an error occurred,
   // otherwise returns true.
@@ -380,7 +300,7 @@
   const void* const thread_stack_base_address_;
 
   // Maps a module's address range to the module.
-  std::vector<ModuleCacheEntry> module_cache_entry_;
+  ModuleCache module_cache_;
 
   // The address range of |_sigtramp|, the signal trampoline function.
   uintptr_t sigtramp_start_;
@@ -408,7 +328,7 @@
 NativeStackSamplerMac::~NativeStackSamplerMac() {}
 
 void NativeStackSamplerMac::ProfileRecordingStarting() {
-  module_cache_entry_.clear();
+  module_cache_.Clear();
 }
 
 std::vector<InternalFrame> NativeStackSamplerMac::RecordStackFrames(
@@ -468,7 +388,7 @@
   // and bail. See MayTriggerUnwInitLocalCrash for details.
   uintptr_t rip = thread_state.__rip;
   if (MayTriggerUnwInitLocalCrash(rip)) {
-    internal_frames.emplace_back(rip, GetInternalModule(rip));
+    internal_frames.emplace_back(rip, module_cache_.GetModuleForAddress(rip));
     return internal_frames;
   }
 
@@ -488,35 +408,17 @@
     return HasValidRbp(unwind_cursor, new_stack_top);
   };
 
-  WalkStack(
-      thread_state,
-      [&internal_frames](uintptr_t frame_ip, InternalModule internal_module) {
-        internal_frames.emplace_back(frame_ip, std::move(internal_module));
-      },
-      continue_predicate);
+  WalkStack(thread_state,
+            [&internal_frames](uintptr_t frame_ip,
+                               ModuleCache::Module internal_module) {
+              internal_frames.emplace_back(frame_ip,
+                                           std::move(internal_module));
+            },
+            continue_predicate);
 
   return internal_frames;
 }
 
-InternalModule NativeStackSamplerMac::GetInternalModule(
-    uintptr_t instruction_pointer) {
-  // Check if |instruction_pointer| is in the address range of a module we've
-  // already seen.
-  auto loc =
-      std::find_if(module_cache_entry_.begin(), module_cache_entry_.end(),
-                   [instruction_pointer](const ModuleCacheEntry& entry) {
-                     return instruction_pointer >= entry.base_address &&
-                            instruction_pointer < entry.end_address;
-                   });
-  if (loc != module_cache_entry_.end())
-    return loc->internal_module;
-
-  InternalModule module = GetModuleForAddress(instruction_pointer);
-  module_cache_entry_.emplace_back(module.base_address,
-                                   module.base_address + module.size, module);
-  return module;
-}
-
 template <typename StackFrameCallback, typename ContinueUnwindPredicate>
 bool NativeStackSamplerMac::WalkStackFromContext(
     unw_context_t* unwind_context,
@@ -543,11 +445,11 @@
     // libunwind adds the expected stack size, it will look for the return
     // address in the wrong place. This check should ensure that we bail before
     // trying to deref a bad IP obtained this way in the previous frame.
-    InternalModule internal_module = GetInternalModule(rip);
-    if (!internal_module.is_valid)
+    const ModuleCache::Module& module = module_cache_.GetModuleForAddress(rip);
+    if (!module.is_valid)
       return false;
 
-    callback(static_cast<uintptr_t>(rip), internal_module);
+    callback(static_cast<uintptr_t>(rip), module);
 
     if (!continue_unwind(&unwind_cursor))
       return false;
@@ -608,8 +510,6 @@
   }
 }
 
-}  // namespace
-
 // NativeStackSampler ---------------------------------------------------------
 
 // static
@@ -620,18 +520,6 @@
 }
 
 // static
-StackSamplingProfiler::InternalModule NativeStackSampler::GetModuleForAddress(
-    uintptr_t address) {
-  Dl_info inf;
-  if (!dladdr(reinterpret_cast<const void*>(address), &inf))
-    return StackSamplingProfiler::InternalModule();
-  auto base_module_address = reinterpret_cast<uintptr_t>(inf.dli_fbase);
-  return StackSamplingProfiler::InternalModule(
-      base_module_address, GetUniqueId(inf.dli_fbase), FilePath(inf.dli_fname),
-      GetModuleTextSize(inf.dli_fbase));
-}
-
-// static
 size_t NativeStackSampler::GetStackBufferSize() {
   // In platform_thread_mac's GetDefaultThreadStackSize(), RLIMIT_STACK is used
   // for all stacks, not just the main thread's, so it is good for use here.
diff --git a/base/profiler/native_stack_sampler_posix.cc b/base/profiler/native_stack_sampler_posix.cc
index 982003d4..fdc18e0 100644
--- a/base/profiler/native_stack_sampler_posix.cc
+++ b/base/profiler/native_stack_sampler_posix.cc
@@ -12,13 +12,6 @@
   return std::unique_ptr<NativeStackSampler>();
 }
 
-// static
-StackSamplingProfiler::InternalModule NativeStackSampler::GetModuleForAddress(
-    uintptr_t address) {
-  // TODO(alph): Implement it.
-  return StackSamplingProfiler::InternalModule();
-}
-
 size_t NativeStackSampler::GetStackBufferSize() {
   return 0;
 }
diff --git a/base/profiler/native_stack_sampler_win.cc b/base/profiler/native_stack_sampler_win.cc
index 56ee166..f3e808f8 100644
--- a/base/profiler/native_stack_sampler_win.cc
+++ b/base/profiler/native_stack_sampler_win.cc
@@ -6,7 +6,6 @@
 
 #include <windows.h>
 
-#include <objbase.h>
 #include <stddef.h>
 #include <winternl.h>
 
@@ -21,21 +20,14 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/profiler/win32_stack_frame_unwinder.h"
+#include "base/sampling_heap_profiler/module_cache.h"
 #include "base/stl_util.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
-#include "base/win/pe_image.h"
-#include "base/win/scoped_handle.h"
 
 namespace base {
 
 using Frame = StackSamplingProfiler::Frame;
 using InternalFrame = StackSamplingProfiler::InternalFrame;
-using Module = StackSamplingProfiler::Module;
-using InternalModule = StackSamplingProfiler::InternalModule;
 using ProfileBuilder = StackSamplingProfiler::ProfileBuilder;
 
 // Stack recording functions --------------------------------------------------
@@ -203,34 +195,6 @@
 #endif
 }
 
-// Gets the unique build ID for a module. Windows build IDs are created by a
-// concatenation of a GUID and AGE fields found in the headers of a module. The
-// GUID is stored in the first 16 bytes and the AGE is stored in the last 4
-// bytes. Returns the empty string if the function fails to get the build ID.
-//
-// Example:
-// dumpbin chrome.exe /headers | find "Format:"
-//   ... Format: RSDS, {16B2A428-1DED-442E-9A36-FCE8CBD29726}, 10, ...
-//
-// The resulting buildID string of this instance of chrome.exe is
-// "16B2A4281DED442E9A36FCE8CBD2972610".
-//
-// Note that the AGE field is encoded in decimal, not hex.
-std::string GetBuildIDForModule(HMODULE module_handle) {
-  GUID guid;
-  DWORD age;
-  win::PEImage(module_handle).GetDebugId(&guid, &age, /* pdb_file= */ nullptr);
-  const int kGUIDSize = 39;
-  string16 build_id;
-  int result =
-      ::StringFromGUID2(guid, WriteInto(&build_id, kGUIDSize), kGUIDSize);
-  if (result != kGUIDSize)
-    return std::string();
-  RemoveChars(build_id, L"{}-", &build_id);
-  build_id += StringPrintf(L"%d", age);
-  return UTF16ToUTF8(build_id);
-}
-
 // ScopedDisablePriorityBoost -------------------------------------------------
 
 // Disables priority boost on a thread for the lifetime of the object.
@@ -382,6 +346,8 @@
   RecordStack(&thread_context, stack);
 }
 
+}  // namespace
+
 // NativeStackSamplerWin ------------------------------------------------------
 
 class NativeStackSamplerWin : public NativeStackSampler {
@@ -397,10 +363,6 @@
       ProfileBuilder* profile_builder) override;
 
  private:
-  // Attempts to query the module filename, base address, and id for
-  // |module_handle|, and returns them in an InternalModule object.
-  static InternalModule GetModuleForHandle(HMODULE module_handle);
-
   // Creates a set of internal frames with the information represented by
   // |stack|.
   std::vector<InternalFrame> CreateInternalFrames(
@@ -414,7 +376,7 @@
   const void* const thread_stack_base_address_;
 
   // The internal module objects, indexed by the module handle.
-  std::map<HMODULE, InternalModule> module_cache_;
+  std::map<HMODULE, ModuleCache::Module> module_cache_;
 
   DISALLOW_COPY_AND_ASSIGN(NativeStackSamplerWin);
 };
@@ -446,23 +408,6 @@
   return CreateInternalFrames(stack);
 }
 
-// static
-InternalModule NativeStackSamplerWin::GetModuleForHandle(
-    HMODULE module_handle) {
-  wchar_t module_name[MAX_PATH];
-  DWORD result_length =
-      ::GetModuleFileName(module_handle, module_name, size(module_name));
-  if (result_length == 0)
-    return InternalModule();
-
-  const std::string& module_id = GetBuildIDForModule(module_handle);
-  if (module_id.empty())
-    return InternalModule();
-
-  return InternalModule(reinterpret_cast<uintptr_t>(module_handle), module_id,
-                        FilePath(module_name));
-}
-
 std::vector<InternalFrame> NativeStackSamplerWin::CreateInternalFrames(
     const std::vector<RecordedFrame>& stack) {
   std::vector<InternalFrame> internal_frames;
@@ -473,7 +418,7 @@
 
     HMODULE module_handle = frame.module.Get();
     if (!module_handle) {
-      internal_frames.emplace_back(frame_ip, InternalModule());
+      internal_frames.emplace_back(frame_ip, ModuleCache::Module());
       continue;
     }
 
@@ -483,7 +428,8 @@
       continue;
     }
 
-    InternalModule internal_module = GetModuleForHandle(module_handle);
+    ModuleCache::Module internal_module =
+        ModuleCache::CreateModuleForHandle(module_handle);
     if (internal_module.is_valid)
       module_cache_.insert(std::make_pair(module_handle, internal_module));
 
@@ -493,8 +439,6 @@
   return internal_frames;
 }
 
-}  // namespace
-
 // NativeStackSampler ---------------------------------------------------------
 
 // static
@@ -516,13 +460,6 @@
 }
 
 // static
-StackSamplingProfiler::InternalModule NativeStackSampler::GetModuleForAddress(
-    uintptr_t address) {
-  // TODO(alph): Implement it.
-  return StackSamplingProfiler::InternalModule();
-}
-
-// static
 size_t NativeStackSampler::GetStackBufferSize() {
   // The default Win32 reserved stack size is 1 MB and Chrome Windows threads
   // currently always use the default, but this allows for expansion if it
diff --git a/base/profiler/stack_sampling_profiler.cc b/base/profiler/stack_sampling_profiler.cc
index 81f3c5d7..7a1b211 100644
--- a/base/profiler/stack_sampling_profiler.cc
+++ b/base/profiler/stack_sampling_profiler.cc
@@ -52,27 +52,6 @@
 
 StackSamplingProfiler::Module::~Module() = default;
 
-// StackSamplingProfiler::InternalModule --------------------------------------
-
-StackSamplingProfiler::InternalModule::InternalModule() : is_valid(false) {}
-
-StackSamplingProfiler::InternalModule::InternalModule(uintptr_t base_address,
-                                                      const std::string& id,
-                                                      const FilePath& filename)
-    : InternalModule(base_address, id, filename, 0) {}
-
-StackSamplingProfiler::InternalModule::InternalModule(uintptr_t base_address,
-                                                      const std::string& id,
-                                                      const FilePath& filename,
-                                                      size_t size)
-    : base_address(base_address),
-      id(id),
-      filename(filename),
-      is_valid(true),
-      size(size) {}
-
-StackSamplingProfiler::InternalModule::~InternalModule() = default;
-
 // StackSamplingProfiler::Frame -----------------------------------------------
 
 StackSamplingProfiler::Frame::Frame(uintptr_t instruction_pointer,
@@ -88,7 +67,7 @@
 
 StackSamplingProfiler::InternalFrame::InternalFrame(
     uintptr_t instruction_pointer,
-    InternalModule internal_module)
+    ModuleCache::Module internal_module)
     : instruction_pointer(instruction_pointer),
       internal_module(std::move(internal_module)) {}
 
diff --git a/base/profiler/stack_sampling_profiler.h b/base/profiler/stack_sampling_profiler.h
index 90579e7..ca004252 100644
--- a/base/profiler/stack_sampling_profiler.h
+++ b/base/profiler/stack_sampling_profiler.h
@@ -15,6 +15,7 @@
 #include "base/base_export.h"
 #include "base/files/file_path.h"
 #include "base/macros.h"
+#include "base/sampling_heap_profiler/module_cache.h"
 #include "base/strings/string16.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/platform_thread.h"
@@ -80,44 +81,6 @@
     FilePath filename;
   };
 
-  // InternalModule represents the module (DLL or exe) and its validness state.
-  // Different from Module, it has an additional field "is_valid".
-  //
-  // This struct is only used for sampling data transfer from NativeStackSampler
-  // to ProfileBuilder.
-  struct BASE_EXPORT InternalModule {
-    InternalModule();
-    InternalModule(uintptr_t base_address,
-                   const std::string& id,
-                   const FilePath& filename);
-    InternalModule(uintptr_t base_address,
-                   const std::string& id,
-                   const FilePath& filename,
-                   size_t size);
-    ~InternalModule();
-
-    // Points to the base address of the module.
-    uintptr_t base_address;
-
-    // An opaque binary string that uniquely identifies a particular program
-    // version with high probability. This is parsed from headers of the loaded
-    // module.
-    // For binaries generated by GNU tools:
-    //   Contents of the .note.gnu.build-id field.
-    // On Windows:
-    //   GUID + AGE in the debug image headers of a module.
-    std::string id;
-
-    // The filename of the module.
-    FilePath filename;
-
-    // The validness of the module.
-    bool is_valid;
-
-    // Size of the module.
-    size_t size;
-  };
-
   // Frame represents an individual sampled stack frame with module information.
   struct BASE_EXPORT Frame {
     Frame(uintptr_t instruction_pointer, size_t module_index);
@@ -141,14 +104,14 @@
   // to ProfileBuilder.
   struct BASE_EXPORT InternalFrame {
     InternalFrame(uintptr_t instruction_pointer,
-                  InternalModule internal_module);
+                  ModuleCache::Module internal_module);
     ~InternalFrame();
 
     // The sampled instruction pointer within the function.
     uintptr_t instruction_pointer;
 
     // The module information.
-    InternalModule internal_module;
+    ModuleCache::Module internal_module;
   };
 
   // Sample represents a set of stack frames with some extra information.
diff --git a/base/profiler/stack_sampling_profiler_unittest.cc b/base/profiler/stack_sampling_profiler_unittest.cc
index b0f88362..8aa7924 100644
--- a/base/profiler/stack_sampling_profiler_unittest.cc
+++ b/base/profiler/stack_sampling_profiler_unittest.cc
@@ -68,9 +68,6 @@
 using InternalFrame = StackSamplingProfiler::InternalFrame;
 using InternalFrames = std::vector<InternalFrame>;
 using InternalFrameSets = std::vector<std::vector<InternalFrame>>;
-using Module = StackSamplingProfiler::Module;
-using InternalModule = StackSamplingProfiler::InternalModule;
-using Sample = StackSamplingProfiler::Sample;
 
 namespace {
 
diff --git a/base/profiler/win32_stack_frame_unwinder.cc b/base/profiler/win32_stack_frame_unwinder.cc
index a3f5f74..a337c16 100644
--- a/base/profiler/win32_stack_frame_unwinder.cc
+++ b/base/profiler/win32_stack_frame_unwinder.cc
@@ -119,6 +119,8 @@
 bool Win32StackFrameUnwinder::TryUnwind(CONTEXT* context,
                                         ScopedModuleHandle* module) {
 #ifdef _WIN64
+  // TODO(chengx): update base::ModuleCache to return a ScopedModuleHandle and
+  // use it for this module lookup.
   ScopedModuleHandle frame_module =
       unwind_functions_->GetModuleForProgramCounter(context->Rip);
   if (!frame_module.IsValid()) {
diff --git a/base/sampling_heap_profiler/module_cache.cc b/base/sampling_heap_profiler/module_cache.cc
index 9384f4c..3871d517 100644
--- a/base/sampling_heap_profiler/module_cache.cc
+++ b/base/sampling_heap_profiler/module_cache.cc
@@ -5,10 +5,28 @@
 #include "base/sampling_heap_profiler/module_cache.h"
 
 #include "base/no_destructor.h"
-#include "base/profiler/native_stack_sampler.h"
 
 namespace base {
 
+ModuleCache::Module::Module() : is_valid(false) {}
+
+ModuleCache::Module::Module(uintptr_t base_address,
+                            const std::string& id,
+                            const FilePath& filename)
+    : Module(base_address, id, filename, 0) {}
+
+ModuleCache::Module::Module(uintptr_t base_address,
+                            const std::string& id,
+                            const FilePath& filename,
+                            size_t size)
+    : base_address(base_address),
+      id(id),
+      filename(filename),
+      is_valid(true),
+      size(size) {}
+
+ModuleCache::Module::~Module() = default;
+
 ModuleCache::ModuleCache() = default;
 ModuleCache::~ModuleCache() = default;
 
@@ -23,7 +41,7 @@
       return module;
   }
 
-  auto module = NativeStackSampler::GetModuleForAddress(address);
+  auto module = CreateModuleForAddress(address);
   if (!module.is_valid)
     return *invalid_module;
   return modules_cache_map_.emplace(module.base_address, std::move(module))
diff --git a/base/sampling_heap_profiler/module_cache.h b/base/sampling_heap_profiler/module_cache.h
index ec039c3..6978bc23 100644
--- a/base/sampling_heap_profiler/module_cache.h
+++ b/base/sampling_heap_profiler/module_cache.h
@@ -6,23 +6,86 @@
 #define BASE_SAMPLING_HEAP_PROFILER_MODULE_CACHE_H_
 
 #include <map>
+#include <string>
 #include <vector>
 
-#include "base/profiler/stack_sampling_profiler.h"
+#include "base/base_export.h"
+#include "base/files/file_path.h"
+#include "build/build_config.h"
+
+#if defined(OS_WIN)
+#include <windows.h>
+#endif
 
 namespace base {
 
 class BASE_EXPORT ModuleCache {
  public:
-  using Module = StackSamplingProfiler::InternalModule;
+  // Module represents the module (DLL or exe) and its validness state.
+  // This struct is used for sampling data transfer from NativeStackSampler
+  // to ProfileBuilder as well as by SamplingHeapProfiler.
+  struct BASE_EXPORT Module {
+    Module();
+    Module(uintptr_t base_address,
+           const std::string& id,
+           const FilePath& filename);
+    Module(uintptr_t base_address,
+           const std::string& id,
+           const FilePath& filename,
+           size_t size);
+    ~Module();
+
+    // Points to the base address of the module.
+    uintptr_t base_address;
+
+    // An opaque binary string that uniquely identifies a particular program
+    // version with high probability. This is parsed from headers of the loaded
+    // module.
+    // For binaries generated by GNU tools:
+    //   Contents of the .note.gnu.build-id field.
+    // On Windows:
+    //   GUID + AGE in the debug image headers of a module.
+    std::string id;
+
+    // The filename of the module.
+    FilePath filename;
+
+    // The validness of the module.
+    bool is_valid;
+
+    // Size of the module.
+    size_t size;
+  };
 
   ModuleCache();
   ~ModuleCache();
 
+  void Clear() { modules_cache_map_.clear(); }
+
   const Module& GetModuleForAddress(uintptr_t address);
   std::vector<const Module*> GetModules() const;
 
  private:
+  // TODO(alph): Refactor corresponding functions to use public API instead,
+  // and drop friends.
+
+  // Creates a Module object for the specified memory address. If the address
+  // does not belong to a module returns an invalid module.
+  static Module CreateModuleForAddress(uintptr_t address);
+  friend class NativeStackSamplerMac;
+
+#if defined(OS_MACOSX)
+  // Returns the size of the _TEXT segment of the module loaded
+  // at |module_addr|.
+  static size_t GetModuleTextSize(const void* module_addr);
+  friend bool MayTriggerUnwInitLocalCrash(uint64_t);
+#endif
+
+#if defined(OS_WIN)
+  static Module CreateModuleForHandle(HMODULE module_handle);
+  friend class NativeStackSamplerWin;
+#endif
+
   std::map<uintptr_t, Module> modules_cache_map_;
 };
 
diff --git a/base/sampling_heap_profiler/module_cache_mac.cc b/base/sampling_heap_profiler/module_cache_mac.cc
new file mode 100644
index 0000000..de145458
--- /dev/null
+++ b/base/sampling_heap_profiler/module_cache_mac.cc
@@ -0,0 +1,85 @@
+// 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 "base/sampling_heap_profiler/module_cache.h"
+
+#include <dlfcn.h>
+#include <mach-o/getsect.h>
+#include <uuid/uuid.h>
+
+#include "base/strings/string_number_conversions.h"
+
+namespace base {
+
+namespace {
+
+// Returns the unique build ID for a module loaded at |module_addr|. Returns the
+// empty string if the function fails to get the build ID.
+//
+// Build IDs are created by the concatenation of the module's GUID (Windows) /
+// UUID (Mac) and an "age" field that indicates how many times that GUID/UUID
+// has been reused. In Windows binaries, the "age" field is present in the
+// module header, but on the Mac, UUIDs are never reused and so the "age" value
+// appended to the UUID is always 0.
+std::string GetUniqueId(const void* module_addr) {
+  const mach_header_64* mach_header =
+      reinterpret_cast<const mach_header_64*>(module_addr);
+  DCHECK_EQ(MH_MAGIC_64, mach_header->magic);
+
+  size_t offset = sizeof(mach_header_64);
+  size_t offset_limit = sizeof(mach_header_64) + mach_header->sizeofcmds;
+
+  for (uint32_t i = 0; i < mach_header->ncmds; ++i) {
+    if (offset + sizeof(load_command) >= offset_limit)
+      return std::string();
+
+    const load_command* current_cmd = reinterpret_cast<const load_command*>(
+        reinterpret_cast<const uint8_t*>(mach_header) + offset);
+
+    if (offset + current_cmd->cmdsize > offset_limit) {
+      // This command runs off the end of the command list. This is malformed.
+      return std::string();
+    }
+
+    if (current_cmd->cmd == LC_UUID) {
+      if (current_cmd->cmdsize < sizeof(uuid_command)) {
+        // This "UUID command" is too small. This is malformed.
+        return std::string();
+      }
+
+      const uuid_command* uuid_cmd =
+          reinterpret_cast<const uuid_command*>(current_cmd);
+      static_assert(sizeof(uuid_cmd->uuid) == sizeof(uuid_t),
+                    "UUID field of UUID command should be 16 bytes.");
+      // The ID is comprised of the UUID concatenated with the Mac's "age" value
+      // which is always 0.
+      return HexEncode(&uuid_cmd->uuid, sizeof(uuid_cmd->uuid)) + "0";
+    }
+    offset += current_cmd->cmdsize;
+  }
+  return std::string();
+}
+
+}  // namespace
+
+// static
+ModuleCache::Module ModuleCache::CreateModuleForAddress(uintptr_t address) {
+  Dl_info inf;
+  if (!dladdr(reinterpret_cast<const void*>(address), &inf))
+    return Module();
+  auto base_module_address = reinterpret_cast<uintptr_t>(inf.dli_fbase);
+  return Module(base_module_address, GetUniqueId(inf.dli_fbase),
+                FilePath(inf.dli_fname), GetModuleTextSize(inf.dli_fbase));
+}
+
+size_t ModuleCache::GetModuleTextSize(const void* module_addr) {
+  const mach_header_64* mach_header =
+      reinterpret_cast<const mach_header_64*>(module_addr);
+  DCHECK_EQ(MH_MAGIC_64, mach_header->magic);
+  unsigned long module_size;
+  getsegmentdata(mach_header, SEG_TEXT, &module_size);
+  return module_size;
+}
+
+}  // namespace base
diff --git a/base/sampling_heap_profiler/module_cache_posix.cc b/base/sampling_heap_profiler/module_cache_posix.cc
new file mode 100644
index 0000000..16d6019
--- /dev/null
+++ b/base/sampling_heap_profiler/module_cache_posix.cc
@@ -0,0 +1,15 @@
+// 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 "base/sampling_heap_profiler/module_cache.h"
+
+namespace base {
+
+// static
+ModuleCache::Module ModuleCache::CreateModuleForAddress(uintptr_t address) {
+  // TODO(alph): Implement it.
+  return Module();
+}
+
+}  // namespace base
diff --git a/base/sampling_heap_profiler/module_cache_unittest.cc b/base/sampling_heap_profiler/module_cache_unittest.cc
index 92a8270..23702ac 100644
--- a/base/sampling_heap_profiler/module_cache_unittest.cc
+++ b/base/sampling_heap_profiler/module_cache_unittest.cc
@@ -17,7 +17,7 @@
 
 // Checks that ModuleCache returns the same module instance for
 // addresses within the module.
-#if defined(OS_MACOSX) && !defined(OS_IOS)
+#if defined(OS_MACOSX) && !defined(OS_IOS) || defined(OS_WIN)
 #define MAYBE_ModuleCache ModuleCache
 #define MAYBE_ModulesList ModulesList
 #else
@@ -32,7 +32,8 @@
   const ModuleCache::Module& module2 = cache.GetModuleForAddress(ptr2);
   EXPECT_EQ(&module1, &module2);
   EXPECT_TRUE(module1.is_valid);
-  EXPECT_LT(module1.base_address, ptr1);
+  EXPECT_GT(module1.size, 0u);
+  EXPECT_LE(module1.base_address, ptr1);
   EXPECT_GT(module1.base_address + module1.size, ptr2);
 }
 
@@ -43,6 +44,8 @@
   EXPECT_TRUE(module.is_valid);
   EXPECT_EQ(1u, cache.GetModules().size());
   EXPECT_EQ(&module, cache.GetModules().front());
+  cache.Clear();
+  EXPECT_EQ(0u, cache.GetModules().size());
 }
 
 TEST_F(ModuleCacheTest, InvalidModule) {
diff --git a/base/sampling_heap_profiler/module_cache_win.cc b/base/sampling_heap_profiler/module_cache_win.cc
new file mode 100644
index 0000000..ca5b280
--- /dev/null
+++ b/base/sampling_heap_profiler/module_cache_win.cc
@@ -0,0 +1,87 @@
+// 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 "base/sampling_heap_profiler/module_cache.h"
+
+#include <objbase.h>
+#include <psapi.h>
+
+#include "base/process/process_handle.h"
+#include "base/stl_util.h"
+#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/win/pe_image.h"
+#include "base/win/scoped_handle.h"
+
+namespace base {
+
+namespace {
+
+// Gets the unique build ID for a module. Windows build IDs are created by a
+// concatenation of a GUID and AGE fields found in the headers of a module. The
+// GUID is stored in the first 16 bytes and the AGE is stored in the last 4
+// bytes. Returns the empty string if the function fails to get the build ID.
+//
+// Example:
+// dumpbin chrome.exe /headers | find "Format:"
+//   ... Format: RSDS, {16B2A428-1DED-442E-9A36-FCE8CBD29726}, 10, ...
+//
+// The resulting buildID string of this instance of chrome.exe is
+// "16B2A4281DED442E9A36FCE8CBD2972610".
+//
+// Note that the AGE field is encoded in decimal, not hex.
+std::string GetBuildIDForModule(HMODULE module_handle) {
+  GUID guid;
+  DWORD age;
+  win::PEImage(module_handle).GetDebugId(&guid, &age, /* pdb_file= */ nullptr);
+  const int kGUIDSize = 39;
+  string16 build_id;
+  int result =
+      ::StringFromGUID2(guid, WriteInto(&build_id, kGUIDSize), kGUIDSize);
+  if (result != kGUIDSize)
+    return std::string();
+  RemoveChars(build_id, L"{}-", &build_id);
+  build_id += StringPrintf(L"%d", age);
+  return UTF16ToUTF8(build_id);
+}
+
+}  // namespace
+
+// static
+ModuleCache::Module ModuleCache::CreateModuleForAddress(uintptr_t address) {
+  HMODULE module_handle = nullptr;
+  if (!::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
+                           reinterpret_cast<LPCTSTR>(address),
+                           &module_handle)) {
+    DCHECK_EQ(ERROR_MOD_NOT_FOUND, static_cast<int>(::GetLastError()));
+    return Module();
+  }
+  Module module = CreateModuleForHandle(module_handle);
+  ::CloseHandle(module_handle);
+  return module;
+}
+
+// static
+ModuleCache::Module ModuleCache::CreateModuleForHandle(HMODULE module_handle) {
+  wchar_t module_name[MAX_PATH];
+  DWORD result_length =
+      ::GetModuleFileName(module_handle, module_name, size(module_name));
+  if (result_length == 0)
+    return Module();
+  const std::string& module_id = GetBuildIDForModule(module_handle);
+  if (module_id.empty())
+    return Module();
+
+  MODULEINFO module_info;
+  if (!::GetModuleInformation(GetCurrentProcessHandle(), module_handle,
+                              &module_info, sizeof(module_info))) {
+    return Module();
+  }
+
+  return Module(reinterpret_cast<uintptr_t>(module_info.lpBaseOfDll), module_id,
+                FilePath(module_name), module_info.SizeOfImage);
+}
+
+}  // namespace base
diff --git a/build/android/pylib/valgrind_tools.py b/build/android/pylib/valgrind_tools.py
index 431b798..4c27b08 100644
--- a/build/android/pylib/valgrind_tools.py
+++ b/build/android/pylib/valgrind_tools.py
@@ -4,6 +4,7 @@
 
 # pylint: disable=R0201
 
+import glob
 import logging
 import os.path
 import subprocess
@@ -11,8 +12,7 @@
 
 from devil.android import device_errors
 from devil.android.valgrind_tools import base_tool
-from pylib import constants
-
+from pylib.constants import DIR_SOURCE_ROOT
 
 
 def SetChromeTimeoutScale(device, scale):
@@ -42,15 +42,17 @@
   @classmethod
   def CopyFiles(cls, device):
     """Copies ASan tools to the device."""
-    # build/config/sanitizers/BUILD.gn puts the runtime in the build dir.
-    lib = os.path.join(constants.GetOutDirectory(),
-                       'libclang_rt.asan-arm-android.so')
+    libs = glob.glob(os.path.join(DIR_SOURCE_ROOT,
+                                  'third_party/llvm-build/Release+Asserts/',
+                                  'lib/clang/*/lib/linux/',
+                                  'libclang_rt.asan-arm-android.so'))
+    assert len(libs) == 1
     subprocess.call(
         [os.path.join(
-             constants.DIR_SOURCE_ROOT,
+             DIR_SOURCE_ROOT,
              'tools/android/asan/third_party/asan_device_setup.sh'),
          '--device', str(device),
-         '--lib', lib,
+         '--lib', libs[0],
          '--extra-options', AddressSanitizerTool.EXTRA_OPTIONS])
     device.WaitUntilFullyBooted()
 
diff --git a/build/config/fuchsia/build_manifest.py b/build/config/fuchsia/build_manifest.py
index 4896c1e..db0db8c 100644
--- a/build/config/fuchsia/build_manifest.py
+++ b/build/config/fuchsia/build_manifest.py
@@ -179,10 +179,13 @@
     # Compute the set of dynamic libraries used by the application or its
     # transitive dependencies (dist libs and components), and merge the result
     # with |expanded_files| so that they are included in the manifest.
-    expanded_files = expanded_files.union(
-        ComputeTransitiveLibDeps(
-            app_filename,
-            {os.path.basename(f): f for f in expanded_files.union(dist_libs)}))
+
+    # TODO(https://crbug.com/861931): Temporarily just include all |dist_libs|.
+    #expanded_files = expanded_files.union(
+    #    ComputeTransitiveLibDeps(
+    #        app_filename,
+    #        {os.path.basename(f): f for f in expanded_files.union(dist_libs)}))
+    expanded_files = expanded_files.union(dist_libs)
 
     # Format and write out the manifest contents.
     app_found = False
diff --git a/build/config/sanitizers/BUILD.gn b/build/config/sanitizers/BUILD.gn
index 7be37c7..faa533b 100644
--- a/build/config/sanitizers/BUILD.gn
+++ b/build/config/sanitizers/BUILD.gn
@@ -45,7 +45,7 @@
     # ASAN is supported on iOS but the runtime library depends on the compiler
     # used (Chromium version of clang versus Xcode version of clang). Only copy
     # the ASAN runtime on iOS if building with Chromium clang.
-    if (is_android || is_mac || is_win || (is_ios && !use_xcode_clang)) {
+    if (is_win || is_mac || (is_ios && !use_xcode_clang)) {
       data_deps = [
         ":copy_asan_runtime",
       ]
@@ -58,13 +58,8 @@
   }
 }
 
-if ((is_android || is_mac || is_win || (is_ios && !use_xcode_clang)) &&
-    using_sanitizer) {
-  if (is_android) {
-    # All asan bots currently use 32-bit arm.
-    # If you change this, also change build/android/pylib/valgrind_tools.py.
-    _clang_rt_dso_path = "linux/libclang_rt.asan-arm-android.so"
-  } else if (is_mac) {
+if ((is_mac || is_win || (is_ios && !use_xcode_clang)) && using_sanitizer) {
+  if (is_mac) {
     _clang_rt_dso_path = "darwin/libclang_rt.asan_osx_dynamic.dylib"
   } else if (is_ios) {
     _clang_rt_dso_path = "darwin/libclang_rt.asan_iossim_dynamic.dylib"
@@ -79,14 +74,9 @@
 
   if (!is_ios) {
     copy("copy_asan_runtime") {
-      # The android runtime path contains "linux", which by default gets
-      # filtered out. Temporarily deactivate the filename filter.
-      set_sources_assignment_filter([])
       sources = [
         _clang_rt_dso_full_path,
       ]
-      set_sources_assignment_filter(sources_assignment_filter)
-
       outputs = [
         "$root_out_dir/{{source_file_part}}",
       ]
diff --git a/build/fuchsia/sdk.sha1 b/build/fuchsia/sdk.sha1
index a086cd7..604a44c 100644
--- a/build/fuchsia/sdk.sha1
+++ b/build/fuchsia/sdk.sha1
@@ -1 +1 @@
-5ba2f403a63325723801c92142f788bebf37f819
\ No newline at end of file
+f209e0ff12286a37573f5ba2695f083470613d0e
\ No newline at end of file
diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni
index 9a496442..da069f1 100644
--- a/build/toolchain/gcc_toolchain.gni
+++ b/build/toolchain/gcc_toolchain.gni
@@ -151,9 +151,11 @@
     # toolchain args, use those values, otherwise default to the global one.
     # This works because the only reasonable override that toolchains might
     # supply for these values are to force-disable them.
-    # But if has_gomacc_path is set, we assumes that compiler wrapper find
-    # gomacc from GOMACC_PATH envvar.
-    if (toolchain_uses_goma && !has_gomacc_path) {
+    # But if has_gomacc_path is set in simple chrome build, we assumes that
+    # *chromeos* compiler wrapper find gomacc from GOMACC_PATH envvar.
+    # Note: In this case, we use gomacc for host toolchain compiling.
+    if (toolchain_uses_goma &&
+        (!has_gomacc_path || invoker_toolchain_args.current_os != "chromeos")) {
       goma_path = "$goma_dir/gomacc"
 
       # Use the static analysis script if static analysis is turned on
diff --git a/build/toolchain/win/BUILD.gn b/build/toolchain/win/BUILD.gn
index eb3e2b2..3c6c9d0 100644
--- a/build/toolchain/win/BUILD.gn
+++ b/build/toolchain/win/BUILD.gn
@@ -143,7 +143,7 @@
       # invocation requires higher cpu usage compared to ninja invocation, and
       # the python wrapper is only needed to work around link.exe problems.
       # TODO(thakis): Remove wrapper once lld-link can merge manifests without
-      # relying on mt.exe being in %PATH% on Windows.
+      # relying on mt.exe being in %PATH% on Windows, https://crbug.com/872740
       linker_wrapper = "ninja -t msvc -e $env -- "  # Note trailing space.
       sys_lib_flags = ""
     } else {
@@ -296,21 +296,6 @@
 
       command = "$linker_wrapper$link /nologo ${sys_lib_flags}/OUT:$exename /PDB:$pdbname @$rspfile"
 
-      if (host_os == "win") {
-        shellprefix = "cmd /c"
-      } else {
-        shellprefix = ""
-      }
-      not_needed([ "shellprefix" ])
-
-      if (is_official_build) {
-        # On bots, the binary's PDB grow and eventually exceed 4G, causing the
-        # link to fail. As there's no utility to keeping the PDB around
-        # incrementally anyway in this config (because we're doing
-        # non-incremental LTCG builds), delete it before linking.
-        command = "$shellprefix $python_path $tool_wrapper_path delete-file $pdbname && $command"
-      }
-
       default_output_extension = ".exe"
       default_output_dir = "{{root_out_dir}}"
       description = "LINK {{output}}"
diff --git a/build/whitespace_file.txt b/build/whitespace_file.txt
index 0646a9f..6dd1a7bb 100644
--- a/build/whitespace_file.txt
+++ b/build/whitespace_file.txt
@@ -174,4 +174,5 @@
 This is groovy.
 
 SECRET ENDING: IT WAS _____ ALL ALONG!
-testing trailing line
+testing trailing line.
+Hacky hacky mitigation now works in CQ.
\ No newline at end of file
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc
index 8d0b03c..e5dad6d 100644
--- a/cc/layers/layer_impl.cc
+++ b/cc/layers/layer_impl.cc
@@ -680,6 +680,10 @@
 
 void LayerImpl::ReleaseResources() {}
 
+void LayerImpl::OnPurgeMemory() {
+  ReleaseResources();
+}
+
 void LayerImpl::ReleaseTileResources() {}
 
 void LayerImpl::RecreateTileResources() {}
diff --git a/cc/layers/layer_impl.h b/cc/layers/layer_impl.h
index dcbd0fb..8a2f9a6 100644
--- a/cc/layers/layer_impl.h
+++ b/cc/layers/layer_impl.h
@@ -372,8 +372,13 @@
   // that rendered this layer was lost.
   virtual void ReleaseResources();
 
+  // Releases resources in response to memory pressure. The default
+  // implementation just calls ReleaseResources() and subclasses will override
+  // if that's not appropriate.
+  virtual void OnPurgeMemory();
+
   // Release tile resources held by this layer. Called when a rendering mode
-  // switch has occured and tiles are no longer valid.
+  // switch has occurred and tiles are no longer valid.
   virtual void ReleaseTileResources();
 
   // Recreate tile resources held by this layer after they were released by a
diff --git a/cc/layers/texture_layer_impl.cc b/cc/layers/texture_layer_impl.cc
index 137534d..7d34344 100644
--- a/cc/layers/texture_layer_impl.cc
+++ b/cc/layers/texture_layer_impl.cc
@@ -170,6 +170,13 @@
   return SimpleEnclosedRegion();
 }
 
+void TextureLayerImpl::OnPurgeMemory() {
+  // Do nothing here intentionally as the LayerTreeFrameSink isn't lost.
+  // Unregistering SharedBitmapIds with the LayerTreeFrameSink wouldn't free
+  // the shared memory, as the TextureLayer and/or TextureLayerClient will still
+  // have a reference to it.
+}
+
 void TextureLayerImpl::ReleaseResources() {
   // Gpu resources are lost when the LayerTreeFrameSink is lost. But software
   // resources are still valid, and we can keep them here in that case.
diff --git a/cc/layers/texture_layer_impl.h b/cc/layers/texture_layer_impl.h
index a82f2b9c..8a75ebcca 100644
--- a/cc/layers/texture_layer_impl.h
+++ b/cc/layers/texture_layer_impl.h
@@ -41,6 +41,7 @@
                    AppendQuadsData* append_quads_data) override;
   SimpleEnclosedRegion VisibleOpaqueRegion() const override;
   void ReleaseResources() override;
+  void OnPurgeMemory() override;
 
   // These setter methods don't cause any implicit damage, so the texture client
   // must explicitly invalidate if they intend to cause a visible change in the
diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc
index 18c72de3..66656e3e 100644
--- a/cc/layers/texture_layer_unittest.cc
+++ b/cc/layers/texture_layer_unittest.cc
@@ -1611,6 +1611,86 @@
 
 SINGLE_AND_MULTI_THREAD_TEST_F(SoftwareTextureLayerSwitchTreesTest);
 
+// Verify that duplicate SharedBitmapIds aren't registered if resources are
+// purged due to memory pressure.
+class SoftwareTextureLayerPurgeMemoryTest : public SoftwareTextureLayerTest {
+ protected:
+  void BeginTest() override {
+    PostSetNeedsCommitToMainThread();
+
+    const gfx::Size size(1, 1);
+    const viz::ResourceFormat format = viz::RGBA_8888;
+
+    id_ = viz::SharedBitmap::GenerateId();
+    bitmap_ = base::MakeRefCounted<CrossThreadSharedBitmap>(
+        id_, viz::bitmap_allocation::AllocateMappedBitmap(size, format), size,
+        format);
+  }
+
+  void DidCommitAndDrawFrame() override {
+    step_ = layer_tree_host()->SourceFrameNumber();
+    switch (step_) {
+      case 1:
+        // The test starts by inserting the TextureLayer to the tree.
+        root_->AddChild(texture_layer_);
+        // And registers a SharedBitmapId, which should be given to the
+        // LayerTreeFrameSink.
+        registration_ = texture_layer_->RegisterSharedBitmapId(id_, bitmap_);
+        // Give the TextureLayer a resource so it contributes to the frame. It
+        // doesn't need to register the SharedBitmapId otherwise.
+        texture_layer_->SetTransferableResource(
+            viz::TransferableResource::MakeSoftware(id_, gfx::Size(1, 1),
+                                                    viz::RGBA_8888),
+            viz::SingleReleaseCallback::Create(
+                base::BindOnce([](const gpu::SyncToken&, bool) {})));
+        break;
+      case 2:
+        // Draw again after OnPurgeMemory() was called on the impl thread so we
+        // can verify that duplicate SharedBitmapIds aren't registered by
+        // TextureLayerImpl.
+        texture_layer_->SetNeedsDisplay();
+        break;
+      case 3:
+        // Release the TransferableResource before shutdown.
+        texture_layer_->ClearClient();
+        break;
+      case 4:
+        EndTest();
+    }
+  }
+
+  void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override {
+    // TextureLayerImpl will have registered the SharedBitmapId at this point.
+    // Call OnPurgeMemory() to ensure that the same SharedBitmapId doesn't get
+    // registered again on the next draw.
+    if (step_ == 1)
+      static_cast<base::MemoryCoordinatorClient*>(host_impl)->OnPurgeMemory();
+  }
+
+  void DisplayReceivedCompositorFrameOnThread(
+      const viz::CompositorFrame& frame) override {
+    if (step_ == 0) {
+      // Before commit 1, the |texture_layer_| has no SharedBitmapId yet.
+      EXPECT_THAT(frame_sink_->owned_bitmaps(), testing::IsEmpty());
+      verified_frames_++;
+    } else {
+      // After commit 1, we added a SharedBitmapId to |texture_layer_|.
+      EXPECT_THAT(frame_sink_->owned_bitmaps(), testing::ElementsAre(id_));
+      verified_frames_++;
+    }
+  }
+
+  void AfterTest() override { EXPECT_EQ(4, verified_frames_); }
+
+  int step_ = 0;
+  int verified_frames_ = 0;
+  viz::SharedBitmapId id_;
+  SharedBitmapIdRegistration registration_;
+  scoped_refptr<CrossThreadSharedBitmap> bitmap_;
+};
+
+SINGLE_AND_MULTI_THREAD_TEST_F(SoftwareTextureLayerPurgeMemoryTest);
+
 class SoftwareTextureLayerMultipleRegisterTest
     : public SoftwareTextureLayerTest {
  protected:
diff --git a/cc/raster/playback_image_provider.cc b/cc/raster/playback_image_provider.cc
index 0316f10..50305d1 100644
--- a/cc/raster/playback_image_provider.cc
+++ b/cc/raster/playback_image_provider.cc
@@ -47,12 +47,6 @@
     return ScopedDecodedDrawImage();
   }
 
-  if (paint_image.GetSkImage()->isTextureBacked()) {
-    return ScopedDecodedDrawImage(DecodedDrawImage(
-        paint_image.GetSkImage(), SkSize::Make(0, 0), SkSize::Make(1.f, 1.f),
-        draw_image.filter_quality(), true /* is_budgeted */));
-  }
-
   const auto& it =
       settings_->image_to_current_frame_index.find(paint_image.stable_id());
   size_t frame_index = it == settings_->image_to_current_frame_index.end()
@@ -60,8 +54,13 @@
                            : it->second;
 
   DrawImage adjusted_image(draw_image, 1.f, frame_index, target_color_space_);
-  auto decoded_draw_image = cache_->GetDecodedImageForDraw(adjusted_image);
+  if (!cache_->UseCacheForDrawImage(adjusted_image)) {
+    return ScopedDecodedDrawImage(DecodedDrawImage(
+        paint_image.GetSkImage(), SkSize::Make(0, 0), SkSize::Make(1.f, 1.f),
+        draw_image.filter_quality(), true /* is_budgeted */));
+  }
 
+  auto decoded_draw_image = cache_->GetDecodedImageForDraw(adjusted_image);
   return ScopedDecodedDrawImage(
       decoded_draw_image,
       base::BindOnce(&UnrefImageFromCache, std::move(adjusted_image), cache_,
diff --git a/cc/raster/playback_image_provider_unittest.cc b/cc/raster/playback_image_provider_unittest.cc
index 40036e8..dd4f6a4 100644
--- a/cc/raster/playback_image_provider_unittest.cc
+++ b/cc/raster/playback_image_provider_unittest.cc
@@ -46,6 +46,13 @@
     EXPECT_GE(refed_image_count_, 0);
   }
 
+  bool UseCacheForDrawImage(const DrawImage& image) const override {
+    return use_cache_for_draw_image_;
+  }
+
+  void set_use_cache_for_draw_image(bool use) {
+    use_cache_for_draw_image_ = use;
+  }
   int refed_image_count() const { return refed_image_count_; }
   int images_decoded() const { return images_decoded_; }
   const DrawImage& last_image() { return last_image_; }
@@ -53,6 +60,7 @@
  private:
   int refed_image_count_ = 0;
   int images_decoded_ = 0;
+  bool use_cache_for_draw_image_ = true;
   DrawImage last_image_;
 };
 
@@ -163,19 +171,9 @@
   EXPECT_EQ(cache.refed_image_count(), 0);
 }
 
-TEST(PlaybackImageProviderTest, TextureImages) {
-  // Texture images should never hit the ImageDecodeCache.
-  sk_sp<const GrGLInterface> gl_interface(GrGLCreateNullInterface());
-  auto context = GrContext::MakeGL(std::move(gl_interface));
-  auto sk_texture_image = CreateBitmapImage(gfx::Size(10, 10))
-                              .GetSkImage()
-                              ->makeTextureImage(context.get(), nullptr);
-  auto image = PaintImageBuilder::WithDefault()
-                   .set_id(PaintImage::GetNextId())
-                   .set_image(sk_texture_image, PaintImage::GetNextContentId())
-                   .TakePaintImage();
-
+TEST(PlaybackImageProviderTest, IgnoresImagesNotSupportedByCache) {
   MockDecodeCache cache;
+  cache.set_use_cache_for_draw_image(false);
   base::Optional<PlaybackImageProvider::Settings> settings;
   settings.emplace();
   PlaybackImageProvider provider(&cache, gfx::ColorSpace(),
@@ -183,7 +181,8 @@
   {
     SkIRect rect = SkIRect::MakeWH(10, 10);
     SkMatrix matrix = SkMatrix::I();
-    auto draw_image = DrawImage(image, rect, kMedium_SkFilterQuality, matrix);
+    auto draw_image = DrawImage(CreateBitmapImage(gfx::Size(10, 10)), rect,
+                                kMedium_SkFilterQuality, matrix);
     auto decode = provider.GetDecodedDrawImage(draw_image);
     EXPECT_TRUE(decode);
     EXPECT_EQ(cache.refed_image_count(), 0);
diff --git a/cc/test/stub_decode_cache.cc b/cc/test/stub_decode_cache.cc
index 4496ece8..6fc8e2b 100644
--- a/cc/test/stub_decode_cache.cc
+++ b/cc/test/stub_decode_cache.cc
@@ -27,4 +27,8 @@
   return 0u;
 }
 
+bool StubDecodeCache::UseCacheForDrawImage(const DrawImage& image) const {
+  return true;
+}
+
 }  // namespace cc
diff --git a/cc/test/stub_decode_cache.h b/cc/test/stub_decode_cache.h
index 7c59162..7b47e57e 100644
--- a/cc/test/stub_decode_cache.h
+++ b/cc/test/stub_decode_cache.h
@@ -27,6 +27,7 @@
       bool aggressively_free_resources) override {}
   void ClearCache() override {}
   size_t GetMaximumMemoryLimitBytes() const override;
+  bool UseCacheForDrawImage(const DrawImage& image) const override;
 };
 
 }  // namespace cc
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc
index a8243db9..1bddac03 100644
--- a/cc/tiles/gpu_image_decode_cache.cc
+++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -818,6 +818,14 @@
   UnrefImageInternal(draw_image, InUseCacheKey::FromDrawImage(draw_image));
 }
 
+bool GpuImageDecodeCache::UseCacheForDrawImage(
+    const DrawImage& draw_image) const {
+  if (draw_image.paint_image().GetSkImage()->isTextureBacked())
+    return false;
+
+  return true;
+}
+
 DecodedDrawImage GpuImageDecodeCache::GetDecodedImageForDraw(
     const DrawImage& draw_image) {
   TRACE_EVENT0("cc", "GpuImageDecodeCache::GetDecodedImageForDraw");
@@ -1840,7 +1848,7 @@
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
                "GpuImageDecodeCache::GetImageDataForDrawImage");
   lock_.AssertAcquired();
-  DCHECK(!draw_image.paint_image().GetSkImage()->isTextureBacked());
+  DCHECK(UseCacheForDrawImage(draw_image));
 
   auto found_in_use = in_use_cache_.find(key);
   if (found_in_use != in_use_cache_.end())
diff --git a/cc/tiles/gpu_image_decode_cache.h b/cc/tiles/gpu_image_decode_cache.h
index 101c6c5..eacec6e 100644
--- a/cc/tiles/gpu_image_decode_cache.h
+++ b/cc/tiles/gpu_image_decode_cache.h
@@ -127,6 +127,7 @@
       bool aggressively_free_resources) override;
   void ClearCache() override;
   size_t GetMaximumMemoryLimitBytes() const override;
+  bool UseCacheForDrawImage(const DrawImage& image) const override;
 
   // MemoryDumpProvider overrides.
   bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
diff --git a/cc/tiles/image_decode_cache.h b/cc/tiles/image_decode_cache.h
index a1653f470..7c75dd9d 100644
--- a/cc/tiles/image_decode_cache.h
+++ b/cc/tiles/image_decode_cache.h
@@ -138,6 +138,11 @@
   // locked budget before creating a task.
   virtual size_t GetMaximumMemoryLimitBytes() const = 0;
 
+  // Returns true if the cache should be used for |image|. In certain cases the
+  // image can directly be used for raster (for instance bitmaps in a software
+  // draw).
+  virtual bool UseCacheForDrawImage(const DrawImage& image) const = 0;
+
  protected:
   void RecordImageMipLevelUMA(int mip_level);
 };
diff --git a/cc/tiles/software_image_decode_cache.cc b/cc/tiles/software_image_decode_cache.cc
index 048bd753..0503874 100644
--- a/cc/tiles/software_image_decode_cache.cc
+++ b/cc/tiles/software_image_decode_cache.cc
@@ -24,23 +24,6 @@
 namespace cc {
 namespace {
 
-bool UseCacheForDrawImage(const DrawImage& draw_image) {
-  // Lazy generated images are have their decode cached.
-  sk_sp<SkImage> sk_image = draw_image.paint_image().GetSkImage();
-  if (sk_image->isLazyGenerated())
-    return true;
-
-  // Cache images that need to be converted to a non-sRGB color space.
-  // TODO(ccameron): Consider caching when any color conversion is required.
-  // https://crbug.com/791828
-  const gfx::ColorSpace& dst_color_space = draw_image.target_color_space();
-  if (dst_color_space.IsValid() &&
-      dst_color_space != gfx::ColorSpace::CreateSRGB()) {
-    return true;
-  }
-
-  return false;
-}
 
 // The number of entries to keep around in the cache. This limit can be breached
 // if more items are locked. That is, locked items ignore this limit.
@@ -524,15 +507,33 @@
   return base::nullopt;
 }
 
+bool SoftwareImageDecodeCache::UseCacheForDrawImage(
+    const DrawImage& draw_image) const {
+  sk_sp<SkImage> sk_image = draw_image.paint_image().GetSkImage();
+
+  // Software cache doesn't support using texture backed images.
+  if (sk_image->isTextureBacked())
+    return false;
+
+  // Lazy generated images need to have their decode cached.
+  if (sk_image->isLazyGenerated())
+    return true;
+
+  // Cache images that need to be converted to a non-sRGB color space.
+  // TODO(ccameron): Consider caching when any color conversion is required.
+  // https://crbug.com/791828
+  const gfx::ColorSpace& dst_color_space = draw_image.target_color_space();
+  if (dst_color_space.IsValid() &&
+      dst_color_space != gfx::ColorSpace::CreateSRGB()) {
+    return true;
+  }
+
+  return false;
+}
+
 DecodedDrawImage SoftwareImageDecodeCache::GetDecodedImageForDraw(
     const DrawImage& draw_image) {
-  // Non-cached images are be used for raster directly.
-  if (!UseCacheForDrawImage(draw_image)) {
-    return DecodedDrawImage(draw_image.paint_image().GetSkImage(),
-                            SkSize::Make(0, 0), SkSize::Make(1.f, 1.f),
-                            draw_image.filter_quality(),
-                            true /* is_budgeted */);
-  }
+  DCHECK(UseCacheForDrawImage(draw_image));
 
   base::AutoLock hold(lock_);
   return GetDecodedImageForDrawInternal(
@@ -574,9 +575,7 @@
 void SoftwareImageDecodeCache::DrawWithImageFinished(
     const DrawImage& image,
     const DecodedDrawImage& decoded_image) {
-  if (!UseCacheForDrawImage(image))
-    return;
-
+  DCHECK(UseCacheForDrawImage(image));
   TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
                "SoftwareImageDecodeCache::DrawWithImageFinished", "key",
                CacheKey::FromDrawImage(image, color_type_).ToString());
diff --git a/cc/tiles/software_image_decode_cache.h b/cc/tiles/software_image_decode_cache.h
index f8b4914..e3e6b74f 100644
--- a/cc/tiles/software_image_decode_cache.h
+++ b/cc/tiles/software_image_decode_cache.h
@@ -53,6 +53,7 @@
       bool aggressively_free_resources) override {}
   void ClearCache() override;
   size_t GetMaximumMemoryLimitBytes() const override;
+  bool UseCacheForDrawImage(const DrawImage& image) const override;
 
   // Decode the given image and store it in the cache. This is only called by an
   // image decode task from a worker thread.
diff --git a/cc/tiles/software_image_decode_cache_unittest.cc b/cc/tiles/software_image_decode_cache_unittest.cc
index 782f5034..09dca3f 100644
--- a/cc/tiles/software_image_decode_cache_unittest.cc
+++ b/cc/tiles/software_image_decode_cache_unittest.cc
@@ -1733,12 +1733,8 @@
       quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable),
       PaintImage::kDefaultFrameIndex, DefaultColorSpace());
 
-  DecodedDrawImage decoded_draw_image =
-      cache.GetDecodedImageForDraw(draw_image);
-  // Expect that we did not allocate a new image.
-  EXPECT_EQ(decoded_draw_image.image().get(), paint_image.GetSkImage().get());
-
-  cache.DrawWithImageFinished(draw_image, decoded_draw_image);
+  // The cache should not support this image.
+  EXPECT_FALSE(cache.UseCacheForDrawImage(draw_image));
 }
 
 // TODO(ccameron): Re-enable this when the root cause of crashes is discovered.
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 97e7aaf..538ae87 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -2818,8 +2818,13 @@
 
 void LayerTreeHostImpl::OnPurgeMemory() {
   ReleaseTileResources();
-  ReleaseTreeResources();
-  ClearUIResources();
+  active_tree_->OnPurgeMemory();
+  if (pending_tree_)
+    pending_tree_->OnPurgeMemory();
+  if (recycle_tree_)
+    recycle_tree_->OnPurgeMemory();
+
+  EvictAllUIResources();
   if (image_decode_cache_) {
     image_decode_cache_->SetShouldAggressivelyFreeResources(true);
     image_decode_cache_->SetShouldAggressivelyFreeResources(false);
diff --git a/cc/trees/layer_tree_host_pixeltest_blending.cc b/cc/trees/layer_tree_host_pixeltest_blending.cc
index 2682c2a2..f1e3d2e 100644
--- a/cc/trees/layer_tree_host_pixeltest_blending.cc
+++ b/cc/trees/layer_tree_host_pixeltest_blending.cc
@@ -374,7 +374,16 @@
       SOFTWARE, FILE_PATH_LITERAL("blending_render_pass_mask.png"), kUseMasks);
 }
 
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassWithMaskAA_GL) {
+// Fails on Linux CFI, see https://crbug.com/872733.
+#if defined(OS_LINUX)
+#define MAYBE_BlendingWithRenderPassWithMaskAA_GL \
+  DISABLED_BlendingWithRenderPassWithMaskAA_GL
+#else
+#define MAYBE_BlendingWithRenderPassWithMaskAA_GL \
+  BlendingWithRenderPassWithMaskAA_GL
+#endif
+TEST_F(LayerTreeHostBlendingPixelTest,
+       MAYBE_BlendingWithRenderPassWithMaskAA_GL) {
   RunBlendingWithRenderPass(ZERO_COPY,
                             FILE_PATH_LITERAL("blending_render_pass_mask.png"),
                             kUseMasks | kUseAntialiasing);
@@ -399,7 +408,16 @@
       SOFTWARE, FILE_PATH_LITERAL("blending_render_pass.png"), kUseColorMatrix);
 }
 
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassColorMatrixAA_GL) {
+// Fails on Linux CFI, see https://crbug.com/872733.
+#if defined(OS_LINUX)
+#define MAYBE_BlendingWithRenderPassColorMatrixAA_GL \
+  DISABLED_BlendingWithRenderPassColorMatrixAA_GL
+#else
+#define MAYBE_BlendingWithRenderPassColorMatrixAA_GL \
+  BlendingWithRenderPassColorMatrixAA_GL
+#endif
+TEST_F(LayerTreeHostBlendingPixelTest,
+       MAYBE_BlendingWithRenderPassColorMatrixAA_GL) {
   RunBlendingWithRenderPass(ZERO_COPY,
                             FILE_PATH_LITERAL("blending_render_pass.png"),
                             kUseAntialiasing | kUseColorMatrix);
@@ -427,7 +445,8 @@
 }
 
 // Often times out on Windows 10. See: https://crbug.com/870236.
-#if defined(OS_WIN)
+// Fails on Linux CFI, see https://crbug.com/872733.
+#if (defined(OS_WIN) || defined(OS_LINUX))
 #define MAYBE_BlendingWithRenderPassWithMaskColorMatrixAA_GL \
   DISABLED_BlendingWithRenderPassWithMaskColorMatrixAA_GL
 #else
@@ -474,8 +493,16 @@
                             kUseMasks | kForceShaders);
 }
 
+// Fails on Linux CFI, see https://crbug.com/872733.
+#if defined(OS_LINUX)
+#define MAYBE_BlendingWithRenderPassShadersWithMaskAA_GL \
+  DISABLED_BlendingWithRenderPassShadersWithMaskAA_GL
+#else
+#define MAYBE_BlendingWithRenderPassShadersWithMaskAA_GL \
+  BlendingWithRenderPassShadersWithMaskAA_GL
+#endif
 TEST_F(LayerTreeHostBlendingPixelTest,
-       BlendingWithRenderPassShadersWithMaskAA_GL) {
+       MAYBE_BlendingWithRenderPassShadersWithMaskAA_GL) {
   RunBlendingWithRenderPass(ZERO_COPY,
                             FILE_PATH_LITERAL("blending_render_pass_mask.png"),
                             kUseMasks | kUseAntialiasing | kForceShaders);
@@ -495,29 +522,54 @@
                             kUseColorMatrix | kForceShaders);
 }
 
+// Fails on Linux CFI, see https://crbug.com/872733.
+#if defined(OS_LINUX)
+#define MAYBE_BlendingWithRenderPassShadersColorMatrixAA_GL \
+  DISABLED_BlendingWithRenderPassShadersColorMatrixAA_GL
+#else
+#define MAYBE_BlendingWithRenderPassShadersColorMatrixAA_GL \
+  BlendingWithRenderPassShadersColorMatrixAA_GL
+#endif
 TEST_F(LayerTreeHostBlendingPixelTest,
-       BlendingWithRenderPassShadersColorMatrixAA_GL) {
+       MAYBE_BlendingWithRenderPassShadersColorMatrixAA_GL) {
   RunBlendingWithRenderPass(ZERO_COPY,
                             FILE_PATH_LITERAL("blending_render_pass.png"),
                             kUseAntialiasing | kUseColorMatrix | kForceShaders);
 }
 
+// Fails on Linux CFI, see https://crbug.com/872733.
+#if defined(OS_LINUX)
+#define MAYBE_BlendingWithRenderPassShadersWithMaskColorMatrix_GL \
+  DISABLED_BlendingWithRenderPassShadersWithMaskColorMatrix_GL
+#else
+#define MAYBE_BlendingWithRenderPassShadersWithMaskColorMatrix_GL \
+  BlendingWithRenderPassShadersWithMaskColorMatrix_GL
+#endif
 TEST_F(LayerTreeHostBlendingPixelTest,
-       BlendingWithRenderPassShadersWithMaskColorMatrix_GL) {
+       MAYBE_BlendingWithRenderPassShadersWithMaskColorMatrix_GL) {
   RunBlendingWithRenderPass(ZERO_COPY,
                             FILE_PATH_LITERAL("blending_render_pass_mask.png"),
                             kUseMasks | kUseColorMatrix | kForceShaders);
 }
 
+// Fails on Linux CFI, see https://crbug.com/872733.
+#if defined(OS_LINUX)
+#define MAYBE_BlendingWithRenderPassShadersWithMaskColorMatrix_GL_TextureRect \
+  DISABLED_BlendingWithRenderPassShadersWithMaskColorMatrix_GL_TextureRect
+#else
+#define MAYBE_BlendingWithRenderPassShadersWithMaskColorMatrix_GL_TextureRect \
+  BlendingWithRenderPassShadersWithMaskColorMatrix_GL_TextureRect
+#endif
 TEST_F(LayerTreeHostBlendingPixelTest,
-       BlendingWithRenderPassShadersWithMaskColorMatrix_GL_TextureRect) {
+       MAYBE_BlendingWithRenderPassShadersWithMaskColorMatrix_GL_TextureRect) {
   RunBlendingWithRenderPass(ZERO_COPY,
                             FILE_PATH_LITERAL("blending_render_pass_mask.png"),
                             kUseMasks | kUseColorMatrix | kForceShaders);
 }
 
 // Often times out on Windows 10. See: https://crbug.com/870236.
-#if defined(OS_WIN)
+// Fails on Linux CFI, see https://crbug.com/872733.
+#if (defined(OS_WIN) || defined(OS_LINUX))
 #define MAYBE_BlendingWithRenderPassShadersWithMaskColorMatrixAA_GL \
   DISABLED_BlendingWithRenderPassShadersWithMaskColorMatrixAA_GL
 #else
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index 4aa523a..aaafd94c 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -134,6 +134,13 @@
   }
 }
 
+void LayerTreeImpl::OnPurgeMemory() {
+  if (!LayerListIsEmpty()) {
+    LayerTreeHostCommon::CallFunctionForEveryLayer(
+        this, [](LayerImpl* layer) { layer->OnPurgeMemory(); });
+  }
+}
+
 void LayerTreeImpl::ReleaseTileResources() {
   if (!LayerListIsEmpty()) {
     LayerTreeHostCommon::CallFunctionForEveryLayer(
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h
index 62a41c96..6cc2aa8d 100644
--- a/cc/trees/layer_tree_impl.h
+++ b/cc/trees/layer_tree_impl.h
@@ -101,6 +101,7 @@
 
   void Shutdown();
   void ReleaseResources();
+  void OnPurgeMemory();
   void ReleaseTileResources();
   void RecreateTileResources();
 
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index 9a0d4e5a3..7f95c59f 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -1793,6 +1793,7 @@
       "//chrome/gpu",
       "//chrome/renderer",
       "//chrome/utility",
+      "//components/minidump_uploader",
       "//components/safe_browsing/android:safe_browsing_mobile",
       "//components/services/heap_profiling",
       "//content/public/app:both",
diff --git a/chrome/VERSION b/chrome/VERSION
index d509745..50df86e5 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=70
 MINOR=0
-BUILD=3518
+BUILD=3519
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 0bd8aa2..87ea2a89 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -943,6 +943,7 @@
     "//base/test:test_support",
     "//chrome/browser/android/metrics:ukm_utils_for_test",
     "//components/heap_profiling:test_support",
+    "//components/minidump_uploader",
     "//content/public/test/android:content_native_test_support",
   ]
 }
@@ -1307,6 +1308,7 @@
            ":browser_java_test_support",
            "//chrome/browser/android/metrics:ukm_utils_java",
            "//components/heap_profiling:heap_profiling_java_test_support",
+           "//components/minidump_uploader:minidump_uploader_java",
            "//content/public/test/android:content_java_test_support",
            "//third_party/android_tools:android_test_mock_java",
          ]
diff --git a/chrome/android/java/res/drawable/contextual_suggestions_placeholder_thumbnail_background.xml b/chrome/android/java/res/drawable/contextual_suggestions_placeholder_thumbnail_background.xml
index d6151aa..d25dcfe 100644
--- a/chrome/android/java/res/drawable/contextual_suggestions_placeholder_thumbnail_background.xml
+++ b/chrome/android/java/res/drawable/contextual_suggestions_placeholder_thumbnail_background.xml
@@ -5,7 +5,7 @@
 
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
     <solid
-        android:color="@color/contextual_suggestions_thumbnail_bg_color" />
+        android:color="@color/placeholder_thumbnail_bg_color" />
     <corners
         android:radius="@dimen/snippets_thumbnail_small_corner_radius" />
 </shape>
\ No newline at end of file
diff --git a/chrome/android/java/res/drawable/image_loading_progress.xml b/chrome/android/java/res/drawable/image_loading_progress.xml
new file mode 100644
index 0000000..44a5c4f6
--- /dev/null
+++ b/chrome/android/java/res/drawable/image_loading_progress.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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. -->
+
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    xmlns:aapt="http://schemas.android.com/aapt"
+    tools:targetApi="21">
+
+    <aapt:attr name="android:drawable">
+        <vector
+            android:width="100dp"
+            android:height="100dp"
+            android:viewportWidth="100.0"
+            android:viewportHeight="100.0">
+
+            <path
+                android:name="circle"
+                android:fillColor="@color/download_image_loading_color"
+                android:pathData="M 20,60 c 0,-11 9,-20 20,-20 l0, 20 l20,0 c 0,11 -9,20 -20,20 c -11,0 -20,-9 -20,-20"/>
+            <path
+                android:name="square"
+                android:fillColor="@color/download_image_loading_color"
+                android:pathData="M 40,40 l0,-15 l35,0 l0,35 l-15,0 c 0,-11 -9,-20 -20,-20 C"/>
+            <path
+                android:name="arc"
+                android:fillColor="@color/download_image_loading_color"
+                android:pathData="M 40,60 l 0,-20 c 11,0 20,9 20,20"/>
+
+        </vector>
+    </aapt:attr>
+
+    <target android:name="circle">
+        <aapt:attr name="android:animation">
+            <set android:ordering="sequentially">
+                <objectAnimator
+                    android:startOffset="0"
+                    android:duration="450"
+                    android:interpolator="@android:interpolator/fast_out_slow_in"
+                    android:propertyName="fillAlpha"
+                    android:valueFrom="1"
+                    android:valueTo="0.5"
+                    android:valueType="floatType"/>
+                <objectAnimator
+                    android:startOffset="0"
+                    android:duration="833"
+                    android:interpolator="@android:interpolator/fast_out_slow_in"
+                    android:propertyName="fillAlpha"
+                    android:valueFrom="0.5"
+                    android:valueTo="1"
+                    android:valueType="floatType"/>
+            </set>
+        </aapt:attr>
+    </target>
+
+    <target android:name="square">
+        <aapt:attr name="android:animation">
+            <set android:ordering="sequentially">
+                <objectAnimator
+                    android:startOffset="83"
+                    android:duration="767"
+                    android:interpolator="@android:interpolator/fast_out_slow_in"
+                    android:propertyName="fillAlpha"
+                    android:valueFrom="1"
+                    android:valueTo="0.5"
+                    android:valueType="floatType"/>
+                <objectAnimator
+                    android:duration="517"
+                    android:startOffset="0"
+                    android:interpolator="@android:interpolator/fast_out_slow_in"
+                    android:propertyName="fillAlpha"
+                    android:valueFrom="0.5"
+                    android:valueTo="1"
+                    android:valueType="floatType"/>
+            </set>
+        </aapt:attr>
+    </target>
+
+    <target android:name="arc">
+        <aapt:attr name="android:animation">
+            <set android:ordering="sequentially">
+                <objectAnimator
+                    android:startOffset="150"
+                    android:duration="417"
+                    android:interpolator="@android:interpolator/fast_out_slow_in"
+                    android:propertyName="fillAlpha"
+                    android:valueFrom="0"
+                    android:valueTo="0.3"
+                    android:valueType="floatType"/>
+                <objectAnimator
+                    android:startOffset="0"
+                    android:duration="933"
+                    android:interpolator="@android:interpolator/fast_out_slow_in"
+                    android:propertyName="fillAlpha"
+                    android:valueFrom="0.3"
+                    android:valueTo="0"
+                    android:valueType="floatType"/>
+            </set>
+        </aapt:attr>
+    </target>
+
+</animated-vector>
diff --git a/chrome/android/java/res/layout/download_manager_image_item.xml b/chrome/android/java/res/layout/download_manager_image_item.xml
index 19ab784..c3b416fe 100644
--- a/chrome/android/java/res/layout/download_manager_image_item.xml
+++ b/chrome/android/java/res/layout/download_manager_image_item.xml
@@ -17,6 +17,7 @@
         android:id="@+id/thumbnail"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:background="@color/placeholder_thumbnail_bg_color"
         android:scaleType="centerCrop"
         android:layout_gravity="center"
         android:adjustViewBounds="true"
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml
index bde089b..dc2f2ec9 100644
--- a/chrome/android/java/res/values/colors.xml
+++ b/chrome/android/java/res/values/colors.xml
@@ -186,6 +186,9 @@
     <!-- Bookmark UI colors -->
     <color name="bookmark_detail_section">#7C7B79</color>
 
+    <!-- Download home colors -->
+    <color name="download_image_loading_color">#BDC1C6</color>
+
     <!-- Favicon colors -->
     <color name="default_favicon_background_color">#787878</color>
 
@@ -214,7 +217,7 @@
     <color name="bottom_system_nav_color">@android:color/white</color>
     <color name="bottom_system_nav_divider_color">@color/black_alpha_12</color>
     <color name="search_box_hint">@color/black_alpha_54</color>
-    <color name="contextual_suggestions_thumbnail_bg_color">#DADCE0</color>
+    <color name="placeholder_thumbnail_bg_color">#DADCE0</color>
     <color name="clear_browsing_data_selected_tab_color">@color/modern_blue_600</color>
 
 </resources>
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 3cf429e6..7f7cf455 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -318,11 +318,7 @@
     public void preInflationStartup() {
         super.preInflationStartup();
 
-        // We need to explicitly enable VR mode here so that the system doesn't kick us out of VR,
-        // or drop us into the 2D-in-VR rendering mode, while we prepare for VR rendering.
-        if (VrModuleProvider.getIntentDelegate().isLaunchingIntoVr(this, getIntent())) {
-            VrModuleProvider.getDelegate().setVrModeEnabled(this, true);
-        }
+        VrModuleProvider.getDelegate().doPreInflationStartup(this, getSavedInstanceState());
 
         // Force a partner customizations refresh if it has yet to be initialized.  This can happen
         // if Chrome is killed and you refocus a previous activity from Android recents, which does
@@ -1196,6 +1192,12 @@
         return super.getOnCreateTimestampMs();
     }
 
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        VrModuleProvider.getDelegate().onSaveInstanceState(outState);
+    }
+
     /**
      * This cannot be overridden in order to preserve destruction order.  Override
      * {@link #onDestroyInternal()} instead to perform clean up tasks.
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 e85488e0..7c35b91 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -589,11 +589,7 @@
                     // launching into VR.
                     && !VrModuleProvider.getIntentDelegate().isLaunchingIntoVr(this, getIntent())
                     && !isLegacyMultiWindow) {
-                // Data reduction promo should be temporarily suppressed if the sign in promo is
-                // shown to avoid nagging users too much.
-                isShowingPromo = SigninPromoUtil.launchSigninPromoIfNeeded(this)
-                        || DataReductionPromoScreen.launchDataReductionPromo(
-                                   this, mTabModelSelectorImpl.getCurrentModel().isIncognito());
+                isShowingPromo = maybeShowPromo();
             } else {
                 preferenceManager.writeBoolean(
                         ChromePreferenceManager.PROMOS_SKIPPED_ON_FIRST_START, true);
@@ -609,6 +605,14 @@
         }
     }
 
+    private boolean maybeShowPromo() {
+        // Only one promo can be shown in one run to avoid nagging users too much.
+        if (SigninPromoUtil.launchConsentBumpIfNeeded(this)) return true;
+        if (SigninPromoUtil.launchSigninPromoIfNeeded(this)) return true;
+        return DataReductionPromoScreen.launchDataReductionPromo(
+                this, mTabModelSelectorImpl.getCurrentModel().isIncognito());
+    }
+
     /**
      * Determine whether the incognito profile needs to be destroyed as part of startup.  This is
      * only needed on L+ when it is possible to swipe away tasks from Android recents without
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
index 7be4afda..0188837 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -104,7 +104,7 @@
     private ControlContainer mControlContainer;
 
     private InsetObserverView mInsetObserverView;
-    private boolean mShowingFullscreenNonVideoContent;
+    private boolean mShowingFullscreen;
     private Runnable mSystemUiFullscreenResizeRunnable;
 
     /** The currently visible Tab. */
@@ -258,7 +258,7 @@
         // contents.
         //
         // [1] - https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_FULLSCREEN
-        if (mShowingFullscreenNonVideoContent && UiUtils.isKeyboardShowing(getContext(), this)) {
+        if (mShowingFullscreen && UiUtils.isKeyboardShowing(getContext(), this)) {
             getWindowVisibleDisplayFrame(mCacheRect);
 
             // On certain devices, getWindowVisibleDisplayFrame is larger than the screen size, so
@@ -273,36 +273,26 @@
     }
 
     private void handleSystemUiVisibilityChange() {
-        boolean isInFullscreen = false;
-        boolean layoutFullscreen = false;
-
         View view = getContentView();
         if (view == null || !ViewCompat.isAttachedToWindow(view)) view = this;
 
+        int uiVisibility = 0;
         while (view != null) {
-            int uiVisibility = view.getSystemUiVisibility();
-            layoutFullscreen |= (uiVisibility & View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) != 0;
-            isInFullscreen |= (uiVisibility & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0;
-            if (layoutFullscreen && isInFullscreen) break;
+            uiVisibility |= view.getSystemUiVisibility();
             if (!(view.getParent() instanceof View)) break;
             view = (View) view.getParent();
         }
 
-        if (!isInFullscreen && !mShowingFullscreenNonVideoContent) return;
+        // SYSTEM_UI_FLAG_FULLSCREEN is cleared when showing the soft keyboard in older version of
+        // Android (prior to P).  The immersive mode flags are not cleared, so use those in
+        // combination to detect this state.
+        boolean isInFullscreen = (uiVisibility & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0
+                || (uiVisibility & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0
+                || (uiVisibility & View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) != 0;
+        boolean layoutFullscreen = (uiVisibility & View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) != 0;
 
-        if (isInFullscreen && mFullscreenManager != null
-                && mFullscreenManager.getPersistentFullscreenMode()) {
-            Tab tab = getCurrentTab();
-            WebContents webContents = tab != null ? tab.getWebContents() : null;
-            // When playing fullscreen video, the inset size adjustments are always temporary and
-            // should be ignored to avoid relayout janks.
-            if (webContents != null && webContents.hasActiveEffectivelyFullscreenVideo()) {
-                isInFullscreen = false;
-            }
-        }
-
-        if (mShowingFullscreenNonVideoContent == isInFullscreen) return;
-        mShowingFullscreenNonVideoContent = isInFullscreen;
+        if (mShowingFullscreen == isInFullscreen) return;
+        mShowingFullscreen = isInFullscreen;
 
         if (mSystemUiFullscreenResizeRunnable == null) {
             mSystemUiFullscreenResizeRunnable = () -> {
@@ -376,8 +366,8 @@
     }
 
     @Override
-    public void onInsetChanged(int top, int left, int bottom, int right) {
-        if (mShowingFullscreenNonVideoContent) onViewportChanged();
+    public void onInsetChanged(int left, int top, int right, int bottom) {
+        if (mShowingFullscreen) onViewportChanged();
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
index 1508eba5..f3b91ee 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
@@ -56,6 +56,7 @@
 import org.chromium.components.feature_engagement.Tracker;
 import org.chromium.components.offline_items_collection.ContentId;
 import org.chromium.components.offline_items_collection.FailState;
+import org.chromium.components.offline_items_collection.LaunchLocation;
 import org.chromium.components.offline_items_collection.LegacyHelpers;
 import org.chromium.components.offline_items_collection.OfflineItem;
 import org.chromium.components.offline_items_collection.OfflineItem.Progress;
@@ -586,7 +587,7 @@
             @DownloadMetrics.DownloadOpenSource int source) {
         if (LegacyHelpers.isLegacyOfflinePage(contentId)) {
             OfflineContentAggregatorFactory.forProfile(Profile.getLastUsedProfile())
-                    .openItem(contentId);
+                    .openItem(LaunchLocation.PROGRESS_BAR, contentId);
         } else {
             DownloadManagerService.getDownloadManagerService().openDownload(
                     contentId, isOffTheRecord, source);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/glue/OfflineContentProviderGlue.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/glue/OfflineContentProviderGlue.java
index a465f40c..8de7434c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/glue/OfflineContentProviderGlue.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/glue/OfflineContentProviderGlue.java
@@ -8,6 +8,7 @@
 import org.chromium.base.ObserverList;
 import org.chromium.chrome.browser.widget.ThumbnailProvider;
 import org.chromium.components.offline_items_collection.ContentId;
+import org.chromium.components.offline_items_collection.LaunchLocation;
 import org.chromium.components.offline_items_collection.LegacyHelpers;
 import org.chromium.components.offline_items_collection.OfflineContentProvider;
 import org.chromium.components.offline_items_collection.OfflineItem;
@@ -59,7 +60,7 @@
         if (LegacyHelpers.isLegacyDownload(item.id)) {
             mDownloadProvider.openItem(item);
         } else {
-            mProvider.openItem(item.id);
+            mProvider.openItem(LaunchLocation.DOWNLOAD_HOME, item.id);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ImageViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ImageViewHolder.java
index dad498c..d5a321b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ImageViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ImageViewHolder.java
@@ -11,12 +11,14 @@
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.download.home.list.ListItem;
+import org.chromium.chrome.browser.download.home.view.LoadingBackground;
 import org.chromium.chrome.browser.modelutil.PropertyModel;
 import org.chromium.components.offline_items_collection.OfflineItemVisuals;
 
 /** A {@link RecyclerView.ViewHolder} specifically meant to display an image {@code OfflineItem}. */
 public class ImageViewHolder extends ThumbnailAwareViewHolder {
     private final int mImageHeightPx;
+    private LoadingBackground mLoadingBackground;
 
     public static ImageViewHolder create(ViewGroup parent) {
         View view = LayoutInflater.from(parent.getContext())
@@ -29,6 +31,7 @@
     public ImageViewHolder(View view, int thumbnailSizePx) {
         super(view, thumbnailSizePx, thumbnailSizePx);
         mImageHeightPx = thumbnailSizePx;
+        mLoadingBackground = new LoadingBackground(view.getContext());
     }
 
     // ThumbnailAwareViewHolder implementation.
@@ -47,4 +50,14 @@
     void onVisualsChanged(ImageView view, OfflineItemVisuals visuals) {
         view.setImageBitmap(visuals == null ? null : visuals.icon);
     }
+
+    @Override
+    protected void showLoadingView(ImageView view) {
+        mLoadingBackground.show(view);
+    }
+
+    @Override
+    protected void hideLoadingView() {
+        mLoadingBackground.hide();
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ThumbnailAwareViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ThumbnailAwareViewHolder.java
index eca9088..fdb26374 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ThumbnailAwareViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ThumbnailAwareViewHolder.java
@@ -103,6 +103,9 @@
         // Clear any associated bitmap from the thumbnail.
         if (mId != null) onVisualsChanged(mThumbnail, null);
 
+        // Show the loading animation if we are in loading state.
+        showLoadingView(mThumbnail);
+
         // Clear out any outstanding thumbnail request.
         if (mCancellable != null) mCancellable.run();
 
@@ -133,11 +136,23 @@
         mCancellable = null;
         mIsRequesting = false;
 
+        // Hide the loading view.
+        hideLoadingView();
+
         // Notify of the new visuals (if any).
         onVisualsChanged(mThumbnail, visuals);
     }
 
     /**
+     * Show UI to indicate that thumbnail loading in progress.
+     * @param view The view that should show the loading image.
+     */
+    protected void showLoadingView(ImageView view) {}
+
+    /** Hide the loading view. */
+    protected void hideLoadingView() {}
+
+    /**
      * Called when the contents of the thumbnail should be changed to due an event (either this
      * {@link RecyclerView.ViewHolder} being rebound to another {@link ListItem} or a thumbnail
      * query returning results.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/LoadingBackground.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/LoadingBackground.java
new file mode 100644
index 0000000..7a4009e
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/LoadingBackground.java
@@ -0,0 +1,46 @@
+// 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.
+
+package org.chromium.chrome.browser.download.home.view;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.support.graphics.drawable.Animatable2Compat;
+import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
+import android.widget.ImageView;
+
+import org.chromium.chrome.R;
+
+/**
+ * A helper class to display the loading image and animation for image and video items. This class
+ * can also be extended and/or modified to include download progress.
+ */
+public class LoadingBackground {
+    private AnimatedVectorDrawableCompat mLoadingDrawable;
+
+    public LoadingBackground(Context context) {
+        mLoadingDrawable =
+                AnimatedVectorDrawableCompat.create(context, R.drawable.image_loading_progress);
+        Animatable2Compat.AnimationCallback animationCallback =
+                new Animatable2Compat.AnimationCallback() {
+                    @Override
+                    public void onAnimationEnd(Drawable drawable) {
+                        mLoadingDrawable.start();
+                    }
+                };
+
+        mLoadingDrawable.registerAnimationCallback(animationCallback);
+    }
+
+    /** Show loading animation for the given {@link view}. */
+    public void show(ImageView view) {
+        view.setImageDrawable(mLoadingDrawable);
+        mLoadingDrawable.start();
+    }
+
+    /** Hide the loading animation. */
+    public void hide() {
+        mLoadingDrawable.clearAnimationCallbacks();
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/items/DownloadBlockedOfflineContentProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/download/items/DownloadBlockedOfflineContentProvider.java
index b974ca4..c81a0180 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/items/DownloadBlockedOfflineContentProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/items/DownloadBlockedOfflineContentProvider.java
@@ -7,6 +7,7 @@
 import org.chromium.base.Callback;
 import org.chromium.base.ObserverList;
 import org.chromium.components.offline_items_collection.ContentId;
+import org.chromium.components.offline_items_collection.LaunchLocation;
 import org.chromium.components.offline_items_collection.LegacyHelpers;
 import org.chromium.components.offline_items_collection.OfflineContentProvider;
 import org.chromium.components.offline_items_collection.OfflineItem;
@@ -32,9 +33,9 @@
     }
 
     @Override
-    public void openItem(ContentId id) {
+    public void openItem(@LaunchLocation int location, ContentId id) {
         assert !LegacyHelpers.isLegacyDownload(id);
-        mProvider.openItem(id);
+        mProvider.openItem(location, id);
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi.java b/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi.java
index 04e2fa10..0b935e856 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi.java
@@ -9,6 +9,7 @@
 import org.chromium.chrome.browser.download.DownloadNotifier;
 import org.chromium.chrome.browser.download.DownloadServiceDelegate;
 import org.chromium.components.offline_items_collection.ContentId;
+import org.chromium.components.offline_items_collection.LaunchLocation;
 import org.chromium.components.offline_items_collection.LegacyHelpers;
 import org.chromium.components.offline_items_collection.OfflineContentProvider;
 import org.chromium.components.offline_items_collection.OfflineItem;
@@ -66,7 +67,7 @@
 
     /** @see OfflineContentProvider#openItem(ContentId) */
     public void openItem(ContentId id) {
-        mProvider.openItem(id);
+        mProvider.openItem(LaunchLocation.NOTIFICATION, id);
     }
 
     // OfflineContentProvider.Observer implementation.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryItemWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryItemWrapper.java
index 1f5b2b72..22b6eba 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryItemWrapper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryItemWrapper.java
@@ -20,6 +20,7 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.widget.DateDividedAdapter.TimedItem;
 import org.chromium.components.download.DownloadState;
+import org.chromium.components.offline_items_collection.LaunchLocation;
 import org.chromium.components.offline_items_collection.OfflineContentProvider;
 import org.chromium.components.offline_items_collection.OfflineItem;
 import org.chromium.components.offline_items_collection.OfflineItem.Progress;
@@ -577,7 +578,7 @@
 
         @Override
         public void open() {
-            getOfflineContentProvider().openItem(mItem.id);
+            getOfflineContentProvider().openItem(LaunchLocation.DOWNLOAD_HOME, mItem.id);
             recordOpenSuccess();
         }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java
index b3f6eb1..2fe72052 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.offlinepages;
 
+import android.text.TextUtils;
+
 import org.chromium.base.Callback;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.ObserverList;
@@ -14,12 +16,15 @@
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.components.offline_items_collection.LaunchLocation;
 import org.chromium.components.offlinepages.DeletePageResult;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.WebContents;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.annotation.Nullable;
 
@@ -698,15 +703,18 @@
     }
 
     /**
-     * Get the url to launch the offline page associated with the provided offline ID. Depending on
-     * whether it is trusted or not, either http/https or file URL will be returned in the callback.
+     * Get the the url params to open the offline page associated with the provided offline ID.
+     * Depending on whether it is trusted or not, either http/https or file URL will be returned in
+     * the callback.
      *
      * @param offlineId ID of the offline page.
+     * @param location Where the offline page is launched.
      * @param callback callback to pass back the url string if found. Will pass back
      * <code>null</code> if not.
      */
-    public void getLaunchUrlByOfflineId(long offlineId, Callback<String> callback) {
-        nativeGetLaunchUrlByOfflineId(mNativeOfflinePageBridge, offlineId, callback);
+    public void getLoadUrlParamsByOfflineId(
+            long offlineId, @LaunchLocation int location, Callback<LoadUrlParams> callback) {
+        nativeGetLoadUrlParamsByOfflineId(mNativeOfflinePageBridge, offlineId, location, callback);
     }
 
     /**
@@ -815,9 +823,16 @@
     }
 
     @CalledByNative
-    private static LoadUrlParams createLoadUrlParams(String url, String extraHeaders) {
+    private static LoadUrlParams createLoadUrlParams(
+            String url, String extraHeaderKey, String extraHeaderValue) {
         LoadUrlParams loadUrlParams = new LoadUrlParams(url);
-        loadUrlParams.setVerbatimHeaders(extraHeaders);
+        if (!TextUtils.isEmpty(extraHeaderKey) && !TextUtils.isEmpty(extraHeaderValue)) {
+            // Set both map-based and collapsed headers to support all use scenarios.
+            Map<String, String> headers = new HashMap<String, String>();
+            headers.put(extraHeaderKey, extraHeaderValue);
+            loadUrlParams.setExtraHeaders(headers);
+            loadUrlParams.setVerbatimHeaders(extraHeaderKey + ": " + extraHeaderValue);
+        }
         return loadUrlParams;
     }
 
@@ -888,8 +903,8 @@
             long nativeOfflinePageBridge, WebContents webContents);
     private native void nativeCheckForNewOfflineContent(
             long nativeOfflinePageBridge, long freshnessTimeMillis, Callback<String> callback);
-    private native void nativeGetLaunchUrlByOfflineId(
-            long nativeOfflinePageBridge, long offlineId, Callback<String> callback);
+    private native void nativeGetLoadUrlParamsByOfflineId(long nativeOfflinePageBridge,
+            long offlineId, int location, Callback<LoadUrlParams> callback);
     private native boolean nativeIsShowingTrustedOfflinePage(
             long nativeOfflinePageBridge, WebContents webContents);
     private native void nativeGetLoadUrlParamsForOpeningMhtmlFileOrContent(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
index 85eb68a..fc9fd08f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
@@ -35,6 +35,7 @@
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabModelObserver;
 import org.chromium.chrome.browser.util.ChromeFileProvider;
 import org.chromium.components.bookmarks.BookmarkId;
+import org.chromium.components.offline_items_collection.LaunchLocation;
 import org.chromium.components.offlinepages.SavePageResult;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.WebContents;
@@ -569,10 +570,11 @@
      * the URL to ensure loading a specific version of offline page.
      * @param url       The url of the offline page to open.
      * @param offlineId The ID of the offline page to open.
+     * @param location  Indicates where the offline page is launched.
      * @param callback  The callback to pass back the LoadUrlParams for launching an URL.
      */
-    public static void getLoadUrlParamsForOpeningOfflineVersion(
-            final String url, long offlineId, Callback<LoadUrlParams> callback) {
+    public static void getLoadUrlParamsForOpeningOfflineVersion(final String url, long offlineId,
+            final @LaunchLocation int location, Callback<LoadUrlParams> callback) {
         OfflinePageBridge offlinePageBridge =
                 getInstance().getOfflinePageBridge(Profile.getLastUsedProfile());
         if (offlinePageBridge == null) {
@@ -580,15 +582,8 @@
             return;
         }
 
-        offlinePageBridge.getLaunchUrlByOfflineId(offlineId, (launchUrl) -> {
-            if (launchUrl == null) callback.onResult(null);
-            LoadUrlParams params = new LoadUrlParams(launchUrl);
-            Map<String, String> headers = new HashMap<String, String>();
-            headers.put(
-                    "X-Chrome-offline", "persist=1 reason=download id=" + Long.toString(offlineId));
-            params.setExtraHeaders(headers);
-            callback.onResult(params);
-        });
+        offlinePageBridge.getLoadUrlParamsByOfflineId(
+                offlineId, location, (loadUrlParams) -> { callback.onResult(loadUrlParams); });
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageDownloadBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageDownloadBridge.java
index 0bf9432..6634f694 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageDownloadBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageDownloadBridge.java
@@ -87,17 +87,20 @@
      * item with specified GUID is not found or can't be opened, nothing happens.
      */
     @CalledByNative
-    private static void openItem(final String url, final long offlineId, final boolean openInCct) {
-        OfflinePageUtils.getLoadUrlParamsForOpeningOfflineVersion(url, offlineId, (params) -> {
-            if (params == null) return;
-            boolean openingFromDownloadsHome =
-                    ApplicationStatus.getLastTrackedFocusedActivity() instanceof DownloadActivity;
-            if (openInCct && openingFromDownloadsHome) {
-                openItemInCct(offlineId, params);
-            } else {
-                openItemInNewTab(offlineId, params);
-            }
-        });
+    private static void openItem(
+            final String url, final long offlineId, final int location, final boolean openInCct) {
+        OfflinePageUtils.getLoadUrlParamsForOpeningOfflineVersion(
+                url, offlineId, location, (params) -> {
+                    if (params == null) return;
+                    boolean openingFromDownloadsHome =
+                            ApplicationStatus.getLastTrackedFocusedActivity()
+                                    instanceof DownloadActivity;
+                    if (openInCct && openingFromDownloadsHome) {
+                        openItemInCct(offlineId, params);
+                    } else {
+                        openItemInNewTab(offlineId, params);
+                    }
+                });
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
index 0695564..df9b37b9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
@@ -95,6 +95,7 @@
     private int mPreviousScrollViewWidth;
     private int mPreviousScrollResultXPosition;
     private float mPreviousScrollFontSize;
+    private boolean mPreviousScrollWasRtl;
 
     // Used as a hint to indicate the text may contain an ellipsize span.  This will be true if an
     // ellispize span was applied the last time the text changed.  A true value here does not
@@ -629,12 +630,16 @@
         // Ensure any selection from the focus state is cleared.
         setSelection(0);
 
+        float currentTextSize = getTextSize();
+        boolean currentIsRtl = ApiCompatibilityUtils.isLayoutRtl(this);
+
         int measuredWidth = getMeasuredWidth() - (getPaddingLeft() + getPaddingRight());
         if (scrollType == mPreviousScrollType && TextUtils.equals(text, mPreviousScrollText)
                 && measuredWidth == mPreviousScrollViewWidth
                 // Font size is float but it changes in discrete range (eg small font, big font),
                 // therefore false negative using regular equality is unlikely.
-                && getTextSize() == mPreviousScrollFontSize) {
+                && currentTextSize == mPreviousScrollFontSize
+                && currentIsRtl == mPreviousScrollWasRtl) {
             scrollTo(mPreviousScrollResultXPosition, getScrollY());
             return;
         }
@@ -654,8 +659,9 @@
         mPreviousScrollType = scrollType;
         mPreviousScrollText = text.toString();
         mPreviousScrollViewWidth = measuredWidth;
-        mPreviousScrollFontSize = getTextSize();
+        mPreviousScrollFontSize = currentTextSize;
         mPreviousScrollResultXPosition = getScrollX();
+        mPreviousScrollWasRtl = currentIsRtl;
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarData.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarData.java
index 64a800c..d3033d8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarData.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarData.java
@@ -25,8 +25,9 @@
     /**
      * The URL schemes that should be displayed complete with path.
      */
-    public static final HashSet<String> UNSUPPORTED_SCHEMES_TO_SPLIT = CollectionUtil.newHashSet(
-            UrlConstants.FILE_SCHEME, UrlConstants.JAVASCRIPT_SCHEME, UrlConstants.DATA_SCHEME);
+    public static final HashSet<String> UNSUPPORTED_SCHEMES_TO_SPLIT =
+            CollectionUtil.newHashSet(UrlConstants.FILE_SCHEME, UrlConstants.JAVASCRIPT_SCHEME,
+                    UrlConstants.DATA_SCHEME, UrlConstants.CONTENT_SCHEME);
     /**
      * URI schemes that ContentView can handle.
      *
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninPromoUtil.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninPromoUtil.java
index de46dd6..ca77f1c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninPromoUtil.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninPromoUtil.java
@@ -9,6 +9,7 @@
 
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeVersionInfo;
 import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
@@ -26,6 +27,21 @@
     private SigninPromoUtil() {}
 
     /**
+     * Launches the consent bump screen if it needs to be displayed.
+     * @param activity The parent activity.
+     * @return Whether the consent bump screen is shown.
+     */
+    public static boolean launchConsentBumpIfNeeded(final Activity activity) {
+        String accountName = ChromeSigninController.get().getSignedInAccountName();
+        if (accountName == null || !ChromeFeatureList.isEnabled(ChromeFeatureList.UNIFIED_CONSENT)
+                || !UnifiedConsentServiceBridge.shouldShowConsentBump()) {
+            return false;
+        }
+        activity.startActivity(SigninActivity.createIntentForConsentBump(activity, accountName));
+        return true;
+    }
+
+    /**
      * Launches the signin promo if it needs to be displayed.
      * @param activity The parent activity.
      * @return Whether the signin promo is shown.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/UnifiedConsentServiceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/UnifiedConsentServiceBridge.java
new file mode 100644
index 0000000..fd881fc
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/UnifiedConsentServiceBridge.java
@@ -0,0 +1,23 @@
+// 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.
+
+package org.chromium.chrome.browser.signin;
+
+import org.chromium.chrome.browser.profiles.Profile;
+
+/**
+ * Bridge to UnifiedConsentService.
+ */
+public class UnifiedConsentServiceBridge {
+    private UnifiedConsentServiceBridge() {}
+
+    /**
+     * Returns whether the consent bump should be shown as part of the migration to Unified Consent.
+     */
+    public static boolean shouldShowConsentBump() {
+        return nativeShouldShowConsentBump(Profile.getLastUsedProfile());
+    }
+
+    private static native boolean nativeShouldShowConsentBump(Profile profile);
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegateImpl.java
index 78bdfbc..b8cabc5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegateImpl.java
@@ -30,6 +30,7 @@
 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tabmodel.document.TabDelegate;
+import org.chromium.components.offline_items_collection.LaunchLocation;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.common.Referrer;
 import org.chromium.ui.base.PageTransition;
@@ -130,8 +131,9 @@
             assert windowOpenDisposition == WindowOpenDisposition.CURRENT_TAB
                     || windowOpenDisposition == WindowOpenDisposition.NEW_WINDOW
                     || windowOpenDisposition == WindowOpenDisposition.NEW_BACKGROUND_TAB;
-            OfflinePageUtils.getLoadUrlParamsForOpeningOfflineVersion(
-                    article.mUrl, article.getOfflinePageOfflineId(), (loadUrlParams) -> {
+            OfflinePageUtils.getLoadUrlParamsForOpeningOfflineVersion(article.mUrl,
+                    article.getOfflinePageOfflineId(), LaunchLocation.SUGGESTION,
+                    (loadUrlParams) -> {
                         // Extra headers are not read in loadUrl, but verbatim headers are.
                         loadUrlParams.setVerbatimHeaders(loadUrlParams.getExtraHeadersString());
                         openDownloadSuggestion(windowOpenDisposition, article, loadUrlParams);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarMediator.java
index ac5651d..5bab11d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarMediator.java
@@ -115,10 +115,10 @@
     @Override
     public void onControlsOffsetChanged(float topOffset, float bottomOffset, boolean needsAnimate) {
         mModel.setValue(BottomToolbarModel.Y_OFFSET, (int) bottomOffset);
-        if (bottomOffset > 0) {
+        if (bottomOffset > 0 || mFullscreenManager.getBottomControlsHeight() == 0) {
             mModel.setValue(BottomToolbarModel.ANDROID_VIEW_VISIBLE, false);
         } else {
-            mModel.setValue(BottomToolbarModel.ANDROID_VIEW_VISIBLE, true);
+            tryShowingAndroidView();
         }
     }
 
@@ -157,30 +157,38 @@
 
     @Override
     public void onHideContextualSearch() {
-        // If the scroll offset for the toolbar is non-zero, it needs to remain hidden after
-        // contextual search is hidden.
-        if (mModel.getValue(BottomToolbarModel.Y_OFFSET) != 0) return;
-        mModel.setValue(BottomToolbarModel.ANDROID_VIEW_VISIBLE, true);
+        tryShowingAndroidView();
     }
 
     @Override
     public void keyboardVisibilityChanged(boolean isShowing) {
         // The toolbars are force shown when the keyboard is visible, so we can blindly set
         // the bottom toolbar view to visible or invisible regardless of the previous state.
-        ChromeFullscreenManager fullscreenManager =
-                mModel.getValue(BottomToolbarModel.LAYOUT_MANAGER).getFullscreenManager();
         if (isShowing) {
-            mBottomToolbarHeightBeforeHide = fullscreenManager.getBottomControlsHeight();
+            mBottomToolbarHeightBeforeHide = mFullscreenManager.getBottomControlsHeight();
             mModel.setValue(BottomToolbarModel.ANDROID_VIEW_VISIBLE, false);
             mModel.setValue(BottomToolbarModel.COMPOSITED_VIEW_VISIBLE, false);
-            fullscreenManager.setBottomControlsHeight(0);
+            mFullscreenManager.setBottomControlsHeight(0);
         } else {
-            fullscreenManager.setBottomControlsHeight(mBottomToolbarHeightBeforeHide);
-            mModel.setValue(BottomToolbarModel.ANDROID_VIEW_VISIBLE, true);
+            mFullscreenManager.setBottomControlsHeight(mBottomToolbarHeightBeforeHide);
+            tryShowingAndroidView();
+            mModel.setValue(
+                    BottomToolbarModel.Y_OFFSET, (int) mFullscreenManager.getBottomControlOffset());
             mModel.setValue(BottomToolbarModel.COMPOSITED_VIEW_VISIBLE, true);
         }
     }
 
+    /**
+     * Try showing the toolbar's Android view after it has been hidden. This accounts for cases
+     * where a browser signal would ordinarily re-show the view, but others still require it to be
+     * hidden.
+     */
+    private void tryShowingAndroidView() {
+        if (mFullscreenManager.getBottomControlOffset() > 0) return;
+        if (mModel.getValue(BottomToolbarModel.Y_OFFSET) != 0) return;
+        mModel.setValue(BottomToolbarModel.ANDROID_VIEW_VISIBLE, true);
+    }
+
     void setLayoutManager(LayoutManager layoutManager) {
         mModel.setValue(BottomToolbarModel.LAYOUT_MANAGER, layoutManager);
         layoutManager.addSceneChangeObserver(this);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/VrDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/VrDelegate.java
index afe1e6da..4840c0f5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr/VrDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/VrDelegate.java
@@ -6,6 +6,7 @@
 
 import android.app.Activity;
 import android.content.Intent;
+import android.os.Bundle;
 
 import org.chromium.chrome.browser.ChromeActivity;
 
@@ -34,8 +35,10 @@
     void onNewIntentWithNative(ChromeActivity activity, Intent intent);
     void maybeHandleVrIntentPreNative(ChromeActivity activity, Intent intent);
     void setVrModeEnabled(Activity activity, boolean enabled);
+    void doPreInflationStartup(ChromeActivity activity, Bundle savedInstanceState);
     boolean bootsToVr();
     boolean isDaydreamReadyDevice();
     boolean isDaydreamCurrentViewer();
     boolean willChangeDensityInVr(ChromeActivity activity);
+    void onSaveInstanceState(Bundle outState);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/VrDelegateFallback.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/VrDelegateFallback.java
index efbdb9a..e02ffb23 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr/VrDelegateFallback.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/VrDelegateFallback.java
@@ -108,6 +108,9 @@
     }
 
     @Override
+    public void doPreInflationStartup(ChromeActivity activity, Bundle savedInstanceState) {}
+
+    @Override
     public boolean bootsToVr() {
         return false;
     }
@@ -149,4 +152,7 @@
         assert false;
         return false;
     }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {}
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/VrDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/VrDelegateImpl.java
index 830941834..69c608d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr/VrDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/VrDelegateImpl.java
@@ -129,6 +129,11 @@
     }
 
     @Override
+    public void doPreInflationStartup(ChromeActivity activity, Bundle savedInstanceState) {
+        VrShellDelegate.doPreInflationStartup(activity, savedInstanceState);
+    }
+
+    @Override
     public boolean bootsToVr() {
         return VrShellDelegate.bootsToVr();
     }
@@ -167,4 +172,9 @@
     public boolean willChangeDensityInVr(ChromeActivity activity) {
         return VrShellDelegate.willChangeDensityInVr(activity);
     }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        VrShellDelegate.onSaveInstanceState(outState);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/VrShellDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/VrShellDelegate.java
index 58e8ff77..d76232b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr/VrShellDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/VrShellDelegate.java
@@ -144,6 +144,9 @@
 
     private static final String VR_BOOT_SYSTEM_PROPERTY = "ro.boot.vr";
 
+    /** ID for SavedInstanceState Bundle for whether Chrome was in VR when killed. */
+    private static final String IN_VR = "in_vr";
+
     private static VrShellDelegate sInstance;
     private static VrBroadcastReceiver sVrBroadcastReceiver;
     private static VrLifecycleObserver sVrLifecycleObserver;
@@ -665,6 +668,30 @@
     }
 
     /**
+     * Performs pre-inflation VR-related startup.
+     */
+    public static void doPreInflationStartup(ChromeActivity activity, Bundle savedInstanceState) {
+        // We need to explicitly enable VR mode here so that the system doesn't kick us out of VR,
+        // or drop us into the 2D-in-VR rendering mode, while we prepare for VR rendering.
+        if (VrIntentUtils.isLaunchingIntoVr(activity, activity.getIntent())) {
+            setVrModeEnabled(activity, true);
+        } else if (savedInstanceState != null && savedInstanceState.getBoolean(IN_VR, false)) {
+            // When Chrome is restored from a SavedInstanceState with VR mode still on we need to
+            // Explicitly turn VR mode off even though we can't really know for sure whether or not
+            // it's currently on.
+            AndroidCompat.setVrModeEnabled(activity, false);
+            sVrModeEnabledActivitys.remove(activity);
+        }
+    }
+
+    /**
+     * See {@link Activity#onSaveInstanceState(Bundle)}
+     */
+    public static void onSaveInstanceState(Bundle outState) {
+        if (isInVr()) outState.putBoolean(IN_VR, true);
+    }
+
+    /**
      * See VrClassesWrapper#bootsToVr().
      */
     public static boolean bootsToVr() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java
index f1d0b2b42..26a0a250 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbar.java
@@ -549,7 +549,8 @@
      */
     protected boolean isWebContentAvailable() {
         Tab currentTab = mTabModelSelector.getCurrentTab();
-        return currentTab != null && currentTab.getWebContents() != null;
+        return currentTab != null && currentTab.getWebContents() != null
+                && !currentTab.isNativePage();
     }
 
     /**
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 fe65550..96a998a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">በ<ph name="WEBSITE_URL" /> ውስጥ ተካትቷል</translation>
 <translation id="1406000523432664303">«አትከታተል»</translation>
 <translation id="1407135791313364759">ሁሉንም ክፈት</translation>
+<translation id="1409426117486808224">ለክፍት ትሮች የተቃለለ እይታ</translation>
 <translation id="1409879593029778104">ፋይሉ አስቀድሞ ስላለ <ph name="FILE_NAME" />ን ማውረድ ታግዷል።</translation>
 <translation id="1414981605391750300">Googleን በማነጋገር ላይ።  ወደ አንድ ደቂቃ ሊወስድ ይችላል…</translation>
 <translation id="1416550906796893042">የመተግበሪያ ስሪት</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838"><ph name="APP_NAME" />ን ለመጠቀም እባክዎ ከበይነመረብ ጋር ይገናኙ።</translation>
 <translation id="1569387923882100876">የተገናኘ መሣሪያ</translation>
 <translation id="1571304935088121812">የተጠቃሚ ስምን ቅዳ</translation>
+<translation id="1576370611341449972">ማውረድ በWi-Fi ላይ ብቻ ነው የሚከሰተው</translation>
 <translation id="1612196535745283361">Chrome መሣሪያዎችን መቃኘት እንዲችል የአካባቢ መዳረሻ ያስፈልገዋል። የአካባቢ መዳረሻ <ph name="BEGIN_LINK" />ለዚህ መሣሪያ ጠፍቷል<ph name="END_LINK" />።</translation>
 <translation id="162035744160882748">ስምረትን፣ ግላዊነት ማላበስን እና ሌሎች የGoogle አገልግሎቶችን ያብሩ</translation>
 <translation id="1620510694547887537">ካሜራ</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">ቪዲዮ</translation>
 <translation id="3810973564298564668">አቀናብር</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> የሚወርዱ ተሰርዘዋል</translation>
+<translation id="3819562311292413223">ለእርስዎ የሚሆኑ ጽሑፎችን አይውርዱ</translation>
 <translation id="3822502789641063741">የጣቢያ ማከማቻ ይጽዳ?</translation>
 <translation id="385051799172605136">ተመለስ</translation>
 <translation id="3859306556332390985">ወደፊት ፈልግ</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">በእርስዎ አስተዳዳሪ የሚቀናበር</translation>
 <translation id="4116038641877404294">ገጾችን ከመስመር ውጭ ለመጠቀም ያውርዷቸው</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d ዕልባት}one{%1$d ዕልባቶች}other{%1$d ዕልባቶች}}</translation>
+<translation id="4149994727733219643">ለድረ-ገጾች የተቃለለ እይታ</translation>
 <translation id="4159800535322890630">ጣቢያዎች ዳሳሾችዎን እንዳይደርሱ ያግዱ</translation>
 <translation id="4165986682804962316">የጣቢያ ቅንብሮች</translation>
 <translation id="4170011742729630528">አገልግሎቱ አይገኝም፤ ቆይተው እንደገና ይሞክሩ።</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">ይህ መለያ የሚቀናበረው በ<ph name="PARENT_NAME" /> ነው።</translation>
 <translation id="5514904542973294328">በዚህ መሣሪያ አስተዳዳሪ ተሰናክሏል</translation>
 <translation id="5515439363601853141">የይለፍ ቃልዎን ለመመልከት ይክፈቱ</translation>
+<translation id="5515716148775388141">የእርስዎ አዶዎች ወደ የማያው ታችኛው ክፍል ተወስደዋል</translation>
 <translation id="5517095782334947753">ከ<ph name="FROM_ACCOUNT" /> የመጡ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት  እና ሌሎች ቅንብሮች አለዎት።</translation>
 <translation id="5524843473235508879">አቅጣጫ ማዞር ታግዷል።</translation>
 <translation id="5527082711130173040">Chrome መሣሪያዎችን መቃኘት እንዲችል የአካባቢ መዳረሻ ያስፈልገዋል። <ph name="BEGIN_LINK1" />ፈቃዶችን ያዘምኑ<ph name="END_LINK1" />። የአካባቢ መዳረሻ እንዲሁም <ph name="BEGIN_LINK2" />ለዚህ መዳረሻ ጠፍቷል<ph name="END_LINK2" />።</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">ለአሁኑ የፍለጋ ፕሮግራም ተፈቅዷል</translation>
 <translation id="7021515813996758557"><ph name="FILE_NAME" /> ወርዷል</translation>
 <translation id="7022756207310403729">በአሳሽ ውስጥ ክፈት</translation>
+<translation id="702463548815491781">TalkBack ወይም መዳረሻ ቀይር ሲበሩ የሚመከር</translation>
 <translation id="7029809446516969842">የይለፍ ቃላት</translation>
 <translation id="7031882061095297553">አሥምር ወደ</translation>
 <translation id="7032663816368481562">እንደዚህ <ph name="ICON" /> ያለ ተጨማሪ በአድራሻ አሞሌ ውስጥ መታ በሚያደርጉበት ጊዜ፣ ለተዛማጅ ገጾች ፈጣን አገናኞችን ያሳዩ። የሚጎበኟቸው ገጾች ዩአርኤሎች ወደ Google ይላካሉ።</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">ከአንዳንድ ጣቢያዎች ታግደዋል</translation>
 <translation id="7253272406652746122">በመሣሪያዎ ቅንብሮች መተግበሪያ ውስጥ ካለው የመለያዎች ገጽ ሆነው የGoogle መለያ ያክሉ።</translation>
 <translation id="7274013316676448362">የታገደ ጣቢያ</translation>
+<translation id="72867290065237936">በይለፍ ቃል ጥቆማዎች እና ቁልፍ ሰሌዳ መካከል ለመቀያየር መታ ያድርጉ</translation>
 <translation id="729975465115245577">የእርስዎ መሣሪያ የይለፍ ቃላት ፋይሉን የሚያከማችበት መተግበሪያ የለውም።</translation>
 <translation id="7302081693174882195">ዝርዝሮች፦ በተቀመጠው የውሂብ መጠን ተደርድረዋል</translation>
 <translation id="7333031090786104871">አሁንም ቀዳሚ ጣቢያን በማከል ላይ</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 85475dd7..ff1004b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -38,7 +38,7 @@
 <translation id="1258753120186372309">‏رسم الشعار المبتكر من Google: <ph name="DOODLE_DESCRIPTION" /></translation>
 <translation id="1259100630977430756">لن تظهر الصفحات التي تشاهدها في علامات التبويب الخاصة في سِجل متصفّحك أو في وحدة تخزين ملفات تعريف الارتباط أو في سِجل البحث بعد إغلاق جميع علامات التبويب الخاصة. وسيتم حفظ أي ملفات تنزّلها أو إشارات مرجعية تنشئها.
 
-لكنك لن تكون غير مرئي. فاستخدام الوضع الخاص لا يخفي تصفُّحك عن صاحب العمل أو مزود خدمة الإنترنت أو مواقع الويب التي تزورها.</translation>
+لكنك ستبقى مرئيًا، فاستخدام الوضع الخاص لا يخفي تصفُّحك عن صاحب العمل أو مزود خدمة الإنترنت أو مواقع الويب التي تزورها.</translation>
 <translation id="127138278192656016">استخدام المزامنة وجميع الخدمات</translation>
 <translation id="1272079795634619415">إيقاف</translation>
 <translation id="1283039547216852943">النقر للتوسيع</translation>
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">تم التضمين في <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">"عدم التعقب"</translation>
 <translation id="1407135791313364759">فتح الكل</translation>
+<translation id="1409426117486808224">عرض مبسَّط لعلامات التبويب المفتوحة</translation>
 <translation id="1409879593029778104">مُنع تنزيل الملف <ph name="FILE_NAME" /> لأنه موجود بالفعل.</translation>
 <translation id="1414981605391750300">‏جارٍ الاتصال بـ Google. قد يستغرق ذلك دقيقة واحدة...</translation>
 <translation id="1416550906796893042">إصدار التطبيق</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">لاستخدام <ph name="APP_NAME" />، يُرجى الاتصال بالإنترنت.</translation>
 <translation id="1569387923882100876">جهاز متصل</translation>
 <translation id="1571304935088121812">نسخ اسم المستخدم</translation>
+<translation id="1576370611341449972">‏لا يتم التنزيل إلا عند الاتصال بشبكة Wi-Fi</translation>
 <translation id="1612196535745283361">‏يحتاج Chrome للوصول إلى الموقع للبحث عن الأجهزة. الوصول إلى الموقع <ph name="BEGIN_LINK" />غير مفعّل لهذا الجهاز<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">‏تفعيل المزامنة والتخصيص وخدمات Google الأخرى</translation>
 <translation id="1620510694547887537">الكاميرا</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">فيديو</translation>
 <translation id="3810973564298564668">إدارة محرّكات البحث</translation>
 <translation id="3819178904835489326">تم إلغاء <ph name="NUMBER_OF_DOWNLOADS" /> من التنزيلات</translation>
+<translation id="3819562311292413223">تنزيل مقالات تهمّك</translation>
 <translation id="3822502789641063741">أتمحو سعة تخزين الموقع؟</translation>
 <translation id="385051799172605136">الرجوع إلى الوراء</translation>
 <translation id="3859306556332390985">الانتقال للأمام</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">يديره المسؤول</translation>
 <translation id="4116038641877404294">تنزيل الصفحات لاستخدامها بلا اتصال بالإنترنت</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{‏إشارة مرجعية (%1$d)}zero{‏%1$d إشارة مرجعية}two{‏إشارتان مرجعيتان (%1$d)}few{‏%1$d إشارات مرجعية}many{‏%1$d إشارةً مرجعيةً}other{‏%1$d إشارة مرجعية}}</translation>
+<translation id="4149994727733219643">عرض مبسَّط لصفحات الويب</translation>
 <translation id="4159800535322890630">حظر المواقع من الوصول إلى أجهزة الاستشعار</translation>
 <translation id="4165986682804962316">إعدادات الموقع</translation>
 <translation id="4170011742729630528">الخدمة غير متاحة، أعد المحاولة لاحقًا.</translation>
@@ -554,6 +558,7 @@
 <translation id="5512137114520586844">تتم إدارة هذا الحساب بواسطة <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">تم الإيقاف من قبل مشرف هذا الجهاز</translation>
 <translation id="5515439363601853141">إلغاء القفل لعرض كلمة المرور</translation>
+<translation id="5515716148775388141">انتقلت الرموز إلى أسفل الشاشة.</translation>
 <translation id="5517095782334947753">تتوفر لديك الإشارات المرجعية، والسجل، وكلمات المرور، والإعدادات الأخرى من <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">تم حظر إعادة التوجيه.</translation>
 <translation id="5527082711130173040">‏يحتاج Chrome للوصول إلى الموقع للبحث عن الأجهزة. <ph name="BEGIN_LINK1" />تحديث الأذونات<ph name="END_LINK1" />. الوصول إلى الموقع <ph name="BEGIN_LINK2" />غير مفعّل لهذا الجهاز<ph name="END_LINK2" /> أيضًا.</translation>
@@ -757,6 +762,7 @@
 <translation id="7016516562562142042">تم السماح به لمحرك البحث الحالي</translation>
 <translation id="7021515813996758557">تم تنزيل <ph name="FILE_NAME" /></translation>
 <translation id="7022756207310403729">فتح في المتصفح</translation>
+<translation id="702463548815491781">‏تمت التوصية به عند تفعيل TalkBack أو الوصول عبر مفتاح التحويل</translation>
 <translation id="7029809446516969842">كلمات المرور</translation>
 <translation id="7031882061095297553">مزامنة لـ</translation>
 <translation id="7032663816368481562">‏عند النقر على "المزيد من النتائج المشابهة" <ph name="ICON" /> في شريط العناوين، تظهر روابط سريعة للصفحات ذات الصلة. ويُرسِل المتصفّح عناوين URL للصفحات التي تزورها إلى Google.</translation>
@@ -785,6 +791,7 @@
 <translation id="7251326866581677552">تم الحظر من بعض المواقع</translation>
 <translation id="7253272406652746122">‏أضف حساب Google من صفحة "الحسابات" في تطبيق إعدادات جهازك.</translation>
 <translation id="7274013316676448362">الموقع المحظور</translation>
+<translation id="72867290065237936">انقر للتبديل بين اقتراحات كلمة المرور ولوحة المفاتيح</translation>
 <translation id="729975465115245577">لا يتضمن جهازك تطبيقًا لتخزين ملف كلمات المرور.</translation>
 <translation id="7302081693174882195">التفاصيل: تم الترتيب بحسب مقدار البيانات المحفوظة</translation>
 <translation id="7333031090786104871">لا تزال عملية إضافة موقع الويب السابق جارية</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 78e9249..d1f29ff 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Вградено в/ъв <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">Заявка „Do Not Track“</translation>
 <translation id="1407135791313364759">Отваряне на всички</translation>
+<translation id="1409426117486808224">Опростен изглед на отворените раздели</translation>
 <translation id="1409879593029778104">Изтеглянето на „<ph name="FILE_NAME" />“ е предотвратено, защото файлът вече съществува.</translation>
 <translation id="1414981605391750300">Установява се връзка с Google. Това може да отнеме известно време…</translation>
 <translation id="1416550906796893042">Версия на приложението</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">За да използвате <ph name="APP_NAME" />, моля, свържете се с интернет.</translation>
 <translation id="1569387923882100876">Свързано устройство</translation>
 <translation id="1571304935088121812">Копиране на потребителското име</translation>
+<translation id="1576370611341449972">Изтеглянето се извършва само през Wi-Fi</translation>
 <translation id="1612196535745283361">Chrome се нуждае от достъп до местоположението, за да сканира за устройства, но съответните услуги са <ph name="BEGIN_LINK" />изключени за това устройство<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Включване на синхронизирането, персонализирането и други услуги на Google</translation>
 <translation id="1620510694547887537">Камера</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Видео</translation>
 <translation id="3810973564298564668">Управление</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> изтегляния бяха изтрити</translation>
+<translation id="3819562311292413223">Изтегляне на статии за вас</translation>
 <translation id="3822502789641063741">Изчистване на данните?</translation>
 <translation id="385051799172605136">Назад</translation>
 <translation id="3859306556332390985">Придвижване напред</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Управлява се от администратора ви</translation>
 <translation id="4116038641877404294">Изтеглете страниците, за да ги използвате офлайн</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d отметка}other{%1$d отметки}}</translation>
+<translation id="4149994727733219643">Опростен изглед на уеб страниците</translation>
 <translation id="4159800535322890630">Блокиране на сайтовете, така че да нямат достъп до сензорите</translation>
 <translation id="4165986682804962316">Настройки за сайта</translation>
 <translation id="4170011742729630528">Няма достъп до услугата. Опитайте отново по-късно.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Този профил се управлява от <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Деактивирано от администратора на това устройство</translation>
 <translation id="5515439363601853141">Отключете, за да видите паролата си</translation>
+<translation id="5515716148775388141">Иконите са преместени в долната част на екрана</translation>
 <translation id="5517095782334947753">Имате отметки, история, пароли и други настройки от <ph name="FROM_ACCOUNT" /></translation>
 <translation id="5524843473235508879">Блокирано бе пренасочване.</translation>
 <translation id="5527082711130173040">Chrome се нуждае от достъп до местоположението, за да сканира за устройства. <ph name="BEGIN_LINK1" />Актуализирайте разрешенията<ph name="END_LINK1" />. Също така услугите за местоположение са <ph name="BEGIN_LINK2" />изключени за това устройство<ph name="END_LINK2" />.</translation>
@@ -757,6 +762,7 @@
 <translation id="7016516562562142042">Разрешено за текущата търсеща машина</translation>
 <translation id="7021515813996758557">„<ph name="FILE_NAME" />“ се изтегли</translation>
 <translation id="7022756207310403729">Отваряне в браузъра</translation>
+<translation id="702463548815491781">Препоръчва се, когато TalkBack или достъпът с превключване са задействани</translation>
 <translation id="7029809446516969842">Пароли</translation>
 <translation id="7031882061095297553">Синхронизиране със</translation>
 <translation id="7032663816368481562">Когато докоснете „Още подобни на това“ <ph name="ICON" /> в адресната лента, показва връзки за бърз достъп до сродни страници. URL адресите на страниците, които посещавате, се изпращат до Google.</translation>
@@ -785,6 +791,7 @@
 <translation id="7251326866581677552">Блокиране за някои сайтове</translation>
 <translation id="7253272406652746122">Добавете профил в Google от страницата „Профили“ в приложението Настройки на устройството ви.</translation>
 <translation id="7274013316676448362">Блокиран сайт</translation>
+<translation id="72867290065237936">Докоснете, за да превключите между предложенията за парола и клавиатурата</translation>
 <translation id="729975465115245577">На устройството ви няма приложение за съхраняване на файла с паролите.</translation>
 <translation id="7302081693174882195">Подробности: сортирани по количество спестени данни</translation>
 <translation id="7333031090786104871">Още се добавя предишният сайт</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 d3b9bd4..36f540f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Inserit a <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">No segueixis</translation>
 <translation id="1407135791313364759">Obre-les totes</translation>
+<translation id="1409426117486808224">Visualització simplificada de les pestanyes obertes</translation>
 <translation id="1409879593029778104">No s'ha baixat el fitxer <ph name="FILE_NAME" /> perquè ja existeix.</translation>
 <translation id="1414981605391750300">S'està contactant amb Google. Aquest procés pot trigar una estona…</translation>
 <translation id="1416550906796893042">Versió de l'aplicació</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Per utilitzar <ph name="APP_NAME" />, connecta't a Internet.</translation>
 <translation id="1569387923882100876">Dispositiu connectat</translation>
 <translation id="1571304935088121812">Copia el nom d'usuari</translation>
+<translation id="1576370611341449972">Només baixa contingut per Wi‑Fi</translation>
 <translation id="1612196535745283361">Chrome necessita accedir a la ubicació per poder cercar dispositius, però aquesta funció està <ph name="BEGIN_LINK" />desactivada en aquest dispositiu<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Activa la sincronització, la personalització i altres serveis de Google</translation>
 <translation id="1620510694547887537">Càmera</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Vídeo</translation>
 <translation id="3810973564298564668">Gestiona</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> baixades suprimides</translation>
+<translation id="3819562311292413223">Baixa articles que et poden interessar</translation>
 <translation id="3822502789641063741">Esborrar emmagatz. lloc?</translation>
 <translation id="385051799172605136">Enrere</translation>
 <translation id="3859306556332390985">Avança</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Gestionat per l'administrador</translation>
 <translation id="4116038641877404294">Baixa pàgines per utilitzar-les sense connexió</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d adreça d'interès}other{%1$d adreces d'interès}}</translation>
+<translation id="4149994727733219643">Visualització simplificada de pàgines web</translation>
 <translation id="4159800535322890630">Impedeix que els llocs web accedeixin als sensors</translation>
 <translation id="4165986682804962316">Configuració del lloc web</translation>
 <translation id="4170011742729630528">El servei no està disponible. Torneu-ho a provar més tard.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844"><ph name="PARENT_NAME" /> gestiona aquest compte.</translation>
 <translation id="5514904542973294328">Opció desactivada per l'administrador d'aquest dispositiu</translation>
 <translation id="5515439363601853141">Desbloqueja la pantalla per veure la contrasenya</translation>
+<translation id="5515716148775388141">Les icones s'han mogut a la part inferior de la pantalla</translation>
 <translation id="5517095782334947753">Tens les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració de l'adreça <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">S'ha bloquejat la redirecció.</translation>
 <translation id="5527082711130173040">Chrome necessita accedir a la ubicació per poder cercar dispositius. <ph name="BEGIN_LINK1" />Actualitza els permisos<ph name="END_LINK1" />. L'accés a la ubicació també està <ph name="BEGIN_LINK2" />desactivat en aquest dispositiu<ph name="END_LINK2" />.</translation>
@@ -601,7 +606,7 @@
 <translation id="5809361687334836369">{HOURS,plural, =1{fa # hora}other{fa # hores}}</translation>
 <translation id="5817918615728894473">Vincula</translation>
 <translation id="583281660410589416">Desconegut</translation>
-<translation id="5833397272224757657">Utilitza el contingut dels llocs web que visites, així com l'activitat i les interaccions del navegador per oferir una experiència personalitzada.</translation>
+<translation id="5833397272224757657">Utilitza el contingut dels llocs web que visites, així com l'activitat i les interaccions del navegador per oferir una experiència personalitzada</translation>
 <translation id="5833984609253377421">Comparteix l'enllaç</translation>
 <translation id="584427517463557805">Pestanya privada seleccionada</translation>
 <translation id="5854790677617711513">Anterior a 30 dies</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Es permet al motor de cerca actual</translation>
 <translation id="7021515813996758557"><ph name="FILE_NAME" /> s'ha baixat</translation>
 <translation id="7022756207310403729">Obre al navegador</translation>
+<translation id="702463548815491781">Es recomana quan els serveis TalkBack o l'accés amb interruptors estan activats</translation>
 <translation id="7029809446516969842">Contrasenyes</translation>
 <translation id="7031882061095297553">Sincronitza amb</translation>
 <translation id="7032663816368481562">En tocar Més contingut com aquest <ph name="ICON" /> a la barra d'adreces, es mostren enllaços ràpids a pàgines relacionades. Els URL de les pàgines que visites s'envien a Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">S'ha bloquejat en alguns llocs web</translation>
 <translation id="7253272406652746122">Afegeix un compte de Google des de la pàgina Comptes de l'aplicació Configuració del dispositiu.</translation>
 <translation id="7274013316676448362">Lloc bloquejat</translation>
+<translation id="72867290065237936">Toca per canviar entre els suggeriments de contrasenya i el teclat</translation>
 <translation id="729975465115245577">El dispositiu no té cap aplicació per emmagatzemar el fitxer de contrasenyes.</translation>
 <translation id="7302081693174882195">Detalls: files ordenades per quantitat de dades estalviades</translation>
 <translation id="7333031090786104871">Encara s'hi està afegint el lloc anterior</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 97395e6..039b4be 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Vloženo do <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">Do Not Track (Nesledovat)</translation>
 <translation id="1407135791313364759">Otevřít vše</translation>
+<translation id="1409426117486808224">Zjednodušené zobrazení otevřených karet</translation>
 <translation id="1409879593029778104">Stažení souboru <ph name="FILE_NAME" /> bylo zabráněno, protože soubor již existuje.</translation>
 <translation id="1414981605391750300">Kontaktování Googlu. Může to chvíli trvat…</translation>
 <translation id="1416550906796893042">Verze aplikace</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Chcete-li použít aplikaci <ph name="APP_NAME" />, připojte se k internetu.</translation>
 <translation id="1569387923882100876">Připojené zařízení</translation>
 <translation id="1571304935088121812">Kopírovat uživatelské jméno</translation>
+<translation id="1576370611341449972">Stahování se provádí pouze přes Wi-Fi</translation>
 <translation id="1612196535745283361">K vyhledání zařízení potřebuje Chrome přístup k informacím o poloze. Přístup k poloze je v tomto zařízení <ph name="BEGIN_LINK" />vypnut<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Zapnout synchronizaci, personalizaci a další služby Google</translation>
 <translation id="1620510694547887537">Kamera</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Spravovat</translation>
 <translation id="3819178904835489326">Počet smazaných stažených souborů: <ph name="NUMBER_OF_DOWNLOADS" /></translation>
+<translation id="3819562311292413223">Stahovat články pro vás</translation>
 <translation id="3822502789641063741">Vymazat úložiště webů?</translation>
 <translation id="385051799172605136">Zpět</translation>
 <translation id="3859306556332390985">Přetočit dopředu</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Spravováno vaším administrátorem</translation>
 <translation id="4116038641877404294">Stáhněte si stránky k použití offline</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d záložka}few{%1$d záložky}many{%1$d záložky}other{%1$d záložek}}</translation>
+<translation id="4149994727733219643">Zjednodušené zobrazení webových stránek</translation>
 <translation id="4159800535322890630">Blokovat webům přístup k senzorům</translation>
 <translation id="4165986682804962316">Nastavení webu</translation>
 <translation id="4170011742729630528">Služba není k dispozici, zkuste to později.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Tento účet je spravován uživatelem <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Zakázáno administrátorem tohoto zařízení</translation>
 <translation id="5515439363601853141">Chcete-li zobrazit heslo, odemkněte zařízení</translation>
+<translation id="5515716148775388141">Vaše ikony byly přesunuty do dolní části obrazovky</translation>
 <translation id="5517095782334947753">Máte záložky, historii, hesla a další nastavení z účtu <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Bylo zablokováno přesměrování.</translation>
 <translation id="5527082711130173040">K vyhledání zařízení potřebuje Chrome přístup k informacím o poloze. <ph name="BEGIN_LINK1" />Aktualizujte oprávnění<ph name="END_LINK1" />. V tomto zařízení je také <ph name="BEGIN_LINK2" />vypnut přístup k poloze<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Pro aktuální vyhledávač povoleno</translation>
 <translation id="7021515813996758557">Soubor <ph name="FILE_NAME" /> byl stažen</translation>
 <translation id="7022756207310403729">Otevřít v prohlížeči</translation>
+<translation id="702463548815491781">Doporučeno, když je zapnuta funkce TalkBack nebo přístup pomocí přepínačů</translation>
 <translation id="7029809446516969842">Hesla</translation>
 <translation id="7031882061095297553">Synchronizace s účty</translation>
 <translation id="7032663816368481562">Když v adresním řádku klepnete na Další podobné návrhy <ph name="ICON" />, zobrazí se rychlé odkazy na související stránky. Adresy URL navštívených stránek se odesílají do Googlu.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Blokováno na všech webech</translation>
 <translation id="7253272406652746122">Přidejte účet Google ze stránky Účty v aplikaci Nastavení svého zařízení.</translation>
 <translation id="7274013316676448362">Blokovaný web</translation>
+<translation id="72867290065237936">Klepnutím můžete přepínat mezi návrhy hesel a klávesnicí</translation>
 <translation id="729975465115245577">V zařízení není žádná aplikace, pomocí které by soubor s hesly bylo možné uložit.</translation>
 <translation id="7302081693174882195">Podrobnosti: Seřazeno podle množství uspořených dat</translation>
 <translation id="7333031090786104871">Předchozí web se stále přidává</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 c029edc..45b12d52 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Integreret i <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">"Do Not Track"</translation>
 <translation id="1407135791313364759">Åbn alle</translation>
+<translation id="1409426117486808224">Enkel visning af åbne faner</translation>
 <translation id="1409879593029778104">Download af <ph name="FILE_NAME" /> blev forhindret, fordi filen allerede findes.</translation>
 <translation id="1414981605391750300">Kontakter Google. Dette kan tage et øjeblik…</translation>
 <translation id="1416550906796893042">Appversion</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Opret forbindelse til internettet for at bruge <ph name="APP_NAME" />.</translation>
 <translation id="1569387923882100876">Tilsluttet enhed</translation>
 <translation id="1571304935088121812">Kopiér brugernavnet</translation>
+<translation id="1576370611341449972">Der downloades kun via Wi-Fi</translation>
 <translation id="1612196535745283361">Chrome skal have placeringsadgang for at kunne scanne efter enheder. Placeringsadgang er <ph name="BEGIN_LINK" />slået fra på denne enhed<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Aktivér synkronisering, tilpasning og andre Google-tjenester</translation>
 <translation id="1620510694547887537">Kamera</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Valgmuligheder</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> downloads blev slettet</translation>
+<translation id="3819562311292413223">Download artikler til dig</translation>
 <translation id="3822502789641063741">Vil du rydde websitelagerpladsen?</translation>
 <translation id="385051799172605136">Tilbage</translation>
 <translation id="3859306556332390985">Spol fremad</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Administreres af din administrator</translation>
 <translation id="4116038641877404294">Download sider for at bruge dem, mens du er offline</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d bogmærke}one{%1$d bogmærke}other{%1$d bogmærker}}</translation>
+<translation id="4149994727733219643">Enkel visning af websider</translation>
 <translation id="4159800535322890630">Bloker websites fra at få adgang til dine sensorer</translation>
 <translation id="4165986682804962316">Indstillinger for website</translation>
 <translation id="4170011742729630528">Tjenesten er ikke tilgængelig. Prøv igen senere.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Denne konto administreres af <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Deaktiveret af administratoren af denne enhed</translation>
 <translation id="5515439363601853141">Lås op for at se din adgangskode</translation>
+<translation id="5515716148775388141">Dine ikoner er flyttet til bunden af skærmen</translation>
 <translation id="5517095782334947753">Du har bogmærker, historik, adgangskoder og andre indstillinger fra <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Omdirigeringen blev blokeret.</translation>
 <translation id="5527082711130173040">Chrome skal have placeringsadgang for at kunne scanne efter enheder. <ph name="BEGIN_LINK1" />Opdater tilladelser<ph name="END_LINK1" />. Placeringsadgang er også <ph name="BEGIN_LINK2" />slået fra på denne enhed<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Tilladt for den nuværende søgemaskine</translation>
 <translation id="7021515813996758557"><ph name="FILE_NAME" /> blev downloadet</translation>
 <translation id="7022756207310403729">Åbn i browser</translation>
+<translation id="702463548815491781">Anbefales, når TalkBack eller Kontaktadgang er aktiveret</translation>
 <translation id="7029809446516969842">Adgangskoder</translation>
 <translation id="7031882061095297553">Synkroniser til</translation>
 <translation id="7032663816368481562">Se hurtige links til relaterede sider, når du trykker på Se lignende indhold <ph name="ICON" /> i adresselinjen. Webadresserne på de sider, du besøger, sendes til Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Blokeret fra nogle websites</translation>
 <translation id="7253272406652746122">Tilføj en Google-konto fra siden Konti i appen Indstillinger på din enhed.</translation>
 <translation id="7274013316676448362">Blokeret website</translation>
+<translation id="72867290065237936">Tryk for at skifte mellem adgangskodeforslag og tastatur</translation>
 <translation id="729975465115245577">Der er ikke nogen app på din enhed, hvor filen med adgangskoder kan gemmes.</translation>
 <translation id="7302081693174882195">Oplysninger: Sorteret efter mængden af sparede data</translation>
 <translation id="7333031090786104871">Det forrige website er stadig ved at blive tilføjet</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 bb13f08..e5d47b3c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -36,9 +36,9 @@
 <translation id="124116460088058876">Weitere Sprachen</translation>
 <translation id="124678866338384709">Aktuellen Tab schließen</translation>
 <translation id="1258753120186372309">Google-Doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
-<translation id="1259100630977430756">Seiten, die Sie in privaten Tabs öffnen, werden nicht in Ihrem Browserverlauf, Cookiespeicher oder Suchverlauf gespeichert, nachdem Sie alle privaten Tabs geschlossen haben. Alle heruntergeladenen Dateien und gespeicherten Lesezeichen bleiben erhalten.
+<translation id="1259100630977430756">Seiten, die Sie in privaten Tabs öffnen, werden nicht in Ihrem Browserverlauf, Cookiespeicher oder Suchverlauf gespeichert, nachdem Sie alle privaten Tabs geschlossen haben. Alle heruntergeladenen Dateien und gespeicherten Lesezeichen bleiben aber erhalten.
 
-Sie sind jedoch nicht unsichtbar. Durch den privaten Modus wird die Tatsache, dass Sie im Web surfen, nicht vor Ihrem Arbeitgeber, Internetanbieter oder den besuchten Websites verborgen.</translation>
+Sie sind aber dennoch nicht unsichtbar. Durch den privaten Modus wird die Tatsache, dass Sie im Web surfen, nicht vor Ihrem Arbeitgeber, Internetanbieter oder den besuchten Websites verborgen.</translation>
 <translation id="127138278192656016">Synchronisierung und alle Dienste nutzen</translation>
 <translation id="1272079795634619415">Stopp</translation>
 <translation id="1283039547216852943">Zum Maximieren tippen</translation>
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Eingebettet in <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">"Do Not Track"</translation>
 <translation id="1407135791313364759">Alle öffnen</translation>
+<translation id="1409426117486808224">Vereinfachte Ansicht für geöffnete Tabs</translation>
 <translation id="1409879593029778104"><ph name="FILE_NAME" /> konnte nicht heruntergeladen werden, da die Datei bereits vorhanden ist.</translation>
 <translation id="1414981605391750300">Google wird kontaktiert. Das kann einen Moment dauern.</translation>
 <translation id="1416550906796893042">Anwendungsversion</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Für die Verwendung von <ph name="APP_NAME" /> ist eine Internetverbindung erforderlich.</translation>
 <translation id="1569387923882100876">Verbundenes Gerät</translation>
 <translation id="1571304935088121812">Nutzernamen kopieren</translation>
+<translation id="1576370611341449972">Download nur über WLAN</translation>
 <translation id="1612196535745283361">Chrome benötigt Zugriff auf den Standort, um nach Geräten suchen zu können. Der Standortzugriff ist <ph name="BEGIN_LINK" />für dieses Gerät deaktiviert<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Synchronisierung, Personalisierung und andere Google-Dienste aktivieren</translation>
 <translation id="1620510694547887537">Kamera</translation>
@@ -141,7 +143,7 @@
 <translation id="2021896219286479412">Vollbild-Steuerelemente</translation>
 <translation id="2038563949887743358">"Desktopversion ansehen" aktivieren</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB sonstiger Apps</translation>
-<translation id="2055670718290744343">Search Accelerator</translation>
+<translation id="2055670718290744343">Suchbeschleuniger</translation>
 <translation id="2063713494490388661">Zum Suchen tippen</translation>
 <translation id="2079545284768500474">Rückgängig machen</translation>
 <translation id="2082238445998314030">Ergebnis <ph name="RESULT_NUMBER" /> von <ph name="TOTAL_RESULTS" /></translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Verwalten</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> Downloads gelöscht</translation>
+<translation id="3819562311292413223">Artikel für Sie herunterladen</translation>
 <translation id="3822502789641063741">Websitespeicher löschen?</translation>
 <translation id="385051799172605136">Zurück</translation>
 <translation id="3859306556332390985">Nach vorne navigieren</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Von Ihrem Administrator verwaltet</translation>
 <translation id="4116038641877404294">Seiten zur Offline-Ansicht herunterladen</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d Lesezeichen}other{%1$d Lesezeichen}}</translation>
+<translation id="4149994727733219643">Vereinfachte Ansicht für Webseiten</translation>
 <translation id="4159800535322890630">Verhindern, dass Websites auf meine Sensoren zugreifen</translation>
 <translation id="4165986682804962316">Website-Einstellungen</translation>
 <translation id="4170011742729630528">Der Dienst ist momentan nicht verfügbar. Bitte versuchen Sie es später erneut.</translation>
@@ -518,7 +522,7 @@
 <translation id="5224771365102442243">Mit Video</translation>
 <translation id="5233638681132016545">Neuer Tab</translation>
 <translation id="5240817131241497236">Die Einstellungen für die Synchronisierung, Personalisierung und andere Google-Dienste in Chrome wurden geändert. Dadurch könnten sich auch Ihre aktuellen Einstellungen geändert haben.</translation>
-<translation id="5264003212305142034">Die <ph name="BEGIN_LINK1" />Einstellungen<ph name="END_LINK1" /> können jederzeit angepasst werden. Google kann die Inhalte der von Ihnen besuchten Websites, Browserinteraktionen und Browseraktivitäten nutzen, um Chrome und andere Google-Dienste wie Übersetzer, die Google-Suche und Werbung zu personalisieren.</translation>
+<translation id="5264003212305142034">Die <ph name="BEGIN_LINK1" />Einstellungen<ph name="END_LINK1" /> können jederzeit angepasst werden. Google kann die Inhalte der von Ihnen besuchten Websites sowie Ihre Browserinteraktionen und Browseraktivitäten nutzen, um Chrome und andere Google-Dienste wie Übersetzer, die Google-Suche und Werbung zu personalisieren.</translation>
 <translation id="5271967389191913893">Das Gerät kann den Inhalt, der heruntergeladen werden soll, nicht öffnen.</translation>
 <translation id="528192093759286357">Ziehen Sie zum Beenden des Vollbildmodus von oben und tippen Sie auf die Zurück-Taste.</translation>
 <translation id="5284584623296338184">Änderungen an Ihren Lesezeichen, Ihrem Verlauf, Ihren Passwörtern und anderen Einstellungen werden nicht mehr mit Ihrem Google-Konto synchronisiert. Ihre vorhandenen Daten bleiben aber in Ihrem Google-Konto gespeichert.</translation>
@@ -554,6 +558,7 @@
 <translation id="5512137114520586844">Dieses Konto wird von <ph name="PARENT_NAME" /> verwaltet.</translation>
 <translation id="5514904542973294328">Vom Administrator dieses Geräts deaktiviert</translation>
 <translation id="5515439363601853141">Entsperren, um Ihr Passwort zu sehen</translation>
+<translation id="5515716148775388141">Ihre Symbole befinden sich jetzt am unteren Bildschirmrand</translation>
 <translation id="5517095782334947753">Sie haben Lesezeichen, den Verlauf, Passwörter und andere Einstellungen von <ph name="FROM_ACCOUNT" /> übernommen.</translation>
 <translation id="5524843473235508879">Weiterleitung blockiert.</translation>
 <translation id="5527082711130173040">Chrome benötigt Zugriff auf den Standort, um nach Geräten suchen zu können. <ph name="BEGIN_LINK1" />Berechtigungen aktualisieren.<ph name="END_LINK1" /> Außerdem ist der Standortzugriff <ph name="BEGIN_LINK2" />für dieses Gerät deaktiviert<ph name="END_LINK2" />.</translation>
@@ -757,6 +762,7 @@
 <translation id="7016516562562142042">Für die aktuelle Suchmaschine zugelassen</translation>
 <translation id="7021515813996758557"><ph name="FILE_NAME" /> heruntergeladen</translation>
 <translation id="7022756207310403729">Im Browser öffnen</translation>
+<translation id="702463548815491781">Empfohlen, wenn TalkBack oder der Schalterzugriff aktiviert ist</translation>
 <translation id="7029809446516969842">Passwörter</translation>
 <translation id="7031882061095297553">Synchronisieren mit</translation>
 <translation id="7032663816368481562">Wenn Sie in der Adressleiste auf "Weitere Ähnliche" <ph name="ICON" /> tippen, werden Quick Links zu ähnlichen Seiten angezeigt. Die URLs der von Ihnen besuchten Seiten werden an Google gesendet.</translation>
@@ -785,6 +791,7 @@
 <translation id="7251326866581677552">Auf einigen Websites blockiert</translation>
 <translation id="7253272406652746122">Fügen Sie ein Google-Konto über die Seite "Konten" der App "Einstellungen" Ihres Geräts hinzu.</translation>
 <translation id="7274013316676448362">Blockierte Website</translation>
+<translation id="72867290065237936">Tippen, um zwischen Passwort-Vorschlägen und der Tastatur zu wechseln</translation>
 <translation id="729975465115245577">Auf Ihrem Gerät befindet sich keine App zum Speichern der Passwortdatei.</translation>
 <translation id="7302081693174882195">Details: Nach der Menge der gespeicherten Daten sortiert</translation>
 <translation id="7333031090786104871">Vorherige Website wird noch hinzugefügt</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 c095b8e3..a2abeecf 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Ενσωματωμένο σε <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">"Να μην γίνεται εντοπισμός"</translation>
 <translation id="1407135791313364759">Άνοιγμα όλων</translation>
+<translation id="1409426117486808224">Απλοποιημένη προβολή για ανοικτές καρτέλες</translation>
 <translation id="1409879593029778104">Η λήψη του αρχείου <ph name="FILE_NAME" /> απετράπη, επειδή το αρχείο υπάρχει ήδη.</translation>
 <translation id="1414981605391750300">Επικοινωνία με Google… Αυτή η διαδικασία μπορεί να διαρκέσει μερικά λεπτά…</translation>
 <translation id="1416550906796893042">Έκδοση εφαρμογής</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Για να χρησιμοποιήσετε την εφαρμογή <ph name="APP_NAME" />, συνδεθείτε στο διαδίκτυο.</translation>
 <translation id="1569387923882100876">Συνδεδεμένη συσκευή</translation>
 <translation id="1571304935088121812">Αντιγραφή ονόματος χρήστη</translation>
+<translation id="1576370611341449972">Η λήψη πραγματοποιείται μόνο μέσω Wi-Fi</translation>
 <translation id="1612196535745283361">Το Chrome χρειάζεται πρόσβαση στην τοποθεσία, προκειμένου να κάνει σάρωση για συσκευές. Η πρόσβαση τοποθεσίας είναι <ph name="BEGIN_LINK" />απενεργοποιημένη για αυτήν τη συσκευή<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Ενεργοποιήστε τον συγχρονισμό, την εξατομίκευση και άλλες υπηρεσίες Google</translation>
 <translation id="1620510694547887537">Κάμερα</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Βίντεο</translation>
 <translation id="3810973564298564668">Διαχείριση</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> λήψεις διαγράφηκαν</translation>
+<translation id="3819562311292413223">Λήψη άρθρων για εσάς</translation>
 <translation id="3822502789641063741">Διαγ.αποθ.χώρου ιστότ.;</translation>
 <translation id="385051799172605136">Πίσω</translation>
 <translation id="3859306556332390985">Αναζήτηση προς τα εμπρός</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Διαχειρίζεται από το διαχειριστή σας</translation>
 <translation id="4116038641877404294">Κατεβάστε σελίδες για να τις χρησιμοποιήσετε εκτός σύνδεσης</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d σελιδοδείκτης}other{%1$d σελιδοδείκτες}}</translation>
+<translation id="4149994727733219643">Απλοποιημένη προβολή για ιστοσελίδες</translation>
 <translation id="4159800535322890630">Αποκλείστε την πρόσβαση των ιστοτόπων στους αισθητήρες σας</translation>
 <translation id="4165986682804962316">Ρυθμίσεις ιστότοπου</translation>
 <translation id="4170011742729630528">Η υπηρεσία δεν είναι διαθέσιμη. Δοκιμάστε ξανά αργότερα.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Αυτός ο λογαριασμός τελεί υπό τη διαχείριση του γονέα <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Απενεργοποιήθηκε από τον διαχειριστή αυτής της συσκευής</translation>
 <translation id="5515439363601853141">Ξεκλειδώστε για προβολή του κωδικού πρόσβασης</translation>
+<translation id="5515716148775388141">Τα εικονίδιά σας μετακινήθηκαν στο κάτω μέρος της οθόνης</translation>
 <translation id="5517095782334947753">Έχετε σελιδοδείκτες, ιστορικό, κωδικούς πρόσβασης και άλλες ρυθμίσεις από τον λογαριασμό <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Η ανακατεύθυνση αποκλείστηκε.</translation>
 <translation id="5527082711130173040">Το Chrome χρειάζεται πρόσβαση στην τοποθεσία, προκειμένου να κάνει σάρωση για συσκευές. <ph name="BEGIN_LINK1" />Ενημέρωση δικαιωμάτων<ph name="END_LINK1" />. Η πρόσβαση τοποθεσίας είναι επίσης <ph name="BEGIN_LINK2" />απενεργοποιημένη για αυτήν τη συσκευή<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Επιτράπηκε για την τρέχουσα μηχανή αναζήτησης</translation>
 <translation id="7021515813996758557">Έγινε λήψη του αρχείου <ph name="FILE_NAME" /></translation>
 <translation id="7022756207310403729">Άνοιγμα σε πρόγρ. περιήγησης</translation>
+<translation id="702463548815491781">Συνιστάται όταν έχει ενεργοποιηθεί το TalkBack ή η πρόσβαση με διακόπτη</translation>
 <translation id="7029809446516969842">Κωδικοί πρόσβασης</translation>
 <translation id="7031882061095297553">Συγχρονισμός με</translation>
 <translation id="7032663816368481562">Όταν πατάτε το εικονίδιο "Περισσότερα σαν αυτό" <ph name="ICON" /> στη γραμμή διευθύνσεων, θα εμφανίζονται γρήγοροι σύνδεσμοι για σχετικές σελίδες. Τα URL των σελίδων που επισκέπτεστε αποστέλλονται στην Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Αποκλεισμός από ορισμένους ιστοτόπους</translation>
 <translation id="7253272406652746122">Προσθέστε έναν Λογαριασμό Google από τη σελίδα "Λογαριασμοί" της εφαρμογής Ρυθμίσεις της συσκευής σας.</translation>
 <translation id="7274013316676448362">Αποκλεισμένος ιστότοπος</translation>
+<translation id="72867290065237936">Πατήστε για εναλλαγή μεταξύ προτάσεων για κωδικούς πρόσβασης και πληκτρολογίου</translation>
 <translation id="729975465115245577">Η συσκευή σας δεν διαθέτει κάποια εφαρμογή για την αποθήκευση του αρχείου κωδικών πρόσβασης.</translation>
 <translation id="7302081693174882195">Λεπτομέρειες: Ταξινομήθηκαν βάσει του όγκου των δεδομένων που αποθηκεύτηκαν</translation>
 <translation id="7333031090786104871">Η προσθήκη του προηγούμενου ιστοτόπου δεν έχει ολοκληρωθεί</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 de29522c..9317cdf 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
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Embedded in <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">“Do Not Track”</translation>
 <translation id="1407135791313364759">Open all</translation>
+<translation id="1409426117486808224">Simplified view for open tabs</translation>
 <translation id="1409879593029778104"><ph name="FILE_NAME" /> download prevented because file already exists.</translation>
 <translation id="1414981605391750300">Contacting Google. This may take a minute…</translation>
 <translation id="1416550906796893042">Application version</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">To use <ph name="APP_NAME" />, please connect to the Internet.</translation>
 <translation id="1569387923882100876">Connected device</translation>
 <translation id="1571304935088121812">Copy username</translation>
+<translation id="1576370611341449972">Download occurs only on Wi-Fi</translation>
 <translation id="1612196535745283361">Chrome needs location access to scan for devices. Location access is <ph name="BEGIN_LINK" />turned off for this device<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Turn on sync, personalisation and other Google services</translation>
 <translation id="1620510694547887537">Camera</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Manage</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> downloads deleted</translation>
+<translation id="3819562311292413223">Download articles for you</translation>
 <translation id="3822502789641063741">Clear site storage?</translation>
 <translation id="385051799172605136">Back</translation>
 <translation id="3859306556332390985">Seek forward</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Managed by your administrator</translation>
 <translation id="4116038641877404294">Download pages to use them offline</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d bookmark}other{%1$d bookmarks}}</translation>
+<translation id="4149994727733219643">Simplified view for web pages</translation>
 <translation id="4159800535322890630">Block sites from accessing your sensors</translation>
 <translation id="4165986682804962316">Site settings</translation>
 <translation id="4170011742729630528">The service is not available; try again later.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">This account is managed by <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Disabled by the administrator of this device</translation>
 <translation id="5515439363601853141">Unlock to view your password</translation>
+<translation id="5515716148775388141">Your icons have moved to the bottom of the screen</translation>
 <translation id="5517095782334947753">You have bookmarks, history, passwords and other settings from <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Redirect blocked.</translation>
 <translation id="5527082711130173040">Chrome needs location access to scan for devices. <ph name="BEGIN_LINK1" />Update permissions<ph name="END_LINK1" />. Location access is also <ph name="BEGIN_LINK2" />turned off for this device<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Allowed for current search engine</translation>
 <translation id="7021515813996758557"><ph name="FILE_NAME" /> downloaded</translation>
 <translation id="7022756207310403729">Open in browser</translation>
+<translation id="702463548815491781">Recommended when TalkBack or Switch Access are on</translation>
 <translation id="7029809446516969842">Passwords</translation>
 <translation id="7031882061095297553">Sync to</translation>
 <translation id="7032663816368481562">When you tap More like this <ph name="ICON" /> in the address bar, show quick links to related pages. The URLs of pages that you visit are sent to Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Blocked from some sites</translation>
 <translation id="7253272406652746122">Add a Google account from the Accounts page in your device’s Settings app.</translation>
 <translation id="7274013316676448362">Blocked site</translation>
+<translation id="72867290065237936">Tap to toggle between password suggestions and keyboard</translation>
 <translation id="729975465115245577">Your device doesn’t have an app to store the passwords file.</translation>
 <translation id="7302081693174882195">Details: Sorted by amount of data saved</translation>
 <translation id="7333031090786104871">Still adding previous site</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 50a3c5e..235d9f2 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
@@ -5,7 +5,7 @@
 <translation id="1036727731225946849">Agregando <ph name="WEBAPK_NAME" />…</translation>
 <translation id="1041308826830691739">De sitios web</translation>
 <translation id="1049743911850919806">Incógnito</translation>
-<translation id="1054301162707478098">Estás en modo privado.</translation>
+<translation id="1054301162707478098">Estás en modo privado</translation>
 <translation id="10614374240317010">Nunca guardado</translation>
 <translation id="1068672505746868501">No traducir nunca páginas en <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -701,7 +701,7 @@
 <translation id="6593061639179217415">Sitio de escritorio</translation>
 <translation id="6600954340915313787">Se copió en Chrome.</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
-<translation id="6610147964972079463">Cerrar las pestañas privadas</translation>
+<translation id="6610147964972079463">Cerrar pestañas privadas</translation>
 <translation id="6612358246767739896">Contenido protegido</translation>
 <translation id="6627583120233659107">Editar la carpeta</translation>
 <translation id="6643016212128521049">Borrar</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 b54e766..598557b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Insertado en <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">No realizar seguimiento</translation>
 <translation id="1407135791313364759">Abrir todas</translation>
+<translation id="1409426117486808224">Vista simplificada de las pestañas abiertas</translation>
 <translation id="1409879593029778104">No se ha descargado <ph name="FILE_NAME" /> porque este archivo ya existe.</translation>
 <translation id="1414981605391750300">Contactando con Google. Esto puede tardar un minuto…</translation>
 <translation id="1416550906796893042">Versión de la aplicación</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Para utilizar <ph name="APP_NAME" />, conéctate a Internet.</translation>
 <translation id="1569387923882100876">Dispositivo conectado</translation>
 <translation id="1571304935088121812">Copiar nombre de usuario</translation>
+<translation id="1576370611341449972">Solo se descarga contenido a través de Wi‑Fi</translation>
 <translation id="1612196535745283361">Chrome necesita acceder a la ubicación para buscar dispositivos. El acceso a la ubicación está <ph name="BEGIN_LINK" />desactivado en este dispositivo<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Activar la sincronización, la personalización y otros servicios de Google</translation>
 <translation id="1620510694547887537">Cámara</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Vídeo</translation>
 <translation id="3810973564298564668">Administrar</translation>
 <translation id="3819178904835489326">Descargas eliminadas: <ph name="NUMBER_OF_DOWNLOADS" /></translation>
+<translation id="3819562311292413223">Descargar artículos recomendados para ti</translation>
 <translation id="3822502789641063741">¿Borrar almacenamiento web?</translation>
 <translation id="385051799172605136">Atrás</translation>
 <translation id="3859306556332390985">Buscar hacia delante</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Administrado por tu administrador</translation>
 <translation id="4116038641877404294">Descarga páginas para usarlas sin conexión</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d marcador}other{%1$d marcadores}}</translation>
+<translation id="4149994727733219643">Vista simplificada de páginas web</translation>
 <translation id="4159800535322890630">No permitir que los sitios web accedan a tus sensores</translation>
 <translation id="4165986682804962316">Configuración de sitios web</translation>
 <translation id="4170011742729630528">El servicio no está disponible. Vuelve a intentarlo más tarde.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Esta cuenta está administrada por <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Inhabilitada por el administrador de este dispositivo</translation>
 <translation id="5515439363601853141">Desbloquea la pantalla para ver tu contraseña</translation>
+<translation id="5515716148775388141">Los iconos ahora aparecen en la parte inferior de la pantalla</translation>
 <translation id="5517095782334947753">Tienes los marcadores, el historial, las contraseñas y otras opciones de configuración de <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Redirección bloqueada</translation>
 <translation id="5527082711130173040">Chrome necesita acceder a la ubicación para buscar dispositivos. <ph name="BEGIN_LINK1" />Actualizar permisos<ph name="END_LINK1" />. El acceso a la ubicación también está <ph name="BEGIN_LINK2" />desactivado en este dispositivo<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Permitido en el motor de búsqueda actual</translation>
 <translation id="7021515813996758557">Se ha descargado <ph name="FILE_NAME" /></translation>
 <translation id="7022756207310403729">Abrir en el navegador</translation>
+<translation id="702463548815491781">Se recomienda cuando TalkBack o la accesibilidad mediante interruptores están activados</translation>
 <translation id="7029809446516969842">Contraseñas</translation>
 <translation id="7031882061095297553">Sincronizar con</translation>
 <translation id="7032663816368481562">Si tocas el icono Similares <ph name="ICON" />, situado en la barra de direcciones, se muestran enlaces rápidos a páginas relacionadas. Las URL de las páginas que visitas se envían a Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Bloqueados en algunos sitios web</translation>
 <translation id="7253272406652746122">Añade una cuenta de Google desde la sección Cuentas de la aplicación de ajustes de tu dispositivo.</translation>
 <translation id="7274013316676448362">Sitio web bloqueado</translation>
+<translation id="72867290065237936">Toca para alternar entre las sugerencias de contraseña y el teclado</translation>
 <translation id="729975465115245577">Tu dispositivo no tiene ninguna aplicación para almacenar el archivo de contraseñas.</translation>
 <translation id="7302081693174882195">Detalles: ordenados por cantidad de datos ahorrados</translation>
 <translation id="7333031090786104871">Aún se está añadiendo el sitio web anterior</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 d87d8e8..ecb7877 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">جاسازی شده در <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">«ردیابی نشود»</translation>
 <translation id="1407135791313364759">باز کردن همه</translation>
+<translation id="1409426117486808224">نمای ساده‌شده برای برگه‌های باز</translation>
 <translation id="1409879593029778104">بارگیری <ph name="FILE_NAME" /> انجام نشد زیرا فایل از قبل موجود است.</translation>
 <translation id="1414981605391750300">‏درحال اتصال به Google. ممکن است یک دقیقه طول بکشد…</translation>
 <translation id="1416550906796893042">نسخه برنامه</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">برای استفاده از <ph name="APP_NAME" />، لطفاً به اینترنت وصل شوید.</translation>
 <translation id="1569387923882100876">دستگاه متصل</translation>
 <translation id="1571304935088121812">کپی کردن نام کاربری</translation>
+<translation id="1576370611341449972">‏بارگیری فقط درصورت اتصال به Wi-Fi انجام می‌شود</translation>
 <translation id="1612196535745283361">‏Chrome برای جستجوی دستگاه‌ها باید به مکان دسترسی داشته باشد. دسترسی به مکان <ph name="BEGIN_LINK" />برای این دستگاه خاموش است<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">‏روشن کردن همگام‌سازی، شخصی‌سازی و سرویس‌های دیگر Google</translation>
 <translation id="1620510694547887537">دوربین</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">فیلم</translation>
 <translation id="3810973564298564668">مدیریت</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> بارگیری حذف شد</translation>
+<translation id="3819562311292413223">بارگیری مقاله‌هایی برای شما</translation>
 <translation id="3822502789641063741">فضای ذخیره سایت پاک شود؟</translation>
 <translation id="385051799172605136">بازگشت</translation>
 <translation id="3859306556332390985">جستجو به جلو</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">مدیریت شده توسط سرپرست‌تان</translation>
 <translation id="4116038641877404294">برای استفاده از صفحه‌ها در حالت آفلاین، آن‌ها را بارگیری کنید</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{‏%1$d نشانک}one{‏%1$d نشانک}other{‏%1$d نشانک}}</translation>
+<translation id="4149994727733219643">نمای ساده‌شده برای صفحه‌های وب</translation>
 <translation id="4159800535322890630">مسدود کردن دسترسی سایت‌ها به حسگرها</translation>
 <translation id="4165986682804962316">تنظیمات سایت</translation>
 <translation id="4170011742729630528">این سرویس در دسترس نیست؛ بعداً دوباره امتحان کنید.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844"><ph name="PARENT_NAME" /> این حساب را مدیریت می‌کند.</translation>
 <translation id="5514904542973294328">توسط سرپرست این دستگاه غیرفعال شده است</translation>
 <translation id="5515439363601853141">برای مشاهده گذرواژه‌تان، قفل صفحه را باز کنید</translation>
+<translation id="5515716148775388141">نمادهایتان به پایین صفحه منتقل شده‌اند</translation>
 <translation id="5517095782334947753">نشانک، سابقه، گذرواژه و تنظیمات دیگری از <ph name="FROM_ACCOUNT" /> دارید.</translation>
 <translation id="5524843473235508879">هدایت کردن مسدود شد.</translation>
 <translation id="5527082711130173040">‏Chrome برای جستجوی دستگاه‌ها باید به مکان دسترسی داشته باشد. <ph name="BEGIN_LINK1" />به‌روزرسانی مجوزها<ph name="END_LINK1" /> . دسترسی به مکان نیز <ph name="BEGIN_LINK2" />برای این دستگاه خاموش است<ph name="END_LINK2" />.</translation>
@@ -755,6 +760,7 @@
 <translation id="7016516562562142042">برای موتور جستجوی فعلی مجاز است</translation>
 <translation id="7021515813996758557"><ph name="FILE_NAME" /> بارگیری شد</translation>
 <translation id="7022756207310403729">بازکردن در مرورگر</translation>
+<translation id="702463548815491781">‏توصیه در زمانی‌که TalkBack یا «دسترسی سوئیچ» روشن است</translation>
 <translation id="7029809446516969842">گذرواژه‌ها</translation>
 <translation id="7031882061095297553">همگام‌سازی در</translation>
 <translation id="7032663816368481562">‏وقتی در نوار نشانی، روی «موارد دیگر شبیه به این» <ph name="ICON" /> ضربه می‌زنید، پیوندهای سریع صفحه‌های مرتبط نمایش داده می‌شوند. نشانی وب صفحاتی که بازدید می‌کنید برای Google ارسال می‌شوند.</translation>
@@ -783,6 +789,7 @@
 <translation id="7251326866581677552">در برخی از سایت‌ها مسدود شد</translation>
 <translation id="7253272406652746122">‏از صفحه «حساب‌ها» در برنامه «تنظیمات» دستگاه، یک حساب Google اضافه کنید.</translation>
 <translation id="7274013316676448362">سایت مسدودشده</translation>
+<translation id="72867290065237936">برای جابه‌جایی بین پیشنهاد گذرواژه و صفحه‌کلید، ضربه بزنید</translation>
 <translation id="729975465115245577">دستگاه شما برنامه‌ای برای ذخیره فایل گذرواژه‌ها ندارد.</translation>
 <translation id="7302081693174882195">جزئیات: مرتب‌شده براساس مقدار داده صرفه‌جویی‌شده</translation>
 <translation id="7333031090786104871">همچنان درحال افزودن سایت قبلی</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 96273f5..f295469d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Intégration sur <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">Interdire le suivi</translation>
 <translation id="1407135791313364759">Tout ouvrir</translation>
+<translation id="1409426117486808224">Vue simplifiée pour les onglets ouverts</translation>
 <translation id="1409879593029778104">Le téléchargement du fichier "<ph name="FILE_NAME" />" a été bloqué, car le fichier existe déjà.</translation>
 <translation id="1414981605391750300">Mise en relation avec Google. Cette opération peut prendre une minute…</translation>
 <translation id="1416550906796893042">Version de l'application</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Pour utiliser l'application <ph name="APP_NAME" />, veuillez vous connecter à Internet.</translation>
 <translation id="1569387923882100876">Appareil connecté</translation>
 <translation id="1571304935088121812">Copier le nom d'utilisateur</translation>
+<translation id="1576370611341449972">Le téléchargement ne s'effectue que lorsque vous disposez d'une connexion Wi-Fi</translation>
 <translation id="1612196535745283361">Chrome doit avoir accès aux données de localisation pour rechercher des appareils. Cette fonctionnalité est <ph name="BEGIN_LINK" />désactivée pour cet appareil<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Activer la synchronisation, la personnalisation et d'autres services Google</translation>
 <translation id="1620510694547887537">Appareil photo</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Vidéo</translation>
 <translation id="3810973564298564668">Gérer</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> téléchargements supprimés</translation>
+<translation id="3819562311292413223">Télécharger des articles pour vous</translation>
 <translation id="3822502789641063741">Suppr. données de site ?</translation>
 <translation id="385051799172605136">Retour</translation>
 <translation id="3859306556332390985">Avance rapide</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Géré par votre administrateur</translation>
 <translation id="4116038641877404294">Téléchargez des pages pour y accéder hors connexion</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d favori}one{%1$d favori}other{%1$d favoris}}</translation>
+<translation id="4149994727733219643">Vue simplifiée pour les pages Web</translation>
 <translation id="4159800535322890630">Bloque l'accès à vos capteurs pour certains sites</translation>
 <translation id="4165986682804962316">Paramètres du site</translation>
 <translation id="4170011742729630528">Service indisponible. Veuillez réessayer plus tard.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Ce compte est géré par <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Désactivé par l'administrateur de cet appareil</translation>
 <translation id="5515439363601853141">Déverrouillez pour afficher votre mot de passe</translation>
+<translation id="5515716148775388141">Vos icônes ont été déplacées au bas de l'écran</translation>
 <translation id="5517095782334947753">Vous disposez des favoris, de l'historique, des mots de passe et d'autres paramètres du compte <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Redirection bloquée.</translation>
 <translation id="5527082711130173040">Chrome doit avoir accès aux données de localisation pour rechercher des appareils. <ph name="BEGIN_LINK1" />Modifiez les autorisations.<ph name="END_LINK1" /> De plus, l'accès aux données de localisation est <ph name="BEGIN_LINK2" />désactivé pour cet appareil<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Autorisé pour le moteur de recherche actuel</translation>
 <translation id="7021515813996758557">Le fichier "<ph name="FILE_NAME" />" a bien été téléchargé.</translation>
 <translation id="7022756207310403729">Ouvrir dans le navigateur</translation>
+<translation id="702463548815491781">Recommandé quand TalkBack ou Switch Access sont activés</translation>
 <translation id="7029809446516969842">Mots de passe</translation>
 <translation id="7031882061095297553">Synchroniser avec</translation>
 <translation id="7032663816368481562">Lorsque vous appuyez sur Plus de suggestions similaires <ph name="ICON" /> dans la barre d'adresse, des liens rapides s'affichent vers des pages associées. Les URL des pages que vous consultez sont envoyées à Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Bloqué sur certains sites</translation>
 <translation id="7253272406652746122">Ajoutez un compte Google depuis la page "Comptes" dans l'application "Paramètres" de votre appareil.</translation>
 <translation id="7274013316676448362">Site bloqué</translation>
+<translation id="72867290065237936">Appuyez pour basculer entre les suggestions de mots de passe et le clavier</translation>
 <translation id="729975465115245577">Aucune application n'est installée sur votre appareil pour stocker le fichier de mots de passe.</translation>
 <translation id="7302081693174882195">Détails : tri effectué par volume de données enregistrées</translation>
 <translation id="7333031090786104871">L'ajout du site précédent est toujours en cours</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 7cacb97b..5990e430 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -5,7 +5,7 @@
 <translation id="1036727731225946849"><ph name="WEBAPK_NAME" /> जोड़ा जा रहा है...</translation>
 <translation id="1041308826830691739">वेबसाइटों से</translation>
 <translation id="1049743911850919806">गुप्त</translation>
-<translation id="1054301162707478098">आप 'निजी मोड' में चले गए हैं.</translation>
+<translation id="1054301162707478098">आप निजी मोड में चले गए हैं.</translation>
 <translation id="10614374240317010">कभी नहीं सहेजा गया</translation>
 <translation id="1068672505746868501"><ph name="SOURCE_LANGUAGE" /> भाषा के पेज का कभी भी अनुवाद न करें</translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -36,9 +36,9 @@
 <translation id="124116460088058876">अधिक भाषाएं</translation>
 <translation id="124678866338384709">वर्तमान टैब को बंद करें</translation>
 <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
-<translation id="1259100630977430756">जब आप 'निजी मोड' के सभी टैब बंद कर देते हैं, तो जिन पेजों को आपने 'निजी मोड' में देखा था वे आपके ब्राउज़र के इतिहास, कुकी स्टोर या खोज इतिहास में दिखाई नहीं देंगे. आप जो भी फ़ाइल डाउनलोड करते हैं या जो भी बुकमार्क बनाते हैं, उन्हें बनाए रखा जाएगा.
+<translation id="1259100630977430756">जब आप निजी मोड के सभी टैब बंद कर देते हैं, तो जिन पेजों को आपने निजी मोड में देखा था वे आपके ब्राउज़र के इतिहास, कुकी स्टोर या खोज इतिहास में दिखाई नहीं देंगे. आप जो भी फ़ाइल डाउनलोड करते हैं या जो भी बुकमार्क बनाते हैं, उन्हें बनाए रखा जाएगा.
 
-हालांकि, 'निजी मोड' का मतलब यह नहीं है कि आपको कोई भी नहीं देख सकता. 'निजी मोड' में आप जो भी ब्राउजिंग करते हैं उसे आपके नियोक्ता, इंटरनेट सेवा देने वाली कंपनी या आप जिन वेबसाइटों को देखते हैं, वे देख सकते हैं.</translation>
+हालांकि, निजी मोड का मतलब यह नहीं है कि आपको कोई भी नहीं देख सकता. निजी मोड में आप जो भी ब्राउजिंग करते हैं उसे आपके नियोक्ता, इंटरनेट सेवा देने वाली कंपनी या आप जिन वेबसाइटों को देखते हैं, वे देख सकते हैं.</translation>
 <translation id="127138278192656016">सिंक और सभी सेवाएं इस्तेमाल करें</translation>
 <translation id="1272079795634619415">रोकें</translation>
 <translation id="1283039547216852943">विस्तृत करने के लिए टैप करें</translation>
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417"><ph name="WEBSITE_URL" /> में एम्बेड किया गया है</translation>
 <translation id="1406000523432664303">“नज़र न रखें”</translation>
 <translation id="1407135791313364759">सभी बुकमार्क खोलें</translation>
+<translation id="1409426117486808224">खुले टैब के लिए सरल बनाया गया व्यू</translation>
 <translation id="1409879593029778104"><ph name="FILE_NAME" /> डाउनलोड को रोका गया क्‍योंकि फ़ाइल पहले से मौजूद है.</translation>
 <translation id="1414981605391750300">Google से संपर्क किया जा रहा है. इसमें कुछ समय लग सकता है…</translation>
 <translation id="1416550906796893042">ऐप्‍लिकेशन वर्शन</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838"><ph name="APP_NAME" /> का इस्तेमाल करने के लिए, कृपया इंटरनेट से कनेक्‍ट करें.</translation>
 <translation id="1569387923882100876">कनेक्ट किया गया डिवाइस</translation>
 <translation id="1571304935088121812">उपयोगकर्ता नाम की कॉपी करें</translation>
+<translation id="1576370611341449972">डाउनलोड सिर्फ़ वाई-फ़ाई पर होता है</translation>
 <translation id="1612196535745283361">डिवाइस स्कैन करने के लिए Chrome को स्थान एक्सेस की आवश्यकता होती है. स्थान एक्सेस <ph name="BEGIN_LINK" />इस डिवाइस के लिए बंद<ph name="END_LINK" /> है.</translation>
 <translation id="162035744160882748">'सिंक करें', 'मनमुताबिक बनाएं' और दूसरी 'Google सेवाएं' चालू करें</translation>
 <translation id="1620510694547887537">कैमरा</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">वीडियो</translation>
 <translation id="3810973564298564668">प्रबंधित करें</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> डाउनलोड हटाए गए</translation>
+<translation id="3819562311292413223">आपके लिए लेख डाउनलोड करें</translation>
 <translation id="3822502789641063741">साइट मेमोरी साफ़ करें?</translation>
 <translation id="385051799172605136">वापस</translation>
 <translation id="3859306556332390985">आगे जाएं</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">आपके व्यवस्थापक द्वारा प्रबंधित</translation>
 <translation id="4116038641877404294">पेज का ऑफ़लाइन उपयोग करने के लिए उन्हें डाउनलोड करें</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d बुकमार्क}one{%1$d बुकमार्क}other{%1$d बुकमार्क}}</translation>
+<translation id="4149994727733219643">वेब पेजों के लिए सरल बनाया गया व्यू</translation>
 <translation id="4159800535322890630">साइटों को अपने डिवाइस के सेंसर एक्सेस करने से ब्लॉक करें</translation>
 <translation id="4165986682804962316">साइट सेटिंग</translation>
 <translation id="4170011742729630528">सेवा उपलब्ध नहीं है; बाद में पुन: प्रयास करें.</translation>
@@ -517,7 +521,7 @@
 <translation id="5224771365102442243">वीडियो के साथ</translation>
 <translation id="5233638681132016545">नया टैब</translation>
 <translation id="5240817131241497236">Chrome में 'सिंक करें', 'मनमुताबिक बनाएं' और दूसरी 'Google सेवाओं' को नियंत्रित करने वाली सेटिंग बदल गई हैं. आपकी मौजूदा सेटिंग पर इसका असर पड़ सकता है.</translation>
-<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> कभी भी अपनी पसंद के मुताबिक बनाई जा सकती हैं. Chrome और दूसरी Google सेवाओं, जैसे कि 'अनुवाद', 'खोज' और विज्ञापनों को आपकी पसंद के मुताबिक बनाने के लिए Google उन साइटों की सामग्री जिन पर आप गए हैं, साथ ही ब्राउज़र गतिनिधि और इंटरैक्शन का इस्तेमाल कर सकता है.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> कभी भी अपनी पसंद के मुताबिक बनाई जा सकती हैं. Chrome और दूसरी Google सेवाओं, जैसे कि 'अनुवाद', 'खोज' और विज्ञापनों को आपकी पसंद के मुताबिक बनाने के लिए, Google उन साइटों की सामग्री का इस्तेमाल कर सकता है जिन पर आप गए हैं, साथ ही वह ब्राउज़र गतिविधि और इंटरैक्शन का इस्तेमाल भी कर सकता है.</translation>
 <translation id="5271967389191913893">डाउनलोड की जाने वाली सामग्री को डिवाइस नहीं खोल सकता.</translation>
 <translation id="528192093759286357">पूर्ण स्क्रीन से बाहर निकलने के लिए ऊपर से खींचें और वापस जाएं स्पर्श करें.</translation>
 <translation id="5284584623296338184">आपके बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग में किए गए बदलाव अब आपके Google खाते में समन्वयित नहीं किए जाएंगे. हालांकि, आपका मौजूदा डेटा आपके Google खाते में संग्रहित रहेगा.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">यह खाता <ph name="PARENT_NAME" /> द्वारा प्रबंधित है.</translation>
 <translation id="5514904542973294328">इस डिवाइस के व्यवस्थापक ने अक्षम किया है</translation>
 <translation id="5515439363601853141">अपना पासवर्ड देखने के लिए अनलॉक करें</translation>
+<translation id="5515716148775388141">आपके आइकॉन स्क्रीन के सबसे नीचे ले जाए गए हैं</translation>
 <translation id="5517095782334947753">आपके पास <ph name="FROM_ACCOUNT" /> के बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग हैं.</translation>
 <translation id="5524843473235508879">दूसरे वेबलिंक पर भेजना ब्लॉक किया हुआ है.</translation>
 <translation id="5527082711130173040">डिवाइस स्कैन करने के लिए Chrome को स्थान एक्सेस की आवश्यकता होती है. <ph name="BEGIN_LINK1" />अनुमतियां अपडेट करें<ph name="END_LINK1" />. स्थान एक्सेस <ph name="BEGIN_LINK2" />इस डिवाइस के लिए भी बंद<ph name="END_LINK2" /> है.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">अभी वाले खोज इंजन के लिए अनुमति दी गई</translation>
 <translation id="7021515813996758557"><ph name="FILE_NAME" /> को डाउनलोड किया गया</translation>
 <translation id="7022756207310403729">ब्राउज़र में खोलें</translation>
+<translation id="702463548815491781">उस समय के लिए सुझाया गया जब 'टॉकबैक' या 'एक्सेस करने का तरीका बदलें' चालू हों</translation>
 <translation id="7029809446516969842">पासवर्ड</translation>
 <translation id="7031882061095297553">इसमें समन्वयित करें</translation>
 <translation id="7032663816368481562">जब आप पता बार में 'इसके जैसे और ज़्यादा' <ph name="ICON" /> पर टैप करते हैं, तो संबंधित पेज पर तेज़ी से पहुंचाने वाले लिंक दिखाती है. आपके देखे गए पेजों के यूआरएल Google को भेजे जाते हैं.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">कुछ साइटों से ब्लॉक है</translation>
 <translation id="7253272406652746122">अपने डिवाइस के सेटिंग ऐप्लिकेशन में खाते पेज से कोई Google खाता जोड़ें.</translation>
 <translation id="7274013316676448362">अवरोधित साइट</translation>
+<translation id="72867290065237936">पासवर्ड सुझावों और कीबोर्ड के बीच टॉगल करने के लिए टैप करें</translation>
 <translation id="729975465115245577">आपके डिवाइस में पासवर्ड फ़ाइल को संग्रहित करने वाला कोई ऐप्लिकेशन नहीं है.</translation>
 <translation id="7302081693174882195">जानकारी: बचाए गए डेटा की मात्रा के अनुसार क्रम से लगाया गया</translation>
 <translation id="7333031090786104871">पिछली साइट अभी भी जोड़ी जा रही है</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 6e28a9e..cf3a23e6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Ugrađeno u <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">"Nemoj pratiti"</translation>
 <translation id="1407135791313364759">Otvori sve</translation>
+<translation id="1409426117486808224">Pojednostavljeni prikaz za otvorene kartice</translation>
 <translation id="1409879593029778104">Preuzimanje datoteke <ph name="FILE_NAME" /> nije uspjelo jer datoteka već postoji.</translation>
 <translation id="1414981605391750300">Kontaktiranje Googlea. To bi moglo potrajati…</translation>
 <translation id="1416550906796893042">Verzija aplikacije</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Da biste upotrebljavali aplikaciju <ph name="APP_NAME" />, povežite se s internetom.</translation>
 <translation id="1569387923882100876">Povezani uređaj</translation>
 <translation id="1571304935088121812">Kopiraj korisničko ime</translation>
+<translation id="1576370611341449972">Preuzimanje se odvija samo putem Wi-Fi-ja</translation>
 <translation id="1612196535745283361">Chrome treba pristup lokaciji kako bi skenirao uređaje. Pristup lokaciji <ph name="BEGIN_LINK" />isključen je za ovaj uređaj<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Uključite sinkronizaciju, prilagodbu i druge Googleove usluge</translation>
 <translation id="1620510694547887537">Fotoaparat</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Upravljaj</translation>
 <translation id="3819178904835489326">Izbrisano preuzimanja: <ph name="NUMBER_OF_DOWNLOADS" /></translation>
+<translation id="3819562311292413223">Preuzmite članke za vas</translation>
 <translation id="3822502789641063741">Izbrisati pohranu?</translation>
 <translation id="385051799172605136">Natrag</translation>
 <translation id="3859306556332390985">Traži unaprijed</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Upravlja vaš administrator</translation>
 <translation id="4116038641877404294">Preuzmite stranice za izvanmrežnu upotrebu</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d oznaka}one{%1$d oznaka}few{%1$d oznake}other{%1$d oznaka}}</translation>
+<translation id="4149994727733219643">Pojednostavljeni prikaz za web-stranice</translation>
 <translation id="4159800535322890630">Blokiranje pristupa senzorima za web-lokacije</translation>
 <translation id="4165986682804962316">Postavke web-lokacije</translation>
 <translation id="4170011742729630528">Usluga nije dostupna, pokušajte ponovo kasnije.</translation>
@@ -394,7 +398,7 @@
 <translation id="4209895695669353772">Uključite sinkronizaciju ako želite da vam Google predlaže prilagođene sadržaje</translation>
 <translation id="4226663524361240545">Obavijesti mogu uključiti vibriranje uređaja</translation>
 <translation id="4242533952199664413">Otvori postavke</translation>
-<translation id="4243710787042215766">Otvori u privatnoj kartici</translation>
+<translation id="4243710787042215766">Otvori na privatnoj kartici</translation>
 <translation id="424864128008805179">Želite li se odjaviti s Chromea?</translation>
 <translation id="4256782883801055595">Licence otvorenog koda</translation>
 <translation id="4259722352634471385">Otvaranje je blokirano: <ph name="URL" /></translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Računom upravlja <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Opciju je omogućio administrator ovog uređaja</translation>
 <translation id="5515439363601853141">Otključajte za prikaz zaporke</translation>
+<translation id="5515716148775388141">Vaše su ikone pomaknute na dno zaslona</translation>
 <translation id="5517095782334947753">Imate oznake, povijest, zaporke i druge postavke s računa <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Preusmjeravanje je blokirano.</translation>
 <translation id="5527082711130173040">Chrome treba pristup lokaciji kako bi skenirao uređaje. <ph name="BEGIN_LINK1" />Ažurirajte dopuštenja<ph name="END_LINK1" />. Pristup lokaciji također je <ph name="BEGIN_LINK2" />isključen za ovaj uređaj<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Dopušteno za trenutačnu tražilicu</translation>
 <translation id="7021515813996758557">Datoteka <ph name="FILE_NAME" /> je preuzeta</translation>
 <translation id="7022756207310403729">Otvori u pregledniku</translation>
+<translation id="702463548815491781">Preporučuje se kada su uključeni TalkBack ili prekidač za pristup</translation>
 <translation id="7029809446516969842">Zaporke</translation>
 <translation id="7031882061095297553">Sinkronizacija s računima</translation>
 <translation id="7032663816368481562">Kada dodirnite ikonu Više ovakvih prijedloga <ph name="ICON" /> u adresnoj traci, prikazat će se brze veze na povezane stranice. URL-ovi stranica koje posjetite šalju se Googleu.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Blokirano na nekim web-lokacijama</translation>
 <translation id="7253272406652746122">Dodajte Google račun putem stranice Računi u aplikaciji Postavke na uređaju.</translation>
 <translation id="7274013316676448362">Blokirana web-lokacija</translation>
+<translation id="72867290065237936">Dodirnite za prebacivanje između prijedloga zaporke i tipkovnice</translation>
 <translation id="729975465115245577">Vaš uređaj nema aplikaciju za spremanje datoteke zaporki.</translation>
 <translation id="7302081693174882195">Pojedinosti: poredano prema količini ušteđenih podataka</translation>
 <translation id="7333031090786104871">I dalje se dodaje prethodna web-lokacija</translation>
@@ -901,7 +908,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB preuzimanja</translation>
 <translation id="8249310407154411074">Na vrh</translation>
 <translation id="8250920743982581267">Dokumenti</translation>
-<translation id="825412236959742607">Ova stranica upotrebljava previše memorije, pa je Chrome uklonio neki sadržaj.</translation>
+<translation id="825412236959742607">Ova stranica upotrebljava previše memorije, pa je Chrome uklonio dio sadržaja.</translation>
 <translation id="8260126382462817229">Ponovo se pokušajte prijaviti</translation>
 <translation id="8261506727792406068">Izbriši</translation>
 <translation id="8266862848225348053">Lokacija za preuzimanje</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 0b00a21..29fb3130 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -38,7 +38,7 @@
 <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
 <translation id="1259100630977430756">Halaman yang Anda lihat dalam tab rahasia tidak akan disimpan di histori, penyimpanan cookie, atau histori penelusuran browser setelah semua tab rahasia ditutup. File apa pun yang didownload atau bookmark yang dibuat akan tetap tersimpan.
 
-Namun demikian, bukan berarti Anda sama sekali tidak terlihat. Menggunakan mode rahasia tidak akan menyembunyikan penjelajahan yang Anda lakukan dari atasan di kantor, dari internet service provider, maupun situs yang Anda buka.</translation>
+Namun demikian, bukan berarti Anda sama sekali tidak terlihat. Menggunakan mode rahasia tidak akan menyembunyikan aktivitas browsing yang Anda lakukan dari atasan di kantor, dari internet service provider, maupun situs yang Anda buka.</translation>
 <translation id="127138278192656016">Gunakan sinkronisasi dan semua layanan</translation>
 <translation id="1272079795634619415">Berhenti</translation>
 <translation id="1283039547216852943">Tap untuk meluaskan</translation>
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Tersemat dalam <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">“Jangan Lacak”</translation>
 <translation id="1407135791313364759">Buka semua</translation>
+<translation id="1409426117486808224">Tampilan sederhana untuk tab yang terbuka</translation>
 <translation id="1409879593029778104">Download <ph name="FILE_NAME" /> dicegah karena file sudah ada.</translation>
 <translation id="1414981605391750300">Menghubungi Google. Tindakan ini memerlukan waktu beberapa saat…</translation>
 <translation id="1416550906796893042">Versi aplikasi</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Untuk menggunakan <ph name="APP_NAME" />, hubungkan ke internet.</translation>
 <translation id="1569387923882100876">Perangkat yang Terhubung</translation>
 <translation id="1571304935088121812">Salin nama pengguna</translation>
+<translation id="1576370611341449972">Download hanya dapat dilakukan di Wi-Fi</translation>
 <translation id="1612196535745283361">Chrome memerlukan akses lokasi untuk memindai perangkat. Akses lokasi <ph name="BEGIN_LINK" />dinonaktifkan untuk perangkat ini<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Aktifkan sinkronisasi, personalisasi, dan layanan Google lainnya</translation>
 <translation id="1620510694547887537">Kamera</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Kelola</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> download dihapus</translation>
+<translation id="3819562311292413223">Mendownload artikel untuk Anda</translation>
 <translation id="3822502789641063741">Kosongkan penyimpanan situs?</translation>
 <translation id="385051799172605136">Mundur</translation>
 <translation id="3859306556332390985">Cari maju</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Dikelola oleh administrator</translation>
 <translation id="4116038641877404294">Download halaman untuk melihat secara offline</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d bookmark}other{%1$d bookmark}}</translation>
+<translation id="4149994727733219643">Tampilan sederhana untuk halaman web</translation>
 <translation id="4159800535322890630">Blokir situs agar tidak mengakses sensor</translation>
 <translation id="4165986682804962316">Setelan situs</translation>
 <translation id="4170011742729630528">Layanan tidak tersedia; coba lagi nanti.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Akun ini dikelola oleh <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Dinonaktifkan oleh administrator perangkat</translation>
 <translation id="5515439363601853141">Buka kunci untuk melihat sandi Anda</translation>
+<translation id="5515716148775388141">Ikon telah dipindahkan ke bagian bawah layar</translation>
 <translation id="5517095782334947753">Anda memiliki bookmark, histori, sandi, dan setelan lain dari <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Pengalihan diblokir.</translation>
 <translation id="5527082711130173040">Chrome memerlukan akses lokasi untuk memindai perangkat. <ph name="BEGIN_LINK1" />Perbarui izin<ph name="END_LINK1" />. Akses lokasi juga <ph name="BEGIN_LINK2" />dinonaktifkan untuk perangkat ini<ph name="END_LINK2" />.</translation>
@@ -603,7 +608,7 @@
 <translation id="583281660410589416">Tidak dikenal</translation>
 <translation id="5833397272224757657">Menggunakan konten di situs yang Anda buka serta aktivitas browser dan interaksi untuk personalisasi</translation>
 <translation id="5833984609253377421">Bagikan link</translation>
-<translation id="584427517463557805">Memilih Tab Rahasia</translation>
+<translation id="584427517463557805">Tab Rahasia yang Dipilih</translation>
 <translation id="5854790677617711513">Lebih dari 30 hari</translation>
 <translation id="5858741533101922242">Chrome tidak dapat mengaktifkan adaptor Bluetooth</translation>
 <translation id="5860033963881614850">Nonaktif</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Diizinkan untuk mesin telusur yang sedang digunakan</translation>
 <translation id="7021515813996758557"><ph name="FILE_NAME" /> didownload</translation>
 <translation id="7022756207310403729">Buka di browser</translation>
+<translation id="702463548815491781">Disarankan saat TalkBack atau Tombol Akses aktif</translation>
 <translation id="7029809446516969842">Sandi</translation>
 <translation id="7031882061095297553">Sinkronkan ke</translation>
 <translation id="7032663816368481562">Saat Anda menge-tap Lainnya seperti ini <ph name="ICON" /> di kolom URL, link cepat ke halaman terkait akan ditampilkan. URL halaman yang Anda buka dikirimkan ke Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Diblokir dari beberapa situs</translation>
 <translation id="7253272406652746122">Tambahkan Akun Google dari halaman Akun di aplikasi Setelan pada perangkat.</translation>
 <translation id="7274013316676448362">Situs yang diblokir</translation>
+<translation id="72867290065237936">Tap untuk beralih antara saran sandi dan keyboard</translation>
 <translation id="729975465115245577">Perangkat Anda tidak memiliki aplikasi untuk menyimpan file sandi.</translation>
 <translation id="7302081693174882195">Detail: Diurutkan menurut jumlah kuota yang dihemat</translation>
 <translation id="7333031090786104871">Masih menambahkan situs sebelumnya</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 35b995b..c47b839 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Incorporato in <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">"Non tenere traccia"</translation>
 <translation id="1407135791313364759">Apri tutte</translation>
+<translation id="1409426117486808224">Visualizzazione semplificata delle schede aperte</translation>
 <translation id="1409879593029778104">Download di <ph name="FILE_NAME" /> impedito perché il file esiste già.</translation>
 <translation id="1414981605391750300">Connessione a Google in corso. L'operazione potrebbe richiedere un minuto…</translation>
 <translation id="1416550906796893042">Versione applicazione</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Connettiti a Internet per usare <ph name="APP_NAME" />.</translation>
 <translation id="1569387923882100876">Dispositivo collegato</translation>
 <translation id="1571304935088121812">Copia nome utente</translation>
+<translation id="1576370611341449972">Il download viene eseguito soltanto tramite Wi-Fi</translation>
 <translation id="1612196535745283361">Chrome ha bisogno dell'accesso alla posizione per cercare dispositivi. L'accesso alla posizione è <ph name="BEGIN_LINK" />disattivato su questo dispositivo<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Attiva la sincronizzazione, la personalizzazione e altri servizi Google</translation>
 <translation id="1620510694547887537">Videocamera</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Gestisci</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> download eliminati</translation>
+<translation id="3819562311292413223">Scarica articoli per te</translation>
 <translation id="3822502789641063741">Cancellare memoria usata da siti?</translation>
 <translation id="385051799172605136">Indietro</translation>
 <translation id="3859306556332390985">Posiziona avanti</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Gestito dall'amministratore</translation>
 <translation id="4116038641877404294">Scarica le pagine per usarle offline</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d segnalibro}other{%1$d segnalibri}}</translation>
+<translation id="4149994727733219643">Visualizzazione semplificata delle pagine web</translation>
 <translation id="4159800535322890630">Impedisci ai siti di accedere ai sensori</translation>
 <translation id="4165986682804962316">Impostazioni sito</translation>
 <translation id="4170011742729630528">Il servizio non è disponibile, riprova più tardi.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Questo account è gestito da <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Opzione disattivata dall'amministratore del dispositivo</translation>
 <translation id="5515439363601853141">Sblocca per visualizzare la password</translation>
+<translation id="5515716148775388141">Le icone sono state spostate in fondo allo schermo</translation>
 <translation id="5517095782334947753">Sono presenti preferiti, cronologia, password e altre impostazioni di <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Reindirizzamento bloccato.</translation>
 <translation id="5527082711130173040">Chrome ha bisogno dell'accesso alla posizione per cercare dispositivi. <ph name="BEGIN_LINK1" />Aggiorna le autorizzazioni<ph name="END_LINK1" />. L'accesso alla posizione è <ph name="BEGIN_LINK2" />disattivato su questo dispositivo<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Consentita per il motore di ricerca corrente</translation>
 <translation id="7021515813996758557"><ph name="FILE_NAME" /> scaricato</translation>
 <translation id="7022756207310403729">Apri nel browser</translation>
+<translation id="702463548815491781">Consigliata quando TalkBack o Switch Access sono attivi</translation>
 <translation id="7029809446516969842">Password</translation>
 <translation id="7031882061095297553">Sincronizza con</translation>
 <translation id="7032663816368481562">Quando tocchi Altri simili <ph name="ICON" /> nella barra degli indirizzi, ti vengono mostrati i link diretti alle pagine correlate. Gli URL delle pagine che visiti vengono inviati a Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Bloccati su alcuni siti</translation>
 <translation id="7253272406652746122">Aggiungi un account Google dalla pagina Account nell'app Impostazioni del dispositivo.</translation>
 <translation id="7274013316676448362">Sito bloccato</translation>
+<translation id="72867290065237936">Tocca per spostarti tra i suggerimenti delle password e la tastiera</translation>
 <translation id="729975465115245577">Il tuo dispositivo non ha un'app per archiviare il file di password.</translation>
 <translation id="7302081693174882195">Dettagli: ordinati per quantità di dati salvati</translation>
 <translation id="7333031090786104871">Aggiunta del sito precedente ancora in corso</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 3cb3c1d..c148e6b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -36,9 +36,9 @@
 <translation id="124116460088058876">שפות נוספות</translation>
 <translation id="124678866338384709">סגור את הכרטיסייה הנוכחית</translation>
 <translation id="1258753120186372309">‏דודל של Google‏: <ph name="DOODLE_DESCRIPTION" /></translation>
-<translation id="1259100630977430756">‏דפים שמציגים בכרטיסיות פרטיות לא נשמרים בהיסטוריית הדפדפן, במאגר קובצי ה-Cookie או בהיסטוריית החיפושים אחרי שסוגרים את כל כרטיסיות הפרטיות. המערכת שומרת את הקבצים שמורידים ואת הסימניות שיוצרים.
+<translation id="1259100630977430756">‏דפים שמציגים בכרטיסיות פרטיות לא נשמרים בהיסטוריית הדפדפן, במאגר קובצי ה-Cookie או בהיסטוריית החיפושים אחרי שסוגרים את כל הכרטיסיות הפרטיות. המערכת שומרת את הקבצים שמורידים ואת הסימניות שיוצרים.
 
-עם זאת, גורמים מסוימים יכולים לראות את הפעילות שלך. מעבר למצב פרטיות אינו מסתיר את פעילות הגלישה מהמעסיק, מספק האינטרנט או מהאתרים שמבקרים בהם.</translation>
+עם זאת, גורמים מסוימים יכולים לראות את הפעילות שלך. מעבר למצב פרטי אינו מסתיר את פעילות הגלישה מהמעסיק, מספק האינטרנט או מהאתרים שמבקרים בהם.</translation>
 <translation id="127138278192656016">שימוש בסינכרון ובכל השירותים</translation>
 <translation id="1272079795634619415">הפסק</translation>
 <translation id="1283039547216852943">הקש כדי להרחיב</translation>
@@ -169,7 +169,7 @@
 <translation id="2234876718134438132">‏סנכרון ושירותי Google</translation>
 <translation id="2259659629660284697">ייצוא סיסמאות…</translation>
 <translation id="2268044343513325586">צמצם</translation>
-<translation id="2280910239864711607">פתיחת כרטיסייה חדשה במצב פרטיות</translation>
+<translation id="2280910239864711607">פתיחת כרטיסייה חדשה במצב פרטי</translation>
 <translation id="2286841657746966508">כתובת לחיוב</translation>
 <translation id="230115972905494466">לא נמצאו מכשירים תואמים</translation>
 <translation id="2315043854645842844">מערכת ההפעלה אינה תומכת בבחירת אישור בצד הלקוח.</translation>
@@ -280,7 +280,7 @@
 <translation id="321773570071367578">אם שכחת את ביטוי הסיסמה או אם ברצונך לשנות את ההגדרה הזו, <ph name="BEGIN_LINK" />אפס את הסינכרון<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">מיקרופון</translation>
 <translation id="3232754137068452469">אפליקציית אינטרנט</translation>
-<translation id="3234355010754616171">כרטיסיית פרטיות חדשה</translation>
+<translation id="3234355010754616171">כרטיסייה פרטית חדשה</translation>
 <translation id="3236059992281584593">נותרה דקה אחת</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">הוסף את הדף לסימניות</translation>
@@ -296,7 +296,7 @@
 <translation id="3350687908700087792">סגור את כל כרטיסיות הגלישה בסתר</translation>
 <translation id="3365671512111106261">‏לא זמין כאשר חוסך הנתונים (Data Saver) פועל</translation>
 <translation id="3367813778245106622">היכנס שוב כדי להתחיל בסנכרון</translation>
-<translation id="3377025655491224618">כרטיסיית פרטיות</translation>
+<translation id="3377025655491224618">כרטיסייה פרטית</translation>
 <translation id="3384347053049321195">שתף תמונה</translation>
 <translation id="3386292677130313581">שאל לפני שתאפשר לאתרים לדעת מה המיקום שלך (מומלץ)</translation>
 <translation id="3387650086002190359">הורדת <ph name="FILE_NAME" /> נכשלה עקב שגיאות במערכת הקבצים.</translation>
@@ -394,7 +394,7 @@
 <translation id="4209895695669353772">‏כדי לקבל מ-Google הצעות לתוכן מותאם אישית, יש להפעיל את הסנכרון</translation>
 <translation id="4226663524361240545">רטט של המכשיר אפשרי כשמתקבלת הודעה</translation>
 <translation id="4242533952199664413">פתח את 'הגדרות'</translation>
-<translation id="4243710787042215766">פתיחה בכרטיסיית פרטיות</translation>
+<translation id="4243710787042215766">פתיחה בכרטיסייה פרטית</translation>
 <translation id="424864128008805179">‏האם לצאת מ-Chrome?</translation>
 <translation id="4256782883801055595">רישיונות קוד פתוח</translation>
 <translation id="4259722352634471385">הניווט חסום: <ph name="URL" /></translation>
@@ -475,7 +475,7 @@
 <translation id="4878404682131129617">‏יצירת מנהרה בעזרת שרת proxy נכשלה</translation>
 <translation id="4881695831933465202">פתח</translation>
 <translation id="488187801263602086">שינוי שם של קובץ</translation>
-<translation id="4883379392681899581">יציאה ממצב פרטיות</translation>
+<translation id="4883379392681899581">יציאה ממצב פרטי</translation>
 <translation id="4885273946141277891">‏מספר בלתי נתמך של מופעי Chrome.</translation>
 <translation id="4910889077668685004">אפליקציות תשלום</translation>
 <translation id="4913161338056004800">איפוס הנתונים הסטטיסטיים</translation>
@@ -603,7 +603,7 @@
 <translation id="583281660410589416">לא ידוע</translation>
 <translation id="5833397272224757657">התוכן מאתרים שנכנסת אליהם, פעילות הדפדפן והאינטראקציות שלך ישמשו לצורך התאמה אישית</translation>
 <translation id="5833984609253377421">שתף קישור</translation>
-<translation id="584427517463557805">כרטיסיית הפרטיות שנבחרה</translation>
+<translation id="584427517463557805">נבחרה כרטיסייה פרטית</translation>
 <translation id="5854790677617711513">לפני יותר מ-30 ימים</translation>
 <translation id="5858741533101922242">‏לא ניתן להפעיל ב-Chrome את מתאם Bluetooth</translation>
 <translation id="5860033963881614850">כבוי</translation>
@@ -663,7 +663,7 @@
 <translation id="6320088164292336938">רטט</translation>
 <translation id="6324034347079777476">‏סנכרון מערכת Android מושבת</translation>
 <translation id="6333140779060797560">שתף באמצעות <ph name="APPLICATION" /></translation>
-<translation id="6336451774241870485">כרטיסיית פרטיות חדשה</translation>
+<translation id="6336451774241870485">כרטיסייה פרטית חדשה</translation>
 <translation id="6337234675334993532">הצפנה</translation>
 <translation id="6341580099087024258">לשאול איפה לשמור קבצים</translation>
 <translation id="6343192674172527289">לא נמצאו הורדות</translation>
@@ -701,7 +701,7 @@
 <translation id="6593061639179217415">אתר למחשבים</translation>
 <translation id="6600954340915313787">‏הועתק אל Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
-<translation id="6610147964972079463">סגירת כרטיסיות הפרטיות</translation>
+<translation id="6610147964972079463">סגירת הכרטיסיות הפרטיות</translation>
 <translation id="6612358246767739896">תוכן מוגן</translation>
 <translation id="6627583120233659107">ערוך תיקיה</translation>
 <translation id="6643016212128521049">נקה</translation>
@@ -805,7 +805,7 @@
 <translation id="7453467225369441013">‏תבוצע יציאה שלך מרוב האתרים. לא תבוצע יציאה מחשבון Google שלך.</translation>
 <translation id="7454641608352164238">אין מספיק מקום</translation>
 <translation id="7455923816558154057">הקש כדי להציג</translation>
-<translation id="7465104139234185284">סגירה של כל כרטיסיות הפרטיות</translation>
+<translation id="7465104139234185284">סגירה של כל הכרטיסיות הפרטיות</translation>
 <translation id="7473891865547856676">לא, תודה</translation>
 <translation id="7475192538862203634">אם אתה רואה זאת לעתים קרובות, נסה את <ph name="BEGIN_LINK" />ההצעות<ph name="END_LINK" /> האלה.</translation>
 <translation id="7475688122056506577">‏לא נמצא כרטיס SD. ייתכן שחלק מהקבצים שלך חסרים.</translation>
@@ -995,7 +995,7 @@
 <translation id="9070377983101773829">התחל חיפוש קולי</translation>
 <translation id="9071742570345586758">‏עליך להתקין את Google VR Services כדי שתוכל להציג תוכן של מציאות מדומה</translation>
 <translation id="9074336505530349563">‏כדי לקבל מ-Google הצעות לתוכן מותאם אישית, יש להיכנס ולהפעיל את הסנכרון</translation>
-<translation id="9080642952018487277">כניסה למצב פרטיות</translation>
+<translation id="9080642952018487277">מעבר למצב פרטי</translation>
 <translation id="9086455579313502267">אין אפשרות לגשת לרשת</translation>
 <translation id="9099018167121903954">‏‎<ph name="KILOBYTES" /> KB להורדות</translation>
 <translation id="9100505651305367705">יש להציע הצגת מאמרים בתצוגה פשוטה, כשהאפשרות נתמכת</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 46de706..788968b3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Iegults vietnē <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">“Nesekot”</translation>
 <translation id="1407135791313364759">Atvērt visas</translation>
+<translation id="1409426117486808224">Vienkāršots atvērtu ciļņu skatījums</translation>
 <translation id="1409879593029778104">Fails <ph name="FILE_NAME" /> netika lejupielādēts, jo tas jau pastāv.</translation>
 <translation id="1414981605391750300">Notiek sazināšanās ar Google. Tas var ilgt kādu minūti...</translation>
 <translation id="1416550906796893042">Lietojumprogrammas versija</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Lai izmantotu lietotni <ph name="APP_NAME" />, izveidojiet savienojumu ar internetu.</translation>
 <translation id="1569387923882100876">Pievienota ierīce</translation>
 <translation id="1571304935088121812">Kopēt lietotājvārdu</translation>
+<translation id="1576370611341449972">Lejupielāde notiek tikai Wi-Fi tīklā</translation>
 <translation id="1612196535745283361">Lai meklētu ierīces, pārlūkam Chrome ir nepieciešama piekļuve atrašanās vietas datiem. <ph name="BEGIN_LINK" />Šajā ierīcē ir izslēgta piekļuve atrašanās vietas datiem<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Sinhronizācijas, personalizācijas un citu Google pakalpojumu ieslēgšana</translation>
 <translation id="1620510694547887537">Kamera</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Pārvaldīt</translation>
 <translation id="3819178904835489326">Izdzēsti <ph name="NUMBER_OF_DOWNLOADS" /> lejupielādētie vienumi</translation>
+<translation id="3819562311292413223">Ieteikto rakstu lejupielāde</translation>
 <translation id="3822502789641063741">Vai notīrīt vietnes krātuvi?</translation>
 <translation id="385051799172605136">Atpakaļ</translation>
 <translation id="3859306556332390985">Pārtīt uz priekšu</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Pārvalda jūsu administrators</translation>
 <translation id="4116038641877404294">Lejupielādējiet lapas, lai izmantotu tās bezsaistē</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d grāmatzīme}zero{%1$d grāmatzīmes}one{%1$d grāmatzīme}other{%1$d grāmatzīmes}}</translation>
+<translation id="4149994727733219643">Vienkāršots tīmekļa lapu skatījums</translation>
 <translation id="4159800535322890630">Neļaut vietnēm piekļūt jūsu ierīces sensoriem</translation>
 <translation id="4165986682804962316">Vietnes iestatījumi</translation>
 <translation id="4170011742729630528">Pakalpojums nav pieejams. Vēlāk mēģiniet vēlreiz.</translation>
@@ -517,7 +521,7 @@
 <translation id="5224771365102442243">Ar video</translation>
 <translation id="5233638681132016545">Jauna cilne</translation>
 <translation id="5240817131241497236">Ir mainīti sinhronizācijas, personalizācijas un citu Google pakalpojumu pārvaldības iestatījumi pārlūkā Chrome. Tas var ietekmēt jūsu pašreizējos iestatījumus.</translation>
-<translation id="5264003212305142034"><ph name="BEGIN_LINK1" /> Iestatījumus <ph name="END_LINK1" /> var pielāgot jebkurā laikā. Google var izmantot jūsu apmeklēto vietņu saturu, kā arī pārlūkā veiktās darbības un mijiedarbības, lai personalizētu pārlūku Chrome un citus Google pakalpojumus, piemēram, Tulkotājs, Meklēšana un reklāmas.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" /> Iestatījumus <ph name="END_LINK1" /> var pielāgot jebkurā laikā. Google var izmantot jūsu apmeklēto vietņu saturu, kā arī pārlūkā veiktās darbības un mijiedarbības, lai personalizētu pārlūku Chrome un citus Google pakalpojumus, piemēram, Tulkotāju, Meklēšanu un reklāmas.</translation>
 <translation id="5271967389191913893">Ierīcē nevar atvērt lejupielādējamo saturu.</translation>
 <translation id="528192093759286357">Lai izietu no pilnekrāna režīma, velciet no augšas un pieskarieties pogai Atpakaļ.</translation>
 <translation id="5284584623296338184">Grāmatzīmju, vēstures, paroļu un citu iestatījumu izmaiņas vairs netiks sinhronizētas ar jūsu Google kontu. Tomēr esošie dati joprojām tiks glabāti jūsu Google kontā.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Šo kontu pārvalda <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Atspējoja šīs ierīces administrators</translation>
 <translation id="5515439363601853141">Atbloķējiet, lai skatītu paroli</translation>
+<translation id="5515716148775388141">Jūsu ikonas ir pārvietotas uz ekrāna apakšdaļu</translation>
 <translation id="5517095782334947753">Ir pieejamas grāmatzīmes, vēsture, paroles un citi iestatījumi no konta <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Novirzīšana ir bloķēta.</translation>
 <translation id="5527082711130173040">Lai meklētu ierīces, pārlūkam Chrome ir nepieciešama piekļuve atrašanās vietas datiem. <ph name="BEGIN_LINK1" />Atjauniniet atļaujas<ph name="END_LINK1" />. Piekļuve atrašanās vietas datiem ir arī <ph name="BEGIN_LINK2" />izslēgta šai ierīcei<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Atļauta pašreizējai meklētājprogrammai</translation>
 <translation id="7021515813996758557">Fails <ph name="FILE_NAME" /> ir lejupielādēts.</translation>
 <translation id="7022756207310403729">Atvērt pārlūkā</translation>
+<translation id="702463548815491781">Ieteicams, ja ir ieslēgta lietotne TalkBack vai slēdžu piekļuves funkcija.</translation>
 <translation id="7029809446516969842">Paroles</translation>
 <translation id="7031882061095297553">Sinhronizēt ar:</translation>
 <translation id="7032663816368481562">Adreses joslā pieskaroties vienumam Citi līdzīgi vienumi <ph name="ICON" />, tiek rādītas ātrās saites uz saistītām lapām. Apmeklēto lapu vietrāži URL tiek nosūtīti Google serveriem.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Bloķētas dažās vietnēs.</translation>
 <translation id="7253272406652746122">Pievienojiet Google kontu no lapas Konti savas ierīces lietotnē Iestatījumi.</translation>
 <translation id="7274013316676448362">Bloķēta vietne</translation>
+<translation id="72867290065237936">Pieskarieties, lai pārslēgtu starp paroles ieteikumiem un tastatūru</translation>
 <translation id="729975465115245577">Ierīcē nav lietotnes, kurā uzglabāt paroļu failu.</translation>
 <translation id="7302081693174882195">Detalizēta informācija: kārtota pēc ietaupīto datu apjoma</translation>
 <translation id="7333031090786104871">Joprojām notiek iepriekšējās vietnes pievienošana</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 e698201..9af49d1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Ingesloten in <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">Niet bijhouden</translation>
 <translation id="1407135791313364759">Alles openen</translation>
+<translation id="1409426117486808224">Vereenvoudigde weergave voor geopende tabbladen</translation>
 <translation id="1409879593029778104">Downloaden van <ph name="FILE_NAME" /> is voorkomen omdat het bestand al bestaat.</translation>
 <translation id="1414981605391750300">Contact opnemen met Google. Dit kan even duren…</translation>
 <translation id="1416550906796893042">Appversie</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Maak verbinding met internet als je <ph name="APP_NAME" /> wilt gebruiken.</translation>
 <translation id="1569387923882100876">Gekoppeld apparaat</translation>
 <translation id="1571304935088121812">Gebruikersnaam kopiëren</translation>
+<translation id="1576370611341449972">Downloaden vindt alleen plaats via wifi</translation>
 <translation id="1612196535745283361">Chrome heeft locatietoegang nodig om naar apparaten te scannen. Locatietoegang is <ph name="BEGIN_LINK" />uitgeschakeld voor dit apparaat<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Synchronisatie, personalisatie en andere Google-services inschakelen</translation>
 <translation id="1620510694547887537">Camera</translation>
@@ -169,7 +171,7 @@
 <translation id="2234876718134438132">Synchronisatie &amp; Google-services</translation>
 <translation id="2259659629660284697">Wachtwoorden exporteren…</translation>
 <translation id="2268044343513325586">Verfijnen</translation>
-<translation id="2280910239864711607">Een nieuw tabblad openen in de privémodus</translation>
+<translation id="2280910239864711607">Een nieuw tabblad openen in privémodus</translation>
 <translation id="2286841657746966508">Factuuradres</translation>
 <translation id="230115972905494466">Geen geschikte apparaten gevonden</translation>
 <translation id="2315043854645842844">Certificaatselectie aan clientzijde wordt niet ondersteund door het besturingssysteem.</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Videobestanden</translation>
 <translation id="3810973564298564668">Beheren</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> downloads verwijderd</translation>
+<translation id="3819562311292413223">Artikelen downloaden voor jou</translation>
 <translation id="3822502789641063741">Site-opslag wissen?</translation>
 <translation id="385051799172605136">Vorige</translation>
 <translation id="3859306556332390985">Vooruit zoeken</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Beheerd door je beheerder</translation>
 <translation id="4116038641877404294">Download pagina's om ze offline te gebruiken</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d bladwijzer}other{%1$d bladwijzers}}</translation>
+<translation id="4149994727733219643">Vereenvoudigde weergave voor webpagina's</translation>
 <translation id="4159800535322890630">Toegang tot je sensoren blokkeren voor sites</translation>
 <translation id="4165986682804962316">Site-instellingen</translation>
 <translation id="4170011742729630528">De service is niet beschikbaar. Probeer het later opnieuw.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Dit account wordt beheerd door <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Uitgeschakeld door de beheerder van dit apparaat</translation>
 <translation id="5515439363601853141">Ontgrendelen om je wachtwoord te bekijken</translation>
+<translation id="5515716148775388141">Je pictogrammen zijn verplaatst naar de onderkant van het scherm</translation>
 <translation id="5517095782334947753">Je hebt bladwijzers, geschiedenis, wachtwoorden en andere instellingen van <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Omleiding geblokkeerd.</translation>
 <translation id="5527082711130173040">Chrome heeft locatietoegang nodig om naar apparaten te scannen. <ph name="BEGIN_LINK1" />Rechten updaten<ph name="END_LINK1" />. Locatietoegang is ook <ph name="BEGIN_LINK2" />uitgeschakeld voor dit apparaat<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Toegestaan voor huidige zoekmachine</translation>
 <translation id="7021515813996758557"><ph name="FILE_NAME" /> gedownload</translation>
 <translation id="7022756207310403729">Openen in browser</translation>
+<translation id="702463548815491781">Aanbevolen wanneer TalkBack of 'Toegang via schakelaar' is ingeschakeld</translation>
 <translation id="7029809446516969842">Wachtwoorden</translation>
 <translation id="7031882061095297553">Synchroniseren met</translation>
 <translation id="7032663816368481562">Wanneer je op Meer zoals dit <ph name="ICON" /> in de adresbalk klikt, worden snelle links naar gerelateerde pagina's weergegeven. De URL's van pagina's die je bezoekt, worden verzonden naar Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Geblokkeerd voor bepaalde sites</translation>
 <translation id="7253272406652746122">Voeg een Google-account toe via de pagina Accounts in de app Instellingen van je apparaat.</translation>
 <translation id="7274013316676448362">Geblokkeerde site</translation>
+<translation id="72867290065237936">Tik om te schakelen tussen wachtwoordsuggesties en het toetsenbord</translation>
 <translation id="729975465115245577">Je apparaat bevat geen app om het wachtwoordbestand in op te slaan.</translation>
 <translation id="7302081693174882195">Details: gesorteerd op de hoeveelheid bespaarde data</translation>
 <translation id="7333031090786104871">Nog steeds bezig met toevoegen van vorige site</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 6740c2ef..5546bb3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -5,7 +5,7 @@
 <translation id="1036727731225946849">Legger til <ph name="WEBAPK_NAME" /> …</translation>
 <translation id="1041308826830691739">Fra nettsteder</translation>
 <translation id="1049743911850919806">Inkognito</translation>
-<translation id="1054301162707478098">Du er nå i privatmodus.</translation>
+<translation id="1054301162707478098">Nå er du i privatmodus.</translation>
 <translation id="10614374240317010">Aldri lagret</translation>
 <translation id="1068672505746868501">Oversett aldri sider på <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -141,7 +141,7 @@
 <translation id="2021896219286479412">Navigering i full skjerm</translation>
 <translation id="2038563949887743358">Slå på Bruk skrivebordsversjon</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB andre apper</translation>
-<translation id="2055670718290744343">Søk akselerator</translation>
+<translation id="2055670718290744343">Søkeakselerator</translation>
 <translation id="2063713494490388661">Trykk for å søke</translation>
 <translation id="2079545284768500474">Angre</translation>
 <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> av <ph name="TOTAL_RESULTS" /></translation>
@@ -169,7 +169,7 @@
 <translation id="2234876718134438132">Synkronisering/Google-tjenester</translation>
 <translation id="2259659629660284697">Eksportér passord</translation>
 <translation id="2268044343513325586">Finstem</translation>
-<translation id="2280910239864711607">Åpne en ny fane i privat-modus</translation>
+<translation id="2280910239864711607">Åpne en ny fane i privatmodus</translation>
 <translation id="2286841657746966508">Faktureringsadresse</translation>
 <translation id="230115972905494466">Fant ingen kompatible enheter</translation>
 <translation id="2315043854645842844">Operativsystemet har ikke støtte for sertifikatvalg på klientsiden.</translation>
@@ -188,7 +188,7 @@
 <translation id="2387895666653383613">Tekstskalering</translation>
 <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation>
 <translation id="2410754283952462441">Velg en konto</translation>
-<translation id="2414672073755873541">Ingen innhold her</translation>
+<translation id="2414672073755873541">Ikke noe innhold her</translation>
 <translation id="2414886740292270097">Mørk</translation>
 <translation id="2416359993254398973">Chrome trenger tilgang til kameraet ditt for dette nettstedet.</translation>
 <translation id="2426805022920575512">Velg en annen konto</translation>
@@ -220,7 +220,7 @@
 <translation id="2621115761605608342">Tillat JavaScript for et bestemt nettsted.</translation>
 <translation id="2625189173221582860">Passordet er kopiert</translation>
 <translation id="2631006050119455616">Spart</translation>
-<translation id="2633278372998075009">Privatefaner</translation>
+<translation id="2633278372998075009">Privatfaner</translation>
 <translation id="2647434099613338025">Legg til språk</translation>
 <translation id="2650751991977523696">Vil du laste ned filen på nytt?</translation>
 <translation id="2653659639078652383">Send</translation>
@@ -325,7 +325,7 @@
 <translation id="360207483134687714">Hjelp til med å forbedre VR-opplevelsen i Chrome</translation>
 <translation id="3616113530831147358">Lyd</translation>
 <translation id="3620176948598597475">Tilbakestilling gjør at datasparingsloggen tømmes, inkludert listen over besøkte nettsteder.</translation>
-<translation id="3630011985153972676">Lar Chrome laste ned artikler for deg når du er tilkoblet Wi-Fi under innstillinger.</translation>
+<translation id="3630011985153972676">La Chrome laste ned artikler for deg når du er tilkoblet Wi-Fi under innstillinger.</translation>
 <translation id="3632295766818638029">Vis passordet</translation>
 <translation id="363596933471559332">Du logges på nettsteder automatisk ved hjelp av lagret legitimasjon. Når funksjonen er slått av, blir du bedt om å oppgi legitimasjonen din hver gang du logger på et nettsted.</translation>
 <translation id="3661699943263275414">Tredjepartsnettsteder kan lagre og lese data i informasjonskapsler.</translation>
@@ -532,7 +532,7 @@
 <translation id="5335288049665977812">Tillat nettsteder å kjøre JavaScript (anbefales)</translation>
 <translation id="5345040418939504969">Slettet <ph name="BOOKMARK_TITLE" /></translation>
 <translation id="5372829067651257087">Nettadressen er kopiert.</translation>
-<translation id="5391532827096253100">Tilkoblingen til dette nettstedet er ikke sikker. Opplysninger om nettstedet</translation>
+<translation id="5391532827096253100">Tilkoblingen din til dette nettstedet er ikke sikker. Informasjon om nettstedet</translation>
 <translation id="5400569084694353794">Ved å bruke dette programmet samtykker du i Chromes <ph name="BEGIN_LINK1" />vilkår for bruk<ph name="END_LINK1" /> og <ph name="BEGIN_LINK2" />merknad om personvern<ph name="END_LINK2" />.</translation>
 <translation id="5403644198645076998">Tillat bare visse nettsteder</translation>
 <translation id="5414836363063783498">Bekrefter …</translation>
@@ -633,7 +633,7 @@
 <translation id="6075798973483050474">Endre startsiden</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> timer igjen</translation>
 <translation id="60924377787140961">Flere artikler kommer snart. Ha en fin ettermiddag.</translation>
-<translation id="6099151465289169210">Bytt til privatefaner.</translation>
+<translation id="6099151465289169210">Bytt til privatfaner</translation>
 <translation id="6108923351542677676">Konfigurasjon pågår …</translation>
 <translation id="6111020039983847643">data brukt</translation>
 <translation id="6112702117600201073">Oppdaterer siden.</translation>
@@ -649,7 +649,7 @@
 <translation id="618555311922999635">Navigasjonspanelet ble åpnet i full høyde</translation>
 <translation id="6192333916571137726">Last ned filen</translation>
 <translation id="6192792657125177640">Unntak</translation>
-<translation id="6206551242102657620">Tilkoblingen er sikker. Opplysninger om nettstedet</translation>
+<translation id="6206551242102657620">Tilkoblingen er sikker. Informasjon om nettstedet</translation>
 <translation id="6210748933810148297">Ikke <ph name="EMAIL" />?</translation>
 <translation id="6216432067784365534">Alternativer for <ph name="NAME_OF_LIST_ITEM" /></translation>
 <translation id="6221633008163990886">Lås opp for å eksportere passordene dine</translation>
@@ -701,7 +701,7 @@
 <translation id="6593061639179217415">Side for datamaskiner</translation>
 <translation id="6600954340915313787">Kopiert til Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
-<translation id="6610147964972079463">Lukk privatefaner</translation>
+<translation id="6610147964972079463">Lukk privatfaner</translation>
 <translation id="6612358246767739896">Beskyttet innhold</translation>
 <translation id="6627583120233659107">Rediger mappen</translation>
 <translation id="6643016212128521049">Tøm</translation>
@@ -805,7 +805,7 @@
 <translation id="7453467225369441013">Logger deg av de fleste nettsteder. Du blir ikke logget av Google-kontoen din.</translation>
 <translation id="7454641608352164238">Det er ikke nok plass</translation>
 <translation id="7455923816558154057">Trykk for å se</translation>
-<translation id="7465104139234185284">Lukk alle privatefaner</translation>
+<translation id="7465104139234185284">Lukk alle privatfaner</translation>
 <translation id="7473891865547856676">Nei takk</translation>
 <translation id="7475192538862203634">Hvis du ser dette ofte, kan du prøve disse <ph name="BEGIN_LINK" />forslagene<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">Finner ikke SD-kort. Noen av filene dine kan mangle.</translation>
@@ -901,7 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB er lastet ned</translation>
 <translation id="8249310407154411074">Flytt til toppen</translation>
 <translation id="8250920743982581267">Dokumenter</translation>
-<translation id="825412236959742607">Denne siden bruker for mye minne, så har Chrome fjernet noe av innholdet.</translation>
+<translation id="825412236959742607">Denne siden bruker for mye minne, så Chrome har fjernet noe av innholdet.</translation>
 <translation id="8260126382462817229">Prøv å logge på igjen</translation>
 <translation id="8261506727792406068">Slett</translation>
 <translation id="8266862848225348053">Nedlastingssted</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 94e53de..22af187 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Umieszczone na <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">„Bez śledzenia”</translation>
 <translation id="1407135791313364759">Otwórz wszystkie</translation>
+<translation id="1409426117486808224">Uproszczony widok otwartych kart</translation>
 <translation id="1409879593029778104">Plik <ph name="FILE_NAME" /> nie został pobrany, bo już istnieje.</translation>
 <translation id="1414981605391750300">Łączę się z Google. Może to chwilę potrwać…</translation>
 <translation id="1416550906796893042">Wersja aplikacji</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Aby skorzystać z aplikacji <ph name="APP_NAME" />, połącz się z internetem.</translation>
 <translation id="1569387923882100876">Połączone urządzenie</translation>
 <translation id="1571304935088121812">Kopiuj nazwę użytkownika</translation>
+<translation id="1576370611341449972">Pobieranie tylko przez Wi-Fi</translation>
 <translation id="1612196535745283361">Aby wyszukać urządzenia, Chrome potrzebuje dostępu do lokalizacji. Dostęp jest <ph name="BEGIN_LINK" />wyłączony na tym urządzeniu<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Włącz synchronizację, personalizację i inne usługi Google</translation>
 <translation id="1620510694547887537">Kamera</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Wideo</translation>
 <translation id="3810973564298564668">Zarządzaj</translation>
 <translation id="3819178904835489326">Usunięte pobrane pliki: <ph name="NUMBER_OF_DOWNLOADS" /></translation>
+<translation id="3819562311292413223">Pobieranie artykułów dla Ciebie</translation>
 <translation id="3822502789641063741">Wyczyścić dane witryn?</translation>
 <translation id="385051799172605136">Wstecz</translation>
 <translation id="3859306556332390985">Przewiń do przodu</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Zarządzany przez administratora</translation>
 <translation id="4116038641877404294">Pobierz strony, by przeglądać je w trybie offline</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d zakładka}few{%1$d zakładki}many{%1$d zakładek}other{%1$d zakładki}}</translation>
+<translation id="4149994727733219643">Uproszczony widok stron internetowych</translation>
 <translation id="4159800535322890630">Blokuj witrynom dostęp do czujników</translation>
 <translation id="4165986682804962316">Ustawienia witryn</translation>
 <translation id="4170011742729630528">Usługa jest niedostępna. Spróbuj ponownie później.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Tym kontem zarządza <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Wyłączone przez administratora tego urządzenia</translation>
 <translation id="5515439363601853141">Odblokuj, by wyświetlić hasło</translation>
+<translation id="5515716148775388141">Ikony są teraz dostępne u dołu ekranu</translation>
 <translation id="5517095782334947753">Masz zakładki, historię, hasła i inne ustawienia z konta <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Przekierowanie zostało zablokowane.</translation>
 <translation id="5527082711130173040">Aby wyszukać urządzenia, Chrome potrzebuje dostępu do lokalizacji. <ph name="BEGIN_LINK1" />Zwiększ uprawnienia<ph name="END_LINK1" />. Dostęp do lokalizacji jest <ph name="BEGIN_LINK2" />wyłączony na tym urządzeniu<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Zezwolono na dostęp obecnej wyszukiwarce</translation>
 <translation id="7021515813996758557">Plik <ph name="FILE_NAME" /> został pobrany</translation>
 <translation id="7022756207310403729">Otwórz w przeglądarce</translation>
+<translation id="702463548815491781">Zalecane, gdy włączono TalkBack lub Switch Access</translation>
 <translation id="7029809446516969842">Hasła</translation>
 <translation id="7031882061095297553">Synchronizuj z</translation>
 <translation id="7032663816368481562">Gdy klikniesz Więcej <ph name="ICON" /> na pasku adresu, pojawią się szybkie linki do podobnych stron. Adresy URL odwiedzanych przez Ciebie stron są przesyłane do Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Blokowane na niektórych stronach</translation>
 <translation id="7253272406652746122">Otwórz aplikację Ustawienia na urządzeniu, przejdź na stronę Konta i dodaj konto Google.</translation>
 <translation id="7274013316676448362">Zablokowana witryna</translation>
+<translation id="72867290065237936">Kliknij, by przełączyć się między sugestiami haseł i klawiaturą</translation>
 <translation id="729975465115245577">Na urządzeniu nie ma aplikacji umożliwiającej zapisanie pliku z hasłami.</translation>
 <translation id="7302081693174882195">Szczegóły: posortowane według zaoszczędzonych danych</translation>
 <translation id="7333031090786104871">Nadal dodaję poprzednią stronę</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 01e0546b..8d50e832 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
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Incorporado em <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">"Não rastrear"</translation>
 <translation id="1407135791313364759">Abrir todas</translation>
+<translation id="1409426117486808224">Visualização simplificada para guias abertas</translation>
 <translation id="1409879593029778104">O download de <ph name="FILE_NAME" /> foi impedido porque o arquivo já existe.</translation>
 <translation id="1414981605391750300">Entrando em contato com o Google. Isso pode levar um minuto…</translation>
 <translation id="1416550906796893042">Versão do aplicativo</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Para usar o app <ph name="APP_NAME" />, conecte-se à Internet.</translation>
 <translation id="1569387923882100876">Dispositivo conectado</translation>
 <translation id="1571304935088121812">Copiar nome de usuário</translation>
+<translation id="1576370611341449972">Download apenas por Wi-Fi</translation>
 <translation id="1612196535745283361">O Chrome precisa ter acesso ao local para verificar dispositivos. O acesso ao local está <ph name="BEGIN_LINK" />desativado neste dispositivo<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Ativar sincronização, personalização e outros serviços do Google</translation>
 <translation id="1620510694547887537">Câmera</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Vídeo</translation>
 <translation id="3810973564298564668">Gerenciar</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> downloads excluídos</translation>
+<translation id="3819562311292413223">Fazer o download de artigos para você</translation>
 <translation id="3822502789641063741">Limpar armaz. de sites?</translation>
 <translation id="385051799172605136">Voltar</translation>
 <translation id="3859306556332390985">Avançar</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Gerenciado pelo seu administrador</translation>
 <translation id="4116038641877404294">Faça o download de páginas para usá-las off-line</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d favorito}one{%1$d favorito}other{%1$d favoritos}}</translation>
+<translation id="4149994727733219643">Visualização simplificada para páginas da Web</translation>
 <translation id="4159800535322890630">Impeça o acesso de sites aos seus sensores</translation>
 <translation id="4165986682804962316">Configurações do site</translation>
 <translation id="4170011742729630528">O serviço não está disponível. Tente novamente mais tarde.</translation>
@@ -554,6 +558,7 @@
 <translation id="5512137114520586844">Esta conta é gerenciada por <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Opção desativada pelo administrador deste dispositivo</translation>
 <translation id="5515439363601853141">Desbloqueie para ver sua senha</translation>
+<translation id="5515716148775388141">Seus ícones foram movidos para a parte inferior da tela</translation>
 <translation id="5517095782334947753">Você tem favoritos, histórico, senhas e outras configurações da conta <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Redirecionamento bloqueado.</translation>
 <translation id="5527082711130173040">O Chrome precisa ter acesso ao local para procurar dispositivos. <ph name="BEGIN_LINK1" />Atualize as permissões<ph name="END_LINK1" />. O acesso ao local também está <ph name="BEGIN_LINK2" />desativado neste dispositivo<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Permitido para o mecanismo de pesquisa atual</translation>
 <translation id="7021515813996758557">O download de <ph name="FILE_NAME" /> foi concluído</translation>
 <translation id="7022756207310403729">Abrir no navegador</translation>
+<translation id="702463548815491781">Recomendado quando o TalkBack ou o acesso com interruptor estão ativados</translation>
 <translation id="7029809446516969842">Senhas</translation>
 <translation id="7031882061095297553">Sincronizar com</translation>
 <translation id="7032663816368481562">Quando você toca em Mais opções semelhantes <ph name="ICON" />, na barra de endereço, são exibidos links rápidos de páginas relacionadas. Os URLs das páginas visitadas são enviados ao Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Bloqueados em alguns sites</translation>
 <translation id="7253272406652746122">Adicione uma Conta do Google na página de "Contas" do app "Config." do seu dispositivo.</translation>
 <translation id="7274013316676448362">Site bloqueado</translation>
+<translation id="72867290065237936">Toque para alternar entre sugestões de senha e teclado</translation>
 <translation id="729975465115245577">Seu dispositivo não tem um app para armazenar o arquivo de senhas.</translation>
 <translation id="7302081693174882195">Detalhes: classificados pela quantidade de dados economizados</translation>
 <translation id="7333031090786104871">Ainda adicionando o site anterior</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 4fdbd5fc..04447a4c 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
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Incorporado em <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">"Não Monitorizar"</translation>
 <translation id="1407135791313364759">Abrir tudo</translation>
+<translation id="1409426117486808224">Vista simplificada dos separadores abertos</translation>
 <translation id="1409879593029778104">A transferência de <ph name="FILE_NAME" /> foi impedida porque o ficheiro já existe.</translation>
 <translation id="1414981605391750300">A contactar a Google… Isto pode demorar um pouco…</translation>
 <translation id="1416550906796893042">Versão da aplicação</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Para utilizar a aplicação <ph name="APP_NAME" />, ligue-se à Internet.</translation>
 <translation id="1569387923882100876">Dispositivo ligado</translation>
 <translation id="1571304935088121812">Copiar nome de utilizador</translation>
+<translation id="1576370611341449972">A transferência ocorre apenas através de Wi-Fi.</translation>
 <translation id="1612196535745283361">O Chrome precisa de acesso à localização para procurar dispositivos. O acesso à localização está <ph name="BEGIN_LINK" />desativado para este dispositivo<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Ativar a sincronização, a personalização e outros serviços Google</translation>
 <translation id="1620510694547887537">Câmara</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Vídeo</translation>
 <translation id="3810973564298564668">Gerir</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> transferências eliminadas</translation>
+<translation id="3819562311292413223">Transferir artigos para si</translation>
 <translation id="3822502789641063741">Limpar armazenamento do site?</translation>
 <translation id="385051799172605136">Anterior</translation>
 <translation id="3859306556332390985">Procurar para a frente</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Gerido pelo gestor</translation>
 <translation id="4116038641877404294">Transfira páginas para as utilizar offline.</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d marcador}other{%1$d marcadores}}</translation>
+<translation id="4149994727733219643">Vista simplificada de páginas Web</translation>
 <translation id="4159800535322890630">Impedir os sites de aceder aos sensores</translation>
 <translation id="4165986682804962316">Definições de sites</translation>
 <translation id="4170011742729630528">O serviço não está disponível. Tente novamente mais tarde.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Esta conta é gerida por <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Desativada pelo gestor do dispositivo</translation>
 <translation id="5515439363601853141">Desbloqueie para ver a palavra-passe.</translation>
+<translation id="5515716148775388141">Os ícones foram movidos para a parte inferior do ecrã.</translation>
 <translation id="5517095782334947753">Tem marcadores, histórico, palavras-passe e outras definições de <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Redirecionamento bloqueado.</translation>
 <translation id="5527082711130173040">O Chrome precisa de acesso à localização para procurar dispositivos. <ph name="BEGIN_LINK1" />Atualize as autorizações<ph name="END_LINK1" />. O acesso à localização também está <ph name="BEGIN_LINK2" />desativado para este dispositivo<ph name="END_LINK2" />.</translation>
@@ -633,7 +638,7 @@
 <translation id="6075798973483050474">Editar página inicial</translation>
 <translation id="60923314841986378">Faltam <ph name="HOURS" /> horas</translation>
 <translation id="60924377787140961">Serão apresentados mais artigos em breve. Desfrute da sua tarde!</translation>
-<translation id="6099151465289169210">Mudado para separadores privados</translation>
+<translation id="6099151465289169210">Alterado para separadores privados</translation>
 <translation id="6108923351542677676">Configuração em curso…</translation>
 <translation id="6111020039983847643">dados utilizados</translation>
 <translation id="6112702117600201073">A atualizar a página</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Permitido para o motor de pesquisa atual</translation>
 <translation id="7021515813996758557"><ph name="FILE_NAME" /> transferido</translation>
 <translation id="7022756207310403729">Abrir no navegador</translation>
+<translation id="702463548815491781">Recomendado quando o TalkBack ou o Acesso por comutador estão ativados.</translation>
 <translation id="7029809446516969842">Palavras-passe</translation>
 <translation id="7031882061095297553">Sincronizar com</translation>
 <translation id="7032663816368481562">Quando toca em Mais deste género <ph name="ICON" /> na barra de endereço, são apresentados links rápidos para páginas relacionadas. Os URLs das páginas que visita são enviados para a Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Bloqueados em alguns sites</translation>
 <translation id="7253272406652746122">Adicione uma Conta Google na página Contas na aplicação Definições do dispositivo.</translation>
 <translation id="7274013316676448362">Site bloqueado</translation>
+<translation id="72867290065237936">Toque para alternar entre as sugestões de palavras-passe e o teclado.</translation>
 <translation id="729975465115245577">O dispositivo não tem uma aplicação para armazenar o ficheiro de palavras-passe.</translation>
 <translation id="7302081693174882195">Detalhes: ordenado por quantidade de dados guardados</translation>
 <translation id="7333031090786104871">Ainda a adicionar o site anterior…</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 380b714..b75b3a4 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Încorporat în <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">„Nu urmări”</translation>
 <translation id="1407135791313364759">Deschideți-le pe toate</translation>
+<translation id="1409426117486808224">Afișare simplificată pentru filele deschise</translation>
 <translation id="1409879593029778104">Descărcarea fișierului <ph name="FILE_NAME" /> a fost împiedicată, deoarece fișierul există deja.</translation>
 <translation id="1414981605391750300">Se contactează Google. Poate dura un minut...</translation>
 <translation id="1416550906796893042">Versiunea aplicației</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Ca să folosești <ph name="APP_NAME" />, conectează-te la internet.</translation>
 <translation id="1569387923882100876">Dispozitiv conectat</translation>
 <translation id="1571304935088121812">Copiază numele de utilizator</translation>
+<translation id="1576370611341449972">Descărcarea se face numai prin Wi-Fi</translation>
 <translation id="1612196535745283361">Chrome necesită accesul la locație pentru a căuta dispozitive. Accesul la locație este <ph name="BEGIN_LINK" />dezactivat pentru acest dispozitiv<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Activează sincronizarea, personalizarea și alte servicii Google</translation>
 <translation id="1620510694547887537">Camera</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Gestionează</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> descărcări șterse</translation>
+<translation id="3819562311292413223">Descarcă articole pentru tine</translation>
 <translation id="3822502789641063741">Ștergi stocarea site-urilor?</translation>
 <translation id="385051799172605136">Înapoi</translation>
 <translation id="3859306556332390985">Derulează înainte</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Gestionat de administratorul tău</translation>
 <translation id="4116038641877404294">Descarcă paginile pentru a le folosi offline</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d marcaj}few{%1$d marcaje}other{%1$d de marcaje}}</translation>
+<translation id="4149994727733219643">Afișare simplificată pentru paginile web</translation>
 <translation id="4159800535322890630">Nu permite accesul site-urilor la senzori</translation>
 <translation id="4165986682804962316">Setări pentru site-uri</translation>
 <translation id="4170011742729630528">Serviciul nu este disponibil. Încercați din nou mai târziu.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Acest cont este gestionat de <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Dezactivată de administratorul dispozitivului</translation>
 <translation id="5515439363601853141">Deblochează pentru a vedea parola</translation>
+<translation id="5515716148775388141">Pictogramele tale s-au mutat în partea de jos a ecranului</translation>
 <translation id="5517095782334947753">Ai marcajele, istoricul, parolele și alte setări din <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Redirecționarea a fost blocată.</translation>
 <translation id="5527082711130173040">Chrome necesită accesul la locație pentru a căuta dispozitive. <ph name="BEGIN_LINK1" />Actualizează permisiunile<ph name="END_LINK1" />. Accesul la locație este <ph name="BEGIN_LINK2" />dezactivat pentru acest dispozitiv<ph name="END_LINK2" />.</translation>
@@ -603,7 +608,7 @@
 <translation id="583281660410589416">Necunoscut</translation>
 <translation id="5833397272224757657">Folosește conținutul de pe site-urile pe care le accesezi, activitatea browserului și interacțiunile pentru personalizare</translation>
 <translation id="5833984609253377421">Trimite linkul</translation>
-<translation id="584427517463557805">Fișă privată selectată</translation>
+<translation id="584427517463557805">Filă privată selectată</translation>
 <translation id="5854790677617711513">Mai vechi de 30 de zile</translation>
 <translation id="5858741533101922242">Chrome nu poate activa adaptorul Bluetooth</translation>
 <translation id="5860033963881614850">Dezactivat</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Permisă pentru motorul de căutare actual</translation>
 <translation id="7021515813996758557">Fișierul <ph name="FILE_NAME" /> a fost descărcat</translation>
 <translation id="7022756207310403729">Deschide în browser</translation>
+<translation id="702463548815491781">Recomandat atunci când este activată opțiunea TalkBack sau Acces prin comutare</translation>
 <translation id="7029809446516969842">Parole</translation>
 <translation id="7031882061095297553">Sincronizează cu</translation>
 <translation id="7032663816368481562">Când atingi Mai multe similare <ph name="ICON" /> în bara de adrese, afișezi linkuri rapide către pagini similare. Adresele URL ale paginilor pe care le accesezi sunt trimise la Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Blocate pe anumite site-uri</translation>
 <translation id="7253272406652746122">Adaugă un Cont Google din pagina Conturi din aplicația Setări a dispozitivului.</translation>
 <translation id="7274013316676448362">Site blocat</translation>
+<translation id="72867290065237936">Atinge pentru a comuta între sugestiile de parole și tastatură</translation>
 <translation id="729975465115245577">Dispozitivul nu are o aplicație pentru stocarea fișierului parolelor.</translation>
 <translation id="7302081693174882195">Detalii: sortate după volumul de date salvate</translation>
 <translation id="7333031090786104871">Încă se adaugă site-ul anterior</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 d92ec0a..00cb73f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Vložené na webe <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">Nesledovať</translation>
 <translation id="1407135791313364759">Otvoriť všetko</translation>
+<translation id="1409426117486808224">Jednoduché zobrazenie otvorených kariet</translation>
 <translation id="1409879593029778104">Sťahovanie súboru <ph name="FILE_NAME" /> bolo zrušené, pretože daný súbor už existuje.</translation>
 <translation id="1414981605391750300">Kontaktuje sa Google. Môže to chvíľu trvať…</translation>
 <translation id="1416550906796893042">Verzia aplikácie</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Ak chcete použiť aplikáciu <ph name="APP_NAME" />, pripojte sa k internetu.</translation>
 <translation id="1569387923882100876">Pripojené zariadenie</translation>
 <translation id="1571304935088121812">Kopírovať používateľské meno</translation>
+<translation id="1576370611341449972">Sťahovanie sa spustí iba po pripojení k sieti Wi-Fi</translation>
 <translation id="1612196535745283361">Na to, aby mohol Chrome hľadať zariadenia, musí mať prístup k polohe. Prístup k polohe je v tomto zariadení <ph name="BEGIN_LINK" />vypnutý<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Zapnutie synchronizácie, prispôsobenia a ďalších služieb Googlu</translation>
 <translation id="1620510694547887537">Kamera</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Spravovať</translation>
 <translation id="3819178904835489326">Počet odstránených stiahnutých súborov: <ph name="NUMBER_OF_DOWNLOADS" /></translation>
+<translation id="3819562311292413223">Sťahovať články pre vás</translation>
 <translation id="3822502789641063741">Vymazať úložisko webu?</translation>
 <translation id="385051799172605136">Naspäť</translation>
 <translation id="3859306556332390985">Pretočiť dopredu</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Spravované vaším správcom</translation>
 <translation id="4116038641877404294">Stiahnite si stránky na použitie offline</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d záložka}few{%1$d záložky}many{%1$d záložky}other{%1$d záložiek}}</translation>
+<translation id="4149994727733219643">Jednoduché zobrazenie webových stránok</translation>
 <translation id="4159800535322890630">Zablokovať webom prístup k senzorom</translation>
 <translation id="4165986682804962316">Nastavenia webu</translation>
 <translation id="4170011742729630528">Služba nie je k dispozícii. Skúste to znova neskôr.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Tento účet je spravovaný používateľom <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Deaktivované správcom tohto zariadenia</translation>
 <translation id="5515439363601853141">Heslo sa zobrazí po odomknutí</translation>
+<translation id="5515716148775388141">Vaše ikony boli presunuté do dolnej časti obrazovky</translation>
 <translation id="5517095782334947753">Máte záložky, históriu, heslá a ďalšie nastavenia z účtu <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Presmerovanie bolo zablokované.</translation>
 <translation id="5527082711130173040">Na to, aby mohol Chrome hľadať zariadenia, musí mať prístup k polohe. <ph name="BEGIN_LINK1" />Aktualizujte povolenia<ph name="END_LINK1" />. Prístup k polohe je <ph name="BEGIN_LINK2" />vypnutý aj v tomto zariadení<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Povolené v aktuálnom vyhľadávači</translation>
 <translation id="7021515813996758557">Súbor <ph name="FILE_NAME" /> je stiahnutý</translation>
 <translation id="7022756207310403729">Otvoriť v prehliadači</translation>
+<translation id="702463548815491781">Odporúčané, keď je zapnutá aplikácia TalkBack alebo prístup s prepínačmi</translation>
 <translation id="7029809446516969842">Heslá</translation>
 <translation id="7031882061095297553">Kam synchronizovať</translation>
 <translation id="7032663816368481562">Zobrazujte si rýchle odkazy na súvisiace stránky po klepnutí na ikonu Ďalšie podobné položky <ph name="ICON" /> v paneli s adresou. Webové adresy navštívených stránok sa odosielajú Googlu.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Blokovanie reklám z niektorých webov</translation>
 <translation id="7253272406652746122">Pridajte účet Google zo stránky Účty v aplikácii Nastavenia na vašom zariadení.</translation>
 <translation id="7274013316676448362">Blokovaný web</translation>
+<translation id="72867290065237936">Medzi návrhmi hesiel a klávesnicou môžete prepínať klepnutím</translation>
 <translation id="729975465115245577">Vaše zariadenie nemá aplikáciu na uloženie súboru s heslami.</translation>
 <translation id="7302081693174882195">Podrobnosti: zoradené podľa množstva ušetrených dát</translation>
 <translation id="7333031090786104871">Pridávanie predchádzajúceho webu stále prebieha</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 8cb75fa..5d13937 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Vdelano v URL <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">»Ne sledi«</translation>
 <translation id="1407135791313364759">Odpri vse</translation>
+<translation id="1409426117486808224">Poenostavljen pogled za odprte zavihke</translation>
 <translation id="1409879593029778104">Prenos datoteke <ph name="FILE_NAME" /> je bil preprečen, ker datoteka že obstaja.</translation>
 <translation id="1414981605391750300">Vzpostavljanje stika z Googlom. To lahko traja kakšno minuto …</translation>
 <translation id="1416550906796893042">Različica aplikacije</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Če želite uporabljati aplikacijo <ph name="APP_NAME" />, se povežite z internetom.</translation>
 <translation id="1569387923882100876">Povezana naprava</translation>
 <translation id="1571304935088121812">Kopiranje uporabniškega imena</translation>
+<translation id="1576370611341449972">Do prenosa pride samo prek povezave Wi-Fi</translation>
 <translation id="1612196535745283361">Chrome za iskanje naprav potrebuje dostop do lokacije. Dostop do lokacije <ph name="BEGIN_LINK" />je izklopljen za to napravo<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Vklop sinhronizacije, prilagajanja in drugih Googlovih storitev</translation>
 <translation id="1620510694547887537">Kamera</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Upravljanje</translation>
 <translation id="3819178904835489326">Št. izbrisanih prenosov: <ph name="NUMBER_OF_DOWNLOADS" /></translation>
+<translation id="3819562311292413223">Prenos člankov za vas</translation>
 <translation id="3822502789641063741">Izbris pod. spl. mesta?</translation>
 <translation id="385051799172605136">Nazaj</translation>
 <translation id="3859306556332390985">Išči naprej</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Upravlja skrbnik</translation>
 <translation id="4116038641877404294">Prenesite strani, če jih želite uporabljati brez povezave</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d zaznamek}one{%1$d zaznamek}two{%1$d zaznamka}few{%1$d zaznamki}other{%1$d zaznamkov}}</translation>
+<translation id="4149994727733219643">Poenostavljen pogled za spletne strani</translation>
 <translation id="4159800535322890630">Spletnim mestom prepreči dostop do tipal</translation>
 <translation id="4165986682804962316">Nastavitve spletnega mesta</translation>
 <translation id="4170011742729630528">Storitev ni na voljo; poskusite znova pozneje.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Ta račun upravlja <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Onemogoči skrbnik te naprave</translation>
 <translation id="5515439363601853141">Odklenite, če si želite ogledati geslo</translation>
+<translation id="5515716148775388141">Ikone so se preselile na dno zaslona</translation>
 <translation id="5517095782334947753">Iz računa <ph name="FROM_ACCOUNT" /> imate zaznamke, zgodovino, gesla in druge nastavitve.</translation>
 <translation id="5524843473235508879">Preusmeritev je bila blokirana.</translation>
 <translation id="5527082711130173040">Chrome za iskanje naprav potrebuje dostop do lokacije. <ph name="BEGIN_LINK1" />Posodobite dovoljenja<ph name="END_LINK1" />. Dostop do lokacije je prav tako <ph name="BEGIN_LINK2" />izklopljen za to napravo<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Dovoljeno za trenutni iskalnik</translation>
 <translation id="7021515813996758557">Datoteka <ph name="FILE_NAME" /> je prenesena</translation>
 <translation id="7022756207310403729">Odpiranje v brskalniku</translation>
+<translation id="702463548815491781">Priporočljivo, ko je vklopljena aplikacija TalkBack ali funkcija dostopa s stikalom</translation>
 <translation id="7029809446516969842">Gesla</translation>
 <translation id="7031882061095297553">Sinhroniziranje z</translation>
 <translation id="7032663816368481562">Če se v naslovni vrstici dotaknete »Več podobne vsebine« <ph name="ICON" />, prikaže hitre povezave do sorodnih strani. URL-ji obiskanih strani se pošljejo Googlu.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Blokirano na nekaterih spletnih mestih</translation>
 <translation id="7253272406652746122">Na strani za račune v aplikaciji Nastavitve dodajte Google Račun.</translation>
 <translation id="7274013316676448362">Blokirano spletno mesto</translation>
+<translation id="72867290065237936">Dotaknite se, če želite preklapljati med predlogi za geslo in tipkovnico</translation>
 <translation id="729975465115245577">V napravi ni aplikacije za shranjevanje datoteke z gesli.</translation>
 <translation id="7302081693174882195">Podrobnosti: razvrščeno po količini prihranjenih podatkov</translation>
 <translation id="7333031090786104871">Dodajanje prejšnjega spletnega mesta še vedno poteka</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 c9d53e9..a9e0a0392 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -38,7 +38,7 @@
 <translation id="1258753120186372309">Google дудл логотип: <ph name="DOODLE_DESCRIPTION" /></translation>
 <translation id="1259100630977430756">Странице које прегледате на приватним картицама се неће задржавати у историји прегледача, складишту колачића или историји претраге када затворите све приватне картице. Сачуваћемо све преузете датотеке или направљене обележиваче.
 
-          Међутим, нисте невидљиви. Прелазак на приватни режим не сакрива оно што прегледате од послодавца, добављача интернет услуге или веб-сајтова које посећујете.</translation>
+Међутим, нисте невидљиви. Прелазак на приватни режим не сакрива оно што прегледате од послодавца, добављача интернет услуге или веб-сајтова које посећујете.</translation>
 <translation id="127138278192656016">Користите синхронизацију и све услуге</translation>
 <translation id="1272079795634619415">Заустави</translation>
 <translation id="1283039547216852943">Додирните да бисте проширили</translation>
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Уграђено је у сајт <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">„Не прати“</translation>
 <translation id="1407135791313364759">Отвори све</translation>
+<translation id="1409426117486808224">Поједностављен приказ отворених картица</translation>
 <translation id="1409879593029778104">Преузимање датотеке <ph name="FILE_NAME" /> је спречено јер она већ постоји.</translation>
 <translation id="1414981605391750300">Контактирамо Google. То може мало да потраје...</translation>
 <translation id="1416550906796893042">Верзија апликације</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Да бисте користили апликацију <ph name="APP_NAME" />, повежите се на интернет.</translation>
 <translation id="1569387923882100876">Повезани уређај</translation>
 <translation id="1571304935088121812">Копирај корисничко име</translation>
+<translation id="1576370611341449972">Преузимање се обавља само када је укључен Wi-Fi</translation>
 <translation id="1612196535745283361">Chrome-у је потребан приступ локацији да би тражио уређаје. Приступ локацији је <ph name="BEGIN_LINK" />искључен за овај уређај<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Укључите синхронизацију, персонализацију и друге Google услуге</translation>
 <translation id="1620510694547887537">Камера</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Видео</translation>
 <translation id="3810973564298564668">Промени</translation>
 <translation id="3819178904835489326">Избрисана преузимања: <ph name="NUMBER_OF_DOWNLOADS" /></translation>
+<translation id="3819562311292413223">Преузмите чланке за вас</translation>
 <translation id="3822502789641063741">Бришете меморију сајта?</translation>
 <translation id="385051799172605136">Назад</translation>
 <translation id="3859306556332390985">Премотај унапред</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Овим управља администратор</translation>
 <translation id="4116038641877404294">Преузмите странице да бисте их користили офлајн</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d обележивач}one{%1$d обележивач}few{%1$d обележивача}other{%1$d обележивача}}</translation>
+<translation id="4149994727733219643">Поједностављен приказ веб-страница</translation>
 <translation id="4159800535322890630">Онемогућите сајтовима да приступају сензорима</translation>
 <translation id="4165986682804962316">Подешавања сајта</translation>
 <translation id="4170011742729630528">Услуга није доступна. Пробајте поново касније.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Овим налогом управља <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Онемогућио је администратор овог уређаја</translation>
 <translation id="5515439363601853141">Откључајте да бисте прегледали лозинку</translation>
+<translation id="5515716148775388141">Иконе су премештене на дно екрана</translation>
 <translation id="5517095782334947753">Имате обележиваче, лозинке и остала подешавања из <ph name="FROM_ACCOUNT" /> налога.</translation>
 <translation id="5524843473235508879">Преусмеравање је блокирано.</translation>
 <translation id="5527082711130173040">Chrome-у је потребан приступ локацији да би тражио уређаје. <ph name="BEGIN_LINK1" />Ажурирајте дозволе<ph name="END_LINK1" />. Приступ локацији је такође <ph name="BEGIN_LINK2" />искључен за овај уређај<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Дозвољено је за актуелни претраживач</translation>
 <translation id="7021515813996758557">Преузели сте <ph name="FILE_NAME" /></translation>
 <translation id="7022756207310403729">Отвори у прегледачу</translation>
+<translation id="702463548815491781">Препоручујемо вам када укључите TalkBack или приступ помоћу прекидача</translation>
 <translation id="7029809446516969842">Лозинке</translation>
 <translation id="7031882061095297553">Синхронизујте са</translation>
 <translation id="7032663816368481562">Када додирнете икону Још сличних ствари <ph name="ICON" /> на траци за адресу, приказују се брзи линкови до сродних страница. URL-ови страница које посећујете се шаљу Google-у.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Блокирано са неких сајтова</translation>
 <translation id="7253272406652746122">Додајте Google налог са странице Налози у апликацији Подешавања на уређају.</translation>
 <translation id="7274013316676448362">Сајт је блокиран</translation>
+<translation id="72867290065237936">Додирните да бисте укључили/искључили предлоге лозинки или тастатуру</translation>
 <translation id="729975465115245577">Уређај нема апликацију за чување датотеке са лозинкама.</translation>
 <translation id="7302081693174882195">Детаљи: сортирано према количини уштеђених података</translation>
 <translation id="7333031090786104871">Још увек додајемо претходни сајт</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 6a38725..6c93349 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Inbäddad i <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">Do Not Track</translation>
 <translation id="1407135791313364759">Öppna alla</translation>
+<translation id="1409426117486808224">Förenklad vy för öppna flikar</translation>
 <translation id="1409879593029778104">Nedladdningen av <ph name="FILE_NAME" /> hindrades eftersom filen redan finns.</translation>
 <translation id="1414981605391750300">Kontaktar Google. Det här kan ta någon minut …</translation>
 <translation id="1416550906796893042">Appversion</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Anslut till internet om du vill använda <ph name="APP_NAME" />.</translation>
 <translation id="1569387923882100876">Ansluten enhet</translation>
 <translation id="1571304935088121812">Kopiera användarnamn</translation>
+<translation id="1576370611341449972">Nedladdningar görs endast via Wi-Fi</translation>
 <translation id="1612196535745283361">Chrome behöver åtkomst till platsinformation för att kunna söka efter enheter. Platsåtkomst är <ph name="BEGIN_LINK" />inaktiverat för enheten<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Aktivera synkronisering, anpassning och andra tjänster från Google</translation>
 <translation id="1620510694547887537">Kamera</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Hantera</translation>
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> nedladdningar har raderats</translation>
+<translation id="3819562311292413223">Ladda ned artiklar för dig</translation>
 <translation id="3822502789641063741">Rensa webbplatslagring?</translation>
 <translation id="385051799172605136">Bakåt</translation>
 <translation id="3859306556332390985">Sök framåt</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Hanteras av administratören</translation>
 <translation id="4116038641877404294">Ladda ned sidor så att du kan använda dem offline</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d bokmärke}other{%1$d bokmärken}}</translation>
+<translation id="4149994727733219643">Förenklad vy för webbsidor</translation>
 <translation id="4159800535322890630">Förhindra att webbplatser använder enhetens sensorer</translation>
 <translation id="4165986682804962316">Platsinställningar</translation>
 <translation id="4170011742729630528">Tjänsten är inte tillgänglig, försök igen senare.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Det här kontot hanteras av <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Har inaktiverats av enhetens administratör</translation>
 <translation id="5515439363601853141">Lås upp om du vill visa lösenordet</translation>
+<translation id="5515716148775388141">Ikonerna har flyttats längst ned på skärmen</translation>
 <translation id="5517095782334947753">Du har bokmärken, historik, lösenord och andra inställningar från <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Omdirigeringen blockerades.</translation>
 <translation id="5527082711130173040">Chrome behöver tillgång till platsinformation för att kunna söka efter enheter. <ph name="BEGIN_LINK1" />Uppdatera behörigheter<ph name="END_LINK1" />. Platsåtkomst är dessutom <ph name="BEGIN_LINK2" />inaktiverat för enheten<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Tillåt för den nuvarande sökmotorn</translation>
 <translation id="7021515813996758557"><ph name="FILE_NAME" /> har laddats ned</translation>
 <translation id="7022756207310403729">Öppna i webbläsaren</translation>
+<translation id="702463548815491781">Rekommenderas när TalkBack eller brytarstyrning är aktiverat</translation>
 <translation id="7029809446516969842">Lösenord</translation>
 <translation id="7031882061095297553">Synkronisera med</translation>
 <translation id="7032663816368481562">Visar snabblänkar till relaterade sidor när du trycker på Fler liknande <ph name="ICON" /> i adressfältet. Webbadresserna till sidor du besöker skickas till Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Blockeras från vissa webbplatser</translation>
 <translation id="7253272406652746122">Lägg till ett Google-konto från kontosidan i appen Inställningar på enheten.</translation>
 <translation id="7274013316676448362">Blockerad webbplats</translation>
+<translation id="72867290065237936">Byt mellan lösenordsförslag och tangentbordet genom att trycka här</translation>
 <translation id="729975465115245577">Det finns ingen app som kan spara lösenordsfilen på enheten.</translation>
 <translation id="7302081693174882195">Mer information: Sorterad efter databesparing</translation>
 <translation id="7333031090786104871">Processen pågår fortfarande för den förra webbplatsen</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 fabebd8..9c92b4e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Imepachikwa katika <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">“Usifuatilie”</translation>
 <translation id="1407135791313364759">Fungua zote</translation>
+<translation id="1409426117486808224">Mwonekano uliorahisishwa kwa ajili ya vichupo vilivyofunguliwa</translation>
 <translation id="1409879593029778104">Kipakuliwa cha <ph name="FILE_NAME" /> kimezuiwa kwa sababu faili tayari ipo.</translation>
 <translation id="1414981605391750300">Inawasiliana na Google. Huenda ikachukua dakika moja…</translation>
 <translation id="1416550906796893042">Toleo la programu</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Tafadhali washa intaneti ili uweze kutumia <ph name="APP_NAME" />.</translation>
 <translation id="1569387923882100876">Kifaa Kilichounganishwa</translation>
 <translation id="1571304935088121812">Nakili jina la mtumiaji</translation>
+<translation id="1576370611341449972">Utapakua kwa kutumia Wi-Fi pekee</translation>
 <translation id="1612196535745283361">Chrome inahitaji idhini ya kufikia mahali ili itafute vifaa. Kipengele cha kufikia mahali <ph name="BEGIN_LINK" />kimezimwa kwenye kifaa hiki<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Washa usawazishaji, mapendeleo na huduma nyingine za Google</translation>
 <translation id="1620510694547887537">Kamera</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Dhibiti</translation>
 <translation id="3819178904835489326">Vipakuliwa <ph name="NUMBER_OF_DOWNLOADS" /> vimefutwa</translation>
+<translation id="3819562311292413223">Pakua makala tunayokupendekezea</translation>
 <translation id="3822502789641063741">Ungependa kufuta hifadhi ya tovuti?</translation>
 <translation id="385051799172605136">Nyuma</translation>
 <translation id="3859306556332390985">Peleka mbele</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Inadhibitiwa na msimamizi wako</translation>
 <translation id="4116038641877404294">Pakua kurasa uzitumie nje ya mtandao</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{Alamisho %1$d}other{Alamisho %1$d}}</translation>
+<translation id="4149994727733219643">Mwonekano uliorahisishwa kwa ajili ya kurasa za wavuti</translation>
 <translation id="4159800535322890630">Zuia tovuti ili zisifikie vitambuzi vyako</translation>
 <translation id="4165986682804962316">Mipangilio ya tovuti</translation>
 <translation id="4170011742729630528">Huduma haipatikani; jaribu tena baadaye.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Akaunti hii inadhibitiwa na <ph name="PARENT_NAME" /></translation>
 <translation id="5514904542973294328">Imezimwa na msimamizi wa kifaa hiki</translation>
 <translation id="5515439363601853141">Fungua ili uangalie nenosiri lako</translation>
+<translation id="5515716148775388141">Aikoni zako zimewekwa kwenye sehemu ya chini ya skrini</translation>
 <translation id="5517095782334947753">Una alamisho, historia, manenosiri na mipangilio mingine kutoka <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Imezuia shughuli ya kuelekeza kwingine.</translation>
 <translation id="5527082711130173040">Chrome inahitaji idhini ya kufikia mahali ili itafute vifaa. <ph name="BEGIN_LINK1" />Badilisha ruhusa<ph name="END_LINK1" />. Kipengele cha idhini ya kufikia mahali pia <ph name="BEGIN_LINK2" />kimezimwa kwenye kifaa hiki<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Imeruhusiwa kwa mtambo wa sasa wa kutafuta</translation>
 <translation id="7021515813996758557"><ph name="FILE_NAME" /> imepakuliwa</translation>
 <translation id="7022756207310403729">Fungua katika kivinjari</translation>
+<translation id="702463548815491781">Inapendekezwa wakati umewasha TalkBack au kipengele cha Kufikia Kupitia Swichi</translation>
 <translation id="7029809446516969842">Manenosiri</translation>
 <translation id="7031882061095297553">Sawazisha kwenye</translation>
 <translation id="7032663816368481562">Unapogusa aikoni ya Zingine kama hii <ph name="ICON" /> katika sehemu ya anwani, onyesha viungo vya haraka vya kurasa zinazohuaisna. URL za kurasa unazotembelea zitatumwa kwa Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Imezuiwa kwenye baadhi ya tovuti</translation>
 <translation id="7253272406652746122">Ongeza Akaunti ya Google kutoka kwenye ukurasa wa Akaunti katika programu ya Mipangilio ya kifaa chako.</translation>
 <translation id="7274013316676448362">Tovuti imezuiwa</translation>
+<translation id="72867290065237936">Gusa ili ubadili kati ya kibodi na mapendekezo ya nenosiri</translation>
 <translation id="729975465115245577">Kifaa chako hakina programu ya kuhifadhi faili ya manenosiri.</translation>
 <translation id="7302081693174882195">Maelezo: Imepangwa kulingana na kiasi cha data kilichookolewa</translation>
 <translation id="7333031090786104871">Bado inaongeza tovuti ya awali</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 862bf59..4b740cb 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -61,6 +61,7 @@
 <translation id="1404122904123200417">Вбудовано на сайті <ph name="WEBSITE_URL" /></translation>
 <translation id="1406000523432664303">"Не відстежувати"</translation>
 <translation id="1407135791313364759">Відкрити все</translation>
+<translation id="1409426117486808224">Спрощений перегляд відкритих вкладок</translation>
 <translation id="1409879593029778104">Файл <ph name="FILE_NAME" /> не завантажено, оскільки він уже є.</translation>
 <translation id="1414981605391750300">З’єднання з Google. Це може зайняти хвилину…</translation>
 <translation id="1416550906796893042">Версія додатка</translation>
@@ -80,6 +81,7 @@
 <translation id="1566400915470565838">Щоб запустити додаток <ph name="APP_NAME" />, під’єднайте пристрій до Інтернету.</translation>
 <translation id="1569387923882100876">Під’єднаний пристрій</translation>
 <translation id="1571304935088121812">Копіювати ім’я користувача</translation>
+<translation id="1576370611341449972">Завантаження відбувається лише через Wi-Fi</translation>
 <translation id="1612196535745283361">Щоб шукати пристрої, Chrome потрібен доступ до геоданих. Доступ до геоданих <ph name="BEGIN_LINK" />вимкнено на цьому пристрої<ph name="END_LINK" />.</translation>
 <translation id="162035744160882748">Увімкнути синхронізацію, персоналізацію й інші служби Google</translation>
 <translation id="1620510694547887537">Камера</translation>
@@ -344,6 +346,7 @@
 <translation id="3810838688059735925">Відео</translation>
 <translation id="3810973564298564668">Змінити</translation>
 <translation id="3819178904835489326">Видалено завантажених файлів: <ph name="NUMBER_OF_DOWNLOADS" /></translation>
+<translation id="3819562311292413223">Завантажувати статті для вас</translation>
 <translation id="3822502789641063741">Видалити дані сайтів?</translation>
 <translation id="385051799172605136">Назад</translation>
 <translation id="3859306556332390985">Далі</translation>
@@ -383,6 +386,7 @@
 <translation id="4113030288477039509">Керується адміністратором</translation>
 <translation id="4116038641877404294">Завантажуйте сторінки, щоб переглядати їх офлайн</translation>
 <translation id="4127069705158143605">{BOOKMARKS_COUNT,plural, =1{%1$d закладка}one{%1$d закладка}few{%1$d закладки}many{%1$d закладок}other{%1$d закладки}}</translation>
+<translation id="4149994727733219643">Спрощений перегляд веб-сторінок</translation>
 <translation id="4159800535322890630">Блокувати доступ сайтів до датчиків</translation>
 <translation id="4165986682804962316">Налаштування сайту</translation>
 <translation id="4170011742729630528">Служба не доступна. Повторіть спробу пізніше.</translation>
@@ -553,6 +557,7 @@
 <translation id="5512137114520586844">Цим обліковим записом керує <ph name="PARENT_NAME" />.</translation>
 <translation id="5514904542973294328">Вимкнено адміністратором пристрою</translation>
 <translation id="5515439363601853141">Розблокуйте, щоб переглянути пароль</translation>
+<translation id="5515716148775388141">Значки переміщено вниз екрана</translation>
 <translation id="5517095782334947753">У вас є закладки, історія, паролі й інші налаштування з облікового запису <ph name="FROM_ACCOUNT" />.</translation>
 <translation id="5524843473235508879">Переспрямування заблоковано.</translation>
 <translation id="5527082711130173040">Щоб шукати пристрої, Chrome потрібен доступ до геоданих. <ph name="BEGIN_LINK1" />Оновити дозволи<ph name="END_LINK1" />. Доступ до геоданих також <ph name="BEGIN_LINK2" />вимкнено на цьому пристрої<ph name="END_LINK2" />.</translation>
@@ -756,6 +761,7 @@
 <translation id="7016516562562142042">Дозволено для поточної пошукової системи</translation>
 <translation id="7021515813996758557">Файл "<ph name="FILE_NAME" />" завантажено</translation>
 <translation id="7022756207310403729">Відкрити у веб-переглядачі</translation>
+<translation id="702463548815491781">Рекомендується, коли ввімкнено TalkBack або кнопковий доступ</translation>
 <translation id="7029809446516969842">Паролі</translation>
 <translation id="7031882061095297553">Синхронізувати</translation>
 <translation id="7032663816368481562">Коли ви торкаєтеся значка <ph name="ICON" /> в адресному рядку, з’являються швидкі посилання на схожі сторінки. URL-адреси відвіданих сторінок надсилаються в Google.</translation>
@@ -784,6 +790,7 @@
 <translation id="7251326866581677552">Заблоковано на деяких сайтах</translation>
 <translation id="7253272406652746122">Додайте обліковий запис Google зі сторінки "Облікові записи" в додатку Налаштування на пристрої.</translation>
 <translation id="7274013316676448362">Заблокований сайт</translation>
+<translation id="72867290065237936">Торкайтеся, щоб перемикатися між пропозиціями паролів і клавіатурою</translation>
 <translation id="729975465115245577">На пристрої немає додатка для зберігання файлу з паролями.</translation>
 <translation id="7302081693174882195">Деталі: відсортовано за кількістю заощадженого трафіку</translation>
 <translation id="7333031090786104871">Попередній сайт ще додається</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 677cd592..436451b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -36,7 +36,7 @@
 <translation id="124116460088058876">Ngôn ngữ khác</translation>
 <translation id="124678866338384709">Đóng tab hiện tại</translation>
 <translation id="1258753120186372309">Hình tượng trưng của Google: <ph name="DOODLE_DESCRIPTION" /></translation>
-<translation id="1259100630977430756">Trang mà bạn xem ở tab ẩn danh sẽ không lưu vào lịch sử của trình duyệt, kho cookie hoặc lịch sử tìm kiếm sau khi bạn đóng tất cả tab riêng tư. Mọi tệp bạn tải xuống hoặc dấu trang bạn tạo sẽ được lưu lại.
+<translation id="1259100630977430756">Các trang mà bạn xem ở tab ẩn danh sẽ không lưu vào lịch sử của trình duyệt, kho cookie hoặc lịch sử tìm kiếm sau khi bạn đóng tất cả tab riêng tư. Mọi tệp bạn tải xuống hoặc dấu trang bạn tạo sẽ được lưu lại.
 
 Tuy nhiên, bạn vẫn có trạng thái hiển thị. Việc chuyển sang chế độ riêng tư sẽ không ẩn hoạt động duyệt web của bạn với chủ lao động, nhà cung cấp dịch vụ Internet hoặc các trang web bạn truy cập.</translation>
 <translation id="127138278192656016">Sử dụng tùy chọn đồng bộ hóa và tất cả dịch vụ</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 a7befe89..a6d0043f 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
@@ -36,7 +36,7 @@
 <translation id="124116460088058876">更多語言</translation>
 <translation id="124678866338384709">關閉目前的分頁</translation>
 <translation id="1258753120186372309">Google Doodle:<ph name="DOODLE_DESCRIPTION" /></translation>
-<translation id="1259100630977430756">你關閉所有私密分頁後,你在其中瀏覽過的網頁都不會保留在瀏覽器記錄、Cookie 儲存庫或搜尋記錄中,但系統仍會保留你下載的所有檔案或是你建立的所有書籤。
+<translation id="1259100630977430756">關閉所有私密分頁後,你在其中瀏覽過的網頁都不會保留在瀏覽器記錄、Cookie 儲存庫或搜尋記錄中,但系統仍會保留你下載的所有檔案或是你建立的所有書籤。
 
 不過,這並不代表你完全沒有瀏覽記錄。使用私密模式時,你的雇主、網際網路服務供應商和你所造訪的網站仍然可以追蹤你的瀏覽記錄。</translation>
 <translation id="127138278192656016">使用同步處理功能和所有服務</translation>
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index d9e4848..75e273e2 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -511,6 +511,7 @@
   "java/src/org/chromium/chrome/browser/download/home/storage/StorageCoordinator.java",
   "java/src/org/chromium/chrome/browser/download/home/storage/StorageSummaryProvider.java",
   "java/src/org/chromium/chrome/browser/download/home/toolbar/DownloadHomeToolbar.java",
+  "java/src/org/chromium/chrome/browser/download/home/view/LoadingBackground.java",
   "java/src/org/chromium/chrome/browser/download/home/view/SelectionView.java",
   "java/src/org/chromium/chrome/browser/download/items/DownloadBlockedOfflineContentProvider.java",
   "java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorFactory.java",
@@ -1298,6 +1299,7 @@
   "java/src/org/chromium/chrome/browser/signin/SigninUtils.java",
   "java/src/org/chromium/chrome/browser/signin/SigninView.java",
   "java/src/org/chromium/chrome/browser/signin/SyncPromoView.java",
+  "java/src/org/chromium/chrome/browser/signin/UnifiedConsentServiceBridge.java",
   "java/src/org/chromium/chrome/browser/snackbar/BottomContainer.java",
   "java/src/org/chromium/chrome/browser/snackbar/DataReductionPromoSnackbarController.java",
   "java/src/org/chromium/chrome/browser/snackbar/Snackbar.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/StubbedProvider.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/StubbedProvider.java
index 4ab139c..dfee5246 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/StubbedProvider.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/StubbedProvider.java
@@ -20,6 +20,7 @@
 import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
 import org.chromium.components.download.DownloadState;
 import org.chromium.components.offline_items_collection.ContentId;
+import org.chromium.components.offline_items_collection.LaunchLocation;
 import org.chromium.components.offline_items_collection.LegacyHelpers;
 import org.chromium.components.offline_items_collection.OfflineContentProvider;
 import org.chromium.components.offline_items_collection.OfflineItem;
@@ -148,7 +149,7 @@
         }
 
         @Override
-        public void openItem(ContentId id) {}
+        public void openItem(@LaunchLocation int location, ContentId id) {}
         @Override
         public void pauseDownload(ContentId id) {}
         @Override
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 7b6a843a..decfca20 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -373,8 +373,8 @@
   <message name="IDS_FILE_BROWSER_ERROR_EXTERNAL_DRIVE_LONG_NAME" desc="Error message displayed when user tries to enter too long name for an external drive.">
     Use a name that's <ph name="MAX_LENGTH">$1<ex>11</ex></ph> characters or less
   </message>
-  <message name="IDS_FILE_BROWSER_ERROR_LINUX_FILES_CONNECTION" desc="Text to show user when there is an error starting or mounting crostini container to show Linux Files.">
-    Unable to view Linux Files
+  <message name="IDS_FILE_BROWSER_ERROR_LINUX_FILES_CONNECTION" desc="Text to show user when there is an error starting or mounting crostini container to show Linux files.">
+    Unable to view Linux files
   </message>
 
   <message name="IDS_FILE_BROWSER_EMPTY_FOLDER" desc="Label shown in an empty folder.">
@@ -974,8 +974,8 @@
   <message name="IDS_FILE_BROWSER_DROP_TARGET_FOLDER_NO_MOVE_PERMISSION" desc="Tooltip label displayed besides mouse pointer while dragging files or folders over a Team Drive or folder in Drive that does not have write access.">
     You don't have permission to move files into '<ph name="FOLDER_NAME">$1<ex>Trip Photos</ex></ph>'.
   </message>
-  <message name="IDS_FILE_BROWSER_DROP_TARGET_OPENING_LINUX_FILES" desc="Tooltip label displayed besides mouse pointer when dragging files or folders over Linux Files root before the container has been started and mounted.">
-    Opening Linux Files...
+  <message name="IDS_FILE_BROWSER_DROP_TARGET_OPENING_LINUX_FILES" desc="Tooltip label displayed besides mouse pointer when dragging files or folders over Linux files root before the container has been started and mounted.">
+    Opening Linux files...
   </message>
 
   <message name="IDS_FILE_BROWSER_SELECT_FOLDER_TITLE" desc="Select folder title.">
@@ -1231,7 +1231,7 @@
     Unable to open with $1
   </message>
   <message name="IDS_FILE_BROWSER_UNABLE_TO_OPEN_CROSTINI" desc="Message shown when a user tries to use a crostini app to open a file outside the crostini container (e.g. in Downloads).  This message will be removed once we support this action.">
-    To open files with $1, first copy to Linux Files folder.
+    To open files with $1, first copy to Linux files folder.
   </message>
 
   <message name="IDS_FILE_BROWSER_FOLDER" desc="Folder entry type">
@@ -5112,7 +5112,7 @@
     Delete Linux (Beta)
   </message>
   <message name="IDS_CROSTINI_UNINSTALLER_BODY" desc="Description for the Crostini uninstaller, a dialog for uninstalling Linux, the associated VM and Linux files.">
-    Delete all Linux applications and data in your Linux Files folder from this <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph>?
+    Delete all Linux applications and data in your Linux files folder from this <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph>?
   </message>
   <message name="IDS_CROSTINI_UNINSTALLER_UNINSTALL_BUTTON" desc="Label for the button in the Crostini uninstaller dialog to uninstall Linux">
     Delete
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 775ab7f..fb54b068 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -8574,8 +8574,8 @@
       <message name="IDS_TOOLTIP_TAB_ALERT_STATE_PIP_PLAYING" desc="Extra tool tip text, when tab is playing a video in Picture-in-Picture.">
         This tab is playing a video in picture-in-picture mode.
       </message>
-      <message name="IDS_TOOLTIP_TAB_ALERT_STATE_DESKTOP_CAPTURING" desc="Extra tool tip text, when the tab is caturing desktop contents.">
-        This tab is sharing your desktop content.
+      <message name="IDS_TOOLTIP_TAB_ALERT_STATE_DESKTOP_CAPTURING" desc="Extra tool tip text, when the tab is capturing desktop contents.">
+        This tab is sharing your screen.
       </message>
 
       <!-- Tab accessibility labels -->
diff --git a/chrome/app/generated_resources_grd/IDS_TOOLTIP_TAB_ALERT_STATE_DESKTOP_CAPTURING.png.sha1 b/chrome/app/generated_resources_grd/IDS_TOOLTIP_TAB_ALERT_STATE_DESKTOP_CAPTURING.png.sha1
new file mode 100644
index 0000000..ec84c2d9
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_TOOLTIP_TAB_ALERT_STATE_DESKTOP_CAPTURING.png.sha1
@@ -0,0 +1 @@
+7d3b067c3f60b572dfc831350f66c05c3a112864
\ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb
index b6bfdabe..9650780 100644
--- a/chrome/app/resources/chromium_strings_hr.xtb
+++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -232,7 +232,7 @@
 <translation id="8157153840442649507">Chromium se prikazuje na tom jeziku</translation>
 <translation id="81770708095080097">Datoteka je opasna i Chromium ju je blokirao.</translation>
 <translation id="8222496066431494154">Instalirajte Chromium na telefon. Poslat ćemo vam SMS na telefonski broj za oporavak računa: <ph name="PHONE_NUMBER" /></translation>
-<translation id="825412236959742607">Ova stranica upotrebljava previše memorije, pa je Chrome uklonio neki sadržaj.</translation>
+<translation id="825412236959742607">Ova stranica upotrebljava previše memorije, pa je Chrome uklonio dio sadržaja.</translation>
 <translation id="8269379391216269538">Pomognite poboljšati Chromium.</translation>
 <translation id="8290862415967981663">Datoteka je možda opasna i Chromium ju je blokirao.</translation>
 <translation id="8330519371938183845">Prijavite se da biste sinkronizirali i prilagodili Chromium na svim svojim uređajima</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb
index f126c16..19b41363 100644
--- a/chrome/app/resources/chromium_strings_no.xtb
+++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -77,14 +77,14 @@
 <translation id="3582788516608077514">Oppdaterer Chromium …</translation>
 <translation id="358997566136285270">Chromium-logo</translation>
 <translation id="3713809861844741608">Åpne linken i en ny fane i Chromium</translation>
-<translation id="3728336900324680424">Chromium vil få tilgang til disken din for å kunne gi deg forslag i adressefeltet</translation>
+<translation id="3728336900324680424">Chromium får tilgang til Disk-lagringen din for å kunne gi deg forslag i adressefeltet</translation>
 <translation id="3762167353400286894">Chromium OS vises på dette språket</translation>
 <translation id="378917192836375108">Med Chromium kan du klikke på et telefonnummer på nettet og ringe til det med Skype.</translation>
 <translation id="3848258323044014972"><ph name="PAGE_TITLE" /> – Chromium</translation>
 <translation id="3852700440713538496">Fest Chromium til oppgavelinjen</translation>
 <translation id="3889543394854987837">Klikk på navnet ditt for å åpne Chromium og starte surfingen.</translation>
 <translation id="3898493977366060150">Surfing med Googles smarte funksjoner</translation>
-<translation id="3965668104013180445">{0,plural, =1{Chromium OS vil starte på nytt om én time}other{Chromium OS vil starte på nytt om # timer}}</translation>
+<translation id="3965668104013180445">{0,plural, =1{Chromium OS startes på nytt om én time}other{Chromium OS startes på nytt om # timer}}</translation>
 <translation id="4036079820698952681">Bidra til å gjøre Chromium bedre ved å rapportere de <ph name="BEGIN_LINK" />nåværende innstillingene<ph name="END_LINK" /></translation>
 <translation id="4050175100176540509">Viktige sikkerhetsforbedringer og nye funksjoner er tilgjengelige i den nyeste versjonen.</translation>
 <translation id="407254336480250557">Velg <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation>
@@ -124,13 +124,13 @@
 <translation id="5479196819031988440">Chromium OS kan ikke åpne denne siden.</translation>
 <translation id="5480860683791598150">Chromium trenger tilgang til posisjonen din for å kunne dele den med dette nettstedet</translation>
 <translation id="549669000822060376">Vent mens Chromium installerer de nyeste systemoppdateringene.</translation>
-<translation id="5514308096618405748">Chrome OS muliggjøres av <ph name="BEGIN_LINK_CROS_OSS" />tilleggsprogramvare med åpen kildekode<ph name="END_LINK_CROS_OSS" />, som Linux(Beta).</translation>
-<translation id="5529843986978123325">{0,plural, =1{Chromium OS vil starte på nytt om 1 minutt}other{Chromium OS vil starte på nytt om # minutter}}</translation>
+<translation id="5514308096618405748">Chrome OS er basert på <ph name="BEGIN_LINK_CROS_OSS" />tilleggsprogramvare med åpen kildekode<ph name="END_LINK_CROS_OSS" />, i likhet med Linux (beta).</translation>
+<translation id="5529843986978123325">{0,plural, =1{Chromium OS startes på nytt om 1 minutt}other{Chromium OS startes på nytt om # minutter}}</translation>
 <translation id="5631814766731275228">Navn og bilde i Chromium</translation>
 <translation id="5634636535844844681">Chromium krever Windows 7 eller nyere.</translation>
 <translation id="5680901439334282664">logg på Chromium</translation>
 <translation id="5698481217667032250">Vis Chromium på dette språket</translation>
-<translation id="5712253116097046984">Administratoren din ber deg om å starte Chromium OS på nytt for å kunne bruke denne oppdateringen</translation>
+<translation id="5712253116097046984">Administratoren din ber deg om å starte Chromium OS på nytt for å ta i bruk denne oppdateringen</translation>
 <translation id="5726838626470692954">Administratoren din må fjerne og legge deg til i Chromium på nytt.</translation>
 <translation id="5768914737813585044">Vis Chromium OS på dette språket</translation>
 <translation id="5796460469508169315">Chromium er nesten klar.</translation>
@@ -149,7 +149,7 @@
 <translation id="6096348254544841612">Tilpass og kontrollér Chromium. Oppdatering er tilgjengelig.</translation>
 <translation id="6120345080069858279">Chromium lagrer dette passordet i Google-kontoen din, så du trenger ikke å huske det.</translation>
 <translation id="6129621093834146363"><ph name="FILE_NAME" /> er farlig, så Chromium har blokkert den.</translation>
-<translation id="620022061217911843">Administratoren din krever at du starter Chromium på nytt for at en oppdatering skal tas i bruk</translation>
+<translation id="620022061217911843">Administratoren din krever at du starter Chromium OS på nytt for å ta i bruk en oppdatering</translation>
 <translation id="6212496753309875659">Denne datamaskinen har allerede en nyere versjon av Chromium. Hvis programvaren ikke fungerer, må du avinstallere Chromium og prøve på nytt.</translation>
 <translation id="6248213926982192922">Gjør Chromium til standard nettleser</translation>
 <translation id="6268381023930128611">Vil du logge av Chromium?</translation>
@@ -206,7 +206,7 @@
 <translation id="7448255348454382571">Start Chromium OS på nytt</translation>
 <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium for utviklere</translation>
 <translation id="7451052299415159299">Chromium trenger tilgang til kameraet ditt for dette nettstedet</translation>
-<translation id="7471302858145901434">{0,plural, =1{Start Chromium på nytt innen én dag}other{Start Chromium OS på nytt innen # dager}}</translation>
+<translation id="7471302858145901434">{0,plural, =1{Start Chromium OS på nytt innen én dag}other{Start Chromium OS på nytt innen # dager}}</translation>
 <translation id="7483335560992089831">Kan ikke installere den samme Chromium-versjonen som kjører. Lukk Chromium og prøv på nytt.</translation>
 <translation id="7549178288319965365">Om Chromium OS</translation>
 <translation id="7577193603922410712">En spesiell sikkerhetsoppdatering for Chromium ble nettopp installert. Du bør starte på nytt nå for at den skal tre i kraft (vi gjenoppretter fanene dine).</translation>
@@ -232,18 +232,18 @@
 <translation id="8157153840442649507">Chromium vises på dette språket</translation>
 <translation id="81770708095080097">Denne filen er farlig, så Chromium har blokkert den.</translation>
 <translation id="8222496066431494154">Installer Chromium på telefonen din. Vi sender en SMS til telefonnummeret ditt for kontogjenoppretting (<ph name="PHONE_NUMBER" />)</translation>
-<translation id="825412236959742607">Denne siden bruker for mye minne, så har Chrome fjernet noe av innholdet.</translation>
+<translation id="825412236959742607">Denne siden bruker for mye minne, så Chrome har fjernet noe av innholdet.</translation>
 <translation id="8269379391216269538">Bidra til å gjøre Chromium bedre</translation>
 <translation id="8290862415967981663">Denne filen kan være farlig, så Chromium har blokkert den.</translation>
 <translation id="8330519371938183845">Logg på for å synkronisere og gi Chromium et personlig preg på alle enhetene dine</translation>
 <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> brukte Chromium tidligere</translation>
-<translation id="8375950122744241554">Overvåkede brukerprofiler vil ikke lengre være tilgjengelig fra og med Chromium 70.</translation>
+<translation id="8375950122744241554">Administrerte brukerprofiler kommer ikke lenger til å være tilgjengelige fra og med Chromium 70.</translation>
 <translation id="8379713241968949941">{0,plural, =1{Chromium startes på nytt om én time}other{Chromium startes på nytt om # timer}}</translation>
 <translation id="8453117565092476964">Installasjonsarkivet er skadet eller ugyldig. Last ned Chromium på nytt.</translation>
 <translation id="8493179195440786826">Chromium er utdatert</translation>
 <translation id="85843667276690461">Få hjelp med å bruke Chromium</translation>
 <translation id="8586442755830160949">Copyright <ph name="YEAR" /> – The Chromium Authors. Med enerett.</translation>
-<translation id="8599548569518771270">{0,plural, =0{Chromium OS vil starte på nytt nå}=1{Chromium OS startes på nytt om 1 sekund}other{Chromium OS startes på nytt om # sekunder}}</translation>
+<translation id="8599548569518771270">{0,plural, =0{Chromium OS startes på nytt nå}=1{Chromium OS startes på nytt om 1 sekund}other{Chromium OS startes på nytt om # sekunder}}</translation>
 <translation id="8619360774459241877">Starter Chromium ...</translation>
 <translation id="8621669128220841554">Installeringen mislyktes på grunn av en uspesifisert feil. Last ned Chromium på nytt.</translation>
 <translation id="8628626585870903697">Chromium omfatter ikke PDF-visningsprogrammet som er nødvendig for at «Forhåndsvisning av utskrift» skal fungere.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 94405328..7d06f02 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">ስምረት እና ግላዊነት ማላበስ</translation>
 <translation id="1398853756734560583">አስፋ</translation>
 <translation id="1399511500114202393">ምንም የተጠቃሚ እውቅና ማረጋገጫ የለም</translation>
+<translation id="1401165786814632797">የእርስዎ መሣሪያ ንቁ በሚህንበት እና ክፍት ሲሆን እርስዎ «Ok Google» በሚሉበት ማናቸውም ጊዜ ረዳትዎን ይድረሱበት።</translation>
 <translation id="140250605646987970">የእርስዎ ስልክ ተገኝቷል። ነገር ግን Smart Lock Android 5.0 እና ከዚያ በላይ ካላቸው መሣሪያዎች ጋር ብቻ ይሰራል። &lt;a&gt;የበለጠ ለመረዳት&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (ክትትል የሚደረግበት)</translation>
 <translation id="1405476660552109915"><ph name="PASSWORD_MANAGER_BRAND" /> ለዚህ ጣቢያ ይለፍ ቃልዎን እንዲያስቀምጥልዎ ይፈልጋሉ?</translation>
@@ -1370,6 +1371,7 @@
 <translation id="3031557471081358569">ከውጪ ለማስመጣት ንጥሎችን ምረጥ፦</translation>
 <translation id="3031601332414921114">ማተምን ካቆምክበት ቀጥል</translation>
 <translation id="303198083543495566">ጂኦግራፊ</translation>
+<translation id="3033999583152214331">የLinux መሣሪያዎች፣ አርታዒዎች፣ እና IDEዎች በእርስዎ Chromebook ላይ ያሂዱ። &lt;a target="_blank" href="<ph name="URL" />"&gt;የበለጠ ለመረዳት&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Flashን አንቃ</translation>
 <translation id="3037754279345160234">ጎራውን ለመቀላቀል ውቅረቱን መተንተን አልተቻለም። እባክዎ የእርስዎን አስተዳዳሪ ያነጋግሩ።</translation>
 <translation id="3038612606416062604">አታሚን ራስዎ ያክሉ</translation>
@@ -1510,6 +1512,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> መገናኘት ይፈልጋል</translation>
 <translation id="3274763671541996799">አሁን ወደ ሙሉ ማያ ገጽ ሄደዋል።</translation>
 <translation id="3275778913554317645">እንደ መስኮት ክፈት</translation>
+<translation id="3278877214895457897">የእርስዎ Chromebook ሲዋቀር በማንኛውም ጊዜ ከረዳትዎ እገዛን ለማግኘት የረዳት አዝራሩን ይጫኑ ወይም «Ok Google» ይበሉ።</translation>
 <translation id="3279230909244266691">ይህ ሂደት ጥቂት ደቂቃዎች ሊወስድ ይችላል። ምናባዊ ማሽኑን በመጀመር ላይ።</translation>
 <translation id="3279741024917655738">የሙሉ ገጽ ዕይታ ቪዲዮዎችን አሳይ በርቷል</translation>
 <translation id="3280237271814976245">አስቀምጥ &amp;እንደ…</translation>
@@ -2164,7 +2167,6 @@
 <translation id="4275830172053184480">መሣሪያዎን ዳግም ያስጀምሩ</translation>
 <translation id="4278101229438943600">የእርስዎ ረዳት ዝግጁ ነው</translation>
 <translation id="4278390842282768270">ተፈቅዷል</translation>
-<translation id="4280864916190672950">መጫን አቁም</translation>
 <translation id="4281844954008187215">የአግልግሎት ውል</translation>
 <translation id="4282196459431406533">Smart Lock በርቷል</translation>
 <translation id="4284105660453474798">እርግጠኛ ነዎት «$1»ን መሰረዝ ይፈልጋሉ?</translation>
@@ -2602,6 +2604,7 @@
 <translation id="4992066212339426712">ድምጸ-ከል አንሳ</translation>
 <translation id="4992458225095111526">Powerwashን ያረጋግጡ</translation>
 <translation id="4992473555164495036">የእርስዎ አስተዳዳሪ ሊገኙ የሚችሉትን የግቤት ዘዴዎች ገድቧቸዋል።</translation>
+<translation id="4992926179187649719">«Ok Google»ን ያብሩ</translation>
 <translation id="4994474651455208930">ጣቢያዎች ለፕሮቶኮሎች ነባሪ ከዋኞች እንዲሆኑ እንዲጠይቁ ፍቀድ</translation>
 <translation id="4994754230098574403">በማዋቀር ላይ</translation>
 <translation id="4996978546172906250">ያጋሩ በ</translation>
@@ -3433,7 +3436,6 @@
 <translation id="6231881193380278751">ገጹን በራስ-ለማደስ በዩአርኤል ውስጥ የመጠይቅ ልኬት ያክሉ፦ chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">ባትሪ</translation>
 <translation id="6232116551750539448">ወደ <ph name="NAME" /> ግንኙነት ጠፍቷል</translation>
-<translation id="6235700927623181151">ይህ ትር የእርስዎን የዴስክቶፕ ይዘት በማጋራት ላይ ነው።</translation>
 <translation id="6237816943013845465">የእርስዎን ማያ ገጽ ምስል ጥራት እንዲቀይሩ ያስችልዎታል</translation>
 <translation id="6238923052227198598">በማያ ገጽ መቆለፊያ ላይ የቅርብ ጊዜውን ማስታወሻ አቆይ</translation>
 <translation id="6239558157302047471">&amp;ክፈፍን ዳግም ጫን</translation>
@@ -4530,6 +4532,7 @@
 <translation id="7908378463497120834">ይቅርታ፣ ቢያንስ አንድ በውጫዊ ማከማቻዎ ላይ ያለ ክፍልፍል ሊፈናጠጥ አልቻለም።</translation>
 <translation id="7909969815743704077">በIncognito ውስጥ የወረደ</translation>
 <translation id="7910768399700579500">&amp;አዲስ አቃፊ</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">የእርስዎ የይለፍ ቃል በአገልጋዩ ላይ ተቀይሯል። እባክዎ ዘግተው ይውጡና እንደገና ይግቡ።</translation>
 <translation id="7915471803647590281">ግብረ መልሱን ከመላክዎ በፊት እባክዎ ምን እየተከሰተ እንደሆነ ይንገሩን።</translation>
 <translation id="7916556741383518510">ጠቅ ሲደረግ</translation>
@@ -4819,7 +4822,6 @@
 <translation id="8366396658833131068">የአውታረ መረብ ግንኙነትዎ ወደነበረበት ተመልሷል። እባክዎ የተለየ አውታረ መረብ ይምረጡ ወይም የኪዮስክ መተግበሪያዎን ለማስጀመር «ቀጥል»ን ይጫኑ።</translation>
 <translation id="8366947248864804596">የእርስዎ ስልክ ሲከፈት እና በአቅራቢያ ሲሆን ለመክፈት ይምረጡ ብቻ። አለበለዚያ የእርስዎን የይለፍ ቃል ወይም ፒን ያስገቡ።</translation>
 <translation id="8368859634510605990">&amp;ሁሉንም እልባቶች ክፈት</translation>
-<translation id="8369547389711988632">መጫን አቁሟል</translation>
 <translation id="8371695176452482769">አሁን ይናገሩ</translation>
 <translation id="8372369524088641025">መጥፎ የWEP ቁልፍ</translation>
 <translation id="8373553483208508744">ትሮች ላይ ድምጸ-ከል ያድርጉ</translation>
@@ -5025,7 +5027,6 @@
 <translation id="8677212948402625567">ሁሉንም ሰብስብ...</translation>
 <translation id="8678648549315280022">የአውርድ ቅንብሮችን ያስተዳድሩ...</translation>
 <translation id="8678933587484842200">ይህ መተግበሪያ እንዴት እንዲጀምር ይፈልጋሉ?</translation>
-<translation id="8679788109894721265">ይህ ገጽ ከ<ph name="MEGABYTES" /> ሜባ በላይ ይጠቀማል</translation>
 <translation id="8680251145628383637">የእርስዎን ዕልባቶች፣ ታሪክ፣ የይለፍ ቃሎች እና ሌሎች ቅንብሮች በሁሉም መሣሪያዎችዎ ላይ ለማግኘት በመለያ ይግቡ። እንዲሁም በራስ-ሰር ወደ የእርስዎ Google አገልግሎቶች እንዲገቡ ይደረጋሉ።</translation>
 <translation id="8686213429977032554">ይህ የDrive ፋይል ገና አልተጋራም</translation>
 <translation id="8687485617085920635">ቀጣይ መስኮት</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index ff38bc92..00e5164 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">المزامنة والتخصيص</translation>
 <translation id="1398853756734560583">تكبير</translation>
 <translation id="1399511500114202393">لا توجد شهادة مستخدم.</translation>
+<translation id="1401165786814632797">‏يمكنك الوصول إلى "المساعد" في أي وقت تقول فيه "OK Google" عندما يكون جهازك نشطًا وتم إلغاء قفله.</translation>
 <translation id="140250605646987970">‏تم العثور على هاتفك. لكن لا يعمل Smart Lock إلا على الأجهزة التي تعمل بنظام تشغيل Android 5.0 أو اعلى. &lt;a&gt;‬‏‫مزيد من المعلومات&lt;/a&gt;</translation>
 <translation id="140520891692800925">(خاضع للإدارة) <ph name="PROFILE_DISPLAY_NAME" /></translation>
 <translation id="1405476660552109915">هل تريد من <ph name="PASSWORD_MANAGER_BRAND" /> حفظ حسابك لهذا الموقع؟</translation>
@@ -1369,6 +1370,7 @@
 <translation id="3031557471081358569">اختيار العناصر المراد استيرادها:</translation>
 <translation id="3031601332414921114">استئناف الطباعة</translation>
 <translation id="303198083543495566">الجغرافيا</translation>
+<translation id="3033999583152214331">‏يمكنك تشغيل أدوات Linux، وأدوات التحرير وبرامج IDE على جهازChromebook. &lt;a target="_blank" href="<ph name="URL" />"&gt;مزيد من المعلومات&lt;/a&gt;</translation>
 <translation id="3036546437875325427">‏تفعيل Flash</translation>
 <translation id="3037754279345160234">يتعذَّر تحليل الإعداد لضمّ النطاق. يُرجى الاتصال بمشرفك.</translation>
 <translation id="3038612606416062604">إضافة طابعة يدويًا</translation>
@@ -1509,6 +1511,7 @@
 <translation id="3271648667212143903">يريد <ph name="ORIGIN" /> الاتصال</translation>
 <translation id="3274763671541996799">تم الانتقال إلى وضع ملء الشاشة.</translation>
 <translation id="3275778913554317645">فتح كنافذة</translation>
+<translation id="3278877214895457897">‏عند إعداد جهاز Chromebook، يُرجى الضغط على زر "المساعد" أو قول "OK Google" للحصول على المساعدة من "المساعد" في أي وقت.</translation>
 <translation id="3279230909244266691">قد تستغرق هذه العملية بضع دقائق. جارٍ بدء الآلة الافتراضية.</translation>
 <translation id="3279741024917655738">عرض الفيديوهات بملء الشاشة على</translation>
 <translation id="3280237271814976245">الحفظ &amp;باسم...</translation>
@@ -2161,7 +2164,6 @@
 <translation id="4275830172053184480">إعادة تشغيل جهازك</translation>
 <translation id="4278101229438943600">المساعد جاهز</translation>
 <translation id="4278390842282768270">مسموح بها</translation>
-<translation id="4280864916190672950">إيقاف التحميل</translation>
 <translation id="4281844954008187215">شروط الخدمة</translation>
 <translation id="4282196459431406533">‏Smart Lock قيد التشغيل</translation>
 <translation id="4284105660453474798">هل تريد فعلًا حذف "$1"؟</translation>
@@ -2599,6 +2601,7 @@
 <translation id="4992066212339426712">إعادة الصوت</translation>
 <translation id="4992458225095111526">‏تأكيد Powerwash</translation>
 <translation id="4992473555164495036">لقد قيّد المشرف طرق الإدخال المتاحة.</translation>
+<translation id="4992926179187649719">‏تفعيل "Ok Google"</translation>
 <translation id="4994474651455208930">السماح للمواقع بأن تطلب أن تصبح معالجات تلقائية للبروتوكولات</translation>
 <translation id="4994754230098574403">الإعداد</translation>
 <translation id="4996978546172906250">مشاركة عن طريق</translation>
@@ -3431,7 +3434,6 @@
 <translation id="6231881193380278751">‏أضف معلمة طلب بحث في عنوان URL لإجراء تحديث تلقائي لصفحة: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">البطارية</translation>
 <translation id="6232116551750539448">انقطع الاتصال بـ <ph name="NAME" /></translation>
-<translation id="6235700927623181151">تشارك علامة التبويب هذه محتوى سطح المكتب.</translation>
 <translation id="6237816943013845465">تسمح لك بضبط دقة الشاشة</translation>
 <translation id="6238923052227198598">إبقاء آخر ملاحظة على شاشة التأمين</translation>
 <translation id="6239558157302047471">إعادة تحميل الإطار</translation>
@@ -4529,6 +4531,7 @@
 <translation id="7908378463497120834">عذرًا، تعذر تركيب جزء واحد على الأقل من جهاز سعة التخزين الخارجية.</translation>
 <translation id="7909969815743704077">تم التحميل في وضع التصفح المتخفي</translation>
 <translation id="7910768399700579500">م&amp;جلّد جديد</translation>
+<translation id="7911118814695487383">‏نظام التشغيل Linux</translation>
 <translation id="7912080627461681647">تم تغيير كلمة المرور على الخادم. يُرجى الخروج ثم تسجيل الدخول مجددًا.</translation>
 <translation id="7915471803647590281">يُرجى إخبارنا بما يحدث قبل إرسال التعليقات.</translation>
 <translation id="7916556741383518510">عند النقر</translation>
@@ -4813,7 +4816,6 @@
 <translation id="8366396658833131068">تمت استعادة اتصال الشبكة. يُرجى تحديد شبكة أخرى أو الضغط على الزر "متابعة" أدناه لتشغيل تطبيق الكشك.</translation>
 <translation id="8366947248864804596">عندما يكون هاتفك غير مقفل وقريب، ما عليك سوى تحديد إلغاء القفل. أو يمكنك إدخال كلمة المرور أو رقم التعريف الشخصي التابع لك.</translation>
 <translation id="8368859634510605990">&amp;فتح كل الإشارات المرجعية</translation>
-<translation id="8369547389711988632">تم إيقاف التحميل</translation>
 <translation id="8371695176452482769">تحدث الآن</translation>
 <translation id="8372369524088641025">‏مفتاح WEP غير صالح</translation>
 <translation id="8373553483208508744">تجاهل علامات التبويب</translation>
@@ -5019,7 +5021,6 @@
 <translation id="8677212948402625567">تصغير الكل...</translation>
 <translation id="8678648549315280022">إدارة إعدادات التنزيل...</translation>
 <translation id="8678933587484842200">كيف تريد بدء عمل هذا التطبيق؟</translation>
-<translation id="8679788109894721265">تستخدم هذه الصفحة مساحة تزيد عن <ph name="MEGABYTES" />ميغابايت</translation>
 <translation id="8680251145628383637">‏سجّل الدخول للحصول على الإشارات المرجعية، والسجل، وكلمات المرور، والإعدادات الأخرى على جميع أجهزتك. سيتم أيضًا تسجيل دخولك تلقائيًا إلى خدمات Google.</translation>
 <translation id="8686213429977032554">‏لم تتم مشاركة ملف Drive هذا بعد</translation>
 <translation id="8687485617085920635">النافذة التالية</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index b11e691..2cee550 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Синхронизиране и персонализиране</translation>
 <translation id="1398853756734560583">Увеличаване</translation>
 <translation id="1399511500114202393">Няма потребителски сертификат</translation>
+<translation id="1401165786814632797">Осъществявайте достъп до Асистент всеки път, когато кажете „Ok Google“ и устройството ви е активно и отключено.</translation>
 <translation id="140250605646987970">Телефонът ви бе намерен, но Smart Lock работи само на устройства с Android 5.0 и по-нови версии. &lt;a&gt;Научете повече&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (контролиран потребител)</translation>
 <translation id="1405476660552109915">Искате ли <ph name="PASSWORD_MANAGER_BRAND" /> да запази профила ви за този сайт?</translation>
@@ -1367,6 +1368,7 @@
 <translation id="3031557471081358569">Изберете елементи за импортиране:</translation>
 <translation id="3031601332414921114">Възобновяване на отпечатването</translation>
 <translation id="303198083543495566">Географско положение</translation>
+<translation id="3033999583152214331">Изпълнявайте инструменти, редактори и интегрирани среди за програмиране за Linux на своя Chromebook. &lt;a target="_blank" href="<ph name="URL" />"&gt;Научете повече&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Активиране на Flash</translation>
 <translation id="3037754279345160234">Конфигурацията за присъединяване към домейна не може да бъде анализирана синтактично. Моля, свържете се с администратора.</translation>
 <translation id="3038612606416062604">Ръчно добавяне на принтер</translation>
@@ -1507,6 +1509,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> иска да се свърже</translation>
 <translation id="3274763671541996799">Използвате цял екран.</translation>
 <translation id="3275778913554317645">Отваряне като прозорец</translation>
+<translation id="3278877214895457897">Когато вашият Chromebook бъде настроен, натиснете бутона за Асистент или кажете „Ok Google“, за да получите помощ от Асистент по всяко време.</translation>
 <translation id="3279230909244266691">Това може да отнеме няколко минути. Виртуалната машина стартира.</translation>
 <translation id="3279741024917655738">Показване на видеоклиповете на цял екран</translation>
 <translation id="3280237271814976245">&amp;Запазване като...</translation>
@@ -2165,7 +2168,6 @@
 <translation id="4275830172053184480">Рестартиране на устройството ви</translation>
 <translation id="4278101229438943600">Асистент е в готовност</translation>
 <translation id="4278390842282768270">Разрешено</translation>
-<translation id="4280864916190672950">Спиране на зареждането</translation>
 <translation id="4281844954008187215">Условия за ползване</translation>
 <translation id="4282196459431406533">Функцията Smart Lock е включена</translation>
 <translation id="4284105660453474798">Наистина ли искате да изтриете „$1“?</translation>
@@ -2603,6 +2605,7 @@
 <translation id="4992066212339426712">Включване на звука</translation>
 <translation id="4992458225095111526">Потвърждаване на извършването на Powerwash</translation>
 <translation id="4992473555164495036">Администраторът ви е ограничил наличните методи на въвеждане.</translation>
+<translation id="4992926179187649719">Включване на „Ok Google“</translation>
 <translation id="4994474651455208930">Разрешаване на питания от сайтове дали да са манипулаторите по подразбиране за протоколите</translation>
 <translation id="4994754230098574403">Настройва се</translation>
 <translation id="4996978546172906250">Споделяне чрез</translation>
@@ -3436,7 +3439,6 @@
 <translation id="6231881193380278751">За да се опреснява страницата автоматично, добавете към URL адреса параметър на заявката: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Батерия</translation>
 <translation id="6232116551750539448">Връзката с/ъс <ph name="NAME" /> прекъсна</translation>
-<translation id="6235700927623181151">Този раздел споделя съдържанието на работния ви плот.</translation>
 <translation id="6237816943013845465">Позволява ви да коригирате разделителната способност на екрана</translation>
 <translation id="6238923052227198598">Запазване на най-новата бележка на заключения екран</translation>
 <translation id="6239558157302047471">Презареждане на рамката</translation>
@@ -4533,6 +4535,7 @@
 <translation id="7908378463497120834">За съжаление поне един дял на външното ви устройство за съхранение не можа да бъде свързан.</translation>
 <translation id="7909969815743704077">Изтеглено в режим „инкогнито“</translation>
 <translation id="7910768399700579500">&amp;Нова папка</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Паролата ви е променена в сървъра. Моля, излезте от профила си и влезте отново в него.</translation>
 <translation id="7915471803647590281">Моля, кажете ни какво става, преди да изпратите отзивите.</translation>
 <translation id="7916556741383518510">При кликване</translation>
@@ -4817,7 +4820,6 @@
 <translation id="8366396658833131068">Връзката ви с мрежата е възстановена. Моля, изберете друга мрежа или натиснете бутона „Напред“ по-долу, за да стартирате павилионното си приложение.</translation>
 <translation id="8366947248864804596">Когато телефонът ви е отключен и е наблизо, трябва само да го изберете, за да отключите устройството си. В противен случай въведете паролата или ПИН кода си.</translation>
 <translation id="8368859634510605990">&amp;Отваряне на всички отметки</translation>
-<translation id="8369547389711988632">Спряхте зареждането</translation>
 <translation id="8371695176452482769">Говорете сега</translation>
 <translation id="8372369524088641025">Ключът за WEP е неправилен</translation>
 <translation id="8373553483208508744">Спиране на звука на разделите</translation>
@@ -5023,7 +5025,6 @@
 <translation id="8677212948402625567">Свиване на всички...</translation>
 <translation id="8678648549315280022">Управление на настройките за изтегляне...</translation>
 <translation id="8678933587484842200">Как искате да се стартира това приложение?</translation>
-<translation id="8679788109894721265">Тази страница използва над <ph name="MEGABYTES" /> МБ</translation>
 <translation id="8680251145628383637">Влезте в профила си, за да получите своите отметки, история, пароли и други настройки на всичките си устройства. Също така ще влезете автоматично в използваните от вас услуги на Google.</translation>
 <translation id="8686213429977032554">Този файл в Диск още не е споделен</translation>
 <translation id="8687485617085920635">Следващ прозорец</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 10accf9..9e21d711 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1469,7 +1469,7 @@
 <translation id="3194737229810486521"><ph name="URL" /> স্থায়ীভাবে আপনার ডিভাইসে ডেটা স্টোর করতে চায়</translation>
 <translation id="3199127022143353223">সার্ভারসমূহ</translation>
 <translation id="3202131003361292969">পাথ</translation>
-<translation id="3202173864863109533">এই ট্যাবের অডিও নিঃশব্দ করা হচ্ছে৷</translation>
+<translation id="3202173864863109533">এই ট্যাবের অডিও মিউট করা হচ্ছে৷</translation>
 <translation id="3206175707080061730">"$1" নামের একটি ফাইল ইতিমধ্যেই বিদ্যমান৷ আপনি কি এটি প্রতিস্থাপন করতে চান?</translation>
 <translation id="3208703785962634733">অনিশ্চিত</translation>
 <translation id="3213187967168344806">প্রিন্টার যোগ করা যাচ্ছে না। কম্পিউটার রিস্টার্ট করে আবার চেষ্টা করুন।</translation>
@@ -1680,7 +1680,7 @@
 <translation id="3528498924003805721">শর্টকাট লক্ষ্যগুলি</translation>
 <translation id="3530305684079447434">আপনার সব ডিভাইসে আপনার বুকমার্কগুলি পেতে, <ph name="SIGN_IN_LINK" />।</translation>
 <translation id="3532844647053365774"><ph name="HOST" /> আপনার মাইক্রোফোন ব্যবহার করতে চায়</translation>
-<translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - অডিও নিঃশব্দ রয়েছে</translation>
+<translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - অডিও মিউট রয়েছে</translation>
 <translation id="3534879087479077042">একজন তত্ত্বাবধানে থাকা ব্যবহারকারী কি?</translation>
 <translation id="3538066758857505094">Linux আনইনস্টল করতে সমস্যা হচ্ছে। আবার চেষ্টা করুন।</translation>
 <translation id="354060433403403521">AC অ্যাডপ্টার</translation>
@@ -2163,7 +2163,6 @@
 <translation id="4275830172053184480">আপনার ডিভাইস বন্ধ করে চালু করুন</translation>
 <translation id="4278101229438943600">আপনার অ্যাসিস্ট্যান্ট প্রস্তুত</translation>
 <translation id="4278390842282768270">মঞ্জুরিপ্রাপ্ত</translation>
-<translation id="4280864916190672950">লোড করা বন্ধ করুন</translation>
 <translation id="4281844954008187215">পরিষেবার শর্তাদি</translation>
 <translation id="4282196459431406533">Smart Lock চালু আছে</translation>
 <translation id="4284105660453474798">আপনি কি "$1" মুছতে চান?</translation>
@@ -2430,7 +2429,7 @@
 <translation id="473546211690256853">এই অ্যাকাউন্টটি <ph name="DOMAIN" /> দ্বারা পরিচালিত</translation>
 <translation id="4737715515457435632">দয়া করে একটি নেটওয়ার্কে সংযোগ করুন</translation>
 <translation id="473775607612524610">আপডেট</translation>
-<translation id="474217410105706308">ট্যাব নিঃশব্দ করুন</translation>
+<translation id="474217410105706308">ট্যাব মিউট করুন</translation>
 <translation id="4742746985488890273">শেল্ফে পিন করুন</translation>
 <translation id="4743260470722568160"><ph name="BEGIN_LINK" />অ্যাপ্লিকেশন কীভাবে আপডেট করতে হয় তা জানুন<ph name="END_LINK" /></translation>
 <translation id="4746971725921104503">দেখে মনে হচ্ছে আপনি ইতিমধ্যে এই নাম দিয়ে একটি ব্যবহারকারীকে পরিচালনা করছেন৷ আপনি কি  <ph name="LINK_START" /> <ph name="USER_DISPLAY_NAME" /> এই ডিভাইসে আমদানি করতে চান<ph name="LINK_END" />?</translation>
@@ -2781,7 +2780,7 @@
 <translation id="5271549068863921519">পাসওয়ার্ড সেভ করুন</translation>
 <translation id="5275352920323889391">কুকুর</translation>
 <translation id="5275973617553375938">Google ড্রাইভ থেকে উদ্ধার করা ফাইলগুলি</translation>
-<translation id="527605719918376753">ট্যাব নিঃশব্দ করুন</translation>
+<translation id="527605719918376753">ট্যাব মিউট করুন</translation>
 <translation id="527605982717517565">সর্বদা <ph name="HOST" />-এ JavaScript মঞ্জুর করুন</translation>
 <translation id="5280426389926346830">শর্টকাট তৈরি করবেন?</translation>
 <translation id="528208740344463258">Android অ্যাপ ডাউনলোড এবং ব্যবহার করার জন্য প্রথমে আপনাকে এই প্রয়োজনীয় আপডেটটি ইনস্টল করা করতে হবে। আপনার <ph name="DEVICE_TYPE" /> আপডেট হওয়ার সময়, আপনি এটি ব্যবহার করতে পারবেন না। ইনস্টলেশন শেষ হওয়ার পরে, আপনার <ph name="DEVICE_TYPE" /> পুনরায় চালু করা হবে।</translation>
@@ -3139,7 +3138,7 @@
 <translation id="5782227691023083829">অনুবাদ হচ্ছে...</translation>
 <translation id="5783221160790377646">একটি ত্রুটির কারণে, তত্ত্বাবধানে থাকা ব্যবহারকারী তৈরি করা হয়নি৷ দয়া করে পরে আবার চেষ্টা করুন৷</translation>
 <translation id="5783602409389152506">ডিভাইসগুলির জন্য যখন স্ক্যান করা হচ্ছে...</translation>
-<translation id="57838592816432529">নিঃশব্দ করুন</translation>
+<translation id="57838592816432529">মিউট করুন</translation>
 <translation id="5785583009707899920">Chrome ফাইল ইউটিলিটি</translation>
 <translation id="5787146423283493983">কী চুক্তি</translation>
 <translation id="5788127256798019331">Play ফাইল</translation>
@@ -3433,7 +3432,6 @@
 <translation id="6231881193380278751">পৃষ্ঠাটি অটো-রিফ্রেশ করতে URL এ কোনো ক্যোয়ারী পারাম যোগ করুন: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">ব্যাটারি: %</translation>
 <translation id="6232116551750539448"><ph name="NAME" /> এর সাথে সংযোগ বিচ্ছিন্ন হয়েছে</translation>
-<translation id="6235700927623181151">এই ট্যাবটি আপনার ডেস্কটপ কন্টেন্ট শেয়ার করছে।</translation>
 <translation id="6237816943013845465">আপনাকে আপনার স্ক্রিন রেজোলিউশন পরিবর্তন করতে অনুমতি দেয়</translation>
 <translation id="6238923052227198598">লেটেস্ট নোটটি লক স্ক্রিনে রাখুন</translation>
 <translation id="6239558157302047471">আবার লোড করার &amp;ফ্রেম</translation>
@@ -3833,7 +3831,7 @@
 <translation id="6840184929775541289">একটি শংসাপত্র কর্তৃপক্ষ নয়</translation>
 <translation id="6840313690797192085">$১ PB</translation>
 <translation id="6841186874966388268">ত্রুটিগুলি</translation>
-<translation id="6843725295806269523">নিঃশব্দ</translation>
+<translation id="6843725295806269523">মিউট</translation>
 <translation id="6845038076637626672">সর্বাধিক খুলুন</translation>
 <translation id="685040365210406336">কোনও পরিবর্তন করবেন না</translation>
 <translation id="6851497530878285708">অ্যাপ সক্ষম করা হয়েছে</translation>
@@ -4813,10 +4811,9 @@
 <translation id="8366396658833131068">আপনার নেটওয়ার্ক সংযোগের পুনঃস্থাপন করা হয়েছে৷ আপনার কিয়স্ক অ্যাপ্লিকেশান লঞ্চ করার জন্য দয়া করে একটি ভিন্ন নেটওয়ার্ক বেছে নিন অথবা নীচের 'অবিরত থাকুন' বোতাম টিপুন৷</translation>
 <translation id="8366947248864804596">আপনার ফোন কাছাকাছি আনলক করা থাকলে আনলক বেছে নিন। অথবা আপনার পাসওয়ার্ড বা পিন লিখুন।</translation>
 <translation id="8368859634510605990">&amp;সকল বুকমার্ক খুলুন</translation>
-<translation id="8369547389711988632">লোড করা বন্ধ করা হচ্ছে</translation>
 <translation id="8371695176452482769">এখনই বলুন</translation>
 <translation id="8372369524088641025">খারাপ WEP কী</translation>
-<translation id="8373553483208508744">ট্যাবগুলি নিঃশব্দ করুন</translation>
+<translation id="8373553483208508744">ট্যাবগুলি মিউট করুন</translation>
 <translation id="8382913212082956454">&amp;ইমেল ঠিকানা কপি করুন</translation>
 <translation id="8386903983509584791">স্ক্যান করা সম্পন্ন হয়েছে</translation>
 <translation id="8389492867173948260">আপনার দেখা ওয়েবসাইটে আপনার সমস্ত ডেটা পড়ার এবং পরিবর্তন করার জন্য এই এক্সটেনশনটিকে অনুমতি দিন:</translation>
@@ -5019,7 +5016,6 @@
 <translation id="8677212948402625567">সকল সঙ্কোচন করুন...</translation>
 <translation id="8678648549315280022">ডাউনলোড সেটিংস পরিচালনা করুন...</translation>
 <translation id="8678933587484842200">আপনি কীভাবে এই অ্যাপটি চালু করতে চান?</translation>
-<translation id="8679788109894721265">এই পৃষ্ঠাটি <ph name="MEGABYTES" />এমবি এর তুলনায় বেশি ডেটা ব্যবহার করেছে</translation>
 <translation id="8680251145628383637">আপনার সকল ডিভাইসে আপনার বুকমার্ক, ইতিহাস এবং অন্যান্য সেটিংস পেতে প্রবেশ করুন। এছাড়াও আপনি স্বয়ংক্রিয়ভাবে আপনার Google পরিষেবায় প্রবেশ করুন করবেন।</translation>
 <translation id="8686213429977032554">এই ড্রাইভ ফাইল এখনো শেয়ার করা হয়নি</translation>
 <translation id="8687485617085920635">পরবর্তী উইন্ডো</translation>
@@ -5252,7 +5248,7 @@
 <translation id="9038430547971207796">পরের বার, আপনার ফোন থেকে নিজের <ph name="DEVICE_TYPE" /> আনলক করতে পারবেন। সেটিংসে গিয়ে Smart Lock বন্ধ করুন।</translation>
 <translation id="9038649477754266430">পৃষ্ঠা আরও দ্রুত লোড করার জন্য কোনো পূর্বাভাষ পরিষেবা ব্যবহার করুন</translation>
 <translation id="9039663905644212491">PEAP</translation>
-<translation id="9039890312082871605">ট্যাবগুলি নিঃশব্দ করুন</translation>
+<translation id="9039890312082871605">ট্যাবগুলি মিউট করুন</translation>
 <translation id="9040661932550800571"><ph name="ORIGIN" />-এর জন্য পাসওয়ার্ড আপডেট করবেন?</translation>
 <translation id="9041692268811217999">আপনার মেশিনে স্থানীয় ফাইলগুলিতে অ্যাক্সেস আপনার প্রশাসক বন্ধ করেছেন</translation>
 <translation id="9042893549633094279">গোপনীয়তা এবং নিরাপত্তা</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 94b65ab..17a4254e6 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Sincronització i personalització</translation>
 <translation id="1398853756734560583">Maximitza</translation>
 <translation id="1399511500114202393">Sense certificat d'usuari</translation>
+<translation id="1401165786814632797">Accedeix a l'Assistent en qualsevol moment dient "Ok Google" amb el dispositiu actiu i desbloquejat.</translation>
 <translation id="140250605646987970">Hem trobat el telèfon, però Smart Lock només funciona en dispositius amb Android 5.0 o una versió posterior. &lt;a&gt;Més informació&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (supervisat)</translation>
 <translation id="1405476660552109915">Voleu que <ph name="PASSWORD_MANAGER_BRAND" /> desi el vostre compte per a aquest lloc?</translation>
@@ -1509,6 +1510,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> es vol connectar</translation>
 <translation id="3274763671541996799">Heu activat el mode de pantalla completa.</translation>
 <translation id="3275778913554317645">Obre com a finestra</translation>
+<translation id="3278877214895457897">Quan el dispositiu Chromebook estigui configurat, prem el botó de l'Assistent o digues "Ok Google" per obtenir ajuda de l'Assistent en qualsevol moment.</translation>
 <translation id="3279230909244266691">Aquest procés pot tardar uns quants minuts. S'està iniciant la màquina virtual.</translation>
 <translation id="3279741024917655738">Mostra els vídeos en pantalla completa a</translation>
 <translation id="3280237271814976245">Desa &amp;com a...</translation>
@@ -2163,7 +2165,6 @@
 <translation id="4275830172053184480">Reinici del dispositiu</translation>
 <translation id="4278101229438943600">L'Assistent està a punt</translation>
 <translation id="4278390842282768270">Permès</translation>
-<translation id="4280864916190672950">Atura la càrrega</translation>
 <translation id="4281844954008187215">Termes i condicions</translation>
 <translation id="4282196459431406533">Smart Lock està activat</translation>
 <translation id="4284105660453474798">Confirmes que vols suprimir  "$1"?</translation>
@@ -2602,6 +2603,7 @@
 <translation id="4992066212339426712">Activa el so</translation>
 <translation id="4992458225095111526">Confirmació de Powerwash</translation>
 <translation id="4992473555164495036">L'administrador ha limitat els mètodes d'entrada disponibles.</translation>
+<translation id="4992926179187649719">Activa "Ok Google"</translation>
 <translation id="4994474651455208930">Permet que els llocs sol·licitin convertir-se en gestors predeterminats de protocols</translation>
 <translation id="4994754230098574403">S'està configurant</translation>
 <translation id="4996978546172906250">Compartir mitjançant</translation>
@@ -3169,7 +3171,7 @@
 <translation id="5832805196449965646">Afegeix una persona</translation>
 <translation id="583281660410589416">Desconegut</translation>
 <translation id="5832976493438355584">Bloquejat</translation>
-<translation id="5833397272224757657">Utilitza el contingut dels llocs web que visites, així com l'activitat i les interaccions del navegador per oferir una experiència personalitzada.</translation>
+<translation id="5833397272224757657">Utilitza el contingut dels llocs web que visites, així com l'activitat i les interaccions del navegador per oferir una experiència personalitzada</translation>
 <translation id="5833610766403489739">Aquest fitxer s'ha extraviat en algun lloc. Comproveu el paràmetre d'ubicació de les baixades i torneu-ho a provar.</translation>
 <translation id="5833726373896279253">Només el propietari d'aquesta configuració la pot modificar:</translation>
 <translation id="5834581999798853053">Queda cosa de <ph name="TIME" /> minuts</translation>
@@ -3436,7 +3438,6 @@
 <translation id="6231881193380278751">Afegiu un paràmetre de consulta a l'URL per actualitzar la pàgina de manera automàtica: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Bateria</translation>
 <translation id="6232116551750539448">S'ha perdut la connexió amb <ph name="NAME" /></translation>
-<translation id="6235700927623181151">Aquesta pestanya està compartint el contingut del teu escriptori.</translation>
 <translation id="6237816943013845465">Permet ajustar la resolució de pantalla</translation>
 <translation id="6238923052227198598">Mantén la darrera nota a la pantalla de bloqueig</translation>
 <translation id="6239558157302047471">Torna a carregar el &amp;marc</translation>
@@ -4016,7 +4017,7 @@
 <translation id="7127980134843952133">Historial de baixades</translation>
 <translation id="7131040479572660648">Llegir les dades dels llocs <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i <ph name="WEBSITE_3" /></translation>
 <translation id="713122686776214250">Afegeix la pà&amp;gina...</translation>
-<translation id="7133578150266914903">L'administrador està revertint el dispositiu a una versió anterior (<ph name="PROGRESS_PERCENT" />)</translation>
+<translation id="7133578150266914903">L'administrador està canviant la versió del dispositiu a una d'anterior (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="7134098520442464001">Fa el text més petit</translation>
 <translation id="7136694880210472378">Estableix com a predeterminat</translation>
 <translation id="7136984461011502314">Benvingut a <ph name="PRODUCT_NAME" /></translation>
@@ -4530,6 +4531,7 @@
 <translation id="7908378463497120834">Com a mínim una partició del dispositiu d'emmagatzematge extern no s'ha pogut muntar.</translation>
 <translation id="7909969815743704077">S'ha baixat en mode d'incògnit</translation>
 <translation id="7910768399700579500">Carpeta &amp;nova</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">La contrasenya s'ha canviat al servidor. Tanca la sessió i torna-la a iniciar.</translation>
 <translation id="7915471803647590281">Indica'ns el problema abans d'enviar els comentaris.</translation>
 <translation id="7916556741383518510">En fer clic</translation>
@@ -4814,7 +4816,6 @@
 <translation id="8366396658833131068">S'ha restablert la vostra connectivitat de xarxa. Seleccioneu una altra xarxa o bé premeu el botó Continua per iniciar l'aplicació de quiosc.</translation>
 <translation id="8366947248864804596">Si el telèfon està desbloquejat i és a prop, selecciona l'opció per desbloquejar. En cas contrari, introdueix la contrasenya o el PIN.</translation>
 <translation id="8368859634510605990">&amp;Obre totes les adreces d'interès</translation>
-<translation id="8369547389711988632">S'ha aturat la càrrega</translation>
 <translation id="8371695176452482769">Parla ara</translation>
 <translation id="8372369524088641025">Clau WEP no vàlida</translation>
 <translation id="8373553483208508744">Silencia les pestanyes</translation>
@@ -5020,7 +5021,6 @@
 <translation id="8677212948402625567">Redueix-ho tot...</translation>
 <translation id="8678648549315280022">Gestiona la configuració de la baixada...</translation>
 <translation id="8678933587484842200">Com voldries que s'iniciés aquesta aplicació?</translation>
-<translation id="8679788109894721265">Aquesta pàgina fa servir més de <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Inicieu la sessió per tenir les adreces d'interès, l'historial, les contrasenyes i altres opcions en tots els dispositius. A més, iniciareu la sessió automàticament als serveis de Google.</translation>
 <translation id="8686213429977032554">Aquest fitxer de Drive encara no s'ha compartit</translation>
 <translation id="8687485617085920635">Finestra següent</translation>
@@ -5228,7 +5228,7 @@
 <translation id="9009369504041480176">S'està carregant (<ph name="PROGRESS_PERCENT" />%)...</translation>
 <translation id="9011163749350026987">Mostra sempre la icona</translation>
 <translation id="9011178328451474963">Darrera pestanya</translation>
-<translation id="9013707997379828817">L'administrador ha revertit el dispositiu a una versió anterior. Desa els fitxers importants i, després, reinicia el dispositiu. Se'n suprimiran totes les dades.</translation>
+<translation id="9013707997379828817">L'administrador ha canviat la versió del dispositiu a una d'anterior. Desa els fitxers importants i, després, reinicia el dispositiu. Se'n suprimiran totes les dades.</translation>
 <translation id="9014987600015527693">Mostra un altre telèfon</translation>
 <translation id="9018218886431812662">La instal·lació s'ha completat</translation>
 <translation id="901834265349196618">correu electrònic</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index e42ad85..e8fe74cc 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Synchronizace a personalizace</translation>
 <translation id="1398853756734560583">Maximalizovat</translation>
 <translation id="1399511500114202393">Žádný certifikát uživatele</translation>
+<translation id="1401165786814632797">Když je zařízení aktivní a odemknuté, můžete Asistenta kdykoliv aktivovat vyslovením fráze „Ok Google“.</translation>
 <translation id="140250605646987970">Váš telefon byl nalezen. Smart Lock však funguje pouze na zařízeních se systémem Android 5.0 nebo novějším. &lt;a&gt;Další informace&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (dozorovaný)</translation>
 <translation id="1405476660552109915">Chcete, aby aplikace <ph name="PASSWORD_MANAGER_BRAND" /> uložila váš účet pro tyto stránky?</translation>
@@ -1370,6 +1371,7 @@
 <translation id="3031557471081358569">Vyberte položky k importu:</translation>
 <translation id="3031601332414921114">Obnovit tisk</translation>
 <translation id="303198083543495566">Geografická poloha</translation>
+<translation id="3033999583152214331">Spouštějte v Chromebooku nástroje, editory a prostředí IDE pro Linux. &lt;a target="_blank" href="<ph name="URL" />"&gt;Další informace&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Povolit Flash</translation>
 <translation id="3037754279345160234">Konfiguraci přidání do domény nelze analyzovat. Obraťte se na svého administrátora.</translation>
 <translation id="3038612606416062604">Přidat tiskárnu ručně</translation>
@@ -1510,6 +1512,7 @@
 <translation id="3271648667212143903">Web <ph name="ORIGIN" /> žádá o připojení</translation>
 <translation id="3274763671541996799">Přepnuli jste do režimu celé obrazovky.</translation>
 <translation id="3275778913554317645">Otevřít jako okno</translation>
+<translation id="3278877214895457897">Po nastavení Chromebooku získáte pomoc od Asistenta kdykoliv tak, že stisknete tlačítko Asistent nebo řeknete „OK Google“.</translation>
 <translation id="3279230909244266691">Tento proces může trvat několik minut. Probíhá spouštění virtuálního počítače.</translation>
 <translation id="3279741024917655738">Videa na celou stránku zobrazovat na</translation>
 <translation id="3280237271814976245">Uložit &amp;jako...</translation>
@@ -2163,7 +2166,6 @@
 <translation id="4275830172053184480">Restartovat zařízení</translation>
 <translation id="4278101229438943600">Asistent je připraven</translation>
 <translation id="4278390842282768270">Povoleno</translation>
-<translation id="4280864916190672950">Zastavit načítání</translation>
 <translation id="4281844954008187215">Smluvní podmínky</translation>
 <translation id="4282196459431406533">Funkce Smart Lock je zapnutá</translation>
 <translation id="4284105660453474798">Opravdu chcete odstranit soubor $1?</translation>
@@ -2601,6 +2603,7 @@
 <translation id="4992066212339426712">Zapnout zvuk</translation>
 <translation id="4992458225095111526">Potvrdit obnovení pomocí funkce Powerwash</translation>
 <translation id="4992473555164495036">Administrátor omezil dostupné metody zadávání.</translation>
+<translation id="4992926179187649719">Zapnout příkaz „Ok Google“</translation>
 <translation id="4994474651455208930">Povolit dotazy stránek, zda je chcete použít jako výchozí obslužný nástroj protokolů</translation>
 <translation id="4994754230098574403">Nastavování</translation>
 <translation id="4996978546172906250">Sdílet prostřednictvím</translation>
@@ -3432,7 +3435,6 @@
 <translation id="6231881193380278751">Přidejte do adresy URL parametr dotazu pro automatickou aktualizaci stránky: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Baterie</translation>
 <translation id="6232116551750539448">Připojení k síti <ph name="NAME" /> bylo ztraceno</translation>
-<translation id="6235700927623181151">Tato karta sdílí obsah vaší plochy.</translation>
 <translation id="6237816943013845465">Umožňuje upravit rozlišení obrazovky</translation>
 <translation id="6238923052227198598">Zobrazovat poslední poznámku na obrazovce uzamčení</translation>
 <translation id="6239558157302047471">Znovu načíst &amp;rámec</translation>
@@ -4527,6 +4529,7 @@
 <translation id="7908378463497120834">Je nám líto, minimálně jeden oddíl externího paměťového zařízení nelze připojit.</translation>
 <translation id="7909969815743704077">Staženo v anonymním režimu</translation>
 <translation id="7910768399700579500">Nová složka</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Vaše heslo bylo na serveru změněno. Odhlaste se a poté se znovu přihlaste.</translation>
 <translation id="7915471803647590281">Než nám odešlete zpětnou vazbu, sdělte nám prosím, co se děje.</translation>
 <translation id="7916556741383518510">Při kliknutí</translation>
@@ -4811,7 +4814,6 @@
 <translation id="8366396658833131068">Připojení k síti je obnoveno. Vyberte jinou síť nebo stisknutím tlačítka Pokračovat níže spusťte aplikaci kiosku.</translation>
 <translation id="8366947248864804596">Když je telefon odemknut a je poblíž, stačí vybrat možnost odemknutí. Jinak je třeba zadat heslo nebo PIN.</translation>
 <translation id="8368859634510605990">&amp;Otevřít všechny záložky</translation>
-<translation id="8369547389711988632">Načítání bylo zastaveno</translation>
 <translation id="8371695176452482769">Mluvte</translation>
 <translation id="8372369524088641025">Chybný klíč WEP</translation>
 <translation id="8373553483208508744">Vypnout zvuk karet</translation>
@@ -5017,7 +5019,6 @@
 <translation id="8677212948402625567">Sbalit vše...</translation>
 <translation id="8678648549315280022">Spravovat nastavení stahování...</translation>
 <translation id="8678933587484842200">Jak tuto aplikaci chcete spouštět?</translation>
-<translation id="8679788109894721265">Tato stránka používá více než <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Přihlaste se a synchronizujte záložky, historii, hesla a další nastavení do všech svých zařízení. Budete také automaticky přihlášeni do svých služeb Google.</translation>
 <translation id="8686213429977032554">Tento soubor na Disku dosud není sdílen</translation>
 <translation id="8687485617085920635">Další okno</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 5fb183b..164694e 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Synkronisering og tilpasning</translation>
 <translation id="1398853756734560583">Maksimér</translation>
 <translation id="1399511500114202393">Ikke noget brugercertifikat</translation>
+<translation id="1401165786814632797">Få adgang til Google-assistenten, hver gang du siger "Ok Google", når din enhed er tændt og oplåst.</translation>
 <translation id="140250605646987970">Telefonen er fundet. Men Smart Lock virker kun på enheder med Android 5.0 eller nyere. &lt;a&gt;Få flere oplysninger&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (administreret)</translation>
 <translation id="1405476660552109915">Skal <ph name="PASSWORD_MANAGER_BRAND" /> gemme din konto for dette website?</translation>
@@ -1508,6 +1509,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> vil gerne oprette forbindelse</translation>
 <translation id="3274763671541996799">Du er nu i fuld skærm.</translation>
 <translation id="3275778913554317645">Åbn som vindue</translation>
+<translation id="3278877214895457897">Når din Chromebook er konfigureret, kan du til enhver tid trykke på Assistent-knappen eller sige "Ok Google" for at for at få hjælp af Google-assistenten.</translation>
 <translation id="3279230909244266691">Denne proces kan tage et par minutter. Den virtuelle maskine startes.</translation>
 <translation id="3279741024917655738">Se videoer i fuld skærm på</translation>
 <translation id="3280237271814976245">Gem &amp;som...</translation>
@@ -2094,7 +2096,7 @@
 <translation id="4146026355784316281">Åbn altid med systemets visningsprogram</translation>
 <translation id="4146785383423576110">Nulstil, og ryd op</translation>
 <translation id="4147897805161313378">Google Fotos</translation>
-<translation id="4150201353443180367">Visning</translation>
+<translation id="4150201353443180367">Skærm</translation>
 <translation id="4152670763139331043">{NUM_TABS,plural, =1{1 fane}one{# faner}other{# faner}}</translation>
 <translation id="4154664944169082762">Fingeraftryk</translation>
 <translation id="4157869833395312646">Microsoft-kryptering via server</translation>
@@ -2164,7 +2166,6 @@
 <translation id="4275830172053184480">Genstart din enhed</translation>
 <translation id="4278101229438943600">Din Google-assistent er klar</translation>
 <translation id="4278390842282768270">Tilladt</translation>
-<translation id="4280864916190672950">Stop indlæsning</translation>
 <translation id="4281844954008187215">Servicevilkår</translation>
 <translation id="4282196459431406533">Smart Lock er slået til</translation>
 <translation id="4284105660453474798">Er du sikker på, at du vil slette "$1"?</translation>
@@ -2602,6 +2603,7 @@
 <translation id="4992066212339426712">Slå lyden til</translation>
 <translation id="4992458225095111526">Bekræft Powerwash</translation>
 <translation id="4992473555164495036">Din administrator har begrænset de tilgængelige indtastningsmetoder.</translation>
+<translation id="4992926179187649719">Aktivér "Ok Google"</translation>
 <translation id="4994474651455208930">Tillad, at websites beder om at håndtere protokoller som standard</translation>
 <translation id="4994754230098574403">Konfigurerer</translation>
 <translation id="4996978546172906250">Del via</translation>
@@ -3435,7 +3437,6 @@
 <translation id="6231881193380278751">Tilføj en forespørgselsparameter i webadressen for at opdatere siden automatisk: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Batteri</translation>
 <translation id="6232116551750539448">Forbindelsen til <ph name="NAME" /> er afbrudt.</translation>
-<translation id="6235700927623181151">Denne fane deler indholdet fra dit skrivebord.</translation>
 <translation id="6237816943013845465">Giver dig mulighed for at justere skærmopløsningen</translation>
 <translation id="6238923052227198598">Behold den nyeste note på låseskærmen</translation>
 <translation id="6239558157302047471">Genindlæs &amp;ramme</translation>
@@ -4531,6 +4532,7 @@
 <translation id="7908378463497120834">Vi beklager, men der kunne ikke oprettes forbindelse til mindst én partition på enheden.</translation>
 <translation id="7909969815743704077">Downloadet i inkognitotilstand</translation>
 <translation id="7910768399700579500">&amp;Ny mappe</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Din adgangskode er blevet ændret på serveren. Log ud, og log derefter ind igen.</translation>
 <translation id="7915471803647590281">Fortæl os, hvad der sker, inden du sender feedback.</translation>
 <translation id="7916556741383518510">Ved klik</translation>
@@ -4815,7 +4817,6 @@
 <translation id="8366396658833131068">Netværksforbindelsen er genoprettet. Vælg et andet netværk, eller tryk på knappen "Fortsæt" nedenfor for at åbne din terminalapp.</translation>
 <translation id="8366947248864804596">Hvis din telefon er låst op og i nærheden, skal du blot vælge den for at låse op. Hvis ikke, skal du angive din adgangskode eller pinkode.</translation>
 <translation id="8368859634510605990">&amp;Åbn alle bogmærker</translation>
-<translation id="8369547389711988632">Indlæsningen er stoppet</translation>
 <translation id="8371695176452482769">Indtal nu</translation>
 <translation id="8372369524088641025">Ugyldig WEP-nøgle</translation>
 <translation id="8373553483208508744">Slå fanernes lyd fra</translation>
@@ -5021,7 +5022,6 @@
 <translation id="8677212948402625567">Skjul alle...</translation>
 <translation id="8678648549315280022">Administrer downloadindstillinger...</translation>
 <translation id="8678933587484842200">Hvordan vil du starte denne app?</translation>
-<translation id="8679788109894721265">Denne side bruger mere end <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Log ind for at få dine bogmærker, din historik, dine adgangskoder og dine øvrige indstillinger på alle dine enheder. Du bliver også automatisk logget ind på dine Google-tjenester.</translation>
 <translation id="8686213429977032554">Denne Drev-fil deles ikke endnu</translation>
 <translation id="8687485617085920635">Næste vindue</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index a6f40bd..e9e1e29e 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Synchronisieren und personalisieren</translation>
 <translation id="1398853756734560583">Vergrößern</translation>
 <translation id="1399511500114202393">Kein Nutzerzertifikat</translation>
+<translation id="1401165786814632797">Bei aktivem Bildschirm und entsperrtem Gerät steht Ihnen Google Assistant jederzeit zur Verfügung, wenn Sie "Ok Google" sagen.</translation>
 <translation id="140250605646987970">Ihr Smartphone wurde gefunden, aber Smart Lock funktioniert nur auf Geräten mit Android 5.0 und höher. &lt;a&gt;Weitere Informationen&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (betreut)</translation>
 <translation id="1405476660552109915">Soll <ph name="PASSWORD_MANAGER_BRAND" /> Ihr Password für diese Website speichern?</translation>
@@ -1506,6 +1507,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> möchte eine Verbindung herstellen</translation>
 <translation id="3274763671541996799">Sie befinden sich im Vollbildmodus.</translation>
 <translation id="3275778913554317645">In neuem Fenster öffnen</translation>
+<translation id="3278877214895457897">Wenn Ihr Chromebook eingerichtet ist, können Sie die Assistant-Taste drücken oder "Ok Google" sagen, um sich jederzeit von Assistant helfen zu lassen.</translation>
 <translation id="3279230909244266691">Der Vorgang kann einige Minuten dauern. Virtuelle Maschine wird gestartet.</translation>
 <translation id="3279741024917655738">Zeigen von Vollbildvideos ist aktiviert</translation>
 <translation id="3280237271814976245">Speichern &amp;unter...</translation>
@@ -2162,7 +2164,6 @@
 <translation id="4275830172053184480">Gerät neu starten</translation>
 <translation id="4278101229438943600">Google Assistant ist bereit</translation>
 <translation id="4278390842282768270">Zugelassen</translation>
-<translation id="4280864916190672950">Laden abbrechen</translation>
 <translation id="4281844954008187215">Nutzungsbedingungen</translation>
 <translation id="4282196459431406533">Smart Lock ist aktiviert</translation>
 <translation id="4284105660453474798">Möchten Sie "$1" wirklich löschen?</translation>
@@ -2600,6 +2601,7 @@
 <translation id="4992066212339426712">Stummschaltung aufheben</translation>
 <translation id="4992458225095111526">Powerwash bestätigen</translation>
 <translation id="4992473555164495036">Ihr Administrator hat die verfügbaren Eingabemethoden eingeschränkt.</translation>
+<translation id="4992926179187649719">"Ok Google" aktivieren</translation>
 <translation id="4994474651455208930">Registrierung von Websites als Standard-Handler für Protokolle zulassen</translation>
 <translation id="4994754230098574403">Wird eingerichtet</translation>
 <translation id="4996978546172906250">Teilen über</translation>
@@ -3432,7 +3434,6 @@
 <translation id="6231881193380278751">Abfrageparameter in URL zum automatischen Aktualisieren der Seite hinzufügen: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Akku</translation>
 <translation id="6232116551750539448">Verbindung mit <ph name="NAME" /> wurde unterbrochen.</translation>
-<translation id="6235700927623181151">Über diesen Tab werden Ihre Desktopinhalte geteilt.</translation>
 <translation id="6237816943013845465">Ermöglicht die Anpassung der Bildschirmauflösung</translation>
 <translation id="6238923052227198598">Neueste Notiz auf Sperrbildschirm anzeigen</translation>
 <translation id="6239558157302047471">&amp;Frame neu laden</translation>
@@ -3752,7 +3753,7 @@
 <translation id="6710213216561001401">Zurück</translation>
 <translation id="6718273304615422081">Wird gezippt...</translation>
 <translation id="671928215901716392">Bildschirm sperren</translation>
-<translation id="6720847671508630642">Die Vorteile von Android automatisch auf Ihrem Chromebook genießen. Wenn Sie Ihr Smartphone verbinden, können Sie damit Textnachrichten von Ihrem Computer senden, seine Internetverbindung teilen und den Chromebook-Bildschirm entsperren.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation>
+<translation id="6720847671508630642">Genießen Sie die Vorteile von Android automatisch auf Ihrem Chromebook. Wenn Sie Ihr Smartphone verbinden, können Sie damit Textnachrichten von Ihrem Computer senden, seine Internetverbindung teilen und den Chromebook-Bildschirm entsperren.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Den Hersteller und das Modell Ihres Sicherheitsschlüssels anzeigen</translation>
 <translation id="6721972322305477112">&amp;Ablage</translation>
 <translation id="672213144943476270">Bitte entsperren Sie Ihr Profil, bevor Sie als Gast surfen.</translation>
@@ -4529,6 +4530,7 @@
 <translation id="7908378463497120834">Mindestens eine Partition auf Ihrem externen Speichergerät konnte nicht bereitgestellt werden.</translation>
 <translation id="7909969815743704077">Im Inkognitomodus heruntergeladen</translation>
 <translation id="7910768399700579500">&amp;Neuer Ordner</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Ihr Passwort wurde auf dem Server geändert. Bitte melden Sie sich ab und dann wieder an.</translation>
 <translation id="7915471803647590281">Bitte beschreiben Sie das Problem, bevor Sie das Feedback abschicken.</translation>
 <translation id="7916556741383518510">Bei Klick</translation>
@@ -4814,7 +4816,6 @@
 <translation id="8366396658833131068">Ihre Netzwerkverbindung wurde wiederhergestellt. Wählen Sie ein anderes Netzwerk aus oder klicken Sie unten auf "Weiter", um Ihre Kiosk-App zu starten.</translation>
 <translation id="8366947248864804596">Wenn Ihr Smartphone entsperrt und in der Nähe ist, können Sie Ihr Gerät mit nur einem Klick entsperren. Andernfalls müssen Sie Ihr Passwort oder Ihre PIN eingeben.</translation>
 <translation id="8368859634510605990">&amp;Alle Lesezeichen öffnen</translation>
-<translation id="8369547389711988632">Laden abgebrochen</translation>
 <translation id="8371695176452482769">Jetzt sprechen</translation>
 <translation id="8372369524088641025">Ungültiger WEP-Schlüssel</translation>
 <translation id="8373553483208508744">Tabs stummschalten</translation>
@@ -5020,7 +5021,6 @@
 <translation id="8677212948402625567">Alle minimieren...</translation>
 <translation id="8678648549315280022">Download-Einstellungen verwalten...</translation>
 <translation id="8678933587484842200">Wie soll diese Anwendung gestartet werden?</translation>
-<translation id="8679788109894721265">Diese Seite benötigt mehr als <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Melden Sie sich an, um Ihre Lesezeichen, Ihren Verlauf und Ihre anderen Einstellungen auf allen Ihren Geräten zu sehen. Sie werden auch automatisch in Ihren Google-Diensten angemeldet.</translation>
 <translation id="8686213429977032554">Die Drive-Datei wurde noch nicht geteilt.</translation>
 <translation id="8687485617085920635">Nächstes Fenster</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 172da70..14298b8 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -70,7 +70,7 @@
 <translation id="1110155001042129815">Αναμονή</translation>
 <translation id="1112420131909513020">Μια καρτέλα παρασκηνίου χρησιμοποιεί Bluetooth</translation>
 <translation id="1114102982691049955"><ph name="PRINTER_MANUFACTURER" /> <ph name="PRINTER_MODEL" /> (USB)</translation>
-<translation id="1114202307280046356">Εξάγωνο</translation>
+<translation id="1114202307280046356">Diamond</translation>
 <translation id="1114335938027186412">Ο υπολογιστής σας περιέχει μια συσκευή ασφαλείας TPM (Μονάδα αξιόπιστης πλατφόρμας), η οποία χρησιμοποιείται για την εφαρμογή πολλών κρίσιμων λειτουργιών ασφαλείας στο Chrome OS. Επισκεφτείτε το κέντρο βοήθειας του Chromebook, για να μάθετε περισσότερα: https://support.google.com/chromebook/?p=tpm</translation>
 <translation id="1114525161406758033">Σε αδράνεια όταν το καπάκι είναι κλειστό</translation>
 <translation id="1116694919640316211">Σχετικά με</translation>
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Συγχρονισμός και εξατομίκευση</translation>
 <translation id="1398853756734560583">Μεγιστοποίηση</translation>
 <translation id="1399511500114202393">Δεν υπάρχει πιστοποιητικό χρήστη</translation>
+<translation id="1401165786814632797">Μπορείτε να αποκτήσετε πρόσβαση στον Βοηθό ανά πάσα στιγμή λέγοντας "OK Google" όταν η συσκευή είναι ενεργοποιημένη και ξεκλείδωτη.</translation>
 <translation id="140250605646987970">Εντοπίστηκε το τηλέφωνό σας. Ωστόσο, το Smart Lock λειτουργεί μόνο σε συσκευές με έκδοση λογισμικού Android 5.0 και νεότερη. &lt;a&gt;Μάθετε περισσότερα&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (Εποπτευόμενος)</translation>
 <translation id="1405476660552109915">Θέλετε το <ph name="PASSWORD_MANAGER_BRAND" /> να αποθηκεύσει τον λογαριασμό σας για αυτόν τον ιστότοπο;</translation>
@@ -1510,6 +1511,7 @@
 <translation id="3271648667212143903">Ο ιστότοπος <ph name="ORIGIN" /> επιθυμεί σύνδεση</translation>
 <translation id="3274763671541996799">Έχετε μεταβεί σε πλήρη οθόνη.</translation>
 <translation id="3275778913554317645">Άνοιγμα σε παράθυρο</translation>
+<translation id="3278877214895457897">Μετά τη ρύθμιση του Chromebook, πατήστε το κουμπί Βοηθού ή πείτε "Ok Google" για να λάβετε βοήθεια από τον Βοηθό σας οποιαδήποτε στιγμή.</translation>
 <translation id="3279230909244266691">Αυτή η διαδικασία μπορεί να διαρκέσει μερικά λεπτά. Έναρξη του εικονικού μηχανήματος.</translation>
 <translation id="3279741024917655738">Προβολή βίντεο σε πλήρη οθόνη σε</translation>
 <translation id="3280237271814976245">Αποθήκευση &amp;ως...</translation>
@@ -2166,7 +2168,6 @@
 <translation id="4275830172053184480">Επανεκκινήστε τη συσκευή σας</translation>
 <translation id="4278101229438943600">Ο Βοηθός σας είναι έτοιμος</translation>
 <translation id="4278390842282768270">Επιτρέπεται</translation>
-<translation id="4280864916190672950">Διακοπή φόρτωσης</translation>
 <translation id="4281844954008187215">Όροι Παροχής Υπηρεσιών</translation>
 <translation id="4282196459431406533">Το Smart Lock είναι ενεργοποιημένο</translation>
 <translation id="4284105660453474798">Είστε βέβαιοι ότι θέλετε να διαγράψετε το "$1";</translation>
@@ -2604,6 +2605,7 @@
 <translation id="4992066212339426712">Κατάργηση σίγασης</translation>
 <translation id="4992458225095111526">Επιβεβαίωση Powerwash</translation>
 <translation id="4992473555164495036">Ο διαχειριστής σας περιόρισε τις διαθέσιμες μεθόδους εισαγωγής.</translation>
+<translation id="4992926179187649719">Ενεργοποίηση "Ok Google"</translation>
 <translation id="4994474651455208930">Να επιτρέπεται σε ιστότοπους να ζητούν να γίνονται προεπιλεγμένα προγράμματα χειρισμού για πρωτόκολλα</translation>
 <translation id="4994754230098574403">Γίνεται ρύθμιση</translation>
 <translation id="4996978546172906250">Μοιραστείτε μέσω</translation>
@@ -3437,7 +3439,6 @@
 <translation id="6231881193380278751">Προσθέστε μια παράμετρο ερωτήματος στη διεύθυνση URL για αυτόματη ανανέωση της σελίδας: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Μπαταρία</translation>
 <translation id="6232116551750539448">Η σύνδεση με το <ph name="NAME" /> χάθηκε</translation>
-<translation id="6235700927623181151">Αυτή η καρτέλα μοιράζεται το περιεχόμενο της επιφάνειας εργασίας σας.</translation>
 <translation id="6237816943013845465">Σας επιτρέπει να προσαρμόσετε την ανάλυση της οθόνης σας</translation>
 <translation id="6238923052227198598">Διατήρηση πιο πρόσφατης σημείωσης στον οθόνη κλειδώματος</translation>
 <translation id="6239558157302047471">Επαναφόρτωση &amp;πλαισίου</translation>
@@ -4534,6 +4535,7 @@
 <translation id="7908378463497120834">Λυπούμαστε, δεν ήταν δυνατή η προσάρτηση τουλάχιστον ενός διαμερίσματος της εξωτερικής συσκευής αποθήκευσης.</translation>
 <translation id="7909969815743704077">Έγινε λήψη στην ανώνυμη περιήγηση</translation>
 <translation id="7910768399700579500">Νέος &amp;φάκελος</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Ο κωδικός πρόσβασής σας έχει αλλάξει στον διακομιστή. Αποσυνδεθείτε και συνδεθείτε ξανά.</translation>
 <translation id="7915471803647590281">Πριν από την αποστολή σχολίων, πείτε μας τι συμβαίνει.</translation>
 <translation id="7916556741383518510">Όταν κάνετε κλικ</translation>
@@ -4818,7 +4820,6 @@
 <translation id="8366396658833131068">Αποκαταστάθηκε η συνδεσιμότητα δικτύου. Επιλέξτε κάποιο άλλο δίκτυο ή πατήστε το κουμπί "Συνέχεια" παρακάτω, για να εκκινήσετε την εφαρμογή kiosk.</translation>
 <translation id="8366947248864804596">Όταν το τηλέφωνό σας είναι ξεκλειδωμένο και σε κοντινή απόσταση, απλώς επιλέξτε για ξεκλείδωμα. Διαφορετικά, καταχωρίστε τον κωδικό πρόσβασης ή το PIN.</translation>
 <translation id="8368859634510605990">Ά&amp;νοιγμα όλων των σελιδοδεικτών</translation>
-<translation id="8369547389711988632">Διακόπηκε η φόρτωση</translation>
 <translation id="8371695176452482769">Μιλήστε τώρα</translation>
 <translation id="8372369524088641025">Εσφαλμένο κλειδί WEP</translation>
 <translation id="8373553483208508744">Σίγαση καρτελών</translation>
@@ -5024,7 +5025,6 @@
 <translation id="8677212948402625567">Σύμπτυξη όλων...</translation>
 <translation id="8678648549315280022">Διαχείριση ρυθμίσεων λήψης…</translation>
 <translation id="8678933587484842200">Πώς θέλετε να ανοίγει αυτή η εφαρμογή;</translation>
-<translation id="8679788109894721265">Αυτή η σελίδα χρησιμοποιεί περισσότερα από <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Συνδεθείτε για να έχετε πρόσβαση στους σελιδοδείκτες, το ιστορικό, τους κωδικούς πρόσβασης και σε άλλες ρυθμίσεις σε όλες τις συσκευές σας. Θα συνδέεστε επίσης αυτόματα στις υπηρεσίες σας Google.</translation>
 <translation id="8686213429977032554">Δεν μοιράζεστε ακόμα αυτό το αρχείο του Drive</translation>
 <translation id="8687485617085920635">Επόμενο παράθυρο</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 7b7d817..101793b 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Sync and personalisation</translation>
 <translation id="1398853756734560583">Maximise</translation>
 <translation id="1399511500114202393">No user certificate</translation>
+<translation id="1401165786814632797">Access your Assistant any time you say "Ok Google" when your device is awake and unlocked.</translation>
 <translation id="140250605646987970">Found your phone. But Smart Lock only works on devices with Android 5.0 and up. &lt;a&gt;Learn more&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (Supervised)</translation>
 <translation id="1405476660552109915">Do you want <ph name="PASSWORD_MANAGER_BRAND" /> to save your account for this site?</translation>
@@ -1369,6 +1370,7 @@
 <translation id="3031557471081358569">Select items to be imported:</translation>
 <translation id="3031601332414921114">Resume printing</translation>
 <translation id="303198083543495566">Geography</translation>
+<translation id="3033999583152214331">Run Linux tools, editors and IDEs on your Chromebook. &lt;a target="_blank" href="<ph name="URL" />"&gt;Learn more&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Enable Flash</translation>
 <translation id="3037754279345160234">Can't parse the configuration to join domain. Please contact your administrator.</translation>
 <translation id="3038612606416062604">Add a printer manually</translation>
@@ -1509,6 +1511,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> wants to connect</translation>
 <translation id="3274763671541996799">You have gone full screen.</translation>
 <translation id="3275778913554317645">Open as window</translation>
+<translation id="3278877214895457897">When your Chromebook is set up, press the Assistant button or say "Ok Google" to get help from your Assistant at any time.</translation>
 <translation id="3279230909244266691">This process may take a few minutes. Starting the virtual machine.</translation>
 <translation id="3279741024917655738">Show full screen videos on</translation>
 <translation id="3280237271814976245">Save &amp;as...</translation>
@@ -2165,7 +2168,6 @@
 <translation id="4275830172053184480">Restart your device</translation>
 <translation id="4278101229438943600">Your Assistant is ready</translation>
 <translation id="4278390842282768270">Allowed</translation>
-<translation id="4280864916190672950">Stop loading</translation>
 <translation id="4281844954008187215">Terms of Service</translation>
 <translation id="4282196459431406533">Smart Lock is turned on</translation>
 <translation id="4284105660453474798">Are you sure that you want to delete "$1"?</translation>
@@ -2603,6 +2605,7 @@
 <translation id="4992066212339426712">Unmute</translation>
 <translation id="4992458225095111526">Confirm Powerwash</translation>
 <translation id="4992473555164495036">Your administrator has limited the available input methods.</translation>
+<translation id="4992926179187649719">Turn on "Ok Google"</translation>
 <translation id="4994474651455208930">Allow sites to ask to become default handlers for protocols</translation>
 <translation id="4994754230098574403">Setting up</translation>
 <translation id="4996978546172906250">Share via</translation>
@@ -3435,7 +3438,6 @@
 <translation id="6231881193380278751">Add a QueryParam in URL to auto-refresh the page: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Battery</translation>
 <translation id="6232116551750539448">Connection to <ph name="NAME" /> has been lost</translation>
-<translation id="6235700927623181151">This tab is sharing your desktop content.</translation>
 <translation id="6237816943013845465">Allows you to adjust your screen resolution</translation>
 <translation id="6238923052227198598">Keep latest note on lock screen</translation>
 <translation id="6239558157302047471">Reload &amp;frame</translation>
@@ -4532,6 +4534,7 @@
 <translation id="7908378463497120834">Sorry, at least one partition on your external storage device could not be mounted.</translation>
 <translation id="7909969815743704077">Downloaded in Incognito</translation>
 <translation id="7910768399700579500">&amp;New folder</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Your password has been changed on the server. Please sign out then sign in again.</translation>
 <translation id="7915471803647590281">Please tell us what is happening before sending the feedback.</translation>
 <translation id="7916556741383518510">On Click</translation>
@@ -4816,7 +4819,6 @@
 <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="8366947248864804596">When your phone is unlocked and nearby, just select to unlock. Otherwise, enter your password or PIN.</translation>
 <translation id="8368859634510605990">&amp;Open all bookmarks</translation>
-<translation id="8369547389711988632">Stopped loading</translation>
 <translation id="8371695176452482769">Speak now</translation>
 <translation id="8372369524088641025">Bad WEP key</translation>
 <translation id="8373553483208508744">Mute tabs</translation>
@@ -5022,7 +5024,6 @@
 <translation id="8677212948402625567">Collapse all...</translation>
 <translation id="8678648549315280022">Manage download settings...</translation>
 <translation id="8678933587484842200">How would you like this application to launch?</translation>
-<translation id="8679788109894721265">This page uses more than <ph name="MEGABYTES" />MB</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="8686213429977032554">This Drive file isn't shared yet</translation>
 <translation id="8687485617085920635">Next window</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index bd3fceb..8717b57 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -2163,7 +2163,6 @@
 <translation id="4275830172053184480">Reiniciar tu dispositivo</translation>
 <translation id="4278101229438943600">Tu Asistente está listo</translation>
 <translation id="4278390842282768270">Permitido</translation>
-<translation id="4280864916190672950">Detener la carga</translation>
 <translation id="4281844954008187215">Condiciones del servicio</translation>
 <translation id="4282196459431406533">Smart Lock está activado</translation>
 <translation id="4284105660453474798">¿Estás seguro de que deseas eliminar "$1"?</translation>
@@ -3433,7 +3432,6 @@
 <translation id="6231881193380278751">Agregar un parámetro de consulta en la URL para actualizar automáticamente la página: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Batería</translation>
 <translation id="6232116551750539448">Se perdió la conexión a <ph name="NAME" />.</translation>
-<translation id="6235700927623181151">Esta pestaña está compartiendo el contenido de tu escritorio.</translation>
 <translation id="6237816943013845465">Permite ajustar la resolución de pantalla</translation>
 <translation id="6238923052227198598">Mantener la nota más reciente en la pantalla bloqueada</translation>
 <translation id="6239558157302047471">Volver a cargar &amp;marco</translation>
@@ -3682,7 +3680,7 @@
 <translation id="6606070663386660533">Pestaña 8</translation>
 <translation id="6607272825297743757">Información del archivo</translation>
 <translation id="6607831829715835317">Más herramientas</translation>
-<translation id="6610147964972079463">Cerrar las pestañas privadas</translation>
+<translation id="6610147964972079463">Cerrar pestañas privadas</translation>
 <translation id="6612358246767739896">Contenido protegido</translation>
 <translation id="6613452264606394692">Para regresar aquí rápidamente, agrega esta página a favoritos</translation>
 <translation id="6614893213975402384">Instala actualizaciones y apps. Al continuar, aceptas que este dispositivo también descargue e instale automáticamente actualizaciones y apps de Google, tu administrador y el fabricante del dispositivo, posiblemente a través de datos móviles. Es posible que algunas de estas apps ofrezcan compras directas desde la aplicación. Puedes quitar las apps en cualquier momento. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation>
@@ -4815,7 +4813,6 @@
 <translation id="8366396658833131068">Se restauró la conexión de red. Selecciona una red distinta o presiona el botón "Continuar" para iniciar la aplicación de kiosco.</translation>
 <translation id="8366947248864804596">Cuando tu teléfono está desbloqueado y cerca, selecciona el dispositivo que quieras desbloquear. De lo contrario, ingresa tu contraseña o PIN.</translation>
 <translation id="8368859634510605990">&amp;Abrir todos los favoritos</translation>
-<translation id="8369547389711988632">Detuviste la carga</translation>
 <translation id="8371695176452482769">Hablar ahora</translation>
 <translation id="8372369524088641025">Clave de WEP no válida</translation>
 <translation id="8373553483208508744">Silenciar pestañas</translation>
@@ -5021,7 +5018,6 @@
 <translation id="8677212948402625567">Contraer todo...</translation>
 <translation id="8678648549315280022">Administrar configuración de descarga…</translation>
 <translation id="8678933587484842200">¿Cómo deseas que se ejecute esta app?</translation>
-<translation id="8679788109894721265">Esta página usa más de <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Accede para obtener tus favoritos, el historial, las contraseñas y otras opciones de configuración en todos tus dispositivos. Además, accederás de forma automática a los servicios de Google.</translation>
 <translation id="8686213429977032554">Este archivo de Drive aún no está compartido</translation>
 <translation id="8687485617085920635">Siguiente ventana</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 9e3ac9d..6cc5dbf0 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Sincronización y personalización</translation>
 <translation id="1398853756734560583">Maximizar</translation>
 <translation id="1399511500114202393">Sin certificado de usuario</translation>
+<translation id="1401165786814632797">Accede al Asistente cuando digas "Ok Google" y tu dispositivo esté activo y desbloqueado.</translation>
 <translation id="140250605646987970">Se ha encontrado tu teléfono, pero Smart Lock solo funciona en dispositivos con Android 5.0 y versiones posteriores. &lt;a&gt;Más información&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (supervisado)</translation>
 <translation id="1405476660552109915">¿Quieres que <ph name="PASSWORD_MANAGER_BRAND" /> guarde tu cuenta en este sitio web?</translation>
@@ -1370,6 +1371,7 @@
 <translation id="3031557471081358569">Selecciona los elementos que quieres importar:</translation>
 <translation id="3031601332414921114">Reanudar la impresión</translation>
 <translation id="303198083543495566">Geografía</translation>
+<translation id="3033999583152214331">Utiliza IDEs, editores y herramientas de Linux en tu Chromebook. &lt;a target="_blank" href="<ph name="URL" />"&gt;Más información&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Habilitar Flash</translation>
 <translation id="3037754279345160234">No se puede analizar la configuración para unirse al dominio. Ponte en contacto con el administrador.</translation>
 <translation id="3038612606416062604">Añadir una impresora manualmente</translation>
@@ -1510,6 +1512,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> quiere conectarse</translation>
 <translation id="3274763671541996799">Has activado el modo de pantalla completa.</translation>
 <translation id="3275778913554317645">Abrir como ventana</translation>
+<translation id="3278877214895457897">Cuando hayas configurado el Chromebook, pulsa el botón del Asistente o di "Ok Google" para recibir ayuda del Asistente en cualquier momento.</translation>
 <translation id="3279230909244266691">Iniciando la máquina virtual. Este proceso puede tardar unos minutos.</translation>
 <translation id="3279741024917655738">Ver vídeos en pantalla completa</translation>
 <translation id="3280237271814976245">Gu&amp;ardar como...</translation>
@@ -2163,7 +2166,6 @@
 <translation id="4275830172053184480">Reiniciar tu dispositivo</translation>
 <translation id="4278101229438943600">El Asistente está listo</translation>
 <translation id="4278390842282768270">Permitido</translation>
-<translation id="4280864916190672950">Detener carga</translation>
 <translation id="4281844954008187215">Condiciones del servicio</translation>
 <translation id="4282196459431406533">Smart Lock está activado</translation>
 <translation id="4284105660453474798">¿Seguro que quieres eliminar "$1"?</translation>
@@ -2601,6 +2603,7 @@
 <translation id="4992066212339426712">Activar sonido</translation>
 <translation id="4992458225095111526">Confirmar Powerwash</translation>
 <translation id="4992473555164495036">Tu administrador ha limitado los métodos de introducción disponibles.</translation>
+<translation id="4992926179187649719">Activar "Ok Google"</translation>
 <translation id="4994474651455208930">Permitir que los sitios web se conviertan en controladores de protocolos predeterminados</translation>
 <translation id="4994754230098574403">Se está configurando</translation>
 <translation id="4996978546172906250">Compartir a través de</translation>
@@ -3432,7 +3435,6 @@
 <translation id="6231881193380278751">Añade un parámetro de consulta en la URL para actualizar la página automáticamente: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Batería</translation>
 <translation id="6232116551750539448">Se ha perdido la conexión a <ph name="NAME" /></translation>
-<translation id="6235700927623181151">En esta pestaña se está compartiendo el contenido de tu ordenador.</translation>
 <translation id="6237816943013845465">Te permite ajustar la resolución de pantalla</translation>
 <translation id="6238923052227198598">Mantener la última nota en la pantalla de bloqueo</translation>
 <translation id="6239558157302047471">Volver a cargar &amp;marco</translation>
@@ -4528,6 +4530,7 @@
 <translation id="7908378463497120834">Lo sentimos, pero al menos una partición del dispositivo de almacenamiento externo no se ha podido montar.</translation>
 <translation id="7909969815743704077">Se ha descargado en modo de incógnito</translation>
 <translation id="7910768399700579500">&amp;Nueva carpeta</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Tu contraseña se ha cambiado en el servidor. Cierra la sesión y vuelve a iniciarla.</translation>
 <translation id="7915471803647590281">Debes describir el error.</translation>
 <translation id="7916556741383518510">Al hacer clic</translation>
@@ -4812,7 +4815,6 @@
 <translation id="8366396658833131068">Tu conexión de red se ha restaurado. Selecciona una red diferente o pulsa el botón "Continuar" para ejecutar tu aplicación de kiosco.</translation>
 <translation id="8366947248864804596">Si el teléfono está desbloqueado y está cerca, solo tienes que seleccionarlo para desbloquearlo. De lo contrario, introduce tu contraseña o PIN.</translation>
 <translation id="8368859634510605990">&amp;Abrir todos los marcadores</translation>
-<translation id="8369547389711988632">Se ha dejado de cargar</translation>
 <translation id="8371695176452482769">Habla ahora</translation>
 <translation id="8372369524088641025">Clave WEP incorrecta</translation>
 <translation id="8373553483208508744">Silenciar pestañas</translation>
@@ -5018,7 +5020,6 @@
 <translation id="8677212948402625567">Ocultar todos...</translation>
 <translation id="8678648549315280022">Administrar configuración de descargas...</translation>
 <translation id="8678933587484842200">¿Cómo te gustaría que se iniciara esta aplicación?</translation>
-<translation id="8679788109894721265">Esta página utiliza más de <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Inicia sesión para acceder a tus marcadores, tu historial, tus contraseñas y tu configuración en todos tus dispositivos. Además, iniciarás sesión automáticamente en tus servicios de Google.</translation>
 <translation id="8686213429977032554">Este archivo de Drive aún no se ha compartido</translation>
 <translation id="8687485617085920635">Siguiente ventana</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 567add2..8898104 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Sünkroonimine ja isikupärastamine</translation>
 <translation id="1398853756734560583">Maksimeeri</translation>
 <translation id="1399511500114202393">Kasutaja sertifikaat puudub</translation>
+<translation id="1401165786814632797">Pääsete assistendile alati juurde, kui seade on sisse lülitatud ja avatud ning ütlete „Ok Google”.</translation>
 <translation id="140250605646987970">Teie telefon on leitud, kuid Smart Lock töötab ainult seadmetel, mis kasutavad operatsioonisüsteemi Android 5.0 ja uuemaid versioone. &lt;a&gt;Lisateave&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (jälgitav)</translation>
 <translation id="1405476660552109915">Kas soovite, et rakendus <ph name="PASSWORD_MANAGER_BRAND" /> salvestaks teie konto selle saidi jaoks?</translation>
@@ -1510,6 +1511,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> soovib ühenduse luua</translation>
 <translation id="3274763671541996799">Lülitasite täisekraanile.</translation>
 <translation id="3275778913554317645">Ava aknana</translation>
+<translation id="3278877214895457897">Kui teie Chromebook on seadistatud, vajutage assistendi nuppu või öelge otsetee sõna „Ok Google”, et assistendilt abi paluda.</translation>
 <translation id="3279230909244266691">Protsess võib võtta mõne minuti. Virtuaalset masinat käivitatakse.</translation>
 <translation id="3279741024917655738">Kuva täisekraanil videod:</translation>
 <translation id="3280237271814976245">Salvesta &amp;nimega...</translation>
@@ -2166,7 +2168,6 @@
 <translation id="4275830172053184480">Taaskäivitage seade</translation>
 <translation id="4278101229438943600">Teie assistent on valmis</translation>
 <translation id="4278390842282768270">Lubatud</translation>
-<translation id="4280864916190672950">Peata laadimine</translation>
 <translation id="4281844954008187215">Teenusetingimused</translation>
 <translation id="4282196459431406533">Smart Lock on sisse lülitatud</translation>
 <translation id="4284105660453474798">Kas soovite kindlasti faili „$1” kustutada?</translation>
@@ -2277,7 +2278,7 @@
 <translation id="4481530544597605423">Sidumata seadmed</translation>
 <translation id="4482194545587547824">Google võib kasutada teie sirvimisajalugu otsingu ja teiste Google'i teenuste isikupärastamiseks</translation>
 <translation id="4495419450179050807">Ära sellel lehel kuva</translation>
-<translation id="4499718683476608392">Saate lubada krediitkaardiandmete automaattäite, et täita vormid ühe klõpsuga</translation>
+<translation id="4499718683476608392">Saate lubada krediitkaardiandmete automaattäite, et täita vormid ühe klikiga</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> jooksis kokku</translation>
 <translation id="450099669180426158">Hüüumärgi ikoon</translation>
 <translation id="4501530680793980440">Eemaldamise kinnitamine</translation>
@@ -2604,6 +2605,7 @@
 <translation id="4992066212339426712">Tühista vaigistus</translation>
 <translation id="4992458225095111526">Powerwashi kinnitamine</translation>
 <translation id="4992473555164495036">Administraator on saadaolevaid sisestusmeetodeid piiranud.</translation>
+<translation id="4992926179187649719">Lülitage funktsioon „Ok Google” sisse</translation>
 <translation id="4994474651455208930">Luba saitidel küsida, kas hakata protokollide vaikimisi töötlejateks</translation>
 <translation id="4994754230098574403">Seadistamine</translation>
 <translation id="4996978546172906250">Jagamine:</translation>
@@ -3436,7 +3438,6 @@
 <translation id="6231881193380278751">Lehe automaatseks värskendamiseks lisage päringu parameeter URL-i: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Aku</translation>
 <translation id="6232116551750539448">Ühendus üksusega <ph name="NAME" /> katkes</translation>
-<translation id="6235700927623181151">See vaheleht jagab teie töölaua sisu.</translation>
 <translation id="6237816943013845465">Võimaldab kohandada ekraani eraldusvõimet</translation>
 <translation id="6238923052227198598">Säilita viimane märge lukustuskuval</translation>
 <translation id="6239558157302047471">Laadi &amp;raam uuesti</translation>
@@ -4533,6 +4534,7 @@
 <translation id="7908378463497120834">Kahjuks ei õnnestunud teie välisel mäluseadmel vähemalt ühe kettapartitsiooni ühendamine.</translation>
 <translation id="7909969815743704077">Alla laaditud inkognito režiimis</translation>
 <translation id="7910768399700579500">&amp;Uus kaust</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Teie parool serveris on muutunud. Logige välja ja seejärel uuesti sisse.</translation>
 <translation id="7915471803647590281">Teatage meile enne tagasiside saatmist, mis toimub.</translation>
 <translation id="7916556741383518510">Klõpsamisel</translation>
@@ -4818,7 +4820,6 @@
 <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="8366947248864804596">Kui teie telefon on avatud ja läheduses, valige see avamiseks. Muul juhul sisestage oma parool või PIN-kood.</translation>
 <translation id="8368859634510605990">&amp;Ava kõik järjehoidjad</translation>
-<translation id="8369547389711988632">Laadimine on katkestatud</translation>
 <translation id="8371695176452482769">Alustage rääkimist</translation>
 <translation id="8372369524088641025">Halb WEP-võti</translation>
 <translation id="8373553483208508744">Summuta vahekaardid</translation>
@@ -5024,7 +5025,6 @@
 <translation id="8677212948402625567">Ahenda kõik ...  </translation>
 <translation id="8678648549315280022">Allalaadimisseadete haldamine ...</translation>
 <translation id="8678933587484842200">Kuidas soovite selle rakenduse käivitada?</translation>
-<translation id="8679788109894721265">Leht kasutab üle <ph name="MEGABYTES" /> MB andmemahtu</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="8686213429977032554">Seda Drive'i faili pole veel jagatud</translation>
 <translation id="8687485617085920635">Järgmine aken</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index d90d2c446..6eb7afcf 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -70,7 +70,7 @@
 <translation id="1110155001042129815">انتظار</translation>
 <translation id="1112420131909513020">برگه پس‌زمینه درحال استفاده از بلوتوث است</translation>
 <translation id="1114102982691049955"><ph name="PRINTER_MANUFACTURER" /> <ph name="PRINTER_MODEL" /> (USB)</translation>
-<translation id="1114202307280046356">الماس</translation>
+<translation id="1114202307280046356">الماسی</translation>
 <translation id="1114335938027186412">‏رایانه شما حاوی یک دستگاه امنیتی با مدول پلتفورم مورداعتماد (TPM) است که برای اجرای بسیاری از ویژگی‌های امنیتی مهم در سیستم عامل Chrome استفاده می‌شود. برای کسب اطلاعات بیشتر به مرکز راهنمایی Chromebook بروید: https://support.google.com/chromebook/?p=tpm</translation>
 <translation id="1114525161406758033">رفتن به حالت خواب، وقتی دستگاه بسته می‌شود</translation>
 <translation id="1116694919640316211">درباره</translation>
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">همگام‌سازی و شخصی‌سازی</translation>
 <translation id="1398853756734560583">بزرگ کردن</translation>
 <translation id="1399511500114202393">بدون گواهینامه کاربر</translation>
+<translation id="1401165786814632797">‏اگر دستگاه بیدار باشد و قفلش باز باشد، هرزمان بگویید «OK Google»، به «دستیار» دسترسی خواهید داشت.</translation>
 <translation id="140250605646987970">‏تلفنتان پیدا شد. اما Smart Lock فقط روی دستگاه‌های دارای Android نسخه ۵٫۰ و بالاتر کار می‌کند. &lt;a&gt;بیشتر بدانید&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (تحت نظارت)</translation>
 <translation id="1405476660552109915">آیا می‌خواهید <ph name="PASSWORD_MANAGER_BRAND" /> حساب شما را برای این سایت ذخیره کند؟</translation>
@@ -1506,6 +1507,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> می‌خواهد مرتبط شود</translation>
 <translation id="3274763671541996799">شما به حالت تمام صفحه رفته‌اید.</translation>
 <translation id="3275778913554317645">باز کردن به‌عنوان پنجره</translation>
+<translation id="3278877214895457897">‏وقتی Chromebook راه‌اندازی شد، دکمه «دستیار» را فشار دهید یا بگویید «OK Google» تا در هرزمانی از «دستیار» کمک بگیرید.</translation>
 <translation id="3279230909244266691">این فرایند ممکن است چند دقیقه طول بکشد. درحال شروع دستگاه مجازی.</translation>
 <translation id="3279741024917655738">نمایش ویدیوهای تمام‌صفحه در</translation>
 <translation id="3280237271814976245">ذخیره &amp;بعنوان</translation>
@@ -2162,7 +2164,6 @@
 <translation id="4275830172053184480">راه‌اندازی دستگاه خود</translation>
 <translation id="4278101229438943600">«دستیار» آماده است</translation>
 <translation id="4278390842282768270">مجاز است</translation>
-<translation id="4280864916190672950">توقف بارگیری</translation>
 <translation id="4281844954008187215">شرایط استفاده از سرویس</translation>
 <translation id="4282196459431406533">‏Smart Lock روشن شده است</translation>
 <translation id="4284105660453474798">آیا مطمئنید می‌خواهید "$1" را حذف کنید؟</translation>
@@ -2600,6 +2601,7 @@
 <translation id="4992066212339426712">باصدا کردن</translation>
 <translation id="4992458225095111526">‏تأیید Powerwash</translation>
 <translation id="4992473555164495036">سرپرست سیستم روش‌های ورودی دردسترس را محدود کرده است.</translation>
+<translation id="4992926179187649719">‏روشن کردن «Ok Google»</translation>
 <translation id="4994474651455208930">سایت‌ها اجازه دارند درخواست کنند کنترل کننده پیش‌فرض برای پروتکل ها شوند</translation>
 <translation id="4994754230098574403">درحال راه‌اندازی</translation>
 <translation id="4996978546172906250">اشتراک‌گذاری از طریق</translation>
@@ -3432,7 +3434,6 @@
 <translation id="6231881193380278751">‏افزودن پارامتر جستار در نشانی وب برای بازخوانی خودکار صفحه: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">باتری</translation>
 <translation id="6232116551750539448">اتصال به <ph name="NAME" /> قطع شده است</translation>
-<translation id="6235700927623181151">این برگه درحال هم‌رسانی محتوای میز کارتان است.</translation>
 <translation id="6237816943013845465">به شما امکان می‌دهد وضوح صفحه را تنظیم کنید</translation>
 <translation id="6238923052227198598">نگه داشتن جدیدترین یادداشت در صفحه درحالت قفل</translation>
 <translation id="6239558157302047471">تازه‌سازی قاب</translation>
@@ -3752,7 +3753,7 @@
 <translation id="6710213216561001401">قبلی</translation>
 <translation id="6718273304615422081">در حال فشرده سازی ...</translation>
 <translation id="671928215901716392">قفل صفحه</translation>
-<translation id="6720847671508630642">‏بهترین‌های Android را به‌طور خودکار با Chromebook هم‌رسانی کنید. تلفنتان را مرتبط کنید تا بتوانید از رایانه پیام نوشتاری ارسال کنید، اتصال اینترنت تلفن را به اشتراک بگذارید و قفل صفحه Chromebook را باز کنید.<ph name="FOOTNOTE_POINTER" /><ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation>
+<translation id="6720847671508630642">‏بهترین‌های Android را به‌طور خودکار با Chromebook هم‌رسانی کنید. تلفنتان را مرتبط کنید تا بتوانید از رایانه پیام نوشتاری ارسال کنید، اتصال اینترنت تلفن را هم‌رسانی کنید و قفل صفحه Chromebook را باز کنید.<ph name="FOOTNOTE_POINTER" /><ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">ساخت و مدل «کلید امنیتی» خود را ببینید</translation>
 <translation id="6721972322305477112">&amp;فایل</translation>
 <translation id="672213144943476270">لطفاً قبل از مرور به‌عنوان مهمان، قفل نمایه‌تان را باز کنید.</translation>
@@ -4529,6 +4530,7 @@
 <translation id="7908378463497120834">متأسفیم، حداقل یک بخش از دستگاه ذخیره‌سازی خارجی نصب نمی‌شود.</translation>
 <translation id="7909969815743704077">دانلود‌شده در ناشناس</translation>
 <translation id="7910768399700579500">پوشه &amp;جدید</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">گذرواژه‌تان در سرور تغییر کرده است. لطفاً از سیستم خارج شوید و سپس دوباره به سیستم وارد شوید.</translation>
 <translation id="7915471803647590281">لطفاً قبل از ارسال بازخورد، به ما بگویید چه اتفاقی در حال وقوع است.</translation>
 <translation id="7916556741383518510">با کلیک</translation>
@@ -4813,7 +4815,6 @@
 <translation id="8366396658833131068">اتصالتان به شبکه بازیابی شد. لطفاً شبکه دیگری را انتخاب کنید یا دکمه «ادامه» را در زیر فشار دهید تا برنامه کیوسکتان را راه‌اندازی کنید.</translation>
 <translation id="8366947248864804596">وقتی تلفنتان قفل نیست و همین اطراف است، برای باز کردن قفل، فقط آن را انتخاب کنید. در غیراین‌صورت، گذرواژه یا پینتان را وارد کنید.</translation>
 <translation id="8368859634510605990">&amp;باز کردن همه نشانک‌ها</translation>
-<translation id="8369547389711988632">بارگیری متوقف شد</translation>
 <translation id="8371695176452482769">اکنون صحبت کنید</translation>
 <translation id="8372369524088641025">‏کلید WEP نادرست</translation>
 <translation id="8373553483208508744">بی‌صدا کردن برگه‌ها</translation>
@@ -5019,7 +5020,6 @@
 <translation id="8677212948402625567">کوچک کردن همه...</translation>
 <translation id="8678648549315280022">مدیریت تنظیمات بارگیری…</translation>
 <translation id="8678933587484842200">می‌خواهید این برنامه چگونه راه‌اندازی شود؟</translation>
-<translation id="8679788109894721265">این صفحه بیش از <ph name="MEGABYTES" /> مگابایت مصرف می‌کند</translation>
 <translation id="8680251145628383637">‏برای دریافت نشانک‌ها، سابقه، گذرواژه‌ها و تنظیمات دیگرتان را در همه دستگاه‌هایتان، به سیستم وارد شوید. همچنین به‌صورت خودکار به سیستم خدمات Google خود نیز وارد می‌شوید.</translation>
 <translation id="8686213429977032554">‏این فایل Drive هنوز به اشتراک گذاشته نشده است</translation>
 <translation id="8687485617085920635">پنجره بعدی</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index ac962ebb..f29fcec 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1371,6 +1371,7 @@
 <translation id="3031557471081358569">Valitse tuotavat kohteet:</translation>
 <translation id="3031601332414921114">Jatka tulostusta</translation>
 <translation id="303198083543495566">Sijainti</translation>
+<translation id="3033999583152214331">Käytä Linux-työkaluja, muokkausohjelmia ja integroituja kehitysympäristöjä Chromebookillasi. &lt;a target="_blank" href="<ph name="URL" />"&gt;Lisätietoja&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Ota Flash käyttöön</translation>
 <translation id="3037754279345160234">Verkkotunnuksen liittymiskonfiguraatiota ei voi jäsentää. Ota yhteyttä järjestelmänvalvojaan.</translation>
 <translation id="3038612606416062604">Lisää tulostin manuaalisesti</translation>
@@ -2164,7 +2165,6 @@
 <translation id="4275830172053184480">Käynnistä laite uudelleen</translation>
 <translation id="4278101229438943600">Assistant on valmiina</translation>
 <translation id="4278390842282768270">Sallittu</translation>
-<translation id="4280864916190672950">Pysäytä lataus</translation>
 <translation id="4281844954008187215">Käyttöehdot</translation>
 <translation id="4282196459431406533">Smart Lock on käytössä.</translation>
 <translation id="4284105660453474798">Haluatko varmasti poistaa kohteen $1?</translation>
@@ -3436,7 +3436,6 @@
 <translation id="6231881193380278751">Lisää URL-osoitteeseen kyselyn param-arvo, jotta sivu päivitetään automaattisesti: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Akku</translation>
 <translation id="6232116551750539448">Yhteys kohteeseen <ph name="NAME" /> on katkennut.</translation>
-<translation id="6235700927623181151">Tämä välilehti jakaa työpöydän sisältöä.</translation>
 <translation id="6237816943013845465">Sallii näytön resoluution säätämisen.</translation>
 <translation id="6238923052227198598">Jätä viimeisin muistiinpano lukitusnäytölle</translation>
 <translation id="6239558157302047471">Lataa kehys uudelleen</translation>
@@ -4816,7 +4815,6 @@
 <translation id="8366396658833131068">Verkkoyhteytesi on palautettu. Valitse eri verkko tai paina alla olevaa Jatka-painiketta, jos haluat käynnistää kioskisovelluksen.</translation>
 <translation id="8366947248864804596">Kun puhelimesi lukitus on avattu ja se on lähellä, aloita käyttö valitsemalla lukituksen avaus. Muussa tapauksessa anna salasana tai PIN-koodi.</translation>
 <translation id="8368859634510605990">Avaa kaikki kirjanmerkit</translation>
-<translation id="8369547389711988632">Lataus pysäytetty</translation>
 <translation id="8371695176452482769">Puhu nyt</translation>
 <translation id="8372369524088641025">Väärä WEP-avain</translation>
 <translation id="8373553483208508744">Mykistä välilehdet</translation>
@@ -5022,7 +5020,6 @@
 <translation id="8677212948402625567">Tiivistä kaikki...</translation>
 <translation id="8678648549315280022">Hallinnoi latausasetuksia…</translation>
 <translation id="8678933587484842200">Miten haluat käynnistää tämän sovelluksen?</translation>
-<translation id="8679788109894721265">Tämä sivu käyttää yli <ph name="MEGABYTES" /> Mt</translation>
 <translation id="8680251145628383637">Kirjaudu sisään, niin voit käyttää kirjanmerkkejä, historiaa, salasanoja ja muita asetuksiasi kaikilla laitteilla. Sinut kirjataan lisäksi automaattisesti sisään käyttämiisi Googlen palveluihin.</translation>
 <translation id="8686213429977032554">Tätä Drive-tiedostoa ei ole vielä jaettu</translation>
 <translation id="8687485617085920635">Seuraava ikkuna</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 605e5cf..296389b 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -2166,7 +2166,6 @@
 <translation id="4275830172053184480">I-restart ang iyong device</translation>
 <translation id="4278101229438943600">Handa na ang iyong Assistant</translation>
 <translation id="4278390842282768270">Pinapayagan</translation>
-<translation id="4280864916190672950">Huminto sa pag-load</translation>
 <translation id="4281844954008187215">Mga Tuntunin ng Serbisyo</translation>
 <translation id="4282196459431406533">Naka-on ang Smart Lock</translation>
 <translation id="4284105660453474798">Sigurado ka bang gusto mong tanggalin ang "$1"?</translation>
@@ -3436,7 +3435,6 @@
 <translation id="6231881193380278751">Magdagdag ng query param sa URL upang awtomatikong i-refresh ang page: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Baterya</translation>
 <translation id="6232116551750539448">Naputol ang koneksyon sa <ph name="NAME" /></translation>
-<translation id="6235700927623181151">Ibinabahagi ng tab na ito ang content ng iyong desktop.</translation>
 <translation id="6237816943013845465">Nagbibigay-daan sa iyong i-adjust ang resolution ng iyong screen</translation>
 <translation id="6238923052227198598">Panatilihin ang pinakabagong tala sa lock screen</translation>
 <translation id="6239558157302047471">I-reload ang &amp;frame</translation>
@@ -4817,7 +4815,6 @@
 <translation id="8366396658833131068">Naipanumbalik na ang connectivity ng iyong network. Mangyaring pumili ng ibang network o pindutin ang button sa ibaba na 'Magpatuloy' upang ilunsad ang iyong kiosk app.</translation>
 <translation id="8366947248864804596">Kapag naka-unlock at nasa malapit ang iyong telepono, piliin lang ang i-unlock. Kung hindi, ilagay ang password o PIN mo.</translation>
 <translation id="8368859634510605990">&amp;Buksan ang lahat ng bookmark</translation>
-<translation id="8369547389711988632">Inihinto ang pag-load</translation>
 <translation id="8371695176452482769">Magsalita ngayon</translation>
 <translation id="8372369524088641025">Mahinang WEP key</translation>
 <translation id="8373553483208508744">Mag-mute ng mga tab</translation>
@@ -5024,7 +5021,6 @@
 <translation id="8677212948402625567">Tiklupin lahat...</translation>
 <translation id="8678648549315280022">Pamahalaan ang mga setting ng pagda-download...</translation>
 <translation id="8678933587484842200">Paano mo gustong ilunsad ang application na ito?</translation>
-<translation id="8679788109894721265">Gumagamit ang page na ito ng mahigit <ph name="MEGABYTES" />MB</translation>
 <translation id="8680251145628383637">Mag-sign in upang makuha ang iyong mga bookmark, history, password at iba pang mga setting sa lahat ng iyong device. Awtomatiko ka ring masa-sign in sa iyong mga serbisyo ng Google.</translation>
 <translation id="8686213429977032554">Hindi pa ibinabahagi ang file sa Drive na ito</translation>
 <translation id="8687485617085920635">Susunod na window</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index f6568ae..2e6e2163 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Synchronisation et personnalisation</translation>
 <translation id="1398853756734560583">Agrandir</translation>
 <translation id="1399511500114202393">Aucun certificat utilisateur</translation>
+<translation id="1401165786814632797">Permet d'accéder à l'Assistant chaque fois que vous dites "Ok Google" quand votre appareil est allumé et déverrouillé.</translation>
 <translation id="140250605646987970">Votre téléphone a été trouvé, mais Smart Lock est compatible uniquement avec les appareils Android 5.0 ou version ultérieure. &lt;a&gt;En savoir plus&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (supervisé)</translation>
 <translation id="1405476660552109915">Voulez-vous que <ph name="PASSWORD_MANAGER_BRAND" /> enregistre votre compte pour ce site ?</translation>
@@ -1510,6 +1511,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> tente de se connecter</translation>
 <translation id="3274763671541996799">Le mode plein écran a été activé.</translation>
 <translation id="3275778913554317645">Ouvrir dans une fenêtre</translation>
+<translation id="3278877214895457897">Lorsque votre Chromebook est configuré, appuyez sur le bouton de l'Assistant ou dites "Ok Google" pour obtenir son aide à tout moment.</translation>
 <translation id="3279230909244266691">Cette opération peut prendre quelques minutes. Démarrage de la machine virtuelle…</translation>
 <translation id="3279741024917655738">Affichage des vidéos en plein écran sur</translation>
 <translation id="3280237271814976245">Enregistrer &amp;sous...</translation>
@@ -2166,7 +2168,6 @@
 <translation id="4275830172053184480">Redémarrer l'appareil</translation>
 <translation id="4278101229438943600">L'Assistant est prêt</translation>
 <translation id="4278390842282768270">Autorisé</translation>
-<translation id="4280864916190672950">Arrêter le chargement</translation>
 <translation id="4281844954008187215">Conditions d'utilisation</translation>
 <translation id="4282196459431406533">Smart Lock est activé</translation>
 <translation id="4284105660453474798">Voulez-vous vraiment supprimer "$1" ?</translation>
@@ -2604,6 +2605,7 @@
 <translation id="4992066212339426712">Réactiver le son</translation>
 <translation id="4992458225095111526">Confirmer la réinitialisation Powerwash</translation>
 <translation id="4992473555164495036">Votre administrateur a limité les modes de saisie disponibles.</translation>
+<translation id="4992926179187649719">Activer la commande "Ok Google"</translation>
 <translation id="4994474651455208930">Permettre aux sites de demander l'autorisation de devenir gestionnaires par défaut des protocoles</translation>
 <translation id="4994754230098574403">Configuration</translation>
 <translation id="4996978546172906250">Partager via</translation>
@@ -3437,7 +3439,6 @@
 <translation id="6231881193380278751">Ajoutez un paramètre de requête dans l'URL pour une actualisation automatique de la page : chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Batterie</translation>
 <translation id="6232116551750539448">La connexion à "<ph name="NAME" />" a été interrompue.</translation>
-<translation id="6235700927623181151">Cet onglet partage le contenu de votre bureau.</translation>
 <translation id="6237816943013845465">Permet d'ajuster la résolution de l'écran</translation>
 <translation id="6238923052227198598">Conserver la dernière note sur l'écran de verrouillage</translation>
 <translation id="6239558157302047471">Actualiser le &amp;cadre</translation>
@@ -4534,6 +4535,7 @@
 <translation id="7908378463497120834">Désolé, impossible d'installer au moins une partition de votre périphérique de stockage externe.</translation>
 <translation id="7909969815743704077">Téléchargé en mode navigation privée</translation>
 <translation id="7910768399700579500">&amp;Nouveau dossier</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Votre mot de passe a été modifié sur le serveur. Veuillez vous déconnecter, puis vous reconnecter.</translation>
 <translation id="7915471803647590281">Veuillez nous indiquer ce qu'il se passe avant d'envoyer votre rapport.</translation>
 <translation id="7916556741383518510">En cas de clic</translation>
@@ -4818,7 +4820,6 @@
 <translation id="8366396658833131068">Votre connexion réseau est rétablie. Veuillez sélectionner un autre réseau ou appuyer sur "Continuer" ci-dessous pour lancer votre application kiosque.</translation>
 <translation id="8366947248864804596">Lorsque votre téléphone est déverrouillé et situé à proximité, il suffit de le sélectionner pour déverrouiller l'appareil. Dans le cas contraire, saisissez votre mot de passe ou votre code.</translation>
 <translation id="8368859634510605990">&amp;Ouvrir tous les favoris</translation>
-<translation id="8369547389711988632">Chargement arrêté</translation>
 <translation id="8371695176452482769">Parlez maintenant.</translation>
 <translation id="8372369524088641025">Clé WEP incorrecte</translation>
 <translation id="8373553483208508744">Couper le son des onglets</translation>
@@ -5024,7 +5025,6 @@
 <translation id="8677212948402625567">Tout réduire...</translation>
 <translation id="8678648549315280022">Gérer les paramètres de téléchargement…</translation>
 <translation id="8678933587484842200">Comment souhaitez-vous que cette application soit lancée ?</translation>
-<translation id="8679788109894721265">Cette page utilise plus de <ph name="MEGABYTES" /> Mo</translation>
 <translation id="8680251145628383637">Connectez-vous pour retrouver vos favoris, votre historique, vos mots de passe et d'autres paramètres sur tous vos appareils. De plus, vous serez automatiquement connecté à vos services Google.</translation>
 <translation id="8686213429977032554">Ce fichier Drive n'a pas encore été partagé</translation>
 <translation id="8687485617085920635">Fenêtre suivante</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 8963008..bc7e4bd 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -2162,7 +2162,6 @@
 <translation id="4275830172053184480">તમારું ઉપકરણ પુનઃપ્રારંભ કરો</translation>
 <translation id="4278101229438943600">તમારું આસિસ્ટંટ તૈયાર છે</translation>
 <translation id="4278390842282768270">મંજૂર</translation>
-<translation id="4280864916190672950">લોડ કરવાનું રોકો</translation>
 <translation id="4281844954008187215">સેવાની શરતો</translation>
 <translation id="4282196459431406533">Smart Lock ચાલુ કરેલું છે</translation>
 <translation id="4284105660453474798">શું આપ ખરેખર  "$1" ને કાઢી નાખવા માંગો છો?</translation>
@@ -3434,7 +3433,6 @@
 <translation id="6231881193380278751">પૃષ્ઠને સ્વતઃ-તાજુ કરવા માટે URL માં એક ક્વેરી પરમ ઉમેરો: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">બૅટરી</translation>
 <translation id="6232116551750539448"><ph name="NAME" /> થી કનેક્શન જતું રહ્યું છે</translation>
-<translation id="6235700927623181151">આ ટૅબ તમારા ડેસ્કટૉપ કન્ટેન્ટને શેર કરી રહ્યું છે.</translation>
 <translation id="6237816943013845465">તમને તમારું સ્ક્રીન રિઝોલ્યૂશન સમાયોજિત કરવાની મંજૂરી આપે છે</translation>
 <translation id="6238923052227198598">લૉક સ્ક્રીન પર એક એકદમ નવી નોંધ રાખો</translation>
 <translation id="6239558157302047471">&amp;ફ્રેમ ફરીથી લોડ કરો</translation>
@@ -4809,7 +4807,6 @@
 <translation id="8366396658833131068">તમારી નેટવર્ક કનેક્ટિવિટી પુનઃસ્થાપિત થઈ છે. કૃપા કરીને બીજું નેટવર્ક પસંદ કરો અથવા તમારી કિઓસ્ક એપ્લિકેશનને લોંચ કરવા માટે નીચે 'ચાલુ રાખો' બટનને દબાવો.</translation>
 <translation id="8366947248864804596">તમારો ફોન અનલૉક કરેલો અને નજીકમાં હોય, ત્યારે માત્ર અનલૉક કરવાનું પસંદ કરો. અન્યથા, તમારો પાસવર્ડ અથવા પિન દાખલ કરો.</translation>
 <translation id="8368859634510605990">બધાં બુકમાર્ક્સ &amp;ખોલો</translation>
-<translation id="8369547389711988632">લોડ કરવાનું રોક્યું</translation>
 <translation id="8371695176452482769">હવે બોલો</translation>
 <translation id="8372369524088641025">ખરાબ WEP કી</translation>
 <translation id="8373553483208508744">ટૅબ્સને મ્યૂટ કરો</translation>
@@ -5015,7 +5012,6 @@
 <translation id="8677212948402625567">બધાને સંકુચિત કરો...</translation>
 <translation id="8678648549315280022">ડાઉનલોડ સેટિંગ્સ સંચાલિત કરો ...</translation>
 <translation id="8678933587484842200">તમે આ ઍપ્લિકેશનને કેવી રીતે લૉન્ચ કરવાનું પસંદ કરશો?</translation>
-<translation id="8679788109894721265">આ પેજમાં <ph name="MEGABYTES" /> MB કરતાં વધુ ડેટા વપરાય છે</translation>
 <translation id="8680251145628383637">તમારા તમામ ઉપકરણો પર તમારા બુકમાર્ક્સ, ઇતિહાસ, પાસવર્ડ્સ અને અન્ય સેટિંગ્સ મેળવવા માટે સાઇન ઇન કરો. તમે તમારી Google સેવાઓ પર આપમેળે સાઇન ઇન પણ થશો.</translation>
 <translation id="8686213429977032554">આ ડ્રાઇવ ફાઇલ હજી સુધી શેર કરી નથી</translation>
 <translation id="8687485617085920635">આગામી વિંડો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 93b6416..e19d44d3 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">सिंक करना और मनमुताबिक बनाना</translation>
 <translation id="1398853756734560583">बड़ा करें</translation>
 <translation id="1399511500114202393">कोई 'उपयोगकर्ता प्रमाणपत्र' नहीं</translation>
+<translation id="1401165786814632797">अपना डिवाइस चालू होने और अनलॉक होने पर कभी भी "Ok Google" बोलें और अपनी Assistant सेवा एक्सेस करें.</translation>
 <translation id="140250605646987970">आपका फ़ोन मिल गया है. लेकिन Smart Lock केवल Android 5.0 और उसके बाद वाले वर्शन चला रहे डिवाइस पर काम करता है. &lt;a&gt;और जानें&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (पर्यवेक्षित)</translation>
 <translation id="1405476660552109915">क्या आप चाहते हैं कि <ph name="PASSWORD_MANAGER_BRAND" /> इस साइट के लिए आपका खाता सहेजे?</translation>
@@ -1510,6 +1511,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> कनेक्ट करना चाहती है</translation>
 <translation id="3274763671541996799">आप पूर्ण स्‍क्रीन में देख रहे हैं.</translation>
 <translation id="3275778913554317645">विंडो के रूप में खोलें</translation>
+<translation id="3278877214895457897">आपका Chromebook सेट अप हो जाने पर, किसी भी समय अपनी Assistant से मदद पाने के लिए Assistant बटन दबाएं या "Ok Google" बोलें.</translation>
 <translation id="3279230909244266691">इस प्रोसेस में कुछ मिनट लग सकते हैं. वर्चुअल मशीन को शुरू किया जा रहा है.</translation>
 <translation id="3279741024917655738">इन पर पूरी स्क्रीन वाले वीडियो दिखाएं</translation>
 <translation id="3280237271814976245">इस &amp;रूप में सहेजें...</translation>
@@ -2165,7 +2167,6 @@
 <translation id="4275830172053184480">अपना डिवाइस पुन: प्रारंभ करें</translation>
 <translation id="4278101229438943600">आपकी Assistant तैयार है</translation>
 <translation id="4278390842282768270">अनुमति है</translation>
-<translation id="4280864916190672950">लोड करना बंद करें</translation>
 <translation id="4281844954008187215">सेवा की शर्तें</translation>
 <translation id="4282196459431406533">Smart Lock चालू है</translation>
 <translation id="4284105660453474798">क्या आप वाकई "$1" को हटाना चाहते हैं?</translation>
@@ -2276,7 +2277,7 @@
 <translation id="4481530544597605423">अयुग्मित किए गए डिवाइस</translation>
 <translation id="4482194545587547824">खोज और अन्य Google सेवाओं को वैयक्तिकृत करने के लिए Google आपके ब्राउज़िंग इतिहास का उपयोग कर सकता है</translation>
 <translation id="4495419450179050807">इस पेज पर न दिखाएं</translation>
-<translation id="4499718683476608392">फ़ॉर्म को एक ही क्लिक में भरने के लिए क्रेडिट कार्ड की जानकारी ऑटोमैटिक भरने की सुविधा चालू करें</translation>
+<translation id="4499718683476608392">फ़ॉर्म को एक ही क्लिक में भरने के लिए, क्रेडिट कार्ड की जानकारी ऑटोमैटिक भरने की सुविधा चालू करें</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> बंद हो गया है</translation>
 <translation id="450099669180426158">'विस्मयादिबोधक चिह्न' आइकॉन</translation>
 <translation id="4501530680793980440">निकालने की दुबारा पूछें</translation>
@@ -2603,6 +2604,7 @@
 <translation id="4992066212339426712">अनम्यूट करें</translation>
 <translation id="4992458225095111526">पावरवॉश की पुष्टि करें</translation>
 <translation id="4992473555164495036">आपके एडमिन ने इनपुट के उपलब्ध तरीके सीमित किए हुए हैं.</translation>
+<translation id="4992926179187649719">'Ok Google' चालू करें</translation>
 <translation id="4994474651455208930">साइटों को प्रोटोकॉल के लिए सामान्य हैंडलर बनने के लिए पूछने की अनुमति दें</translation>
 <translation id="4994754230098574403">सेट अप किया जा रहा है</translation>
 <translation id="4996978546172906250">इसके द्वारा शेयर करें</translation>
@@ -3435,7 +3437,6 @@
 <translation id="6231881193380278751">पेज को अपने आप रीफ्रेश करने के लिए URL में एक क्‍वेरी पैरामीटर जोड़ें: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">बैटरी</translation>
 <translation id="6232116551750539448"><ph name="NAME" /> से कनेक्शन टूट गया</translation>
-<translation id="6235700927623181151">यह टैब आपके डेस्कटॉप की सामग्री शेयर कर रहा है.</translation>
 <translation id="6237816943013845465">आपको अपना स्क्रीन रिज़ॉल्‍यूशन समायोजित करने देती है</translation>
 <translation id="6238923052227198598">सबसे नया नोट लॉक स्क्रीन पर रखें</translation>
 <translation id="6239558157302047471">&amp;फ़्रेम फिर लोड करें</translation>
@@ -4532,6 +4533,7 @@
 <translation id="7908378463497120834">क्षमा करें, आपके बाह्य मेमोरी डिवाइस पर कम-से-कम एक विभाजन माउंट नहीं हो सका.</translation>
 <translation id="7909969815743704077">गुप्त मोड में डाउनलोड किया गया</translation>
 <translation id="7910768399700579500">&amp;नया फ़ोल्डर</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">सर्वर पर आपका पासवर्ड बदल दिया गया है. कृपया साइन आउट करें उसके बाद फिर से प्रवेश करें.</translation>
 <translation id="7915471803647590281">कृपया फ़ीडबैक भेजने से पहले हमें बताएं कि क्‍या हो रहा है.</translation>
 <translation id="7916556741383518510">क्लिक करने पर</translation>
@@ -4816,7 +4818,6 @@
 <translation id="8366396658833131068">आपकी नेटवर्क कनेक्टिविटी पुनर्स्थापित हो गई है. कृपया अपना किओस्क ऐप्स लॉन्च करने के लिए भिन्न नेटवर्क चुनें या नीचे दिया गया 'जारी रखें' बटन दबाएं.</translation>
 <translation id="8366947248864804596">जब आपका फ़ोन अनलॉक हो और आस-पास हो, तो बस अनलॉक करना चुनें. नहीं तो, अपना पासवर्ड या पिन डालें.</translation>
 <translation id="8368859634510605990">सभी बुकमार्क &amp;खोलें</translation>
-<translation id="8369547389711988632">लोड करना बंद किया गया</translation>
 <translation id="8371695176452482769">अब बोलें</translation>
 <translation id="8372369524088641025">ख़राब WEP कुंजी</translation>
 <translation id="8373553483208508744">टैब की आवाज़ बंद करें</translation>
@@ -5022,7 +5023,6 @@
 <translation id="8677212948402625567">सभी संक्षिप्त करें...</translation>
 <translation id="8678648549315280022">डाउनलोड सेटिंग प्रबंधित करें...</translation>
 <translation id="8678933587484842200">आप इस ऐप्लिकेशन को कैसे लॉन्च करना चाहते हैं?</translation>
-<translation id="8679788109894721265">यह पेज <ph name="MEGABYTES" />एमबी से भी ज़्यादा डेटा का इस्तेमाल करता है</translation>
 <translation id="8680251145628383637">अपने सभी डिवाइसों पर अपने बुकमार्क, इतिहास, पासवर्ड और अन्‍य सेटिंग प्राप्‍त करने के लिए प्रवेश करें. आप अपनी Google सेवाओं में भी अपने आप प्रवेश कर जाएंगे.</translation>
 <translation id="8686213429977032554">यह डिस्क अभी तक शेयर नहीं की गई है</translation>
 <translation id="8687485617085920635">अगली विंडो</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index f203caa..9aa8772 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Sinkronizacija i prilagodba</translation>
 <translation id="1398853756734560583">Maksimiziraj</translation>
 <translation id="1399511500114202393">Nema korisničkog certifikata</translation>
+<translation id="1401165786814632797">Pristupite Asistentu svaki put kad izgovorite "Ok Google", a uređaj je aktivan i otključan.</translation>
 <translation id="140250605646987970">Vaš je telefon pronađen, ali Smart Lock funkcionira samo na uređajima s Androidom 5.0 i novijima. &lt;a&gt;Saznajte više&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (nadzirani korisnik)</translation>
 <translation id="1405476660552109915">Želite li da <ph name="PASSWORD_MANAGER_BRAND" /> spremi vaš račun za ovu web-lokaciju?</translation>
@@ -1370,6 +1371,7 @@
 <translation id="3031557471081358569">Odaberi stavke za uvoz:</translation>
 <translation id="3031601332414921114">Nastavi ispis</translation>
 <translation id="303198083543495566">Geografija</translation>
+<translation id="3033999583152214331">Pokrenite Linuxove alate, uređivače i IDE-jeve na svojem Chromebooku. &lt;a target="_blank" href="<ph name="URL" />"&gt;Saznajte više&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Omogući Flash</translation>
 <translation id="3037754279345160234">Nije moguće raščlaniti konfiguraciju za pridruživanje domeni. Obratite se administratoru.</translation>
 <translation id="3038612606416062604">Ručno dodavanje pisača</translation>
@@ -1510,6 +1512,7 @@
 <translation id="3271648667212143903">Web-lokacija <ph name="ORIGIN" /> želi se povezati</translation>
 <translation id="3274763671541996799">Prešli ste u način prikaza na cijelom zaslonu.</translation>
 <translation id="3275778913554317645">Otvori kao prozor</translation>
+<translation id="3278877214895457897">Dok se Chromebook postavlja, pritisnite gumb Asistent ili recite "Ok Google" da biste dobili pomoć od Asistenta u bilo kojem trenutku.</translation>
 <translation id="3279230909244266691">Taj postupak može potrajati nekoliko minuta. Pokreće se virtualno računalo.</translation>
 <translation id="3279741024917655738">Prikaži videozapise preko cijelog zaslona na</translation>
 <translation id="3280237271814976245">Spremi &amp;kao...</translation>
@@ -2166,7 +2169,6 @@
 <translation id="4275830172053184480">Ponovo pokrenite svoj uređaj</translation>
 <translation id="4278101229438943600">Vaš je Asistent spreman</translation>
 <translation id="4278390842282768270">Dopušteno</translation>
-<translation id="4280864916190672950">Zaustavi učitavanje</translation>
 <translation id="4281844954008187215">Uvjeti upotrebe usluge</translation>
 <translation id="4282196459431406533">Smart Lock uključen</translation>
 <translation id="4284105660453474798">Doista želite izbrisati stavku  "$1"?</translation>
@@ -2604,6 +2606,7 @@
 <translation id="4992066212339426712">Uključi zvuk</translation>
 <translation id="4992458225095111526">Potvrda Powerwasha</translation>
 <translation id="4992473555164495036">Vaš je administrator ograničio dostupne načine unosa.</translation>
+<translation id="4992926179187649719">Uključite "Ok Google"</translation>
 <translation id="4994474651455208930">Dopusti web-lokacijama traženje dopuštenja da postanu zadani rukovatelji za protokole</translation>
 <translation id="4994754230098574403">Postavljanje</translation>
 <translation id="4996978546172906250">Dijeli putem</translation>
@@ -3436,7 +3439,6 @@
 <translation id="6231881193380278751">Dodajte parametar upita u URL da biste automatski osvježili stranicu: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Baterija</translation>
 <translation id="6232116551750539448">Prekinuta je veza s mrežom <ph name="NAME" /></translation>
-<translation id="6235700927623181151">Ova kartica dijeli sadržaj vaše radne površine.</translation>
 <translation id="6237816943013845465">Omogućuje prilagodbu razlučivosti zaslona</translation>
 <translation id="6238923052227198598">Zadrži najnoviju bilješku na zaključanom zaslonu</translation>
 <translation id="6239558157302047471">Ponovo učitaj okvir</translation>
@@ -4533,6 +4535,7 @@
 <translation id="7908378463497120834">Žao nam je, nije bilo moguće postaviti najmanje jednu particiju na vanjskom uređaju za pohranu.</translation>
 <translation id="7909969815743704077">Preuzeto u anonimnom načinu</translation>
 <translation id="7910768399700579500">&amp;Nova mapa</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Zaporka se promijenila na poslužitelju. Odjavite se pa se ponovo prijavite.</translation>
 <translation id="7915471803647590281">Recite nam što se događa prije nego što nam pošaljete povratnu informaciju.</translation>
 <translation id="7916556741383518510">Na klik</translation>
@@ -4818,7 +4821,6 @@
 <translation id="8366396658833131068">Veza s mrežom ponovno je uspostavljena. Odaberite neku drugu mrežu ili pritisnite gumb "Nastavi" u nastavku kako biste pokrenuli aplikaciju kioska.</translation>
 <translation id="8366947248864804596">Kada je vaš telefon otključan i u blizini, samo odaberite otključavanje. U suprotnom unesite zaporku ili PIN.</translation>
 <translation id="8368859634510605990">&amp;Otvori sve oznake</translation>
-<translation id="8369547389711988632">Učitavanje je zaustavljeno</translation>
 <translation id="8371695176452482769">Govorite sad</translation>
 <translation id="8372369524088641025">Neispravan WEP ključ</translation>
 <translation id="8373553483208508744">Isključi zvuk na karticama</translation>
@@ -5024,7 +5026,6 @@
 <translation id="8677212948402625567">Sažmi sve...</translation>
 <translation id="8678648549315280022">Upravljanje postavkama preuzimanja...</translation>
 <translation id="8678933587484842200">Kako želite da se ova aplikacija pokreće?</translation>
-<translation id="8679788109894721265">Ova stranica upotrebljava više od <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Prijavite se tako da vam oznake, povijest i druge postavke budu dostupne na svim svojim uređajima. Time ćete se automatski prijaviti i na Googleove usluge.</translation>
 <translation id="8686213429977032554">Ova datoteka na Disku još se ne dijeli</translation>
 <translation id="8687485617085920635">Sljedeći prozor</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index c34c4ca..fe35f0c 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -2166,7 +2166,6 @@
 <translation id="4275830172053184480">Indítsa újra az eszközt</translation>
 <translation id="4278101229438943600">Segédje készen áll</translation>
 <translation id="4278390842282768270">Engedélyezve</translation>
-<translation id="4280864916190672950">Betöltés leállítása</translation>
 <translation id="4281844954008187215">Általános Szerződési Feltételek</translation>
 <translation id="4282196459431406533">A Smart Lock be van kapcsolva</translation>
 <translation id="4284105660453474798">Biztos, hogy törölni szeretné ezt: "$1"?</translation>
@@ -3438,7 +3437,6 @@
 <translation id="6231881193380278751">Adjon meg egy lekérdezési paramétert az URL-ben az oldal automatikus frissítéséhez: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Akkumulátor</translation>
 <translation id="6232116551750539448">Megszűnt a kapcsolat a következővel: <ph name="NAME" /></translation>
-<translation id="6235700927623181151">Ez a lap megosztja az asztal tartalmát.</translation>
 <translation id="6237816943013845465">Lehetővé teszi a képernyő felbontásának módosítását</translation>
 <translation id="6238923052227198598">Legutóbbi jegyzet megtartása a lezárási képernyőn</translation>
 <translation id="6239558157302047471">&amp;Keret újratöltése</translation>
@@ -4819,7 +4817,6 @@
 <translation id="8366396658833131068">A hálózati kapcsolat helyreállt. Kérjük, válasszon másik hálózatot, vagy nyomja le az alábbi „Folytatás” gombot a kioszkalkalmazás elindításához.</translation>
 <translation id="8366947248864804596">Ha telefonja feloldott állapotban és a közelben van, válassza ki a lezárás feloldásához. Ellenkező esetben adja meg jelszavát vagy PIN-kódját.</translation>
 <translation id="8368859634510605990">&amp;Az összes könyvjelző megnyitása</translation>
-<translation id="8369547389711988632">Leállította a betöltést</translation>
 <translation id="8371695176452482769">Most beszéljen</translation>
 <translation id="8372369524088641025">Hibás WEP kulcs</translation>
 <translation id="8373553483208508744">Lapok némítása</translation>
@@ -5025,7 +5022,6 @@
 <translation id="8677212948402625567">Összes listanézete...</translation>
 <translation id="8678648549315280022">Letöltési beállítások kezelése...</translation>
 <translation id="8678933587484842200">Hogyan szeretné elindítani ezt az alkalmazást?</translation>
-<translation id="8679788109894721265">Ez az oldal több mint <ph name="MEGABYTES" /> MB memóriát használ</translation>
 <translation id="8680251145628383637">Ha bejelentkezik, könyvjelzőit, előzményeit és egyéb beállításait bármilyen eszközről elérheti. Ráadásul automatikusan bejelentkezik a Google-szolgáltatásokba.</translation>
 <translation id="8686213429977032554">Ez a Drive-fájl még nincs megosztva</translation>
 <translation id="8687485617085920635">Következő ablak</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 26ed3f1..7605cf9 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Sinkronisasi dan personalisasi</translation>
 <translation id="1398853756734560583">Perbesar</translation>
 <translation id="1399511500114202393">Tidak ada sertifikat pengguna</translation>
+<translation id="1401165786814632797">Mengakses Asisten setiap kali Anda mengucapkan "Ok Google" saat perangkat aktif dan tidak terkunci.</translation>
 <translation id="140250605646987970">Ponsel Anda telah ditemukan. Namun Smart Lock hanya bekerja di perangkat dengan Android 5.0 dan yang lebih baru. &lt;a&gt;Pelajari lebih lanjut&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (Dilindungi)</translation>
 <translation id="1405476660552109915">Ingin <ph name="PASSWORD_MANAGER_BRAND" /> menyimpan akun untuk situs ini?</translation>
@@ -1370,6 +1371,7 @@
 <translation id="3031557471081358569">Pilih item yang akan diimpor:</translation>
 <translation id="3031601332414921114">Lanjutkan pencetakan</translation>
 <translation id="303198083543495566">Geografi</translation>
+<translation id="3033999583152214331">Menjalankan IDE, editor, dan fitur Linux di Chromebook Anda. &lt;a target="_blank" href="<ph name="URL" />"&gt;Pelajari lebih lanjut&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Aktifkan Flash</translation>
 <translation id="3037754279345160234">Tidak dapat mengurai konfigurasi untuk bergabung dengan domain. Hubungi administrator.</translation>
 <translation id="3038612606416062604">Tambahkan printer secara manual</translation>
@@ -1510,6 +1512,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> ingin terhubung</translation>
 <translation id="3274763671541996799">Anda telah memasuki mode layar penuh.</translation>
 <translation id="3275778913554317645">Buka sebagai jendela</translation>
+<translation id="3278877214895457897">Jika Chromebook sudah disiapkan, tekan tombol Asisten atau ucapkan "OK Google" untuk mendapatkan bantuan dari Asisten kapan saja.</translation>
 <translation id="3279230909244266691">Proses ini dapat memerlukan waktu beberapa menit. Memulai mesin virtual.</translation>
 <translation id="3279741024917655738">Tampilkan video layar penuh diaktifkan</translation>
 <translation id="3280237271814976245">Simp&amp;an sebagai...</translation>
@@ -2166,7 +2169,6 @@
 <translation id="4275830172053184480">Mulai ulang perangkat Anda</translation>
 <translation id="4278101229438943600">Asisten sudah siap</translation>
 <translation id="4278390842282768270">Diizinkan</translation>
-<translation id="4280864916190672950">Berhenti memuat</translation>
 <translation id="4281844954008187215">Persyaratan Layanan</translation>
 <translation id="4282196459431406533">Smart Lock diaktifkan</translation>
 <translation id="4284105660453474798">Yakin ingin menghapus "$1"?</translation>
@@ -2604,6 +2606,7 @@
 <translation id="4992066212339426712">Bunyikan</translation>
 <translation id="4992458225095111526">Konfirmasi Powerwash</translation>
 <translation id="4992473555164495036">Administrator membatasi metode masukan yang tersedia.</translation>
+<translation id="4992926179187649719">Aktifkan "Ok Google"</translation>
 <translation id="4994474651455208930">Izinkan situs meminta untuk menjadi penangan default bagi protokol</translation>
 <translation id="4994754230098574403">Menyiapkan</translation>
 <translation id="4996978546172906250">Bagikan dengan</translation>
@@ -3436,7 +3439,6 @@
 <translation id="6231881193380278751">Tambahkan parameter kueri di URL untuk menyegarkan halaman secara otomatis: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Baterai</translation>
 <translation id="6232116551750539448">Sambungan ke <ph name="NAME" /> terputus</translation>
-<translation id="6235700927623181151">Tab ini sedang membagikan konten desktop Anda.</translation>
 <translation id="6237816943013845465">Memungkinkan Anda menyesuaikan resolusi layar</translation>
 <translation id="6238923052227198598">Tampilkan catatan terbaru di layar kunci</translation>
 <translation id="6239558157302047471">Muat ulang &amp;frame</translation>
@@ -4533,6 +4535,7 @@
 <translation id="7908378463497120834">Maaf, setidaknya satu partisi pada perangkat penyimpanan eksternal Anda tidak dapat dipasang.</translation>
 <translation id="7909969815743704077">Didownload dalam mode Penyamaran</translation>
 <translation id="7910768399700579500">&amp;Map baru</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Sandi Anda telah diubah di server. Harap logout, lalu login kembali.</translation>
 <translation id="7915471803647590281">Beri tahu kami apa yang terjadi sebelum mengirim masukan.</translation>
 <translation id="7916556741383518510">Saat Diklik</translation>
@@ -4817,7 +4820,6 @@
 <translation id="8366396658833131068">Konektivitas jaringan Anda dipulihkan. Pilih jaringan lain atau tekan tombol 'Lanjutkan' di bawah untuk meluncurkan aplikasi kios.</translation>
 <translation id="8366947248864804596">Saat ponsel tidak dikunci dan berada di dekat Anda, cukup pilih untuk membuka kunci. Jika tidak, masukkan sandi atau PIN.</translation>
 <translation id="8368859634510605990">&amp;Buka semua bookmark</translation>
-<translation id="8369547389711988632">Berhenti memuat</translation>
 <translation id="8371695176452482769">Bicaralah sekarang</translation>
 <translation id="8372369524088641025">Kunci WEP yang buruk</translation>
 <translation id="8373553483208508744">Nonaktifkan tab</translation>
@@ -5023,7 +5025,6 @@
 <translation id="8677212948402625567">Ciutkan semua...</translation>
 <translation id="8678648549315280022">Mengelola setelan download...</translation>
 <translation id="8678933587484842200">Bagaimana Anda ingin meluncurkan aplikasi ini?</translation>
-<translation id="8679788109894721265">Halaman ini menggunakan lebih dari <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Masuk untuk mendapatkan bookmark, histori, sandi, dan setelan lain di semua perangkat. Anda juga akan otomatis masuk ke layanan Google.</translation>
 <translation id="8686213429977032554">File Drive ini belum dibagikan</translation>
 <translation id="8687485617085920635">Jendela berikutnya</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 00be777e..68fcd451 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Sincronizzazione e personalizzazione</translation>
 <translation id="1398853756734560583">Ingrandisci</translation>
 <translation id="1399511500114202393">Nessun certificato utente</translation>
+<translation id="1401165786814632797">Accedi all'assistente ogni volta che pronunci "Ok Google" quando il tuo dispositivo è attivo e sbloccato.</translation>
 <translation id="140250605646987970">Il telefono è stato rilevato, ma la funzione Smart Lock è supportata soltanto su dispositivi con Android 5.0 e versioni successive. &lt;a&gt;Ulteriori informazioni&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (supervisionato)</translation>
 <translation id="1405476660552109915">Vuoi che <ph name="PASSWORD_MANAGER_BRAND" /> salvi l'account per questo sito?</translation>
@@ -1509,6 +1510,7 @@
 <translation id="3271648667212143903">Il sito <ph name="ORIGIN" /> desidera collegarsi</translation>
 <translation id="3274763671541996799">Sei passato a schermo intero.</translation>
 <translation id="3275778913554317645">Apri come finestra</translation>
+<translation id="3278877214895457897">Dopo aver configurato il Chromebook, premi il pulsante Assistente o dì "Ok Google" per farti aiutare dall'assistente in qualsiasi momento.</translation>
 <translation id="3279230909244266691">Questa procedura potrebbe richiedere alcuni minuti. Avvio della macchina virtuale in corso.</translation>
 <translation id="3279741024917655738">Mostra video a schermo intero su</translation>
 <translation id="3280237271814976245">Salva con &amp;nome...</translation>
@@ -2163,7 +2165,6 @@
 <translation id="4275830172053184480">Riavvia il dispositivo</translation>
 <translation id="4278101229438943600">Il tuo assistente è pronto</translation>
 <translation id="4278390842282768270">Consentiti</translation>
-<translation id="4280864916190672950">Interrompi il caricamento</translation>
 <translation id="4281844954008187215">Termini di servizio</translation>
 <translation id="4282196459431406533">Funzione Smart Lock attiva</translation>
 <translation id="4284105660453474798">Eliminare "$1"?</translation>
@@ -2601,6 +2602,7 @@
 <translation id="4992066212339426712">Riattiva audio</translation>
 <translation id="4992458225095111526">Conferma Powerwash</translation>
 <translation id="4992473555164495036">L'amministratore ha limitato i metodi di immissione disponibili.</translation>
+<translation id="4992926179187649719">Attiva "Ok Google"</translation>
 <translation id="4994474651455208930">Consenti ai siti di chiedere di diventare gestori predefiniti dei protocolli</translation>
 <translation id="4994754230098574403">Configurazione in corso</translation>
 <translation id="4996978546172906250">Condividi tramite</translation>
@@ -3432,7 +3434,6 @@
 <translation id="6231881193380278751">Aggiungi un parametro query nell'URL per aggiornare automaticamente la pagina: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Batteria</translation>
 <translation id="6232116551750539448">Connection a <ph name="NAME" /> interrotta</translation>
-<translation id="6235700927623181151">Questa scheda sta condividendo i contenuti del tuo desktop.</translation>
 <translation id="6237816943013845465">Consente di regolare la risoluzione dello schermo</translation>
 <translation id="6238923052227198598">Tieni le note più recenti sulla schermata di blocco</translation>
 <translation id="6239558157302047471">Ricarica &amp;frame</translation>
@@ -4527,6 +4528,7 @@
 <translation id="7908378463497120834">Spiacenti, impossibile montare almeno una partizione del dispositivo di archiviazione esterno.</translation>
 <translation id="7909969815743704077">Scaricato in modalità in incognito</translation>
 <translation id="7910768399700579500">&amp;Nuova cartella</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">La password è stata modificata sul server. Esci e accedi nuovamente.</translation>
 <translation id="7915471803647590281">Comunicaci cosa sta accadendo prima di inviare il feedback.</translation>
 <translation id="7916556741383518510">Al clic</translation>
@@ -4811,7 +4813,6 @@
 <translation id="8366396658833131068">La connettività di rete è stata ripristinata. Seleziona un'altra rete o premi il pulsante "Continua" sotto per avviare l'app kiosk.</translation>
 <translation id="8366947248864804596">Quando il telefono è sbloccato e nelle vicinanze, è sufficiente selezionare per sbloccare. In caso contrario, inserisci la password o il PIN.</translation>
 <translation id="8368859634510605990">&amp;Apri tutti i Preferiti</translation>
-<translation id="8369547389711988632">Caricamento interrotto</translation>
 <translation id="8371695176452482769">Parla adesso</translation>
 <translation id="8372369524088641025">Chiave WEP non valida</translation>
 <translation id="8373553483208508744">Disattiva audio schede</translation>
@@ -5017,7 +5018,6 @@
 <translation id="8677212948402625567">Comprimi tutto...</translation>
 <translation id="8678648549315280022">Gestisci impostazioni download...</translation>
 <translation id="8678933587484842200">Come vuoi che venga lanciata questa applicazione?</translation>
-<translation id="8679788109894721265">Questa pagina usa più di <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Accedi per trovare i tuoi segnalibri, la cronologia, le password e altre impostazioni su tutti i tuoi dispositivi. Verrà inoltre eseguito l'accesso automatico ai tuoi servizi Google.</translation>
 <translation id="8686213429977032554">Questo file di Drive non è stato ancora condiviso</translation>
 <translation id="8687485617085920635">Finestra successiva</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index bbe3c3f..1484e0a 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -2163,7 +2163,6 @@
 <translation id="4275830172053184480">הפעלת המכשיר מחדש</translation>
 <translation id="4278101229438943600">‏ה-Assistant מוכן</translation>
 <translation id="4278390842282768270">מותר</translation>
-<translation id="4280864916190672950">עצירת הטעינה</translation>
 <translation id="4281844954008187215">תנאי שירות</translation>
 <translation id="4282196459431406533">‏Smart Lock מופעל</translation>
 <translation id="4284105660453474798">האם אתה בטוח שברצונך למחוק את "$1"?</translation>
@@ -3434,7 +3433,6 @@
 <translation id="6231881193380278751">‏הוסף פרמטר שאילתה בכתובת האתר כדי לרענן את הדף באופן אוטומטי: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">סוללה</translation>
 <translation id="6232116551750539448">החיבור אל <ph name="NAME" /> נותק</translation>
-<translation id="6235700927623181151">הכרטיסייה הזו משתפת את תוכן שולחן העבודה שלך.</translation>
 <translation id="6237816943013845465">הגדרה זו מאפשרת לך לקבוע את רזולוציית המסך</translation>
 <translation id="6238923052227198598">המשך הצגת ההודעה האחרונה במסך הנעילה</translation>
 <translation id="6239558157302047471">טען מחדש את ה&amp;מסגרת</translation>
@@ -3501,7 +3499,7 @@
 <translation id="6327785803543103246">‏גילוי אוטומטי של שרת proxy באינטרנט</translation>
 <translation id="6333064448949140209">‏הקובץ יישלח אל Google לניפוי באגים</translation>
 <translation id="6333834492048057036">מיקוד בסרגל כתובות לחיפוש</translation>
-<translation id="6336451774241870485">כרטיסיית פרטיות חדשה</translation>
+<translation id="6336451774241870485">כרטיסייה פרטית חדשה</translation>
 <translation id="6339668969738228384">צור פרופיל חדש בשביל <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">‏לא ניתן היה להתחבר אל השרת. יש לבדוק את חיבור הרשת ולנסות שוב. אם הבעיה ממשיכה, יש להפעיל מחדש את ה-Chromebook.</translation>
 <translation id="6340071272923955280">‏פרוטוקול הדפסה באינטרנט (IPPS)</translation>
@@ -3683,7 +3681,7 @@
 <translation id="6606070663386660533">כרטיסייה 8</translation>
 <translation id="6607272825297743757">פרטי הקובץ</translation>
 <translation id="6607831829715835317">כלים &amp;נוספים</translation>
-<translation id="6610147964972079463">סגירת כרטיסיות הפרטיות</translation>
+<translation id="6610147964972079463">סגירת הכרטיסיות הפרטיות</translation>
 <translation id="6612358246767739896">תוכן מוגן</translation>
 <translation id="6613452264606394692">הוספת הדף לסימניות תאפשר גישה מהירה אליו</translation>
 <translation id="6614893213975402384">‏התקנת עדכונים ואפליקציות. הבחירה להמשיך תבטא הסכמה מצידך לכך שהמכשיר גם יוריד ויתקין באופן אוטומטי עדכונים ואפליקציות מ-Google, מספק השירות ומיצרן המכשיר. ייתכן שההורדה תיעשה באמצעות חבילת הגלישה. חלק מהאפליקציות האלה עשויות לכלול אפשרות לרכישות מהאפליקציה. תמיד אפשר להסיר את האפליקציות האלה. <ph name="BEGIN_LINK1" />מידע נוסף<ph name="END_LINK1" /></translation>
@@ -3754,7 +3752,7 @@
 <translation id="6710213216561001401">הקודם</translation>
 <translation id="6718273304615422081">דוחס...</translation>
 <translation id="671928215901716392">מסך נעילה</translation>
-<translation id="6720847671508630642">‏אפשר לשתף באופן אוטומטי את מיטב היכולות של Android עם ה-Chromebook. חיבור הטלפון מאפשר לך לשלוח הודעות טקסט מהמחשב, לשתף את חיבור האינטרנט של הטלפון ולבטל את נעילת מסך ה-Chromebook.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
+<translation id="6720847671508630642">‏אפשר לשתף באופן אוטומטי את מיטב היכולות של Android עם ה-Chromebook. חיבור הטלפון מאפשר לך לשלוח הודעות טקסט מהמחשב, לשתף את חיבור האינטרנט של הטלפון ולבטל את הנעילה של מסך ה-Chromebook.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">לראות את היצרן והדגם של מפתח האבטחה</translation>
 <translation id="6721972322305477112">&amp;קובץ</translation>
 <translation id="672213144943476270">בטל את נעילת הפרופיל שלך לפני גלישה כאורח.</translation>
@@ -4812,7 +4810,6 @@
 <translation id="8366396658833131068">קישוריות הרשת שלך התחדשה. בחר רשת אחרת או לחץ על הלחצן 'המשך' שלמטה כדי להפעיל את יישום הקיוסק.</translation>
 <translation id="8366947248864804596">‏כשהטלפון שלך בקרבת מקום ואינו נעול, עליך לבחור באפשרות של ביטול נעילה. אחרת, עליך להזין סיסמה או קוד PIN.</translation>
 <translation id="8368859634510605990">&amp;פתח את כל הסימניות</translation>
-<translation id="8369547389711988632">הטעינה נפסקה</translation>
 <translation id="8371695176452482769">דבר עכשיו</translation>
 <translation id="8372369524088641025">‏מקש WEP גרוע</translation>
 <translation id="8373553483208508744">השתק כרטיסיות</translation>
@@ -5018,7 +5015,6 @@
 <translation id="8677212948402625567">כווץ הכל...</translation>
 <translation id="8678648549315280022">נהל הגדרות הורדה...</translation>
 <translation id="8678933587484842200">איך להפעיל את האפליקציה הזו?</translation>
-<translation id="8679788109894721265">‏הדף הזה משתמש ביותר מ-‎<ph name="MEGABYTES" />MB</translation>
 <translation id="8680251145628383637">‏היכנס כדי לקבל גישה אל הסימניות, ההיסטוריה, הסיסמאות והגדרות נוספות בכל המכשירים שברשותך. בנוסף, תחובר אוטומטית אל שירותי Google.</translation>
 <translation id="8686213429977032554">‏קובץ זה של Drive עדיין לא משותף</translation>
 <translation id="8687485617085920635">החלון הבא</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 50c22061..5a516b5 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -2166,7 +2166,6 @@
 <translation id="4275830172053184480">デバイスの再起動</translation>
 <translation id="4278101229438943600">アシスタントの設定完了</translation>
 <translation id="4278390842282768270">許可</translation>
-<translation id="4280864916190672950">読み込みを停止する</translation>
 <translation id="4281844954008187215">利用規約</translation>
 <translation id="4282196459431406533">Smart Lock が有効です</translation>
 <translation id="4284105660453474798">「$1」を削除してもよろしいですか?</translation>
@@ -3436,7 +3435,6 @@
 <translation id="6231881193380278751">ページを自動更新するには URL にクエリ パラメータを追加します: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">バッテリー</translation>
 <translation id="6232116551750539448"><ph name="NAME" /> への接続が切断されました</translation>
-<translation id="6235700927623181151">このタブはパソコンのコンテンツを共有しています。</translation>
 <translation id="6237816943013845465">画面の解像度を調整できます</translation>
 <translation id="6238923052227198598">ロック画面に最新のメモを表示する</translation>
 <translation id="6239558157302047471">フレームを再読み込み(&amp;F)</translation>
@@ -4818,7 +4816,6 @@
 <translation id="8366396658833131068">ネットワーク接続が復元されました。キオスク アプリを起動するには、別のネットワークを選択するか、下の [続行] ボタンを押してください。</translation>
 <translation id="8366947248864804596">スマートフォンがロック解除された状態で近くにある場合は、選択するとデバイスのロックを解除できます。そうでない場合は、パスワードまたは PIN を入力します。</translation>
 <translation id="8368859634510605990">すべてのブックマークを開く(&amp;O)</translation>
-<translation id="8369547389711988632">読み込みを停止しました</translation>
 <translation id="8371695176452482769">お話しください</translation>
 <translation id="8372369524088641025">WEP キーが正しくありません</translation>
 <translation id="8373553483208508744">タブをミュート</translation>
@@ -5024,7 +5021,6 @@
 <translation id="8677212948402625567">すべてを折りたたむ...</translation>
 <translation id="8678648549315280022">ダウンロード設定を管理...</translation>
 <translation id="8678933587484842200">このアプリケーションの起動方法を選択してください。</translation>
-<translation id="8679788109894721265">このページは <ph name="MEGABYTES" /> MB を超えるデータを使用しています</translation>
 <translation id="8680251145628383637">ブックマーク、履歴、パスワードなどの設定をすべてのデバイスで使用するにはログインしてください。ログインすると、利用している Google サービスにも自動的にログインすることになります。</translation>
 <translation id="8686213429977032554">未共有のドライブ ファイル</translation>
 <translation id="8687485617085920635">次のウィンドウ</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 7994577..222c757 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -509,7 +509,7 @@
 <translation id="1744060673522309905">ಡೊಮೇನ್‌ಗೆ ಸಾಧನವನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನೀವು ಸೇರಿಸಬಹುದಾದ ಸಾಧನಗಳ ಸಂಖ್ಯೆಯನ್ನು ಮೀರಿಲ್ಲ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.</translation>
 <translation id="1744108098763830590">ಹಿನ್ನೆಲೆ ಪುಟ</translation>
 <translation id="1745520510852184940">ಯಾವಾಗಲೂ ಇದನ್ನು ಮಾಡಿ</translation>
-<translation id="1746417874336251387">ನಿಮ್ಮ ಫೋನ್‌ನ ಸಂಪರ್ಕವನ್ನು ಬಳಸುವ ಹೊಸ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು Chromebook ಗೆ ಒದಗಿಸಿ</translation>
+<translation id="1746417874336251387">ನಿಮ್ಮ Chromebook ನಲ್ಲಿ ಹೊಸ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ. ಈ ವೈಶಿಷ್ಟ್ಯಗಳು ನಿಮ್ಮ ಫೋನ್‍ನ ಸಂಪರ್ಕವನ್ನು ಬಳಸುತ್ತವೆ.</translation>
 <translation id="174937106936716857">ಒಟ್ಟು ಫೈಲ್‌ ಎಣಿಕೆ</translation>
 <translation id="175196451752279553">ಮುಚ್ಚಿದ ಟ್ಯಾಬ್‌ಗಳನ್ನು ಮತ್ತೆ ತೆರೆಯಿರಿ</translation>
 <translation id="1753905327828125965">ಅತಿಹೆಚ್ಚು ಬಾರಿ ಸಂದರ್ಶಿಸಿರುವುದು</translation>
@@ -1367,6 +1367,7 @@
 <translation id="3031557471081358569">ಆಮದು ಮಾಡಲು ಐಟಂಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಿ:</translation>
 <translation id="3031601332414921114">ಮುದ್ರಿಸುವಿಕೆಯನ್ನು ಪುನರಾರಂಭಿಸಿ</translation>
 <translation id="303198083543495566">ಭೂಗೋಳಶಾಸ್ತ್ರ</translation>
+<translation id="3033999583152214331">ನಿಮ್ಮ Chromebook ನಲ್ಲಿ Linux ಪರಿಕರಗಳು, ಎಡಿಟರ್‌ಗಳು ಮತ್ತು IDE ಗಳನ್ನು ರನ್ ಮಾಡಿ. &lt;a target="_blank" href="<ph name="URL" />"&gt;ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ&lt;/a&gt;</translation>
 <translation id="3036546437875325427">ಫ್ಲ್ಯಾಶ್ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="3037754279345160234">ಡೊಮೇನ್ ಜೋಡಣೆ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ವಿಶ್ಲೇಷಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation>
 <translation id="3038612606416062604">ಹಸ್ತಚಾಲಿತವಾಗಿ ಪ್ರಿಂಟರ್ ಸೇರಿಸಿ</translation>
@@ -2163,7 +2164,6 @@
 <translation id="4275830172053184480">ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ</translation>
 <translation id="4278101229438943600">ನಿಮ್ಮ ಅಸಿಸ್ಟೆಂಟ್ ಸಿದ್ಧವಾಗಿದೆ</translation>
 <translation id="4278390842282768270">ಅನುಮತಿಸಲಾಗಿದೆ</translation>
-<translation id="4280864916190672950">ಲೋಡ್ ಮಾಡುವುದನ್ನು ನಿಲ್ಲಿಸಿ</translation>
 <translation id="4281844954008187215">ಸೇವೆಯ ನಿಯಮಗಳು</translation>
 <translation id="4282196459431406533">Smart Lock ಅನ್ನು ಆನ್‌ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="4284105660453474798">"$1" ಅನ್ನು ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?</translation>
@@ -3434,7 +3434,6 @@
 <translation id="6231881193380278751">ಪುಟವನ್ನು ಸ್ವಯಂ-ರಿಫ್ರೆಶ್ ಮಾಡಲು ಪ್ರಶ್ನೆಯ ಪರಮ್ ಸೇರಿಸಿ: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">ಬ್ಯಾಟರಿ</translation>
 <translation id="6232116551750539448"><ph name="NAME" /> ಗೆ ಸಂಪರ್ಕ ಕಡಿದು ಹೋಗಿದೆ</translation>
-<translation id="6235700927623181151">ಈ ಟ್ಯಾಬ್ ನಿಮ್ಮ ಡೆಸ್ಕ್‌ಟಾಪ್ ವಿಷಯವನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation>
 <translation id="6237816943013845465">ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ರೆಸಲ್ಯೂಶನ್ ಸರಿಹೊಂದಿಸಲು ನಿಮಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ</translation>
 <translation id="6238923052227198598">ಲಾಕ್ ಪರದೆಯ ಮೇಲೆ ಇತ್ತೀಚಿನ ಟಿಪ್ಪಣಿ ಇರಿಸಿ</translation>
 <translation id="6239558157302047471">ರೀಲೋಡ್ &amp;ಫ್ರೇಮ್</translation>
@@ -4806,7 +4805,6 @@
 <translation id="8366396658833131068">ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌ ಸಂಪರ್ಕವನ್ನು ಮರುಸ್ಥಾಪಿಸಲಾಗಿದೆ. ದಯವಿಟ್ಟು ಬೇರೊಂದು ನೆಟ್‌ವರ್ಕ್‌ ಆಯ್ಕೆಮಾಡಿ ಅಥವಾ ನಿಮ್ಮ ಕಿಯೋಸ್ಕ್‌ ಅಪ್ಲಿಕೇಶನ್‌ ಪ್ರಾರಂಭಿಸಲು ಕೆಳಗಿರುವ 'ಮುಂದುವರಿಸು' ಬಟನ್‌ ಕ್ಲಿಕ್ ಮಾಡಿ.</translation>
 <translation id="8366947248864804596">ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಿರುವಾಗ ಮತ್ತು ಹತ್ತಿರದಲ್ಲಿರುವಾಗ, ಅನ್‌ಲಾಕ್‌ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ. ಇಲ್ಲದಿದ್ದರೆ, ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ ಅಥವಾ ಪಿನ್‌ ಅನ್ನು ನಮೂದಿಸಿ.</translation>
 <translation id="8368859634510605990">&amp;ಎಲ್ಲ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
-<translation id="8369547389711988632">ಲೋಡ್ ಮಾಡುವುದನ್ನು ನಿಲ್ಲಿಸಲಾಗಿದೆ</translation>
 <translation id="8371695176452482769">ಈಗ ಮಾತನಾಡಿ</translation>
 <translation id="8372369524088641025">ಕೆಟ್ಟ WEP ಕೀ</translation>
 <translation id="8373553483208508744">ಟ್ಯಾಬ್‌ಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಿ</translation>
@@ -5014,7 +5012,6 @@
 <translation id="8677212948402625567">ಎಲ್ಲವನ್ನು ಕುಗ್ಗಿಸು...</translation>
 <translation id="8678648549315280022">ಡೌನ್‌ಲೋಡ್‌ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ...</translation>
 <translation id="8678933587484842200">ಈ ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ನೀವು ಹೇಗೆ ಪ್ರಾರಂಭಿಸಲು ಬಯಸುತ್ತೀರಿ?</translation>
-<translation id="8679788109894721265">ಈ ಪುಟವು <ph name="MEGABYTES" />MB ಗಿಂತಲೂ ಹೆಚ್ಚು ಡೇಟಾವನ್ನು ಬಳಸುತ್ತದೆ</translation>
 <translation id="8680251145628383637">ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು, ಇತಿಹಾಸ ಮತ್ತು ಇತರ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಸೈನ್‌ ಇನ್‌ ಮಾಡಿ. ನಿಮ್ಮ Google ಸೇವೆಗಳಿಗೆ ಸಹ ನಿಮ್ಮನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಲಾಗುತ್ತದೆ.</translation>
 <translation id="8686213429977032554">ಈ ಡ್ರೈವ್ ಫೈಲ್ ಅನ್ನು ಇನ್ನೂ ಹಂಚಿಕೊಳ್ಳಲಾಗಿಲ್ಲ</translation>
 <translation id="8687485617085920635">ಮುಂದಿನ ವಿಂಡೊ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 4e2dc0d0..9614aa94 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -2164,7 +2164,6 @@
 <translation id="4275830172053184480">기기 다시 시작</translation>
 <translation id="4278101229438943600">어시스턴트 이용 가능</translation>
 <translation id="4278390842282768270">허용됨</translation>
-<translation id="4280864916190672950">로드 중지</translation>
 <translation id="4281844954008187215">서비스 약관</translation>
 <translation id="4282196459431406533">Smart Lock이 사용 설정됨</translation>
 <translation id="4284105660453474798">'$1'을(를) 삭제하시겠습니까?</translation>
@@ -3434,7 +3433,6 @@
 <translation id="6231881193380278751">검색어 매개변수를 URL에 추가하여 다음 페이지를 자동으로 새로고침하세요. chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">배터리</translation>
 <translation id="6232116551750539448"><ph name="NAME" /> 연결이 끊어졌습니다.</translation>
-<translation id="6235700927623181151">탭에서 데스크톱 콘텐츠를 공유하는 중입니다.</translation>
 <translation id="6237816943013845465">화면 해상도를 조정할 수 있습니다.</translation>
 <translation id="6238923052227198598">잠금 화면에 최근 메모 보관</translation>
 <translation id="6239558157302047471">프레임 새로고침(&amp;F)</translation>
@@ -4815,7 +4813,6 @@
 <translation id="8366396658833131068">네트워크 연결이 복원되었습니다. 키오스크 앱을 실행하려면 다른 네트워크를 선택하거나 아래에서 '계속' 버튼을 누르세요.</translation>
 <translation id="8366947248864804596">휴대전화가 잠금 해제된 상태로 근처에 있는 경우 선택하여 잠금 해제하세요. 그렇지 않은 경우 비밀번호나 PIN을 입력해야 합니다.</translation>
 <translation id="8368859634510605990">모든 북마크 열기(&amp;O)</translation>
-<translation id="8369547389711988632">로드가 중지됨</translation>
 <translation id="8371695176452482769">말하세요</translation>
 <translation id="8372369524088641025">잘못된 WEP 키</translation>
 <translation id="8373553483208508744">탭 음소거</translation>
@@ -5021,7 +5018,6 @@
 <translation id="8677212948402625567">모두 접기...</translation>
 <translation id="8678648549315280022">다운로드 설정 관리...</translation>
 <translation id="8678933587484842200">이 애플리케이션을 실행할 방법을 선택하세요.</translation>
-<translation id="8679788109894721265">이 페이지는 <ph name="MEGABYTES" />MB 이상을 사용합니다.</translation>
 <translation id="8680251145628383637">로그인하면 모든 기기에서 북마크, 방문 기록, 비밀번호, 기타 설정이 동기화되며 Google 서비스에 자동으로 로그인됩니다.</translation>
 <translation id="8686213429977032554">드라이브 파일이 아직 공유되지 않음</translation>
 <translation id="8687485617085920635">다음 창</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 0ab5baf..338c160 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -2166,7 +2166,6 @@
 <translation id="4275830172053184480">Iš naujo paleisti įrenginį</translation>
 <translation id="4278101229438943600">Padėjėjas pasiruošęs</translation>
 <translation id="4278390842282768270">Leidžiama</translation>
-<translation id="4280864916190672950">Sustabdyti įkėlimą</translation>
 <translation id="4281844954008187215">Paslaugų teikimo sąlygos</translation>
 <translation id="4282196459431406533">„Smart Lock“ įjungta</translation>
 <translation id="4284105660453474798">Ar iš tikrųjų norite ištrinti „$1“?</translation>
@@ -3437,7 +3436,6 @@
 <translation id="6231881193380278751">Kad puslapis būtų atnaujintas automatiškai, pridėkite šį užklausos parametrą prie URL: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Akumuliatorius</translation>
 <translation id="6232116551750539448">Ryšys su „<ph name="NAME" />“ nutrūko</translation>
-<translation id="6235700927623181151">Šis skirtukas bendrina jūsų darbalaukio turinį.</translation>
 <translation id="6237816943013845465">Leidžiama koreguoti ekrano skyrą</translation>
 <translation id="6238923052227198598">Palikti naujausią pastabą užrakinimo ekrane</translation>
 <translation id="6239558157302047471">Įkelti &amp;rėmelį iš naujo</translation>
@@ -4818,7 +4816,6 @@
 <translation id="8366396658833131068">Tinklo ryšys atkurtas. Pasirinkite kitą tinklą arba paspauskite toliau pateiktą mygtuką „Tęsti“, kad paleistumėte viešojo terminalo programą.</translation>
 <translation id="8366947248864804596">Jei jūsų telefonas yra netoliese ir atrakintas, tiesiog pasirinkite jį, kad atrakintumėte. Kitu atveju įveskite slaptažodį arba PIN kodą.</translation>
 <translation id="8368859634510605990">&amp;Atidaryti visas žymes</translation>
-<translation id="8369547389711988632">Įkėlimas sustabdytas</translation>
 <translation id="8371695176452482769">Kalbėti dabar</translation>
 <translation id="8372369524088641025">Netinkamas WEP raktas</translation>
 <translation id="8373553483208508744">Nutildyti skirtukų garsą</translation>
@@ -5024,7 +5021,6 @@
 <translation id="8677212948402625567">Sutraukti viską...</translation>
 <translation id="8678648549315280022">Valdyti atsisiuntimo nustatymus...</translation>
 <translation id="8678933587484842200">Kaip norite paleisti šią programą?</translation>
-<translation id="8679788109894721265">Šis puslapis naudoja daugiau nei <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Prisijunkite, kad žymes, istoriją, slaptažodžius ir kitus nustatymus galėtumėte naudoti visuose įrenginiuose. Be to, būsite automatiškai prijungti prie „Google“ paslaugų.</translation>
 <translation id="8686213429977032554">Šis Disko failas dar nebendrinamas</translation>
 <translation id="8687485617085920635">Kitas langas</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index ada68f4a..e470db13 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Sinhronizēšana un personalizācija</translation>
 <translation id="1398853756734560583">Maksimizēt</translation>
 <translation id="1399511500114202393">Bez lietotāja sertifikāta</translation>
+<translation id="1401165786814632797">Ja jūsu ierīce ir aktivizēta un atbloķēta, Asistentam varat piekļūt jebkurā laikā, pasakot frāzi “OK Google”.</translation>
 <translation id="140250605646987970">Jūsu tālrunis tika atrasts. Taču sistēma Smart Lock darbojas tikai ierīcēs, kurās tiek izmantota operētājsistēma Android 5.0 vai jaunāka versija. &lt;a&gt;Uzziniet vairāk&lt;/a&gt;.</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (uzraudzītais)</translation>
 <translation id="1405476660552109915">Vai vēlaties, lai <ph name="PASSWORD_MANAGER_BRAND" /> saglabātu jūsu kontu šai vietnei?</translation>
@@ -1510,6 +1511,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> vēlas izveidot savienojumu</translation>
 <translation id="3274763671541996799">Ir atvērts pilnekrāna režīms.</translation>
 <translation id="3275778913554317645">Atvērt kā logu</translation>
+<translation id="3278877214895457897">Kad Chromebook dators ir iestatīts, nospiediet Asistenta pogu vai sakiet “Ok Google”, lai jebkurā brīdī saņemtu palīdzību no Asistenta.</translation>
 <translation id="3279230909244266691">Šis process var ilgt dažas minūtes. Notiek virtuālās mašīnas startēšana.</translation>
 <translation id="3279741024917655738">Ieslēgta pilnekrāna videoklipu rādīšana</translation>
 <translation id="3280237271814976245">Saglabāt kā...</translation>
@@ -1604,7 +1606,7 @@
 <translation id="3428419049384081277">Jūs esat pierakstījies!</translation>
 <translation id="3429275422858276529">Saglabājiet šo lapu kā grāmatzīmi, lai vēlāk varētu to viegli atrast</translation>
 <translation id="3429599832623003132">$1 vienumi</translation>
-<translation id="3430342160185525240">Ļauj Asistentam rādīt jums paziņojumus</translation>
+<translation id="3430342160185525240">Ļauj Asistentam rādīt jums paziņojumus.</translation>
 <translation id="3432227430032737297">Noņemt visu parādīto</translation>
 <translation id="3432757130254800023">Sūtīt audio un video saturu uz ekrāniem lokālajā tīklā</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -2166,7 +2168,6 @@
 <translation id="4275830172053184480">Ierīces restartēšana</translation>
 <translation id="4278101229438943600">Asistents ir gatavs</translation>
 <translation id="4278390842282768270">Atļauts</translation>
-<translation id="4280864916190672950">Apturēt ielādi</translation>
 <translation id="4281844954008187215">Google pakalpojumu noteikumi</translation>
 <translation id="4282196459431406533">Smart Lock ir ieslēgta</translation>
 <translation id="4284105660453474798">Vai tiešām vēlaties dzēst $1?</translation>
@@ -2604,6 +2605,7 @@
 <translation id="4992066212339426712">Ieslēgt skaņu</translation>
 <translation id="4992458225095111526">Powerwash apstiprināšana</translation>
 <translation id="4992473555164495036">Administrators ir ierobežojis pieejamās ievades metodes.</translation>
+<translation id="4992926179187649719">Ieslēdziet funkciju "Ok Google"</translation>
 <translation id="4994474651455208930">Ļaut vietnēm lūgt kļūt par protokolu noklusējuma apdarinātājiem</translation>
 <translation id="4994754230098574403">Notiek iestatīšana</translation>
 <translation id="4996978546172906250">Kopīgošanas veids:</translation>
@@ -3436,7 +3438,6 @@
 <translation id="6231881193380278751">Vietrādī URL pievienojiet vaicājuma parametru, lai automātiski atsvaidzinātu lapu: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Akumulators</translation>
 <translation id="6232116551750539448">Savienojums ar “<ph name="NAME" />” tika pārtraukts.</translation>
-<translation id="6235700927623181151">Šajā cilnē tiek kopīgots jūsu darbvirsmas saturs.</translation>
 <translation id="6237816943013845465">Ļauj pielāgot ekrāna izšķirtspēju.</translation>
 <translation id="6238923052227198598">Paturēt pēdējo piezīmi bloķēšanas ekrānā</translation>
 <translation id="6239558157302047471">Atkārtoti ielādēt &amp;ietvaru</translation>
@@ -4532,6 +4533,7 @@
 <translation id="7908378463497120834">Diemžēl vismaz vienu ārējās atmiņas ierīces nodalījumu nevarēja uzstādīt.</translation>
 <translation id="7909969815743704077">Lejupielādēts inkognito režīmā</translation>
 <translation id="7910768399700579500">Jauna mape</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Jūsu parole serverī ir mainīta. Lūdzu, izrakstieties un vēlreiz pierakstieties.</translation>
 <translation id="7915471803647590281">Pirms atsauksmes nosūtīšanas lūdzam jūs pastāstīt, kas notiek.</translation>
 <translation id="7916556741383518510">Noklikšķinot</translation>
@@ -4817,7 +4819,6 @@
 <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="8366947248864804596">Ja tālrunis ir atbloķēts un atrodas tuvumā, atlasiet atbloķēšanu. Pretējā gadījumā ievadiet paroli vai PIN.</translation>
 <translation id="8368859634510605990">&amp;Atvērt visas grāmatzīmes</translation>
-<translation id="8369547389711988632">Ielāde apturēta</translation>
 <translation id="8371695176452482769">Runājiet tūlīt</translation>
 <translation id="8372369524088641025">Neatbilstoša WEP atslēga</translation>
 <translation id="8373553483208508744">Izslēgt ciļņu skaņu</translation>
@@ -5023,7 +5024,6 @@
 <translation id="8677212948402625567">Sakļaut visu...</translation>
 <translation id="8678648549315280022">Pārvaldīt lejupielādes iestatījumus...</translation>
 <translation id="8678933587484842200">Kā vēlaties palaist šo lietojumprogrammu?</translation>
-<translation id="8679788109894721265">Šī lapa izmanto vairāk nekā <ph name="MEGABYTES" /> MB</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="8686213429977032554">Šis Diska fails vēl nav kopīgots</translation>
 <translation id="8687485617085920635">Nākamais logs</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 85cf83b3..99c90571e 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -398,7 +398,7 @@
 <translation id="1589055389569595240">സ്‌പെല്ലിംഗും വ്യാകരണവും കാണിക്കുക</translation>
 <translation id="1593594475886691512">ഫോർമാറ്റുചെയ്യുന്നു...</translation>
 <translation id="159359590073980872">ഇമേജ് കാഷെ</translation>
-<translation id="1593926297800505364">പേയ്മെന്റ് രീതികൾ സംരക്ഷിക്കുക</translation>
+<translation id="1593926297800505364">പേയ്മെന്റ് രീതി സംരക്ഷിക്കുക</translation>
 <translation id="1598233202702788831">അപ്‌ഡേറ്റുകളെ നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്റര്‍ പ്രവർത്തനരഹിതമാക്കി.</translation>
 <translation id="1600857548979126453">പേജ് ഡീബഗ്ഗർ ബാക്ക്എൻഡ് ആക്‌സസ്സുചെയ്യുക</translation>
 <translation id="1601560923496285236">പ്രയോഗിക്കുക</translation>
@@ -1601,7 +1601,7 @@
 <translation id="3428419049384081277">നിങ്ങൾ സൈൻ ഇൻ ചെയ്‌തു!</translation>
 <translation id="3429275422858276529">പിന്നീട് ഈ പേജ് എളുപ്പത്തിൽ കണ്ടെത്താൻ ബുക്ക്‌മാർക്ക് ചെയ്യുക</translation>
 <translation id="3429599832623003132">$1 ഇനങ്ങൾ</translation>
-<translation id="3430342160185525240">നിങ്ങൾക്ക് അറിയിപ്പുകൾ കാണിക്കാൻ അസിസ്‌റ്റന്റിനെ പ്രവർത്തനക്ഷമമാക്കുക.</translation>
+<translation id="3430342160185525240">നിങ്ങളെ അറിയിപ്പുകൾ കാണിക്കാൻ അസിസ്‌റ്റന്റിനെ അനുവദിക്കുന്നു.</translation>
 <translation id="3432227430032737297">ദൃശ്യമാക്കിയിരിക്കുന്നതെല്ലാം നീക്കംചെയ്യുക</translation>
 <translation id="3432757130254800023">പ്രാദേശിക നെറ്റ്‌വർക്കിലെ ഡിസ്‌പ്ലേകളിലേക്ക് ഓഡിയോയും വീഡിയോയും അയയ്‌ക്കുക</translation>
 <translation id="3432762828853624962">പങ്കിട്ട വർക്കർമാർ</translation>
@@ -2162,7 +2162,6 @@
 <translation id="4275830172053184480">നിങ്ങളുടെ ഉപകരണം പുനരാരംഭിക്കുക</translation>
 <translation id="4278101229438943600">നിങ്ങളുടെ അസിസ്‌റ്റന്റ് തയ്യാറാണ്</translation>
 <translation id="4278390842282768270">അനുവദനീയം</translation>
-<translation id="4280864916190672950">ലോഡ് ചെയ്യുന്നത് നിർത്തുക</translation>
 <translation id="4281844954008187215">സേവന നിബന്ധനകൾ</translation>
 <translation id="4282196459431406533">Smart Lock ഓണാണ്</translation>
 <translation id="4284105660453474798">"$1" ഇല്ലാതാക്കാൻ നിങ്ങൾ താൽപ്പര്യപ്പെടുന്നുവെന്ന് തീർച്ചയാണോ?</translation>
@@ -3433,7 +3432,6 @@
 <translation id="6231881193380278751">പേജ് സ്വയമേ പുതുക്കുന്നതിന് URL-ൽ ചോദ്യ param ചേർക്കുക: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">ബാറ്ററി</translation>
 <translation id="6232116551750539448"><ph name="NAME" /> എന്നതിലേക്കുള്ള കണക്ഷൻ നഷ്‌ടമായി</translation>
-<translation id="6235700927623181151">ഈ ടാബ് നിങ്ങളുടെ ഡെസ്‌ക്‌ടോപ്പ് ഉള്ളടക്കം പങ്കിടുന്നു.</translation>
 <translation id="6237816943013845465">സ്‌ക്രീൻ റെസല്യൂഷൻ ക്രമീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു</translation>
 <translation id="6238923052227198598">ലോക്ക് സ്‌ക്രീനിൽ ഏറ്റവും പുതിയ കുറിപ്പ് സൂക്ഷിക്കുക</translation>
 <translation id="6239558157302047471">റീലോഡും ഫ്രെയിമും</translation>
@@ -4815,7 +4813,6 @@
 <translation id="8366396658833131068">നിങ്ങളുടെ നെറ്റ്‌വർക്ക് കണക്റ്റിവിറ്റി പുനഃസ്‌ഥാപിച്ചു. നിങ്ങളുടെ കിയോസ്‌ക് അപ്ലിക്കേഷൻ സമാരംഭിക്കാൻ മറ്റൊരു നെറ്റ്‌വർക്ക് തിരഞ്ഞെടുക്കുകയോ ചുവടെയുള്ള 'തുടരുക' ബട്ടൺ അമർത്തുകയോ ചെയ്യുക.</translation>
 <translation id="8366947248864804596">നിങ്ങളുടെ ഫോൺ അൺലോക്കുചെയ്ത നിലയിൽ സമീപത്തുള്ളപ്പോൾ, അൺലോക്ക് തിരഞ്ഞെടുക്കുക. അല്ലെങ്കിൽ നിങ്ങളുടെ പാസ്‌വേഡോ പിന്നോ നൽകുക.</translation>
 <translation id="8368859634510605990">എല്ലാ ബുക്ക്‍മാര്‍ക്കുകളും &amp;തുറക്കുക</translation>
-<translation id="8369547389711988632">ലോഡ് ചെയ്യുന്നത് നിലച്ചു</translation>
 <translation id="8371695176452482769">ഇപ്പോള്‍ സംസാരിക്കുക</translation>
 <translation id="8372369524088641025">മോശം WEP കീ</translation>
 <translation id="8373553483208508744">ടാബുകൾ മ്യൂട്ടുചെയ്യുക</translation>
@@ -5021,7 +5018,6 @@
 <translation id="8677212948402625567">എല്ലാം സങ്കോചിപ്പിക്കുക...</translation>
 <translation id="8678648549315280022">ഡൗൺലോഡ് ക്രമീകരണങ്ങൾ നിയന്ത്രിക്കുക...</translation>
 <translation id="8678933587484842200">ഈ ആപ്പ് എങ്ങനെ ആരംഭിക്കാനാണ് നിങ്ങൾ ആഗ്രഹിക്കുന്നത്?</translation>
-<translation id="8679788109894721265">ഈ പേജ് <ph name="MEGABYTES" />MB-യിലും കൂടുതൽ ഉപയോഗിക്കുന്നു</translation>
 <translation id="8680251145628383637">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ബുക്ക്‌മാർക്കുകൾ, ചരിത്രം, പാസ്‌വേഡുകൾ, മറ്റ് ക്രമീകരണം എന്നിവ ലഭിക്കാൻ സൈൻ ഇൻ ചെയ്യുക. നിങ്ങളുടെ Google സേവനങ്ങളിലേക്ക് സ്വയമേവ നിങ്ങൾ സൈൻ ഇൻ ആകുന്നതുമാണ്.</translation>
 <translation id="8686213429977032554">ഈ ഡ്രൈവ് ഫയൽ ഇതുവരെ പങ്കിട്ടില്ല</translation>
 <translation id="8687485617085920635">അടുത്ത വിന്‍ഡോ</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 1069f240..55e4645 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -2165,7 +2165,6 @@
 <translation id="4275830172053184480">आपला डिव्हाइस रीस्टार्ट करा</translation>
 <translation id="4278101229438943600">तुमचा असिस्टंट तयार आहे</translation>
 <translation id="4278390842282768270">अनुमत</translation>
-<translation id="4280864916190672950">लोड करणे थांबवा</translation>
 <translation id="4281844954008187215">सेवा अटी</translation>
 <translation id="4282196459431406533">Smart Lock चालू आहे</translation>
 <translation id="4284105660453474798">तुमची खात्री आहे की आपण "$1" हटवू इच्छिता?</translation>
@@ -3437,7 +3436,6 @@
 <translation id="6231881193380278751">पृष्ठ स्वयं-रिफ्रेश करण्यासाठी एक क्वेरी परम जोडा: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">बॅटरी</translation>
 <translation id="6232116551750539448"><ph name="NAME" /> वरील कनेक्शन गमावले गेले आहे</translation>
-<translation id="6235700927623181151">हा टॅब तुमचा डेस्कटॉप आशय शेअर करत आहे.</translation>
 <translation id="6237816943013845465">आपले स्क्रीन रिझोल्यूशन समायोजित करण्याची आपल्याला अनुमती देते</translation>
 <translation id="6238923052227198598">लॉक स्क्रीनवर नवीनतम टीप ठेवा</translation>
 <translation id="6239558157302047471">रीलोड आणि फ्रेम करा</translation>
@@ -4817,7 +4815,6 @@
 <translation id="8366396658833131068">तुमची नेटवर्क कनेक्टिव्हिटी पुनर्संचयित झाली आहे. कृपया एक भिन्न नेटवर्क निवडा किंवा आपला कियोस्क अॅप लाँच करण्यासाठी खालील 'सुरु ठेवा' बटण दाबा.</translation>
 <translation id="8366947248864804596">तुमचा फोन अनलॉक आणि जवळपास असताना फक्त अनलॉक निवडा. अन्यथा तुमचा पासवर्ड किंवा पिन टाका.</translation>
 <translation id="8368859634510605990">सर्व बुकमार्क &amp;उघडा</translation>
-<translation id="8369547389711988632">लोड करणे थांबवा</translation>
 <translation id="8371695176452482769">आता बोला</translation>
 <translation id="8372369524088641025">खराब WEP की</translation>
 <translation id="8373553483208508744">टॅब निःशब्द करा</translation>
@@ -5023,7 +5020,6 @@
 <translation id="8677212948402625567">सर्व संकुचित करा...</translation>
 <translation id="8678648549315280022">डाउनलोड सेटिंग्ज व्यवस्थापित करा...</translation>
 <translation id="8678933587484842200">हे अॅप्लिकेशन कसे लॉंच व्हावे असे तुम्हाला वाटते?</translation>
-<translation id="8679788109894721265">हे पेज <ph name="MEGABYTES" />MB पेक्षा जास्त वापरते</translation>
 <translation id="8680251145628383637">आपल्या सर्व डिव्हाइसेसवर आपले बुकमार्क, इतिहास, पासवर्ड आणि इतर सेटिंग्ज मिळविण्‍यासाठी साइन इन करा. आपण स्वयंचलितपणे आपल्‍या Google सेवांवर देखील साइन इन कराल.</translation>
 <translation id="8686213429977032554">ही ड्राइव्ह फाईल अद्याप सामायिक केलेली नाही</translation>
 <translation id="8687485617085920635">पुढील विंडो</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index baa7db6..c9dbedf0 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Penyegerakan dan pemeribadian</translation>
 <translation id="1398853756734560583">Maksimumkan</translation>
 <translation id="1399511500114202393">Tiada sijil pengguna</translation>
+<translation id="1401165786814632797">Akses Assistant anda pada bila-bila masa anda menyebut "Ok Google" semasa skrin anda hidup dan tidak berkunci.</translation>
 <translation id="140250605646987970">Telefon anda telah dijumpai. Tetapi Smart Lock hanya berfungsi pada peranti dengan OS Android 5.0 dan ke atas. &lt;a&gt;Ketahui lebih lanjut&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (Diselia)</translation>
 <translation id="1405476660552109915">Adakah anda mahu <ph name="PASSWORD_MANAGER_BRAND" /> menyimpan akaun anda untuk tapak ini?</translation>
@@ -1371,6 +1372,7 @@
 <translation id="3031557471081358569">Pilih item untuk mengimport:</translation>
 <translation id="3031601332414921114">Sambung semula pencetakan</translation>
 <translation id="303198083543495566">Geografi</translation>
+<translation id="3033999583152214331">Jalankan alatan, editor dan IDE Linux pada Chromebook anda. &lt;a target="_blank" href="<ph name="URL" />"&gt;Ketahui lebih lanjut&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Dayakan Flash</translation>
 <translation id="3037754279345160234">Tidak dapat menghurai konfigurasi penyertaan domain. Sila hubungi pentadbir anda.</translation>
 <translation id="3038612606416062604">Tambahkan pencetak secara manual</translation>
@@ -1511,6 +1513,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> ingin menyambung</translation>
 <translation id="3274763671541996799">Anda telah menggunakan skrin penuh.</translation>
 <translation id="3275778913554317645">Buka sebagai tetingkap</translation>
+<translation id="3278877214895457897">Apabila Chromebook anda selesai disediakan, tekan butang Assistant atau sebut "Ok Google" untuk mendapatkan bantuan daripada Assistant anda pada bila-bila masa.</translation>
 <translation id="3279230909244266691">Proses ini mungkin mengambil masa beberapa minit. Memulakan mesin maya.</translation>
 <translation id="3279741024917655738">Tunjukkan video skrin penuh pada</translation>
 <translation id="3280237271814976245">Simpan &amp;sebagai...</translation>
@@ -2167,7 +2170,6 @@
 <translation id="4275830172053184480">Mulakan semula peranti anda</translation>
 <translation id="4278101229438943600">Assistant anda bersedia</translation>
 <translation id="4278390842282768270">Dibenarkan</translation>
-<translation id="4280864916190672950">Hentikan pemuatan</translation>
 <translation id="4281844954008187215">Syarat Perkhidmatan</translation>
 <translation id="4282196459431406533">Smart Lock dihidupkan</translation>
 <translation id="4284105660453474798">Adakah anda pasti anda mahu memadamkan "$1"?</translation>
@@ -2605,6 +2607,7 @@
 <translation id="4992066212339426712">Nyahredam</translation>
 <translation id="4992458225095111526">Sahkan Powerwash</translation>
 <translation id="4992473555164495036">Pentadbir anda telah mengehadkan kaedah input yang tersedia.</translation>
+<translation id="4992926179187649719">Hidupkan 'Ok Google'</translation>
 <translation id="4994474651455208930">Membenarkan tapak untuk meminta menjadi pengendali lalai untuk protokol</translation>
 <translation id="4994754230098574403">Menyediakan</translation>
 <translation id="4996978546172906250">Kongsi melalui</translation>
@@ -3437,7 +3440,6 @@
 <translation id="6231881193380278751">Tambahkan param pertanyaan dalam URL untuk automuat semula halaman: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Bateri</translation>
 <translation id="6232116551750539448">Sambungan ke <ph name="NAME" /> telah hilang</translation>
-<translation id="6235700927623181151">Tab ini berkongsi kandungan desktop anda.</translation>
 <translation id="6237816943013845465">Membolehkan anda melaraskan peleraian skrin anda</translation>
 <translation id="6238923052227198598">Simpan nota terkini pada skrin kunci</translation>
 <translation id="6239558157302047471">Muat semula &amp;bingkai</translation>
@@ -4534,6 +4536,7 @@
 <translation id="7908378463497120834">Maaf, sekurang-kurangnya satu pemetakan pada peranti storan luaran anda tidak boleh dilekapkan.</translation>
 <translation id="7909969815743704077">Dimuat turun dalam Inkognito</translation>
 <translation id="7910768399700579500">&amp;Folder baharu</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Kata laluan anda telah ditukar pada pelayan. Sila log keluar, kemudian log masuk semula.</translation>
 <translation id="7915471803647590281">Sila beritahu kami kejadian yang berlaku sebelum menghantar maklum balas.</translation>
 <translation id="7916556741383518510">Apabila Diklik</translation>
@@ -4819,7 +4822,6 @@
 <translation id="8366396658833131068">Sambungan rangkaian anda sudah dipulihkan. Sila pilih rangkaian lain atau tekan butang 'Teruskan' di bawah untuk melancarkan apl kios anda.</translation>
 <translation id="8366947248864804596">Apabila telefon anda dibuka kunci dan berada berdekatan, pilih sahaja untuk membuka kunci. Jika tidak, masukkan kata laluan atau PIN anda.</translation>
 <translation id="8368859634510605990">&amp;Buka semua penanda halaman</translation>
-<translation id="8369547389711988632">Pemuatan dihentikan</translation>
 <translation id="8371695176452482769">Cakap sekarang</translation>
 <translation id="8372369524088641025">Kekunci WEP teruk</translation>
 <translation id="8373553483208508744">Redam beberapa tab</translation>
@@ -5025,7 +5027,6 @@
 <translation id="8677212948402625567">Runtuhkan semua...</translation>
 <translation id="8678648549315280022">Urus tetapan muat turun...</translation>
 <translation id="8678933587484842200">Bagaimanakah anda mahu apl ini dilancarkan?</translation>
-<translation id="8679788109894721265">Halaman ini menggunakan lebih <ph name="MEGABYTES" />MB</translation>
 <translation id="8680251145628383637">Log masuk untuk mendapatkan penanda halaman, sejarah, kata laluan dan tetapan anda yang lain pada semua peranti anda. Anda turut akan dilog masuk secara automatik ke perkhidmatan Google anda.</translation>
 <translation id="8686213429977032554">Fail Drive ini belum dikongsi lagi</translation>
 <translation id="8687485617085920635">Tetingkap seterusnya</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index f04d5c11..c9d425c 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Synchronisatie en personalisatie</translation>
 <translation id="1398853756734560583">Maximaliseren</translation>
 <translation id="1399511500114202393">Geen gebruikerscertificaat</translation>
+<translation id="1401165786814632797">Wanneer je apparaat is ingeschakeld en ontgrendeld, kun je de Assistent openen door 'Oké Google' te zeggen.</translation>
 <translation id="140250605646987970">Je telefoon is gevonden. Smart Lock werkt echter alleen op apparaten met Android 5.0 en hoger. &lt;a&gt;Meer informatie&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (met beperkte rechten)</translation>
 <translation id="1405476660552109915">Wil je dat <ph name="PASSWORD_MANAGER_BRAND" /> je account voor deze site opslaat?</translation>
@@ -1370,6 +1371,7 @@
 <translation id="3031557471081358569">Selecteer items die je wilt importeren:</translation>
 <translation id="3031601332414921114">Afdrukken hervatten</translation>
 <translation id="303198083543495566">Geografie</translation>
+<translation id="3033999583152214331">Gebruik Linux-tools, editors en IDE's op je Chromebook. &lt;a target="_blank" href="<ph name="URL" />"&gt;Meer informatie&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Flitser inschakelen</translation>
 <translation id="3037754279345160234">Kan de configuratie voor domeinkoppeling niet parseren. Neem contact op met je beheerder.</translation>
 <translation id="3038612606416062604">Handmatig een printer toevoegen</translation>
@@ -1510,6 +1512,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> wil verbinding maken</translation>
 <translation id="3274763671541996799">Je hebt de modus voor volledig scherm ingeschakeld.</translation>
 <translation id="3275778913554317645">Openen als venster</translation>
+<translation id="3278877214895457897">Wanneer je Chromebook is ingesteld, kun je op elk gewenst moment op de Assistent-knop drukken of 'Oké Google' zeggen om hulp van de Assistent te krijgen.</translation>
 <translation id="3279230909244266691">Dit proces kan enkele minuten duren. De virtuele machine wordt gestart.</translation>
 <translation id="3279741024917655738">Video's op volledig scherm weergeven op</translation>
 <translation id="3280237271814976245">Opslaan &amp;als...</translation>
@@ -2166,7 +2169,6 @@
 <translation id="4275830172053184480">Je apparaat opnieuw opstarten</translation>
 <translation id="4278101229438943600">De Assistent staat klaar</translation>
 <translation id="4278390842282768270">Toegestaan</translation>
-<translation id="4280864916190672950">Stoppen met laden</translation>
 <translation id="4281844954008187215">Servicevoorwaarden</translation>
 <translation id="4282196459431406533">Smart Lock is ingeschakeld</translation>
 <translation id="4284105660453474798">Weet je zeker dat je '$1' wilt verwijderen?</translation>
@@ -2604,6 +2606,7 @@
 <translation id="4992066212339426712">Dempen opheffen</translation>
 <translation id="4992458225095111526">Powerwash bevestigen</translation>
 <translation id="4992473555164495036">Je beheerder heeft de beschikbare invoermethoden beperkt.</translation>
+<translation id="4992926179187649719">'Oké Google' uitschakelen</translation>
 <translation id="4994474651455208930">Websites laten vragen of je ze als de standaardhandler voor protocollen wilt instellen.</translation>
 <translation id="4994754230098574403">Instellen</translation>
 <translation id="4996978546172906250">Delen via</translation>
@@ -3437,7 +3440,6 @@
 <translation id="6231881193380278751">Voeg een queryparameter aan de URL toe om de pagina automatisch te laten vernieuwen: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Batterij</translation>
 <translation id="6232116551750539448">Verbinding met <ph name="NAME" /> is verbroken</translation>
-<translation id="6235700927623181151">Dit tabblad deelt de content van je bureaublad.</translation>
 <translation id="6237816943013845465">Hiermee kun je de schermresolutie aanpassen</translation>
 <translation id="6238923052227198598">Laatste notitie op vergrendelingsscherm laten staan</translation>
 <translation id="6239558157302047471">&amp;Frame opnieuw laden</translation>
@@ -4533,6 +4535,7 @@
 <translation id="7908378463497120834">Ten minste één partitie op je externe opslagapparaat kan niet worden gekoppeld.</translation>
 <translation id="7909969815743704077">Gedownload in incognitomodus</translation>
 <translation id="7910768399700579500">&amp;Nieuwe map</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Je wachtwoord is gewijzigd op de server. Log uit en weer in.</translation>
 <translation id="7915471803647590281">Vertel ons wat er aan de hand is voordat je de feedback verzendt.</translation>
 <translation id="7916556741383518510">Bij klik</translation>
@@ -4817,7 +4820,6 @@
 <translation id="8366396658833131068">Je netwerkverbinding is hersteld. Selecteer een ander netwerk of druk hieronder op de knop 'Doorgaan' om je kiosk-app te starten.</translation>
 <translation id="8366947248864804596">Wanneer je telefoon is ontgrendeld en zich in de buurt bevindt, kun je deze selecteren om te ontgrendelen. Anders moet je je wachtwoord of pincode opgeven.</translation>
 <translation id="8368859634510605990">Alle bladwijzers &amp;openen</translation>
-<translation id="8369547389711988632">Gestopt met laden</translation>
 <translation id="8371695176452482769">Begin nu te spreken</translation>
 <translation id="8372369524088641025">Slechte WEP-sleutel</translation>
 <translation id="8373553483208508744">Tabbladen dempen</translation>
@@ -5023,7 +5025,6 @@
 <translation id="8677212948402625567">Alles samenvouwen...</translation>
 <translation id="8678648549315280022">Downloadinstellingen beheren...</translation>
 <translation id="8678933587484842200">Hoe moet deze app worden gestart?</translation>
-<translation id="8679788109894721265">Deze pagina gebruikt meer dan <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Log in om je bladwijzers, geschiedenis, wachtwoorden en andere instellingen op te halen op al je apparaten. Je wordt ook automatisch ingelogd bij je Google-services.</translation>
 <translation id="8686213429977032554">Dit Drive-bestand is nog niet gedeeld</translation>
 <translation id="8687485617085920635">Volgende venster</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 5197e23..ad05a04 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -398,7 +398,7 @@
 <translation id="1589055389569595240">Vis stavekontroll og grammatikk</translation>
 <translation id="1593594475886691512">Formaterer …</translation>
 <translation id="159359590073980872">Bildebuffer</translation>
-<translation id="1593926297800505364">Lagre betalingsmåte</translation>
+<translation id="1593926297800505364">Lagre betalingsmåten</translation>
 <translation id="1598233202702788831">Administratoren din har slått av oppdateringer.</translation>
 <translation id="1600857548979126453">få tilgang til bakdata for sidefeilsøkingsprogrammet</translation>
 <translation id="1601560923496285236">Bruk</translation>
@@ -417,13 +417,13 @@
 <translation id="1618268899808219593">&amp;Brukerstøtte</translation>
 <translation id="162035744160882748">Slå på synkronisering, personlig tilpasning og andre Google-tjenester</translation>
 <translation id="1620510694547887537">Kamera</translation>
-<translation id="1623132449929929218">Bildene er ikke tilgjengelige nå. Koble til Internettet på nytt for å se bakgrunnsamlingene.</translation>
+<translation id="1623132449929929218">Bildene er ikke tilgjengelige nå. Koble til Internett på nytt for å se bakgrunnssamlingene.</translation>
 <translation id="1624026626836496796">Dette skjer bare én gang. Påloggingsinformasjonen din lagres ikke.</translation>
 <translation id="1627276047960621195">Filbeskrivelser</translation>
 <translation id="1627408615528139100">Allerede lastet ned</translation>
 <translation id="1632803087685957583">Lar deg justere repetisjonshastigheten på tastaturet, ordforslag osv.</translation>
 <translation id="1635033183663317347">Installert av din foresatte.</translation>
-<translation id="1635885551358739414">Google kan bruke innhold på nettsteder du besøker, nettleseraktiviteten din og andre interaksjoner for å gi Chrome og andre Google-tjenester (som Oversetter, Søk og annonser) et personlig preg. Du kan tilpasse dette i innstillingene.</translation>
+<translation id="1635885551358739414">Google kan bruke innhold fra nettsteder du besøker, nettleseraktiviteten din og andre interaksjoner for å gi Chrome og andre Google-tjenester (som Oversetter, Søk og annonser) et personlig preg. Du kan tilpasse dette i innstillingene.</translation>
 <translation id="1637224376458524414">Få dette bokmerket på iPhone</translation>
 <translation id="1637765355341780467">Det oppsto en feil ved åpning av profilen din. Det kan hende at enkelte funksjoner ikke er tilgjengelige.</translation>
 <translation id="1639239467298939599">Laster inn</translation>
@@ -464,7 +464,7 @@
 <translation id="1673137583248014546"><ph name="URL" /> ber om å se merket og modellen til sikkerhetsnøkkelen din</translation>
 <translation id="167832068858235403">redusert lydstyrke</translation>
 <translation id="1679068421605151609">Utviklerverktøy</translation>
-<translation id="1680849702532889074">Det oppstå en feil under installasjon av Linux-programmet ditt.</translation>
+<translation id="1680849702532889074">Det oppsto en feil under installasjon av Linux-programmet ditt.</translation>
 <translation id="16815041330799488">Ikke la nettsteder se tekst og bilder som er kopiert til utklippstavlen</translation>
 <translation id="1682548588986054654">Nytt inkognitovindu</translation>
 <translation id="168715261339224929">For å få bokmerkene dine på alle enhetene dine, slå på synkronisering.</translation>
@@ -500,7 +500,7 @@
 <translation id="1732215134274276513">Løsne faner</translation>
 <translation id="1734824808160898225"><ph name="PRODUCT_NAME" /> oppdateres muligens ikke automatisk</translation>
 <translation id="1736419249208073774">Utforsk</translation>
-<translation id="1736827427463982819">Slå av Linux (Beta)</translation>
+<translation id="1736827427463982819">Slå av Linux (beta)</translation>
 <translation id="1737968601308870607">Rapporter feil</translation>
 <translation id="1741314857973421784">Fortsett</translation>
 <translation id="174173592514158117">Vis alle Play-mapper</translation>
@@ -703,7 +703,7 @@
 <translation id="2045969484888636535">Fortsett blokkering av informasjonskapsler</translation>
 <translation id="204622017488417136">Enheten blir tilbakestilt til den tidligere installerte versjonen av Chrome. Alle brukerkontoer og lokale data fjernes. Dette kan ikke gjøres om.</translation>
 <translation id="2048182445208425546">Få tilgang til nettverkstrafikken din</translation>
-<translation id="2048653237708779538">Handling ikke tilgjengelig</translation>
+<translation id="2048653237708779538">Handlingen er ikke tilgjengelig</translation>
 <translation id="204914487372604757">Opprett snarvei</translation>
 <translation id="2050339315714019657">Stående</translation>
 <translation id="2053312383184521053">Data om hviletilstand</translation>
@@ -944,7 +944,7 @@
 <translation id="2425665904502185219">Total filstørrelse</translation>
 <translation id="2428510569851653187">Beskriv hva du holdt på med da fanen kræsjet</translation>
 <translation id="2431027948063157455">Google-assistenten kunne ikke lastes inn. Kontrollér nettverkstilkoblingen din, og prøv på nytt.</translation>
-<translation id="2432753757290432042">Linux (Beta) oppdatering kreves</translation>
+<translation id="2432753757290432042">Oppdatering av Linux (beta) kreves</translation>
 <translation id="2433452467737464329">Legg til en søkeparameter i nettadressen for å automatisk laste inn siden på nytt: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Utseende</translation>
 <translation id="2433836460518180625">Lås kun opp enheten</translation>
@@ -1213,7 +1213,7 @@
 <translation id="2803375539583399270">Skriv inn PIN-koden</translation>
 <translation id="2805646850212350655">Microsoft Encrypting File System</translation>
 <translation id="2805756323405976993">Apper</translation>
-<translation id="2806891468525657116">Snarveien fins allerede.</translation>
+<translation id="2806891468525657116">Snarveien finnes allerede</translation>
 <translation id="2807517655263062534">Filer du laster ned, vises her</translation>
 <translation id="2809586584051668049">og <ph name="NUMBER_ADDITIONAL_DISABLED" /> til</translation>
 <translation id="281133045296806353">Opprettet nytt vindu i eksisterende nettleserøkt.</translation>
@@ -1599,7 +1599,7 @@
 <translation id="3428419049384081277">Du er pålogget</translation>
 <translation id="3429275422858276529">Sett denne siden som bokmerke for å finne den enkelt senere</translation>
 <translation id="3429599832623003132">$1 elementer</translation>
-<translation id="3430342160185525240">Gjør at assistenten kan vise deg rvarsler.</translation>
+<translation id="3430342160185525240">Lar assistenten vise deg varsler.</translation>
 <translation id="3432227430032737297">Fjern alle som vises</translation>
 <translation id="3432757130254800023">Send lyd og bilde til skjermer på lokalnettverket</translation>
 <translation id="3432762828853624962">Delte arbeidere (SharedWorker)</translation>
@@ -1786,7 +1786,7 @@
 <translation id="3693415264595406141">Passord:</translation>
 <translation id="3694027410380121301">Velg forrige fane</translation>
 <translation id="3699624789011381381">E-postadresse</translation>
-<translation id="3699920817649120894">Slå av synkronisering og personalisering?</translation>
+<translation id="3699920817649120894">Vil du slå av synkronisering og persontilpasning?</translation>
 <translation id="3700888195348409686">Presenterer (<ph name="PAGE_ORIGIN" />)</translation>
 <translation id="3702500414347826004">Oppstartssidene er endret til å inkludere <ph name="URL" />.</translation>
 <translation id="370415077757856453">JavaScript er blokkert</translation>
@@ -1918,7 +1918,7 @@
 <translation id="3871092408932389764">Lavest</translation>
 <translation id="3872220884670338524">Flere handlinger, lagret konto for <ph name="USERNAME" /> på <ph name="DOMAIN" /></translation>
 <translation id="3872991219937722530">Frigjør lagringsplass for å unngå at enheten slutter å reagere.</translation>
-<translation id="3873315167136380065">For å skru dette på, <ph name="BEGIN_LINK" />tilbakestill synkroniseringen<ph name="END_LINK" /> for å fjerne din synkronisering av passordfrase</translation>
+<translation id="3873315167136380065">For å slå dette på, <ph name="BEGIN_LINK" />tilbakestill synkroniseringen<ph name="END_LINK" /> for å fjerne passordfrasen din for synkronisering</translation>
 <translation id="3878840326289104869">Oppretter en administrert bruker</translation>
 <translation id="3879748587602334249">Nedlastingsbehandling</translation>
 <translation id="3880709822663530586">Sikkerhetsnøkkelen din fungerer bare når enhetens Bluetooth er på</translation>
@@ -2108,7 +2108,7 @@
 <translation id="4192273449750167573">Gjennomgå innstillingene dine på den neste skjermen</translation>
 <translation id="4193154014135846272">Google-dokument</translation>
 <translation id="4194570336751258953">Aktiver berøringsklikk</translation>
-<translation id="4195249722193633765">Installer app med Linux (Beta)</translation>
+<translation id="4195249722193633765">Installer app med Linux (beta)</translation>
 <translation id="4195643157523330669">Åpne i ny fane</translation>
 <translation id="4195814663415092787">Fortsett der du slapp</translation>
 <translation id="4197674956721858839">Zip-utvalg</translation>
@@ -2159,7 +2159,6 @@
 <translation id="4275830172053184480">Start enheten din på nytt</translation>
 <translation id="4278101229438943600">Assistenten din er klar</translation>
 <translation id="4278390842282768270">Tillatt</translation>
-<translation id="4280864916190672950">Stopp innlasting</translation>
 <translation id="4281844954008187215">Vilkår for bruk</translation>
 <translation id="4282196459431406533">Smart Lock er slått på</translation>
 <translation id="4284105660453474798">Er du sikker på at du vil slette $1?</translation>
@@ -2169,7 +2168,7 @@
 <translation id="428608937826130504">Hylleelement 8</translation>
 <translation id="4287502004382794929">Du har ikke tilstrekkelige programvarelisenser for å registrere denne enheten. Ta kontakt med salgsavdelingen for å kjøpe flere. Hvis du tror dette er en feil, kan du ta kontakt med brukerstøtten.</translation>
 <translation id="4289540628985791613">Oversikt</translation>
-<translation id="4295072614469448764">Appen er tilgjengelig i terminalen din. Det kan også været et ikon i din appoversikt.</translation>
+<translation id="4295072614469448764">Appen er tilgjengelig i terminalen din. Det kan også være et ikon i appoversikten.</translation>
 <translation id="4296575653627536209">Legg til en administrert bruker</translation>
 <translation id="4297219207642690536">Start på nytt og tilbakestill</translation>
 <translation id="4297322094678649474">Endre språk</translation>
@@ -2207,7 +2206,7 @@
 <translation id="4370975561335139969">E-posten og passordet du skrev inn, stemmer ikke overens.</translation>
 <translation id="437184764829821926">Avanserte innstillinger for skrifttype</translation>
 <translation id="4372884569765913867">1 x 1</translation>
-<translation id="4374831787438678295">Linux-installer</translation>
+<translation id="4374831787438678295">Linux-installasjonsprogram</translation>
 <translation id="4375035964737468845">åpne nedlastede filer</translation>
 <translation id="4377363674125277448">Det oppsto et problem med sertifikatet til tjeneren.</translation>
 <translation id="4378154925671717803">Telefon</translation>
@@ -2270,7 +2269,7 @@
 <translation id="4481530544597605423">Frakoblede enheter</translation>
 <translation id="4482194545587547824">Google kan bruke nettlesingsloggen din for å gi Søk og andre Google-tjenester et personlig preg</translation>
 <translation id="4495419450179050807">Ikke vis på denne siden</translation>
-<translation id="4499718683476608392">Slå på kredittkort-autofyll for å fylle ut skjemaer ved hjelp av ett enkelt klikk</translation>
+<translation id="4499718683476608392">Slå på autofyll for kredittkort for å fylle ut skjemaer med ett klikk</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> har kræsjet</translation>
 <translation id="450099669180426158">Utropstegnikon</translation>
 <translation id="4501530680793980440">Bekreftelse av fjerning</translation>
@@ -2327,7 +2326,7 @@
 <translation id="4576541033847873020">Koble til Bluetooth-enhet</translation>
 <translation id="4579581181964204535">Kunne ikke caste <ph name="HOST_NAME" />.</translation>
 <translation id="4580526846085481512">Er du sikker på at du vil slette $1 elementer?</translation>
-<translation id="4582497162516204941">Installer med Linux (Beta)</translation>
+<translation id="4582497162516204941">Installer med Linux (beta)</translation>
 <translation id="4582563038311694664">Tilbakestill alle innstillingene</translation>
 <translation id="4585793705637313973">Endre siden</translation>
 <translation id="4589268276914962177">Ny terminal</translation>
@@ -2570,7 +2569,7 @@
 <translation id="4953808748584563296">Oransje standardbrukerbilde</translation>
 <translation id="4955814292505481804">Årlig</translation>
 <translation id="4957949153200969297">Slår bare på funksjoner knyttet til <ph name="IDS_SHORT_PRODUCT_NAME" />-synkronisering</translation>
-<translation id="4959262764292427323">Passordene er lagret i Google-kontoen din, slik at du kan bruke dem på hvilken som helst enhet</translation>
+<translation id="4959262764292427323">Passordene er lagret i Google-kontoen din, slik at du kan bruke dem på alle enheter</translation>
 <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation>
 <translation id="496226124210045887">Mappen du valgte inneholder sensitive filer. Er du sikker på at du vil gi «$1» permanent lesetilgang til denne mappen?</translation>
 <translation id="4964455510556214366">Oppsett</translation>
@@ -3023,7 +3022,7 @@
 <translation id="5612720917913232150"><ph name="URL" /> ber om å bruke posisjonen til enheten din</translation>
 <translation id="5612734644261457353">Passordet ditt kunne fortsatt ikke bekreftes. Merk: Hvis du endret passordet ditt nylig, blir det nye passordet ditt tatt i bruk når du logger deg av. Du må bruke det gamle passordet her.</translation>
 <translation id="5614190747811328134">Brukerinformasjon</translation>
-<translation id="5614553682702429503">Lagre passord?</translation>
+<translation id="5614553682702429503">Vil du lagre passordet?</translation>
 <translation id="561698261642843490">Lukk Firefox</translation>
 <translation id="5618075537869101857">Kiosk-appen kunne ikke kjøres.</translation>
 <translation id="5618333180342767515">(dette kan ta noen minutter)</translation>
@@ -3064,7 +3063,7 @@
 <translation id="5677503058916217575">Sidespråk:</translation>
 <translation id="5677928146339483299">Blokkert</translation>
 <translation id="5678550637669481956">Lese- og skrivetilgang til <ph name="VOLUME_NAME" /> er innvilget.</translation>
-<translation id="5678784840044122290">Linux-programmet vil være tilgjengelig i terminalen din, samt kan vise et ikon i din appoversikt.</translation>
+<translation id="5678784840044122290">Linux-appen blir tilgjengelig i terminalen din og kan også vise et ikon i appoversikten.</translation>
 <translation id="5678955352098267522">Les dataene dine på <ph name="WEBSITE_1" /></translation>
 <translation id="5684661240348539843">Ressursidentifikator</translation>
 <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Kan ikke koble fra et arkiv eller en virtuell disk<ph name="END_BOLD" />
@@ -3185,7 +3184,7 @@
 <translation id="5855773610748894548">Beklager – feil i den sikre modulen.</translation>
 <translation id="5856721540245522153">Slå på feilsøkingsfunksjoner</translation>
 <translation id="5857090052475505287">Ny mappe</translation>
-<translation id="585979798156957858">Ekstern Meta</translation>
+<translation id="585979798156957858">Ekstern meta</translation>
 <translation id="5860033963881614850">Av</translation>
 <translation id="5860209693144823476">Fane 3</translation>
 <translation id="5860491529813859533">Slå på</translation>
@@ -3216,7 +3215,7 @@
 <translation id="5908769186679515905">Blokkér nettsteder fra å kjøre Flash</translation>
 <translation id="5910363049092958439">Lagre &amp;bildet som</translation>
 <translation id="5911737117543891828">Midlertidige Google Disk-filer utenfor Internett slettes. Filer du har satt som tilgjengelig utenfor Internett, blir ikke slettet fra denne enheten.</translation>
-<translation id="5911887972742538906">Det oppsto en feil under installasjon av ditt Linux-program.</translation>
+<translation id="5911887972742538906">Det oppsto en feil under installasjon av Linux-appen.</translation>
 <translation id="5912378097832178659">R&amp;ediger søkemotorer...</translation>
 <translation id="5914724413750400082">Modulus (<ph name="MODULUS_NUM_BITS" /> biters):
   <ph name="MODULUS_HEX_DUMP" />
@@ -3428,7 +3427,6 @@
 <translation id="6231881193380278751">Legg til en forespørselsparameter i nettadressen for å laste inn siden på nytt automatisk: chrome://device-log/?refresh=&lt;sek&gt;</translation>
 <translation id="6232017090690406397">Batteri</translation>
 <translation id="6232116551750539448">Tilkoblingen til <ph name="NAME" /> er brutt</translation>
-<translation id="6235700927623181151">Denne fanen deler innholdet på skrivebordet ditt.</translation>
 <translation id="6237816943013845465">Lar deg justere skjermoppløsningen</translation>
 <translation id="6238923052227198598">Hold det siste notatet på låseskjermen</translation>
 <translation id="6239558157302047471">Last inn &amp;rammen på nytt</translation>
@@ -3676,7 +3674,7 @@
 <translation id="6606070663386660533">Fane 8</translation>
 <translation id="6607272825297743757">Filinformasjon</translation>
 <translation id="6607831829715835317">Flere verktøy</translation>
-<translation id="6610147964972079463">Lukk privatefaner</translation>
+<translation id="6610147964972079463">Lukk privatfaner</translation>
 <translation id="6612358246767739896">Beskyttet innhold</translation>
 <translation id="6613452264606394692">Kom raskt tilbake hit ved å sette denne siden som bokmerke</translation>
 <translation id="6614893213975402384">Installer oppdateringer og apper. Ved å fortsette godtar du at denne enheten også kan laste ned og installere oppdateringer automatisk fra Google, operatøren din og produsenten av enheten. Dette bruker muligens mobildata. Noen av disse appene kan inneholde kjøp i app-funksjonalitet. Du kan fjerne disse appene når som helst. <ph name="BEGIN_LINK1" />Finn ut mer<ph name="END_LINK1" /></translation>
@@ -3747,7 +3745,7 @@
 <translation id="6710213216561001401">Forrige</translation>
 <translation id="6718273304615422081">Zipper ...</translation>
 <translation id="671928215901716392">Lås skjerm</translation>
-<translation id="6720847671508630642">Koble til telefonen, slik at du kan sende tekstmeldinger fra datamaskinen din, dele telefonens Internett-tilkobling og låse opp Chromebook-skjermen. <ph name="FOOTNOTE_POINTER" /><ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation>
+<translation id="6720847671508630642">Del automatisk det beste fra Android med Chromebooken din. Koble til telefonen, slik at du kan sende tekstmeldinger fra datamaskinen, dele telefonens Internett-tilkobling og låse opp Chromebook-skjermen.<ph name="FOOTNOTE_POINTER" /><ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">se merket og modellen til sikkerhetsnøkkelen din</translation>
 <translation id="6721972322305477112">&amp;Fil</translation>
 <translation id="672213144943476270">Du må låse opp profilen din før du kan surfe som gjest.</translation>
@@ -3894,7 +3892,7 @@
 <translation id="6970856801391541997">Skriv ut bestemte sider</translation>
 <translation id="6972180789171089114">Lyd og video</translation>
 <translation id="6973630695168034713">Mapper</translation>
-<translation id="6974609594866392343">Frakoblet demomodus</translation>
+<translation id="6974609594866392343">Demomodus uten nett</translation>
 <translation id="6976108581241006975">JavaScript-konsoll</translation>
 <translation id="6977381486153291903">Fastvareversjon</translation>
 <translation id="6978121630131642226">Søkemotorer</translation>
@@ -4008,7 +4006,7 @@
 <translation id="7127980134843952133">Nedlastingslogg</translation>
 <translation id="7131040479572660648">Lesing av dataene dine på <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og <ph name="WEBSITE_3" /></translation>
 <translation id="713122686776214250">Legg til si&amp;de</translation>
-<translation id="7133578150266914903">Administratoren din kaller tilbake denne enheten (<ph name="PROGRESS_PERCENT" />)</translation>
+<translation id="7133578150266914903">Administratoren din tilbakestiller denne enheten til forrige versjon (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="7134098520442464001">Forminsk teksten</translation>
 <translation id="7136694880210472378">Bruk som standard</translation>
 <translation id="7136984461011502314">Velkommen til <ph name="PRODUCT_NAME" /></translation>
@@ -4209,7 +4207,7 @@
 <translation id="7463006580194749499">Legg til person</translation>
 <translation id="7464490149090366184">Opprettelsen av zip-filen mislyktes – elementet eksisterer: «$1»</translation>
 <translation id="7465778193084373987">Nettadresse for tilbakekalling av Netscape-sertifikat</translation>
-<translation id="7469406957790636836">For å slå dette på, må du først slå på stavekontrollen i <ph name="BEGIN_LINK" />Språk og inndata<ph name="END_LINK" /></translation>
+<translation id="7469406957790636836">For å slå dette på må du først slå på stavekontrollen i <ph name="BEGIN_LINK" />Språk og inndata<ph name="END_LINK" /></translation>
 <translation id="7469894403370665791">Koble til dette nettverket automatisk</translation>
 <translation id="747114903913869239">Feil: Kan ikke avkode etternavnet</translation>
 <translation id="7473753388963818366">La oss få deg i gang med <ph name="DEVICE_TYPE" /></translation>
@@ -4374,7 +4372,7 @@
 <translation id="7730449930968088409">ta bilde av innhold på skjermen din</translation>
 <translation id="7730494089396812859">Vis detaljer for skybasert sikkerhetskopiering</translation>
 <translation id="7732111077498238432">Nettverket er kontrollert av regler</translation>
-<translation id="7737238973539693982">Slett Linux (Beta)</translation>
+<translation id="7737238973539693982">Slett Linux (beta)</translation>
 <translation id="773905249182896430">Beskytter deg og enheten din mot farlige nettsteder</translation>
 <translation id="7740996059027112821">Standard</translation>
 <translation id="7748528009589593815">Forrige fane</translation>
@@ -4564,7 +4562,7 @@
 <translation id="7974936243149753750">Overskanning</translation>
 <translation id="7977551819349545646">Oppdaterer Chromebox …</translation>
 <translation id="7978412674231730200">Privatnøkkel</translation>
-<translation id="7978450511781612192">Dette logger deg av Google-kontoene dine. Dine bokmerker, histore, passord, med mer, vil ikke lengre bli synkronisert.</translation>
+<translation id="7978450511781612192">Dette logger deg av Google-kontoene dine. Bokmerkene dine, loggen din, passordene dine med mer blir ikke lenger synkronisert.</translation>
 <translation id="7979036127916589816">Feil ved synkronisering</translation>
 <translation id="7980084013673500153">Ressurs-ID: <ph name="ASSET_ID" /></translation>
 <translation id="7981313251711023384">Last inn sider på forhånd for raskere nettlesing og søk</translation>
@@ -4730,7 +4728,7 @@
 <translation id="8226619461731305576">Kø</translation>
 <translation id="8226742006292257240">Nedenfor ser du et tilfeldig generert TPM-passord som er tildelt datamaskinen din:</translation>
 <translation id="8227119283605456246">Legg ved fil</translation>
-<translation id="8230134520748321204">Lagre passord for <ph name="ORIGIN" />?</translation>
+<translation id="8230134520748321204">Vil du lagre passord for <ph name="ORIGIN" />?</translation>
 <translation id="8234795456569844941">Hjelp programutviklerne våre med å løse dette problemet. Fortell oss hva som skjedde rett før du fikk profilfeilmeldingen:</translation>
 <translation id="8234989666557591529">Velg hvilken telefon du vil låse opp <ph name="DEVICE_TYPE" />-enheten med</translation>
 <translation id="8239020549147958415">Synkroniser som <ph name="FULL_NAME" /></translation>
@@ -4806,7 +4804,6 @@
 <translation id="8366396658833131068">Nettverkstilkoblingen er gjenopprettet. Velg et annet nettverk eller trykk på «Fortsett»-knappen nedenfor for å starte kioskappen din.</translation>
 <translation id="8366947248864804596">Når telefonen er låst opp og i nærheten, kan du klikke for å låse opp. Eventuelt kan du skrive inn passordet ditt eller PIN-koden din.</translation>
 <translation id="8368859634510605990">&amp;Åpne alle bokmerker</translation>
-<translation id="8369547389711988632">Stoppet innlasting</translation>
 <translation id="8371695176452482769">Snakk nå</translation>
 <translation id="8372369524088641025">Feil WEP-nøkkel</translation>
 <translation id="8373553483208508744">Slå av lyden for fanene</translation>
@@ -4894,7 +4891,7 @@
 <translation id="8497219075884839166">Windows Verktøy</translation>
 <translation id="8498214519255567734">Gjør det lettere å se på skjermen og lese i svakt lys</translation>
 <translation id="8498395510292172881">Forsett å lese i Chrome</translation>
-<translation id="8502536196501630039">For å bruke apper fra Google Play, må du først gjenopprette appene dine. Noe data kan ha blitt tapt.</translation>
+<translation id="8502536196501630039">For å bruke apper fra Google Play må du først gjenopprette appene dine. Noe data kan ha gått tapt.</translation>
 <translation id="8503813439785031346">Brukernavn</translation>
 <translation id="850875081535031620">Fant ingen skadelig programvare</translation>
 <translation id="8509646642152301857">Nedlastingen av ordboken for stavekontroll mislyktes.</translation>
@@ -5002,7 +4999,7 @@
 <translation id="8666584013686199826">Spør når et nettsted vil ha tilgang til USB-enheter</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> vises nå i fullskjermsvisning, og har deaktivert markøren din.</translation>
 <translation id="8669284339312441707">Varmere</translation>
-<translation id="8669919703154928649">La assistenten vis deg varslene</translation>
+<translation id="8669919703154928649">La assistenten vise deg varsler</translation>
 <translation id="8669949407341943408">Flytter …</translation>
 <translation id="8671210955687109937">Kan kommentere</translation>
 <translation id="8673026256276578048">Søk på nettet</translation>
@@ -5012,7 +5009,6 @@
 <translation id="8677212948402625567">Skjul alle</translation>
 <translation id="8678648549315280022">Administrer nedlastingsinnstillinger</translation>
 <translation id="8678933587484842200">Hvordan vil du at denne appen skal starte?</translation>
-<translation id="8679788109894721265">Denne siden bruker mer enn <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Logg på for å hente bokmerkene dine, loggen din, passordene dine og andre innstillinger på alle enhetene du bruker. Du blir dessuten automatisk logget på Google-tjenestene du bruker.</translation>
 <translation id="8686213429977032554">Denne Disk-filen er ikke delt ennå</translation>
 <translation id="8687485617085920635">Neste vindu</translation>
@@ -5024,7 +5020,7 @@
 <translation id="8698464937041809063">Google-tegning</translation>
 <translation id="869884720829132584">Programmeny</translation>
 <translation id="869891660844655955">Utløpsdato</translation>
-<translation id="8699566574894671540">For å lå dette på, må du først velge Kontroller rettskriving mens du skriver inne i Rediger-menyen</translation>
+<translation id="8699566574894671540">For å slå dette på må du først velge «Kontrollér staving mens du skriver» på Rediger-menyen</translation>
 <translation id="870073306461175568">Fildelinger på nettverket</translation>
 <translation id="8701677791353449257">Enhetsnavnet må samsvare med det regulære uttrykket <ph name="REGEX" />.</translation>
 <translation id="8704521619148782536">Dette tar mye lengre tid enn normalt. Du kan fortsette å vente eller avbryte og prøve på nytt senere.</translation>
@@ -5064,7 +5060,7 @@
 
         &lt;p&gt;Du kan likevel konfigurere via kommandolinjen. Les mer om flagg og miljøvariabler i &lt;code&gt;man <ph name="PRODUCT_BINARY_NAME" />&lt;/code&gt;.&lt;/p&gt;</translation>
 <translation id="8755376271068075440">&amp;Større</translation>
-<translation id="8756969031206844760">Oppdater passord?</translation>
+<translation id="8756969031206844760">Vil du oppdatere passordet?</translation>
 <translation id="8757090071857742562">Skrivebordet kunne ikke castes. Sjekk om du bekreftet forespørselen om å begynne å dele skjermen din.</translation>
 <translation id="8757640015637159332">Start en offentlig økt</translation>
 <translation id="8757742102600829832">Velg en Chromebox du vil koble til</translation>
@@ -5220,7 +5216,7 @@
 <translation id="9009369504041480176">Laster opp (<ph name="PROGRESS_PERCENT" /> %) ...</translation>
 <translation id="9011163749350026987">Vis alltid ikonet</translation>
 <translation id="9011178328451474963">Den siste fanen</translation>
-<translation id="9013707997379828817">Administratoren henter tilbake enheten din. Vennligst lagre viktige filer, og start deretter på nytt. Alle data på enheten vil bli slettet.</translation>
+<translation id="9013707997379828817">Administratoren tilbakestiller denne enheten til forrige versjon. Lagre viktige filer, og start enheten på nytt. Alle data på enheten blir slettet.</translation>
 <translation id="9014987600015527693">Vis en annen telefon</translation>
 <translation id="9018218886431812662">Installasjonen er fullført</translation>
 <translation id="901834265349196618">e-post</translation>
@@ -5246,7 +5242,7 @@
 <translation id="9038649477754266430">Bruk en prediksjonstjeneste for å laste inn sider raskere</translation>
 <translation id="9039663905644212491">PEAP</translation>
 <translation id="9039890312082871605">Slå av lyden for fanene</translation>
-<translation id="9040661932550800571">Oppdater passord for <ph name="ORIGIN" />?</translation>
+<translation id="9040661932550800571">Vil du oppdatere passordet for <ph name="ORIGIN" />?</translation>
 <translation id="9041692268811217999">Administratoren din har deaktivert tilgang til lokale filer på maskinen din</translation>
 <translation id="9042893549633094279">Personvern og sikkerhet</translation>
 <translation id="904451693890288097">Skriv inn passordet for «<ph name="DEVICE_NAME" />»:</translation>
@@ -5351,7 +5347,7 @@
 <translation id="9203478404496196495">Slå på lyden for fanen</translation>
 <translation id="9203904171912129171">Velg enhet</translation>
 <translation id="9203962528777363226">Administratoren til denne enheten har deaktivert tillegging av nye brukere</translation>
-<translation id="9213073329713032541">Installasjon startet vellykket.</translation>
+<translation id="9213073329713032541">Installeringen er startet.</translation>
 <translation id="9214520840402538427">Beklager. Oppstarten av attributtene for installasjonstid er tidsavbrutt. Ta kontakt med brukerstøtterepresentanten din.</translation>
 <translation id="9214695392875603905">Cupcake</translation>
 <translation id="9215293857209265904">«<ph name="EXTENSION_NAME" />» ble lagt til</translation>
@@ -5407,7 +5403,7 @@
 <translation id="988978206646512040">Tomme passordfraser er ikke tillatt</translation>
 <translation id="992032470292211616">Utvidelser, apper og temaer kan skade enheten din. Er du sikker på at du vil fortsette?</translation>
 <translation id="992592832486024913">Slå av ChromeVox (taletilbakemelding)</translation>
-<translation id="993540765962421562">Installering pågår.</translation>
+<translation id="993540765962421562">Installeringen pågår.</translation>
 <translation id="994289308992179865">&amp;Gjenta</translation>
 <translation id="996250603853062861">Etablerer sikker tilkobling ...</translation>
 <translation id="998747458861718449">I&amp;nspiser</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 8a94eaca..575a42dc 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Synchronizacja i personalizacja</translation>
 <translation id="1398853756734560583">Maksymalizuj</translation>
 <translation id="1399511500114202393">Brak certyfikatu użytkownika</translation>
+<translation id="1401165786814632797">Uruchamiaj Asystenta, mówiąc „OK Google”, gdy urządzenie jest odblokowane i nieuśpione.</translation>
 <translation id="140250605646987970">Telefon został wykryty, jednak Smart Lock działa tylko na urządzeniach z Androidem 5.0 lub nowszym. &lt;a&gt;Więcej informacji&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (nadzorowany)</translation>
 <translation id="1405476660552109915">Czy <ph name="PASSWORD_MANAGER_BRAND" /> ma zapisać konto dla tej strony?</translation>
@@ -1370,6 +1371,7 @@
 <translation id="3031557471081358569">Wybierz elementy do zaimportowania:</translation>
 <translation id="3031601332414921114">Wznów drukowanie</translation>
 <translation id="303198083543495566">Lokalizacja</translation>
+<translation id="3033999583152214331">Używaj na Chromebooku 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="3036546437875325427">Włącz Flasha</translation>
 <translation id="3037754279345160234">Nie można przeanalizować konfiguracji dołączania do domeny. Skontaktuj się z administratorem.</translation>
 <translation id="3038612606416062604">Dodaj drukarkę ręcznie</translation>
@@ -1510,6 +1512,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> chce się połączyć</translation>
 <translation id="3274763671541996799">Pracujesz w trybie pełnoekranowym.</translation>
 <translation id="3275778913554317645">Otwórz jako okno</translation>
+<translation id="3278877214895457897">Gdy skonfigurujesz Chromebooka, możesz korzystać z Asystenta. W dowolnym momencie naciśnij jego przycisk lub powiedz „OK Google”.</translation>
 <translation id="3279230909244266691">Może to potrwać kilka minut. Uruchamiam maszynę wirtualną.</translation>
 <translation id="3279741024917655738">Wyświetlaj filmy pełnoekranowe na:</translation>
 <translation id="3280237271814976245">Zapisz &amp;jako...</translation>
@@ -2166,7 +2169,6 @@
 <translation id="4275830172053184480">Zrestartuj urządzenie</translation>
 <translation id="4278101229438943600">Twój Asystent jest gotowy</translation>
 <translation id="4278390842282768270">Dopuszczone</translation>
-<translation id="4280864916190672950">Zatrzymaj ładowanie</translation>
 <translation id="4281844954008187215">Warunki korzystania z usługi</translation>
 <translation id="4282196459431406533">Funkcja Smart Lock jest włączona</translation>
 <translation id="4284105660453474798">Czy na pewno chcesz usunąć plik „$1”?</translation>
@@ -2604,6 +2606,7 @@
 <translation id="4992066212339426712">Wyłącz wyciszenie</translation>
 <translation id="4992458225095111526">Potwierdzanie Powerwash</translation>
 <translation id="4992473555164495036">Administrator ograniczył dostępne metody wprowadzania.</translation>
+<translation id="4992926179187649719">Włącz funkcję „OK Google”</translation>
 <translation id="4994474651455208930">Zezwól, by strony prosiły użytkownika o ustawienie ich jako domyślnego modułu obsługi protokołu</translation>
 <translation id="4994754230098574403">Konfiguruję</translation>
 <translation id="4996978546172906250">Udostępnij przez</translation>
@@ -3436,7 +3439,6 @@
 <translation id="6231881193380278751">Dodaj parametr zapytania do URL-a, by strona odświeżała się automatycznie: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Bateria</translation>
 <translation id="6232116551750539448">Połączenie z <ph name="NAME" /> zostało utracone</translation>
-<translation id="6235700927623181151">Ta karta udostępnia zawartość Twojego pulpitu.</translation>
 <translation id="6237816943013845465">Pozwala zmienić rozdzielczość ekranu</translation>
 <translation id="6238923052227198598">Wyświetlaj najnowszą notatkę na ekranie blokady</translation>
 <translation id="6239558157302047471">Załaduj ponownie &amp;ramkę</translation>
@@ -4533,6 +4535,7 @@
 <translation id="7908378463497120834">Nie można podłączyć co najmniej jednej partycji na urządzeniu zewnętrznej pamięci masowej.</translation>
 <translation id="7909969815743704077">Pobrano w trybie incognito</translation>
 <translation id="7910768399700579500">&amp;Nowy folder</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Twoje hasło zostało zmienione na serwerze. Wyloguj się i zaloguj się ponownie.</translation>
 <translation id="7915471803647590281">Zanim wyślesz opinię, powiedz nam, co się dzieje.</translation>
 <translation id="7916556741383518510">Po kliknięciu</translation>
@@ -4818,7 +4821,6 @@
 <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="8366947248864804596">Gdy Twój telefon jest odblokowany i znajduje się w pobliżu, po prostu kliknij, by odblokować urządzenie. W przeciwnym razie wpisz hasło lub kod PIN.</translation>
 <translation id="8368859634510605990">&amp;Otwórz wszystkie zakładki</translation>
-<translation id="8369547389711988632">Ładowanie zatrzymane</translation>
 <translation id="8371695176452482769">Mów teraz</translation>
 <translation id="8372369524088641025">Błędny klucz WEP</translation>
 <translation id="8373553483208508744">Wycisz karty</translation>
@@ -5024,7 +5026,6 @@
 <translation id="8677212948402625567">Zwiń wszystko...</translation>
 <translation id="8678648549315280022">Zarządzaj ustawieniami pobierania...</translation>
 <translation id="8678933587484842200">Jak chcesz uruchamiać tę aplikację?</translation>
-<translation id="8679788109894721265">Ta strona zużyła ponad <ph name="MEGABYTES" /> MB</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="8686213429977032554">Ten plik na Dysku nie jest jeszcze udostępniany</translation>
 <translation id="8687485617085920635">Następne okno</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 0ce80cc..4843020d 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Sincronização e personalização</translation>
 <translation id="1398853756734560583">Maximizar</translation>
 <translation id="1399511500114202393">Nenhum certificado do usuário</translation>
+<translation id="1401165786814632797">Acesse seu Assistente sempre que disser "Ok Google" quando seu dispositivo estiver ativado e desbloqueado.</translation>
 <translation id="140250605646987970">Seu smartphone foi localizado. No entanto, o Smart Lock funciona apenas em dispositivos com Android 5.0 e posterior. &lt;a&gt;Saiba mais&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (supervisionado)</translation>
 <translation id="1405476660552109915">Quer que <ph name="PASSWORD_MANAGER_BRAND" /> salve sua conta para este site?</translation>
@@ -1370,6 +1371,7 @@
 <translation id="3031557471081358569">Selecione os itens que serão importados:</translation>
 <translation id="3031601332414921114">Retomar impressão</translation>
 <translation id="303198083543495566">Região geográfica</translation>
+<translation id="3033999583152214331">Execute ferramentas, editores e ambientes de desenvolvimento integrado do Linux no seu Chromebook. &lt;a target="_blank" href="<ph name="URL" />"&gt;Saiba mais&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Ativar Flash</translation>
 <translation id="3037754279345160234">Não é possível analisar a configuração de vínculo de domínios. Entre em contato com seu administrador.</translation>
 <translation id="3038612606416062604">Adicionar uma impressora manualmente</translation>
@@ -1510,6 +1512,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> deseja se conectar</translation>
 <translation id="3274763671541996799">Você está no modo de tela inteira.</translation>
 <translation id="3275778913554317645">Abrir como janela</translation>
+<translation id="3278877214895457897">Quando o Chromebook estiver configurado, pressione o botão do Assistente ou diga "Ok Google" para receber ajuda do Assistente a qualquer momento.</translation>
 <translation id="3279230909244266691">O processo pode levar alguns minutos. Iniciando a máquina virtual.</translation>
 <translation id="3279741024917655738">Mostrar vídeos em tela cheia em</translation>
 <translation id="3280237271814976245">Salvar &amp;como...</translation>
@@ -2166,7 +2169,6 @@
 <translation id="4275830172053184480">Reiniciar seu dispositivo</translation>
 <translation id="4278101229438943600">O Assistente está pronto</translation>
 <translation id="4278390842282768270">Permitido</translation>
-<translation id="4280864916190672950">Interromper carregamento</translation>
 <translation id="4281844954008187215">Termos de Serviço</translation>
 <translation id="4282196459431406533">O Smart Lock está ativado</translation>
 <translation id="4284105660453474798">Tem certeza que quer apagar "$1"?</translation>
@@ -2604,6 +2606,7 @@
 <translation id="4992066212339426712">Ativar som</translation>
 <translation id="4992458225095111526">Confirmar powerwash</translation>
 <translation id="4992473555164495036">O administrador limitou os métodos de entrada disponíveis.</translation>
+<translation id="4992926179187649719">Ativar "Ok Google"</translation>
 <translation id="4994474651455208930">Permitir que os sites peçam para se tornarem manipuladores padrão de protocolos</translation>
 <translation id="4994754230098574403">Configurando</translation>
 <translation id="4996978546172906250">Compartilhar via</translation>
@@ -3438,7 +3441,6 @@
 <translation id="6231881193380278751">Adicionar um parâmetro de consulta no URL para atualizar automaticamente a página: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Bateria</translation>
 <translation id="6232116551750539448">A conexão com <ph name="NAME" /> foi perdida</translation>
-<translation id="6235700927623181151">Esta guia está compartilhando o conteúdo da sua área de trabalho</translation>
 <translation id="6237816943013845465">Permite ajustar a resolução da tela</translation>
 <translation id="6238923052227198598">Manter a anotação mais recente na tela de bloqueio</translation>
 <translation id="6239558157302047471">Atualizar &amp;frame</translation>
@@ -4535,6 +4537,7 @@
 <translation id="7908378463497120834">Ao menos uma partição no seu dispositivo de armazenamento externo não pôde ser montada.</translation>
 <translation id="7909969815743704077">Download feito no modo anônimo</translation>
 <translation id="7910768399700579500">&amp;Nova pasta</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Sua senha foi alterada no servidor. Saia e faça login novamente.</translation>
 <translation id="7915471803647590281">Conte-nos o que está acontecendo antes de enviar comentários.</translation>
 <translation id="7916556741383518510">Ao Clicar</translation>
@@ -4820,7 +4823,6 @@
 <translation id="8366396658833131068">Sua conectividade de rede foi restaurada. Selecione outra rede ou pressione o botão "Continuar" abaixo para iniciar seu aplicativo de quiosque.</translation>
 <translation id="8366947248864804596">Quando o smartphone está desbloqueado e nas proximidades, basta selecionar para desbloquear. Caso contrário, digite sua senha ou PIN.</translation>
 <translation id="8368859634510605990">&amp;Abrir todos os favoritos</translation>
-<translation id="8369547389711988632">Carregamento interrompido</translation>
 <translation id="8371695176452482769">Fale agora</translation>
 <translation id="8372369524088641025">Chave WEP incorreta</translation>
 <translation id="8373553483208508744">Desativar som das guias</translation>
@@ -5026,7 +5028,6 @@
 <translation id="8677212948402625567">Recolher tudo...</translation>
 <translation id="8678648549315280022">Gerenciar configurações de download...</translation>
 <translation id="8678933587484842200">Como você gostaria que este app fosse iniciado?</translation>
-<translation id="8679788109894721265">Esta página usa mais de <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Faça login para ter acesso aos seus favoritos, histórico, senhas e outras configurações em todos os seus dispositivos. Você será conectado automaticamente aos seus serviços do Google.</translation>
 <translation id="8686213429977032554">Este arquivo do Google Drive ainda não foi compartilhado.</translation>
 <translation id="8687485617085920635">Próxima janela</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index b3b9f7aa..ccfd127 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Sincronização e personalização</translation>
 <translation id="1398853756734560583">Maximizar</translation>
 <translation id="1399511500114202393">Nenhum certificado de utilizador</translation>
+<translation id="1401165786814632797">Aceda ao Assistente sempre que disser "Ok Google" quando o dispositivo estiver ativado e desbloqueado.</translation>
 <translation id="140250605646987970">Encontrámos o seu telemóvel. No entanto, o Smart Lock só funciona em dispositivos com o Android 5.0 ou superior. &lt;a&gt;Saiba mais&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (supervisionado)</translation>
 <translation id="1405476660552109915">Pretende que o <ph name="PASSWORD_MANAGER_BRAND" /> guarde a sua conta para este site?</translation>
@@ -512,7 +513,7 @@
 <translation id="1744060673522309905">Não é possível associar o dispositivo ao domínio. Certifique-se de que não excedeu o número de dispositivos que pode adicionar.</translation>
 <translation id="1744108098763830590">página de fundo</translation>
 <translation id="1745520510852184940">Fazer sempre isto</translation>
-<translation id="1746417874336251387">Oferecer novas funcionalidades que utilizam a ligação do telemóvel ao Chromebook</translation>
+<translation id="1746417874336251387">Oferece novas funcionalidades que utilizam a ligação do telemóvel ao Chromebook</translation>
 <translation id="174937106936716857">Contagem total de ficheiros</translation>
 <translation id="175196451752279553">Voltar a abrir o s&amp;eparador fechado</translation>
 <translation id="1753905327828125965">Mais visitados</translation>
@@ -1371,6 +1372,7 @@
 <translation id="3031557471081358569">Seleccione os itens a importar:</translation>
 <translation id="3031601332414921114">Retomar a impressão</translation>
 <translation id="303198083543495566">Geografia</translation>
+<translation id="3033999583152214331">Execute ferramentas, editores e IDEs de Linux no seu Chromebook. &lt;a target="_blank" href="<ph name="URL" />"&gt;Saiba mais&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Ativar Flash</translation>
 <translation id="3037754279345160234">Não é possível analisar a configuração de associação do domínio. Contacte o administrador.</translation>
 <translation id="3038612606416062604">Adicionar uma impressora manualmente</translation>
@@ -1511,6 +1513,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> pretende estabelecer ligação</translation>
 <translation id="3274763671541996799">Mudou para o ecrã inteiro.</translation>
 <translation id="3275778913554317645">Abrir como janela</translation>
+<translation id="3278877214895457897">Quando o Chromebook estiver configurado, prima o botão do Assistente ou diga "Ok Google" para obter ajuda do Assistente a qualquer momento.</translation>
 <translation id="3279230909244266691">Este processo pode demorar alguns minutos. A iniciar a máquina virtual…</translation>
 <translation id="3279741024917655738">Mostrar vídeos em ecrã inteiro em</translation>
 <translation id="3280237271814976245">Guard&amp;ar como...</translation>
@@ -2167,7 +2170,6 @@
 <translation id="4275830172053184480">Reiniciar o dispositivo</translation>
 <translation id="4278101229438943600">O seu Assistente está pronto</translation>
 <translation id="4278390842282768270">Permitidos:</translation>
-<translation id="4280864916190672950">Parar carregamento</translation>
 <translation id="4281844954008187215">Termos de Utilização</translation>
 <translation id="4282196459431406533">O Smart Lock está ativado</translation>
 <translation id="4284105660453474798">Tem a certeza de que pretende eliminar "$1"?</translation>
@@ -2605,6 +2607,7 @@
 <translation id="4992066212339426712">Reativar o som</translation>
 <translation id="4992458225095111526">Confirmar Powerwash</translation>
 <translation id="4992473555164495036">O administrador limitou os métodos de introdução disponíveis.</translation>
+<translation id="4992926179187649719">Ativar a opção "Ok Google"</translation>
 <translation id="4994474651455208930">Permitir que os Web sites peçam para serem os processadores predefinidos de protocolos</translation>
 <translation id="4994754230098574403">A configurar…</translation>
 <translation id="4996978546172906250">Partilhar através de</translation>
@@ -3438,7 +3441,6 @@
 <translation id="6231881193380278751">Adicione um parâmetro de consulta no URL para atualizar automaticamente a página: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Bateria</translation>
 <translation id="6232116551750539448">Perdeu-se a ligação a <ph name="NAME" /></translation>
-<translation id="6235700927623181151">Este separador está a partilhar o conteúdo do seu ambiente de trabalho.</translation>
 <translation id="6237816943013845465">Permite-lhe ajustar a resolução do ecrã</translation>
 <translation id="6238923052227198598">Manter a nota mais recente no ecrã de bloqueio</translation>
 <translation id="6239558157302047471">Atualizar &amp;frame</translation>
@@ -4535,6 +4537,7 @@
 <translation id="7908378463497120834">Lamentamos, mas não foi possível montar, pelo menos, uma partição no aparelho de armazenamento externo.</translation>
 <translation id="7909969815743704077">Transferido em modo de navegação anónima</translation>
 <translation id="7910768399700579500">&amp;Nova pasta</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">A sua palavra-passe foi alterada no servidor. Termine e inicie sessão novamente.</translation>
 <translation id="7915471803647590281">Indique-nos o que está a acontecer antes de enviar os comentários.</translation>
 <translation id="7916556741383518510">Ao clicar</translation>
@@ -4819,7 +4822,6 @@
 <translation id="8366396658833131068">A conetividade de rede foi restaurada. Selecione uma rede diferente ou prima "Continuar" abaixo para iniciar a aplicação de quiosque.</translation>
 <translation id="8366947248864804596">Quando o telemóvel estiver desbloqueado e próximo, basta selecionar para desbloquear. Caso contrário, introduza a palavra-passe ou o PIN.</translation>
 <translation id="8368859634510605990">&amp;Abrir todos os marcadores</translation>
-<translation id="8369547389711988632">Carregamento interrompido</translation>
 <translation id="8371695176452482769">Falar agora</translation>
 <translation id="8372369524088641025">Chave WEP incorrecta</translation>
 <translation id="8373553483208508744">Desativar som dos separadores</translation>
@@ -5025,7 +5027,6 @@
 <translation id="8677212948402625567">Reduzir tudo...</translation>
 <translation id="8678648549315280022">Gerir definições de transferência...</translation>
 <translation id="8678933587484842200">Como pretende que esta aplicação seja iniciada?</translation>
-<translation id="8679788109894721265">Esta página utiliza mais de <ph name="MEGABYTES" /> MB.</translation>
 <translation id="8680251145628383637">Inicie sessão para obter os seus marcadores, o histórico, as palavras-passe e outras definições em todos os seus dispositivos. Além disso, também inicia sessão automaticamente nos serviços Google.</translation>
 <translation id="8686213429977032554">Este ficheiro do Google Drive ainda não foi partilhado</translation>
 <translation id="8687485617085920635">Janela seguinte</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 4ab6c0e..cd3f28c 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Sincronizare și personalizare</translation>
 <translation id="1398853756734560583">Maximizează</translation>
 <translation id="1399511500114202393">Niciun certificat de utilizator</translation>
+<translation id="1401165786814632797">Accesează Asistentul ori de câte ori rostești „Ok Google” când dispozitivul este activ și deblocat.</translation>
 <translation id="140250605646987970">S-a găsit telefonul. Dar Smart Lock funcționează numai cu dispozitive care au Android 5.0 sau versiuni ulterioare. &lt;a&gt;Află mai multe&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (monitorizat)</translation>
 <translation id="1405476660552109915">Dorești ca <ph name="PASSWORD_MANAGER_BRAND" /> să îți salveze contul pentru acest site?</translation>
@@ -1510,6 +1511,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> dorește să se conecteze</translation>
 <translation id="3274763671541996799">Ați intrat în modul ecran complet.</translation>
 <translation id="3275778913554317645">Deschide ca fereastră</translation>
+<translation id="3278877214895457897">După configurarea Chromebookului, apasă butonul Asistentului sau rostește „Ok Google” pentru a obține oricând ajutor de la Asistent.</translation>
 <translation id="3279230909244266691">Poate dura câteva minute. Se pornește mașina virtuală.</translation>
 <translation id="3279741024917655738">Afișează videoclipurile pe ecran complet pe</translation>
 <translation id="3280237271814976245">Salvează c&amp;a...</translation>
@@ -2166,7 +2168,6 @@
 <translation id="4275830172053184480">Reporniți gadgetul</translation>
 <translation id="4278101229438943600">Asistentul este pregătit</translation>
 <translation id="4278390842282768270">Se permite</translation>
-<translation id="4280864916190672950">Oprește încărcarea</translation>
 <translation id="4281844954008187215">Condiții de furnizare a serviciilor</translation>
 <translation id="4282196459431406533">Smart Lock este activat</translation>
 <translation id="4284105660453474798">Sigur vrei să ștergi „$1”?</translation>
@@ -2604,6 +2605,7 @@
 <translation id="4992066212339426712">Activează sunetul</translation>
 <translation id="4992458225095111526">Confirmă Powerwash</translation>
 <translation id="4992473555164495036">Administratorul a limitat metodele de introducere a textului disponibile.</translation>
+<translation id="4992926179187649719">Activează „Ok Google”</translation>
 <translation id="4994474651455208930">Permiteți site-urilor să solicite să aibă rolul de programe asociate prestabilite pentru protocoale</translation>
 <translation id="4994754230098574403">Se configurează</translation>
 <translation id="4996978546172906250">Trimiteți prin</translation>
@@ -3436,7 +3438,6 @@
 <translation id="6231881193380278751">Adaugă un parametru de interogare în adresa URL pentru a actualiza automat pagina: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Baterie</translation>
 <translation id="6232116551750539448">S-a pierdut conexiunea la <ph name="NAME" /></translation>
-<translation id="6235700927623181151">Această filă permite accesul la conținutul de pe desktopul tău.</translation>
 <translation id="6237816943013845465">Cu ajutorul acestei setări, poți să ajustezi rezoluția ecranului</translation>
 <translation id="6238923052227198598">Păstrează cea mai recentă notă pe ecranul de blocare</translation>
 <translation id="6239558157302047471">Reîncarcă &amp;cadrul</translation>
@@ -4533,6 +4534,7 @@
 <translation id="7908378463497120834">Ne pare rău, cel puțin o partiție de pe dispozitivul de stocare externă nu a putut fi montată.</translation>
 <translation id="7909969815743704077">Descărcat în modul incognito</translation>
 <translation id="7910768399700579500">Dosar &amp;nou</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Parola a fost modificată pe server. Deconectează-te, apoi conectează-te din nou.</translation>
 <translation id="7915471803647590281">Spune-ne ce se întâmplă înainte de a trimite feedback.</translation>
 <translation id="7916556741383518510">Când se dă clic</translation>
@@ -4817,7 +4819,6 @@
 <translation id="8366396658833131068">Conexiunea la rețea a fost restabilită. Selectați altă rețea sau apăsați mai jos pe butonul „Continuați” pentru a lansa aplicația chioșc.</translation>
 <translation id="8366947248864804596">Când telefonul este deblocat și în apropiere, pentru a debloca, trebuie doar să selectezi. Altfel, introdu parola sau codul PIN.</translation>
 <translation id="8368859634510605990">&amp;Deschideți toate marcajele</translation>
-<translation id="8369547389711988632">S-a oprit încărcarea</translation>
 <translation id="8371695176452482769">Rostește acum</translation>
 <translation id="8372369524088641025">Cheie WEP greșită</translation>
 <translation id="8373553483208508744">Dezactivează sunetul filelor</translation>
@@ -5023,7 +5024,6 @@
 <translation id="8677212948402625567">Restrânge-le pe toate...</translation>
 <translation id="8678648549315280022">Gestionați setările pentru descărcare...</translation>
 <translation id="8678933587484842200">Cum dorești să se lanseze această aplicație?</translation>
-<translation id="8679788109894721265">Această pagină folosește mai mult de <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Conectează-te pentru a-ți accesa marcajele, istoricul, parolele și alte setări pe toate dispozitivele. În plus, te vei conecta automat la serviciile Google.</translation>
 <translation id="8686213429977032554">La acest fișier din Drive nu s-a permis încă accesul</translation>
 <translation id="8687485617085920635">Fereastra următoare</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 56d8036..12b2171 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -2167,7 +2167,6 @@
 <translation id="4275830172053184480">Перезапуск устройства</translation>
 <translation id="4278101229438943600">Ассистент готов к работе!</translation>
 <translation id="4278390842282768270">Разрешены</translation>
-<translation id="4280864916190672950">Остановить загрузку</translation>
 <translation id="4281844954008187215">Условия использования</translation>
 <translation id="4282196459431406533">Функция Smart Lock включена</translation>
 <translation id="4284105660453474798">Действительно удалить "$1"?</translation>
@@ -3437,7 +3436,6 @@
 <translation id="6231881193380278751">Добавьте в URL параметр запроса для автоматического обновления страницы: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Аккумулятор</translation>
 <translation id="6232116551750539448">Соединение с <ph name="NAME" /> прервано</translation>
-<translation id="6235700927623181151">На этой вкладке транслируется содержимое вашего рабочего стола.</translation>
 <translation id="6237816943013845465">Позволяет настроить разрешение экрана</translation>
 <translation id="6238923052227198598">Показывать последнюю заметку на заблокированном экране</translation>
 <translation id="6239558157302047471">Перезагрузить &amp;фрейм</translation>
@@ -4818,7 +4816,6 @@
 <translation id="8366396658833131068">Подключение к сети восстановлено. Выберите другую сеть или нажмите кнопку "Продолжить", чтобы запустить киоск-приложение.</translation>
 <translation id="8366947248864804596">Когда телефон разблокирован и находится поблизости, выберите разблокировку. В противном случае введите пароль или PIN-код.</translation>
 <translation id="8368859634510605990">&amp;Открыть все закладки</translation>
-<translation id="8369547389711988632">Загрузка приостановлена</translation>
 <translation id="8371695176452482769">Говорите</translation>
 <translation id="8372369524088641025">Недопустимый ключ WEP</translation>
 <translation id="8373553483208508744">Отключить звук на вкладках</translation>
@@ -5024,7 +5021,6 @@
 <translation id="8677212948402625567">Свернуть все...</translation>
 <translation id="8678648549315280022">Настройки скачивания…</translation>
 <translation id="8678933587484842200">Как запустить это приложение?</translation>
-<translation id="8679788109894721265">Эта страница использует более <ph name="MEGABYTES" /> Мб трафика.</translation>
 <translation id="8680251145628383637">Войдите в аккаунт, чтобы синхронизировать закладки, историю, пароли и другие настройки на всех устройствах. Одновременно будет выполнена авторизация в сервисах Google.</translation>
 <translation id="8686213429977032554">К этому файлу на Диске пока нет доступа</translation>
 <translation id="8687485617085920635">Следующее окно</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index b2879d7..c01f324 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Synchronizácia a prispôsobenie</translation>
 <translation id="1398853756734560583">Maximalizovať</translation>
 <translation id="1399511500114202393">Žiadny certifikát používateľa</translation>
+<translation id="1401165786814632797">Keď je zariadenie prebudené a odomknuté, Asistenta môžete kedykoľvek aktivovať vyslovením výrazu „Ok Google“.</translation>
 <translation id="140250605646987970">Našli sme váš telefón. Funkcia Smart Lock však funguje iba na zariadeniach s Androidom verzie 5.0 a novšej. &lt;a&gt;Ďalšie informácie&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (kontrolovaný)</translation>
 <translation id="1405476660552109915">Chcete, aby prehliadač <ph name="PASSWORD_MANAGER_BRAND" /> uložil váš účet pre tento web?</translation>
@@ -1510,6 +1511,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> žiada o pripojenie</translation>
 <translation id="3274763671541996799">Prepli ste na režim celej obrazovky.</translation>
 <translation id="3275778913554317645">Otvárať ako okno</translation>
+<translation id="3278877214895457897">Po nastavení Chromebooku môžete kedykoľvek získať pomoc od Asistenta tak, že stlačíte tlačidlo Asistent a poviete „OK Google“.</translation>
 <translation id="3279230909244266691">Tento proces môže trvať niekoľko minút. Spúšťa sa virtuálny počítač.</translation>
 <translation id="3279741024917655738">Zobrazovať videá na celú obrazovku na</translation>
 <translation id="3280237271814976245">Uložiť &amp;ako...</translation>
@@ -2166,7 +2168,6 @@
 <translation id="4275830172053184480">Reštart zariadenia</translation>
 <translation id="4278101229438943600">Váš Asistent je k dispozícii</translation>
 <translation id="4278390842282768270">Povolené</translation>
-<translation id="4280864916190672950">Zastaviť načítavanie</translation>
 <translation id="4281844954008187215">Zmluvné podmienky</translation>
 <translation id="4282196459431406533">Smart Lock je zapnutý</translation>
 <translation id="4284105660453474798">Naozaj chcete odstrániť súbor $1?</translation>
@@ -2604,6 +2605,7 @@
 <translation id="4992066212339426712">Zapnúť zvuk</translation>
 <translation id="4992458225095111526">Potvrdenia obnovenia Powerwash</translation>
 <translation id="4992473555164495036">Správca obmedzil dostupné metódy vstupu.</translation>
+<translation id="4992926179187649719">Zapnutie kľúčového výrazu „Ok Google“</translation>
 <translation id="4994474651455208930">Povoliť stránkam požiadať o nastavenie za predvolené obslužné nástroje protokolov</translation>
 <translation id="4994754230098574403">Nastavuje sa</translation>
 <translation id="4996978546172906250">Zdieľať prostredníctvom</translation>
@@ -3436,7 +3438,6 @@
 <translation id="6231881193380278751">Pridajte do webovej adresy parameter dopytu na automatickú aktualizáciu stránky: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Batéria</translation>
 <translation id="6232116551750539448">Pripojenie k sieti <ph name="NAME" /> bolo prerušené</translation>
-<translation id="6235700927623181151">Táto karta zdieľa obsah vašej pracovnej plochy.</translation>
 <translation id="6237816943013845465">Umožňuje nastaviť rozlíšenie obrazovky</translation>
 <translation id="6238923052227198598">Zobrazovať poslednú poznámku na uzamknutej obrazovke</translation>
 <translation id="6239558157302047471">Znova načítať prvok &amp;frame</translation>
@@ -4533,6 +4534,7 @@
 <translation id="7908378463497120834">Je nám ľúto, ale nepodarilo sa pripojiť minimálne jeden oddiel externého pamäťového zariadenia.</translation>
 <translation id="7909969815743704077">Stiahnuté v režime inkognito</translation>
 <translation id="7910768399700579500">&amp;Nový priečinok</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Vaše heslo bolo zmenené na serveri. Odhláste sa a potom sa znova prihláste.</translation>
 <translation id="7915471803647590281">Pred odoslaním spätnej väzby nám popíšte situáciu.</translation>
 <translation id="7916556741383518510">Po kliknutí</translation>
@@ -4817,7 +4819,6 @@
 <translation id="8366396658833131068">Vaše pripojenie k sieti je obnovené. Vyberte inú sieť alebo stlačte tlačidlo Pokračovať nachádzajúce sa nižšie a spustite tak aplikáciu Kiosk.</translation>
 <translation id="8366947248864804596">Keď je váš telefón odomknutý a v blízkosti, stačí zvoliť možnosť Odomknúť. Inak zadajte heslo alebo PIN.</translation>
 <translation id="8368859634510605990">&amp;Otvoriť všetky záložky</translation>
-<translation id="8369547389711988632">Načítavanie sa zastavilo</translation>
 <translation id="8371695176452482769">Hovorte…</translation>
 <translation id="8372369524088641025">Zlý kľúč WEP</translation>
 <translation id="8373553483208508744">Stlmiť karty</translation>
@@ -5023,7 +5024,6 @@
 <translation id="8677212948402625567">Zbaliť všetky...</translation>
 <translation id="8678648549315280022">Spravovať nastavenia sťahovania…</translation>
 <translation id="8678933587484842200">Ako sa má táto aplikácia spúšťať?</translation>
-<translation id="8679788109894721265">Táto stránka využíva viac ako <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Prihláste sa, aby ste získali svoje karty, záložky, históriu a ďalšie nastavenia na všetkých zariadeniach. Navyše budete automaticky prihlásený/-á do služieb Google.</translation>
 <translation id="8686213429977032554">Tento súbor na Disku sa zatiaľ nezdieľa</translation>
 <translation id="8687485617085920635">Ďalšie okno</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 24b5ccb..00127eb 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Sinhronizacija in prilagajanje</translation>
 <translation id="1398853756734560583">Povečaj</translation>
 <translation id="1399511500114202393">Brez uporabniškega potrdila</translation>
+<translation id="1401165786814632797">Do Pomočnika lahko dostopate, kadar koli izgovorite »OK Google«, ko je zaslon vklopljen in odklenjen.</translation>
 <translation id="140250605646987970">Vaš telefon je bil najden, vendar Smart Lock deluje samo v napravah s sistemom Android 5.0 in novejšim. &lt;a&gt;Več o tem&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (Zaščiten)</translation>
 <translation id="1405476660552109915">Ali želite, da <ph name="PASSWORD_MANAGER_BRAND" /> shrani račun za to spletno mesto?</translation>
@@ -1510,6 +1511,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> se želi povezati</translation>
 <translation id="3274763671541996799">Odprli ste način celotnega zaslona.</translation>
 <translation id="3275778913554317645">Odpri kot okno</translation>
+<translation id="3278877214895457897">Ko je Chromebook nastavljen, pritisnite gumb za Pomočnika ali izgovorite »Ok Google«, če želite, da vam Pomočnik kadar koli pomaga.</translation>
 <translation id="3279230909244266691">To lahko traja nekaj minut. Zagon navideznega računalnika.</translation>
 <translation id="3279741024917655738">Prikaz celozaslonskih videoposnetkov na</translation>
 <translation id="3280237271814976245">Shrani &amp;kot ...</translation>
@@ -2166,7 +2168,6 @@
 <translation id="4275830172053184480">Znova zaženite napravo.</translation>
 <translation id="4278101229438943600">Pomočnik je na voljo</translation>
 <translation id="4278390842282768270">Dovoljeno</translation>
-<translation id="4280864916190672950">Ustavitev nalaganja</translation>
 <translation id="4281844954008187215">Pogoji storitve</translation>
 <translation id="4282196459431406533">Smart Lock je vklopljen</translation>
 <translation id="4284105660453474798">Ali ste prepričani, da želite izbrisati datoteko »$1«?</translation>
@@ -2604,6 +2605,7 @@
 <translation id="4992066212339426712">Vklopi zvok</translation>
 <translation id="4992458225095111526">Potrdite Powerwash</translation>
 <translation id="4992473555164495036">Skrbnik je omejil razpoložljive načine vnosa.</translation>
+<translation id="4992926179187649719">Vklop sprožilne besede »Ok Google«</translation>
 <translation id="4994474651455208930">Dovoli spletnim mestom, da zahtevajo, da postanejo privzete rutine za obravnavo protokolov</translation>
 <translation id="4994754230098574403">Nastavljanje</translation>
 <translation id="4996978546172906250">Skupna raba prek</translation>
@@ -3437,7 +3439,6 @@
 <translation id="6231881193380278751">Če želite, da se stran samodejno osveži, v URL-ju dodajte parameter iskalne poizvedbe: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Baterija</translation>
 <translation id="6232116551750539448">Povezava z omrežjem <ph name="NAME" /> je prekinjena</translation>
-<translation id="6235700927623181151">Ta zavihek souporablja vsebino namizja.</translation>
 <translation id="6237816943013845465">Omogoča prilagajanje ločljivosti zaslona</translation>
 <translation id="6238923052227198598">Najnovejši zapisek naj bo prikazan na zaklenjenem zaslonu</translation>
 <translation id="6239558157302047471">Znova naloži &amp;okvir</translation>
@@ -4533,6 +4534,7 @@
 <translation id="7908378463497120834">Vsaj ene particije v zunanji napravi za shranjevanje ni bilo mogoče vpeti.</translation>
 <translation id="7909969815743704077">Preneseno v načinu brez beleženja zgodovine</translation>
 <translation id="7910768399700579500">&amp;Nova mapa</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Geslo je bilo spremenjeno v strežniku. Odjavite se in se nato znova prijavite.</translation>
 <translation id="7915471803647590281">Povejte nam, kaj se dogaja, preden nam pošljete povratne informacije.</translation>
 <translation id="7916556741383518510">Ob kliku</translation>
@@ -4817,7 +4819,6 @@
 <translation id="8366396658833131068">Omrežna povezava je znova vzpostavljena. Če želite zagnati aplikacijo za kiosk, izberite drugo omrežje ali spodaj pritisnite »Naprej«.</translation>
 <translation id="8366947248864804596">Ko je telefon odklenjen in v bližini, samo izberite za odklepanje. V nasprotnem primeru vnesite geslo ali PIN.</translation>
 <translation id="8368859634510605990">&amp;Odpri vse zaznamke</translation>
-<translation id="8369547389711988632">Ustavljeno nalaganje</translation>
 <translation id="8371695176452482769">Začnite govoriti</translation>
 <translation id="8372369524088641025">Napačen ključ WEP</translation>
 <translation id="8373553483208508744">Izklop zvoka zavihkov</translation>
@@ -5023,7 +5024,6 @@
 <translation id="8677212948402625567">Strni vse ...</translation>
 <translation id="8678648549315280022">Upravljanje nastavitev prenosa ...</translation>
 <translation id="8678933587484842200">Kako želite, da se zažene ta aplikacija?</translation>
-<translation id="8679788109894721265">Prenos podatkov za to stran presega <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Prijavite se, če želite uporabljati zaznamke, zgodovino, gesla in druge nastavitve v vseh napravah. Prav tako boste samodejno prijavljeni v Googlove storitve.</translation>
 <translation id="8686213429977032554">Ta datoteka v storitvi Google Drive še ni v skupni rabi</translation>
 <translation id="8687485617085920635">Naslednje okno</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 3b11730..05e0baaf 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Синхронизација и персонализација</translation>
 <translation id="1398853756734560583">Увећај</translation>
 <translation id="1399511500114202393">Нема корисничког сертификата</translation>
+<translation id="1401165786814632797">Приступајте Помоћнику сваки пут када изговорите „Ок Google“ док је уређај ван стања спавања и откључан.</translation>
 <translation id="140250605646987970">Телефон је пронађен. Али Smart Lock функционише само на уређајима који имају Android 5.0 и новије верзије. &lt;a&gt;Сазнајте више&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (контролисано)</translation>
 <translation id="1405476660552109915">Желите ли да <ph name="PASSWORD_MANAGER_BRAND" /> сачува налог за овај сајт?</translation>
@@ -640,7 +641,7 @@
 <translation id="1932098463447129402">Не пре</translation>
 <translation id="1933809209549026293">Повежите миша или тастатуру. Ако користите Bluetooth уређај, проверите да ли је спреман за упаривање.</translation>
 <translation id="1936157145127842922">Прикажи у директоријуму</translation>
-<translation id="1938351510777341717">External Command (Спољна команда)</translation>
+<translation id="1938351510777341717">Спољна команда</translation>
 <translation id="1940546824932169984">Повезани уређаји</translation>
 <translation id="1942765061641586207">Резолуција слике</translation>
 <translation id="1943097386230153518">Инсталирајте нову услугу</translation>
@@ -1506,6 +1507,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> жели да се повеже</translation>
 <translation id="3274763671541996799">Прешли сте на режим целог екрана.</translation>
 <translation id="3275778913554317645">Отвори као прозор</translation>
+<translation id="3278877214895457897">Када подесите Chromebook, притисните дугме Помоћник или изговорите „Ок Google“ да бисте затражили помоћ од Помоћника у било ком тренутку.</translation>
 <translation id="3279230909244266691">Ово може да потраје неколико минута. Покреће се виртуелна машина.</translation>
 <translation id="3279741024917655738">Приказуј видео снимке преко целог екрана на:</translation>
 <translation id="3280237271814976245">Сачувај &amp;као...</translation>
@@ -2162,7 +2164,6 @@
 <translation id="4275830172053184480">Поновно покретање уређаја</translation>
 <translation id="4278101229438943600">Помоћник је спреман</translation>
 <translation id="4278390842282768270">Дозвољено</translation>
-<translation id="4280864916190672950">Заустављање учитавања</translation>
 <translation id="4281844954008187215">Услови коришћења услуге</translation>
 <translation id="4282196459431406533">Smart Lock је укључен</translation>
 <translation id="4284105660453474798">Да ли стварно желите да избришете „$1“?</translation>
@@ -2600,6 +2601,7 @@
 <translation id="4992066212339426712">Укључи звук</translation>
 <translation id="4992458225095111526">Потврђивање Powerwash-а</translation>
 <translation id="4992473555164495036">Администратор је ограничио доступне методе уноса.</translation>
+<translation id="4992926179187649719">Укључите „Ок Google“</translation>
 <translation id="4994474651455208930">Дозволи сајтовима да захтевају да постану подразумевани обрађивачи протокола</translation>
 <translation id="4994754230098574403">Подешава се</translation>
 <translation id="4996978546172906250">Дељење преко</translation>
@@ -3434,7 +3436,6 @@
 <translation id="6231881193380278751">Додајте параметар упита у URL да бисте аутоматски освежили страницу: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Батерија</translation>
 <translation id="6232116551750539448">Веза са мрежом <ph name="NAME" /> је прекинута</translation>
-<translation id="6235700927623181151">Ова картица дели садржај екрана.</translation>
 <translation id="6237816943013845465">Омогућавају вам да прилагодите резолуцију екрана</translation>
 <translation id="6238923052227198598">Задржи најновију белешку на закључаном екрану</translation>
 <translation id="6239558157302047471">Поново учитај &amp;оквир</translation>
@@ -4530,6 +4531,7 @@
 <translation id="7908378463497120834">Жао нам је, најмање једну партицију спољног меморијског уређаја није било могуће укључити.</translation>
 <translation id="7909969815743704077">Преузето је у режиму без архивирања</translation>
 <translation id="7910768399700579500">&amp;Нови директоријум</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Лозинка је промењена на серверу. Одјавите се, па се поново пријавите.</translation>
 <translation id="7915471803647590281">Реците нам шта се дешава пре него што пошаљете повратне информације.</translation>
 <translation id="7916556741383518510">При клику</translation>
@@ -4814,7 +4816,6 @@
 <translation id="8366396658833131068">Веза са мрежом је поново успостављена. Изаберите другу мрежу или притисните дугме „Настави“ у наставку да бисте покренули киоск апликацију.</translation>
 <translation id="8366947248864804596">Када је телефон откључан и у близини, само га изаберите да бисте откључали. У супротном, унесите лозинку или PIN.</translation>
 <translation id="8368859634510605990">&amp;Отвори све обележиваче</translation>
-<translation id="8369547389711988632">Учитавање је заустављено</translation>
 <translation id="8371695176452482769">Почните да говорите</translation>
 <translation id="8372369524088641025">Неисправна WEP шифра</translation>
 <translation id="8373553483208508744">Искључи звук картица</translation>
@@ -5010,7 +5011,7 @@
 <translation id="8666584013686199826">Питај када сајт жели да приступи USB уређајима</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> је сада у режиму целог екрана и онемогућио је курсор.</translation>
 <translation id="8669284339312441707">Топлије</translation>
-<translation id="8669919703154928649">Омогућите да вам Помоћник приказује обавештења</translation>
+<translation id="8669919703154928649">Дозволите Помоћнику да вам приказује обавештења</translation>
 <translation id="8669949407341943408">Премештање...</translation>
 <translation id="8671210955687109937">Може да коментарише</translation>
 <translation id="8673026256276578048">Претражи Веб...</translation>
@@ -5020,7 +5021,6 @@
 <translation id="8677212948402625567">Скупи све...</translation>
 <translation id="8678648549315280022">Управљај подешавањима преузимања...</translation>
 <translation id="8678933587484842200">Како желите да се ова апликација покреће?</translation>
-<translation id="8679788109894721265">Ова страница користи више од <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Пријавите се да би вам обележивачи, историја, лозинке и друга подешавања били доступни на свим уређајима. Аутоматски ћете бити пријављени и на Google услуге.</translation>
 <translation id="8686213429977032554">Ова датотека са Диска се још увек не дели</translation>
 <translation id="8687485617085920635">Следећи прозор</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index a501c1d3..46dede4 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Synkronisering och anpassning</translation>
 <translation id="1398853756734560583">Maximera</translation>
 <translation id="1399511500114202393">Inget användarcertifikat</translation>
+<translation id="1401165786814632797">Få tillgång till assistenten när du säger ”Ok Google” och enheten är aktiv och olåst.</translation>
 <translation id="140250605646987970">Din mobil hittades, men Smart Lock fungerar bara för enheter med Android 5.0 och senare. &lt;a&gt;Läs mer&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (kontrollerad)</translation>
 <translation id="1405476660552109915">Vill du spara kontot för den här webbplatsen med <ph name="PASSWORD_MANAGER_BRAND" />?</translation>
@@ -1369,6 +1370,7 @@
 <translation id="3031557471081358569">Välj objekt att importera:</translation>
 <translation id="3031601332414921114">Återuppta utskriften</translation>
 <translation id="303198083543495566">Geografi</translation>
+<translation id="3033999583152214331">Kör verktyg, redigerare och IDE:er för Linux på Chromebook. &lt;a target="_blank" href="<ph name="URL" />"&gt;Läs mer&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Aktivera blixt</translation>
 <translation id="3037754279345160234">Det gick inte att analysera konfigurationen för domänanslutning. Kontakta administratören.</translation>
 <translation id="3038612606416062604">Lägg till en skrivare manuellt</translation>
@@ -1509,6 +1511,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> vill ansluta</translation>
 <translation id="3274763671541996799">Du har aktiverat helskärmsläget.</translation>
 <translation id="3275778913554317645">Öppna som fönster</translation>
+<translation id="3278877214895457897">När konfigureringen av Chromebook är klar kan du trycka på assistentknappen eller säga ”Ok Google” när som helst när du vill få hjälp av assistenten.</translation>
 <translation id="3279230909244266691">Detta kan ta några minuter. Den virtuella maskinen startas.</translation>
 <translation id="3279741024917655738">Visa videor i helskärmsläge på</translation>
 <translation id="3280237271814976245">Spara so&amp;m...</translation>
@@ -2165,7 +2168,6 @@
 <translation id="4275830172053184480">Starta om enheten</translation>
 <translation id="4278101229438943600">Assistenten är redo</translation>
 <translation id="4278390842282768270">Tillåtet</translation>
-<translation id="4280864916190672950">Avbryt inläsningen</translation>
 <translation id="4281844954008187215">Användarvillkor</translation>
 <translation id="4282196459431406533">Smart Lock är aktiverat</translation>
 <translation id="4284105660453474798">Vill du ta bort $1?</translation>
@@ -2603,6 +2605,7 @@
 <translation id="4992066212339426712">Slå på ljudet</translation>
 <translation id="4992458225095111526">Bekräfta återställning med Powerwash</translation>
 <translation id="4992473555164495036">Administratören har begränsat vilka inmatningsmetoder som är tillgängliga.</translation>
+<translation id="4992926179187649719">Aktivera ”Ok Google”</translation>
 <translation id="4994474651455208930">Tillåt att webbplatser begär att bli standardhanterare för protokoll</translation>
 <translation id="4994754230098574403">Konfigurerar</translation>
 <translation id="4996978546172906250">Dela via</translation>
@@ -3435,7 +3438,6 @@
 <translation id="6231881193380278751">Lägg till en frågeparameter i webbadressen för att automatiskt uppdatera sidan: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Batteri</translation>
 <translation id="6232116551750539448">Anslutningen till <ph name="NAME" /> har brutits</translation>
-<translation id="6235700927623181151">Ditt skrivbord delas på den här fliken.</translation>
 <translation id="6237816943013845465">Ger möjlighet att ändra skärmupplösningen</translation>
 <translation id="6238923052227198598">Behåll den senaste anteckningen på låsskärmen</translation>
 <translation id="6239558157302047471">Läs in &amp;ram igen</translation>
@@ -4532,6 +4534,7 @@
 <translation id="7908378463497120834">Minst en partition på den externa lagringsenheten kunde inte monteras.</translation>
 <translation id="7909969815743704077">Laddades ned i inkognitoläge</translation>
 <translation id="7910768399700579500">&amp;Ny mapp</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Lösenordet har ändrats på servern. Logga ut och logga sedan in igen.</translation>
 <translation id="7915471803647590281">Berätta för oss vad som händer innan du skickar feedback.</translation>
 <translation id="7916556741383518510">Vid klick</translation>
@@ -4816,7 +4819,6 @@
 <translation id="8366396658833131068">Nätverksanslutningen har återställts. Välj ett annat nätverk eller tryck på knappen Fortsätt om du vill starta kioskappen.</translation>
 <translation id="8366947248864804596">När mobilen är olåst och finns i närheten väljer du bara detta för att låsa upp enheten. I annat fall anger du lösenordet eller pinkoden.</translation>
 <translation id="8368859634510605990">&amp;Öppna alla bokmärken</translation>
-<translation id="8369547389711988632">Inläsningen har pausats</translation>
 <translation id="8371695176452482769">Prata nu</translation>
 <translation id="8372369524088641025">Felaktig WEP-nyckel</translation>
 <translation id="8373553483208508744">Stäng av ljud från flikar</translation>
@@ -5022,7 +5024,6 @@
 <translation id="8677212948402625567">Dölj alla...</translation>
 <translation id="8678648549315280022">Hantera inställningar för nedladdning ...</translation>
 <translation id="8678933587484842200">Hur vill du att det här programmet ska startas?</translation>
-<translation id="8679788109894721265">Den här sidan använder mer än <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Logga in om du vill få tillgång till samma bokmärken, historik, lösenord och andra inställningar på alla dina enheter. Dessutom blir du automatiskt inloggad på Googles tjänster.</translation>
 <translation id="8686213429977032554">Den här filen i Drive delas inte ännu</translation>
 <translation id="8687485617085920635">Nästa fönster</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 6fdee5a9..190067f 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Kusawazisha na kuweka mapendeleo</translation>
 <translation id="1398853756734560583">Tanua</translation>
 <translation id="1399511500114202393">Hakuna cheti cha mtumiaji</translation>
+<translation id="1401165786814632797">Fikia programu yako ya Mratibu wakati wowote unaposema "OK Google" ikiwa umewasha kifaa chako na hujakifunga.</translation>
 <translation id="140250605646987970">Simu yako imepatikana. Lakini Smart Lock inafanya kazi kwenye vifaa vyenye Android 5.0 na matoleo mapya zaidi pekee. &lt;a&gt;Pata maelezo zaidi&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (Mtumiaji anayesimamiwa)</translation>
 <translation id="1405476660552109915">Je, unataka <ph name="PASSWORD_MANAGER_BRAND" /> kuhifadhi akaunti yako kwa tovuti hii?</translation>
@@ -1366,6 +1367,7 @@
 <translation id="3031557471081358569">Chagua vitu vya kuleta:</translation>
 <translation id="3031601332414921114">Endelea kuchapisha</translation>
 <translation id="303198083543495566">Jiografia</translation>
+<translation id="3033999583152214331">Tumia zana za Linux, vihariri na IDE kwenye Chromebook yako. &lt;a target="_blank" href="<ph name="URL" />"&gt;Pata maelezo zaidi&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Washa Flash</translation>
 <translation id="3037754279345160234">Imeshindwa kuchanganua mipangilio ya kujiunga na kikoa. Tafadhali wasiliana na msimamizi wako.</translation>
 <translation id="3038612606416062604">Jiongezee printa</translation>
@@ -1506,6 +1508,7 @@
 <translation id="3271648667212143903"><ph name="ORIGIN" /> inataka kuunganisha</translation>
 <translation id="3274763671541996799">Umeamua kutumia skrini nzima.</translation>
 <translation id="3275778913554317645">Fungua kama dirisha</translation>
+<translation id="3278877214895457897">Wakati umeweka mipangilio ya Chromebook, bonyeza kitufe cha programu ya Mratibu au useme "OK Google" ili upate usaidizi kutoka kwa programu ya Mratibu wakati wowote.</translation>
 <translation id="3279230909244266691">Huenda mchakato ukachukua dakika kadhaa. Inaanzisha kompyuta iliyo mbali.</translation>
 <translation id="3279741024917655738">Onyesha video za skrini kamili kwenye</translation>
 <translation id="3280237271814976245">Hifadhi k&amp;ama...</translation>
@@ -2157,7 +2160,6 @@
 <translation id="4275830172053184480">Washa upya kifaa chako</translation>
 <translation id="4278101229438943600">Mratibu wako yuko tayari</translation>
 <translation id="4278390842282768270">Vilivyoruhusiwa</translation>
-<translation id="4280864916190672950">Acha kupakia</translation>
 <translation id="4281844954008187215">Sheria na Masharti</translation>
 <translation id="4282196459431406533">Smart Lock imewashwa</translation>
 <translation id="4284105660453474798">Je, una uhakika unataka kufuta "$1"?</translation>
@@ -2595,6 +2597,7 @@
 <translation id="4992066212339426712">Rejesha sauti</translation>
 <translation id="4992458225095111526">Thibitisha Powerwash</translation>
 <translation id="4992473555164495036">Msimamizi wako amedhibiti njia zilizopo za kuweka data.</translation>
+<translation id="4992926179187649719">Washa kipengele cha 'Ok Google'</translation>
 <translation id="4994474651455208930">Ruhusu tovuti kutuma ombi la kuwa vidhibiti chaguomsingi vya itifaki</translation>
 <translation id="4994754230098574403">Inaweka mipangilio</translation>
 <translation id="4996978546172906250">Shiriki kupitia</translation>
@@ -3427,7 +3430,6 @@
 <translation id="6231881193380278751">Ongeza hoja katika URL ili kuonyesha upya ukurasa kiotomatiki: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Betri</translation>
 <translation id="6232116551750539448">Muunganisho kwenye <ph name="NAME" /> umepotea</translation>
-<translation id="6235700927623181151">Kichupo hiki kinashiriki maudhui yako yaliyo kwenye eneokazi.</translation>
 <translation id="6237816943013845465">Hukuruhusu kurekebisha ubora wa skrini yako</translation>
 <translation id="6238923052227198598">Kiweke kidokezo cha hivi punde kwenye skrini iliyofungwa</translation>
 <translation id="6239558157302047471">Pakia fremu upya</translation>
@@ -4525,6 +4527,7 @@
 <translation id="7908378463497120834">Samahani, angalau sehemu moja kwenye kifaa chako cha hifadhi ya nje haingeweza kuangikwa.</translation>
 <translation id="7909969815743704077">Ilipakuliwa katika Hali Fiche</translation>
 <translation id="7910768399700579500">&amp;Folda jipya</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Nenosiri lako limebadilishwa kwenye seva. Tafadhali ondoka na uingie katika akaunti tena.</translation>
 <translation id="7915471803647590281">Tafadhali tuelezee kinachofanyika kabla ya kutuma mwitiko.</translation>
 <translation id="7916556741383518510">Unapobofya</translation>
@@ -4810,7 +4813,6 @@
 <translation id="8366396658833131068">Muunganisho wa mtandao wako umerejeshwa. Tafadhali chagua mtandao tofauti au bonyeza kitufe cha 'Endelea' hapo chini ili uzindue programu ya kioski.</translation>
 <translation id="8366947248864804596">Fungua kwa kuchagua tu iwapo simu yako imefunguliwa na ipo karibu. Vinginevyo, weka nenosiri lako au PIN.</translation>
 <translation id="8368859634510605990">&amp;Fungua alamisho zote</translation>
-<translation id="8369547389711988632">Imeacha kupakia</translation>
 <translation id="8371695176452482769">Ongea sasa</translation>
 <translation id="8372369524088641025">Kitufe kibovu cha WEP</translation>
 <translation id="8373553483208508744">Zima vichupo</translation>
@@ -5016,7 +5018,6 @@
 <translation id="8677212948402625567">Kunja zote...</translation>
 <translation id="8678648549315280022">Dhibiti mipangilio ya upakuaji...</translation>
 <translation id="8678933587484842200">Je, ungependa kuanzisha programu hii kwa njia gani?</translation>
-<translation id="8679788109894721265">Ukurasa huu hutumia zaidi ya MB <ph name="MEGABYTES" /></translation>
 <translation id="8680251145628383637">Ingia katika akaunti ili upate alamisho, historia, manenosiri, na mipangilio yako mingine kwenye vifaa vyako vyote. Pia utaingia katika huduma zako kwenye Google kiotomatiki.</translation>
 <translation id="8686213429977032554">Faili hii ya Hifadhi bado haijashirikiwa</translation>
 <translation id="8687485617085920635">Dirisha linalofuata</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 4855c51..a3e8ef6 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1371,6 +1371,7 @@
 <translation id="3031557471081358569">இறக்குமதிக்கு உருப்படிகளைத் தேர்ந்தெடு</translation>
 <translation id="3031601332414921114">அச்சிடுவதை மீண்டும் தொடங்கு</translation>
 <translation id="303198083543495566">புவியியல்</translation>
+<translation id="3033999583152214331">உங்கள் Chromebookகில் Linux கருவிகள், திருத்திகள், IDEகள் போன்றவற்றை இயக்கலாம். &lt;a target="_blank" href="<ph name="URL" />"&gt;மேலும் அறிக&lt;/a&gt;</translation>
 <translation id="3036546437875325427">ஃபிளாஷை இயக்கு</translation>
 <translation id="3037754279345160234">டொமைனில் இணைவதற்கு, உள்ளமைவைப் பாகுபடுத்த முடியவில்லை. உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation>
 <translation id="3038612606416062604">கைமுறையாகப் பிரிண்டரைச் சேர்</translation>
@@ -2166,7 +2167,6 @@
 <translation id="4275830172053184480">உங்கள் சாதனத்தை மீண்டும் தொடங்கவும்</translation>
 <translation id="4278101229438943600">உங்கள் அசிஸ்டண்ட் தயாராகிவிட்டது</translation>
 <translation id="4278390842282768270">அனுமதிக்கப்பட்டது</translation>
-<translation id="4280864916190672950">ஏற்றுவதை நிறுத்து</translation>
 <translation id="4281844954008187215">சேவை விதிமுறைகள்</translation>
 <translation id="4282196459431406533">Smart Lock இயக்கப்பட்டது</translation>
 <translation id="4284105660453474798">"$1" ஐ நிச்சயமாக நீக்க வேண்டுமா?</translation>
@@ -3437,7 +3437,6 @@
 <translation id="6231881193380278751">பக்கத்தைத் தானாகப் புதுப்பிக்க, URL இல் வினவல் அளவுருவைச் சேர்க்கவும்: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">பேட்டரி</translation>
 <translation id="6232116551750539448"><ph name="NAME" /> உடனான இணைப்பு துண்டிக்கப்பட்டது</translation>
-<translation id="6235700927623181151">இந்தத் தாவல் உங்கள் டெஸ்க்டாப் உள்ளடக்கத்தைப் பகிர்கிறது.</translation>
 <translation id="6237816943013845465">திரையின் தெளிவுத்திறனைச் சரிசெய்ய அனுமதிக்கும்</translation>
 <translation id="6238923052227198598">சமீபத்திய குறிப்பைப் லாக் ஸ்கிரீனில் வைத்திரு</translation>
 <translation id="6239558157302047471">&amp;ஃபிரேமை மீண்டும் ஏற்று</translation>
@@ -3757,7 +3756,7 @@
 <translation id="6710213216561001401">முந்தையது</translation>
 <translation id="6718273304615422081">ஜிப் செய்கிறது...</translation>
 <translation id="671928215901716392">திரையைப் பூட்டு</translation>
-<translation id="6720847671508630642">Androidன் சிறந்த அம்சங்களை உங்கள் Chromebookகுடன் தானாகப் பகிரலாம். உங்கள் ஃபோனை இணைத்தால், உங்கள் கம்ப்யூட்டரிலிருந்து உரைச் செய்தி அனுப்பலாம், ஃபோனின் இணைய இணைப்பைப் பகிரலாம், Chromebookகின் திரையைப் பூட்டுநீக்கலாம்.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation>
+<translation id="6720847671508630642">Androidன் சிறந்த அம்சங்களை உங்கள் Chromebookகுடன் தானாகப் பகிரலாம். உங்கள் ஃபோனை இணைத்தால், உங்கள் கம்ப்யூட்டரிலிருந்து மெசேஜ் அனுப்பலாம், ஃபோனின் இணைய இணைப்பைப் பகிரலாம், Chromebookகின் திரையைப் பூட்டுநீக்கலாம்.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">உங்கள் பாதுகாப்பு விசையின் உற்பத்தியாளர் மற்றும் மாடலைப் பார்க்க விரும்புகிறது</translation>
 <translation id="6721972322305477112">&amp;File</translation>
 <translation id="672213144943476270">விருந்தினராக உலாவும் முன், உங்கள் சுயவிவரத்தைத் திறக்கவும்.</translation>
@@ -4816,7 +4815,6 @@
 <translation id="8366396658833131068">உங்கள் நெட்வொர்க் இணைப்பு மீட்டெடுக்கப்பட்டது. உங்கள் kiosk பயன்பாட்டைத் தொடங்க, வேறு நெட்வொர்க்கைத் தேர்ந்தெடுக்கவும் அல்லது கீழேயுள்ள 'தொடரவும்' பொத்தானை அழுத்தவும்.</translation>
 <translation id="8366947248864804596">மொபைல் திறக்கப்பட்டு அருகில் இருக்கும் போது, Chromebook சாதனத்தைத் திறக்க, அதற்கான விருப்பத்தைத் தேர்ந்தெடுத்தால் போதும். இல்லை எனில், கடவுச்சொல் அல்லது பின்னை உள்ளிடவும்.</translation>
 <translation id="8368859634510605990">புக்மார்க்ஸ் அனைத்தையும் &amp;திற</translation>
-<translation id="8369547389711988632">ஏற்றுவது நிறுத்தப்பட்டது</translation>
 <translation id="8371695176452482769">இப்போது பேசுக</translation>
 <translation id="8372369524088641025">மோசமான WEP விசை</translation>
 <translation id="8373553483208508744">தாவல்களை முடக்கு</translation>
@@ -5022,7 +5020,6 @@
 <translation id="8677212948402625567">அனைத்தையும் சுருக்கு...</translation>
 <translation id="8678648549315280022">பதிவிறக்க அமைப்புகளை நிர்வகிக்கவும்...</translation>
 <translation id="8678933587484842200">இந்தப் பயன்பாட்டை எப்படித் துவக்க விரும்புகிறீர்கள்?</translation>
-<translation id="8679788109894721265">இந்தப் பக்கம் <ph name="MEGABYTES" />மெ.பை.க்கும் அதிகமான டேட்டாவைப் பயன்படுத்துகிறது</translation>
 <translation id="8680251145628383637">உள்நுழைந்து, உங்கள் சாதனங்கள் எல்லாவற்றிலும் உள்ள புத்தகக்குறிகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகளைப் பெறவும். உங்கள் Google சேவைகளிலும் தானாகவே உள்நுழைவீர்கள்.</translation>
 <translation id="8686213429977032554">இந்த இயக்ககக் கோப்பு இன்னும் பகிரப்படவில்லை</translation>
 <translation id="8687485617085920635">அடுத்த சாளரம்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 933df79..5c4da4cf 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -646,7 +646,7 @@
 <translation id="1938351510777341717">బాహ్య ఆదేశం</translation>
 <translation id="1940546824932169984">కనెక్ట్ చేయబడిన పరికరాలు</translation>
 <translation id="1942765061641586207">చిత్ర రిజల్యూషన్</translation>
-<translation id="1943097386230153518">కొత్త సేవలను ఇన్‌స్టాల్ చేయి</translation>
+<translation id="1943097386230153518">కొత్త సేవను ఇన్‌స్టాల్ చేయి</translation>
 <translation id="1944921356641260203">నవీకరణ కనుగొనబడింది</translation>
 <translation id="1951615167417147110">ఒక పేజీ పైకి స్క్రోల్ చెయ్యండి</translation>
 <translation id="1954813140452229842">షేర్‌ను మౌంట్ చేయడంలో ఎర్రర్ ఏర్పడింది. దయచేసి మీ ఆధారాలను సరిచూసుకుని, మళ్లీ ప్రయత్నించండి.</translation>
@@ -2166,7 +2166,6 @@
 <translation id="4275830172053184480">మీ పరికరాన్ని పునఃప్రారంభించండి</translation>
 <translation id="4278101229438943600">మీ అసిస్టెంట్ సిద్ధంగా ఉంది</translation>
 <translation id="4278390842282768270">అనుమతించబడింది</translation>
-<translation id="4280864916190672950">లోడ్ చేయడం ఆపివేయండి</translation>
 <translation id="4281844954008187215">సేవా నిబంధనలు</translation>
 <translation id="4282196459431406533">Smart Lock ఆన్‌లో ఉంది</translation>
 <translation id="4284105660453474798">మీరు "$1"ను ఖచ్చితంగా తొలగించాలనుకుంటున్నారా?</translation>
@@ -3436,7 +3435,6 @@
 <translation id="6231881193380278751">పేజీని స్వయంచాలకంగా రిఫ్రెష్ చేయడానికి URLలో ప్రశ్న పరామితిని జోడించండి: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">బ్యాటరీ</translation>
 <translation id="6232116551750539448"><ph name="NAME" />కి కనెక్షన్ కోల్పోయింది</translation>
-<translation id="6235700927623181151">ఈ ట్యాబ్ మీ డెస్క్‌టాప్‌ కంటెంట్‌ను షేర్ చేస్తోంది.</translation>
 <translation id="6237816943013845465">మీ స్క్రీన్ రిజల్యూషన్‌ను సర్దుబాటు చేయడానికి మిమ్మల్ని అనుమతిస్తుంది</translation>
 <translation id="6238923052227198598">లాక్ స్క్రీన్‌పై తాజా గమనికను ఉంచండి</translation>
 <translation id="6239558157302047471">&amp;ఫ్రేమ్ మళ్లీ లోడ్ చేయి</translation>
@@ -4814,7 +4812,6 @@
 <translation id="8366396658833131068">మీ నెట్‌వర్క్ కనెక్టివిటీ పునరుద్ధరించబడింది. దయచేసి వేరే నెట్‌వర్క్‌ను ఎంచుకోండి లేదా మీ కియోస్క్ అనువర్తనాన్ని ప్రారంభించడానికి క్రింది 'కొనసాగించు' బటన్ నొక్కండి.</translation>
 <translation id="8366947248864804596">మీ ఫోన్ అన్‌లాక్ చేసినప్పుడు మరియు సమీపంలో ఉన్నప్పుడు, అన్‌లాక్ చేయడానికి కేవలం ఎంచుకోండి. లేకుంటే, మీ పాస్‌వర్డ్‌ లేదా పిన్‌ను నమోదు చేయండి.</translation>
 <translation id="8368859634510605990">&amp;అన్ని బుక్‌మార్క్‌లను తెరువు</translation>
-<translation id="8369547389711988632">లోడ్ చేయడం ఆగిపోయింది</translation>
 <translation id="8371695176452482769">ఇప్పుడు మాట్లాడండి</translation>
 <translation id="8372369524088641025">తప్పుడు WEP కీ</translation>
 <translation id="8373553483208508744">ట్యాబ్‌లను మ్యూట్ చేయి</translation>
@@ -5020,7 +5017,6 @@
 <translation id="8677212948402625567">అన్నీ కుదించు...</translation>
 <translation id="8678648549315280022">డౌన్‌లోడ్ సెట్టింగ్‌లను నిర్వహించండి...</translation>
 <translation id="8678933587484842200">మీరు ఈ అప్లికేషన్‌ని ఎలా ప్రారంభించాలనుకుంటున్నారు?</translation>
-<translation id="8679788109894721265">ఈ పేజీ <ph name="MEGABYTES" />MB కంటే ఎక్కువ ఉపయోగిస్తోంది</translation>
 <translation id="8680251145628383637">మీ బుక్‌మార్క్‌లు, చరిత్ర, పాస్‌వర్డ్‌లు మరియు ఇతర సెట్టింగ్‌లను మీ అన్ని పరికరాల్లో పొందడానికి సైన్ ఇన్ చేయండి. మీరు మీ Google సేవలకు కూడా స్వయంచాలకంగా సైన్ ఇన్ చేయబడతారు.</translation>
 <translation id="8686213429977032554">ఈ డిస్క్ ఫైల్ ఇంకా భాగస్వామ్యం చేయబడలేదు</translation>
 <translation id="8687485617085920635">తర్వాతి విండో</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 255fe18..47cf333 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1604,7 +1604,7 @@
 <translation id="3428419049384081277">คุณลงชื่อเข้าใช้แล้ว</translation>
 <translation id="3429275422858276529">บุ๊กมาร์กหน้านี้เพื่อให้หาเจอง่ายในภายหลัง</translation>
 <translation id="3429599832623003132">$1 รายการ</translation>
-<translation id="3430342160185525240">ให้ Assistant แสดงการแจ้งเตือน</translation>
+<translation id="3430342160185525240">เปิดให้ Assistant แสดงการแจ้งเตือน</translation>
 <translation id="3432227430032737297">นำรายการที่แสดงทั้งหมดออก</translation>
 <translation id="3432757130254800023">ส่งภาพและเสียงไปยังจอแสดงผลบนเครือข่ายเฉพาะที่</translation>
 <translation id="3432762828853624962">คนทำงานที่แชร์</translation>
@@ -2166,7 +2166,6 @@
 <translation id="4275830172053184480">รีสตาร์ทอุปกรณ์ของคุณ</translation>
 <translation id="4278101229438943600">Assistant พร้อมใช้งานแล้ว</translation>
 <translation id="4278390842282768270">อนุญาตแล้ว</translation>
-<translation id="4280864916190672950">หยุดโหลด</translation>
 <translation id="4281844954008187215">ข้อกำหนดในการให้บริการ</translation>
 <translation id="4282196459431406533">Smart Lock เปิดอยู่</translation>
 <translation id="4284105660453474798">คุณแน่ใจหรือไม่ว่าต้องการลบ "$1"</translation>
@@ -3436,7 +3435,6 @@
 <translation id="6231881193380278751">เพิ่มพารามิเตอร์ข้อความค้นหาใน URL เพื่อรีเฟรชหน้าโดยอัตโนมัติ: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">แบตเตอรี่</translation>
 <translation id="6232116551750539448">ขาดการเชื่อมต่อกับ <ph name="NAME" /></translation>
-<translation id="6235700927623181151">แท็บนี้กำลังแชร์เนื้อหาบนเดสก์ท็อป</translation>
 <translation id="6237816943013845465">ให้คุณปรับเปลี่ยนความละเอียดของหน้าจอ</translation>
 <translation id="6238923052227198598">เก็บโน้ตล่าสุดไว้ในหน้าจอล็อก</translation>
 <translation id="6239558157302047471">โหลดเ&amp;ฟรมซ้ำ</translation>
@@ -4817,7 +4815,6 @@
 <translation id="8366396658833131068">กู้คืนการเชื่อมต่อเครือข่ายของคุณแล้ว โปรดเลือกเครือข่ายอื่นหรือกดปุ่ม "ดำเนินการต่อ" ที่ด้านล่างเพื่อเปิดแอปคีออสก์</translation>
 <translation id="8366947248864804596">เมื่อโทรศัพท์ปลดล็อกและอยู่ใกล้ๆ ให้เลือกโทรศัพท์เพื่อปลดล็อก มิฉะนั้นให้ป้อนรหัสผ่านหรือ PIN</translation>
 <translation id="8368859634510605990">&amp;เปิดบุ๊กมาร์กทั้งหมด</translation>
-<translation id="8369547389711988632">หยุดโหลดแล้ว</translation>
 <translation id="8371695176452482769">เชิญพูดเลย</translation>
 <translation id="8372369524088641025">คีย์ WEP ไม่ถูกต้อง</translation>
 <translation id="8373553483208508744">ปิดเสียงแท็บ</translation>
@@ -5023,7 +5020,6 @@
 <translation id="8677212948402625567">ยุบทั้งหมด...</translation>
 <translation id="8678648549315280022">จัดการการตั้งค่าการดาวน์โหลด...</translation>
 <translation id="8678933587484842200">คุณต้องการเปิดแอปพลิเคชันนี้ด้วยวิธีใด</translation>
-<translation id="8679788109894721265">หน้านี้ใช้อินเทอร์เน็ตมากกว่า <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">ลงชื่อเข้าใช้เพื่อดึงบุ๊กมาร์ก ประวัติ รหัสผ่าน และการตั้งค่าอื่นๆ บนอุปกรณ์ทุกเครื่องของคุณ ทั้งนี้ ระบบจะลงชื่อเข้าใช้บริการต่างๆ ของ Google ให้คุณโดยอัตโนมัติ</translation>
 <translation id="8686213429977032554">ยังไม่มีการแชร์ไฟล์ไดรฟ์นี้</translation>
 <translation id="8687485617085920635">หน้าต่างถัดไป</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 134e6bc..980e1d0 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -2166,7 +2166,6 @@
 <translation id="4275830172053184480">Cihazınızı yeniden başlatın</translation>
 <translation id="4278101229438943600">Asistanınız hazır</translation>
 <translation id="4278390842282768270">İzin verildi</translation>
-<translation id="4280864916190672950">Yüklemeyi durdur</translation>
 <translation id="4281844954008187215">Hizmet Şartları</translation>
 <translation id="4282196459431406533">Smart Lock açık</translation>
 <translation id="4284105660453474798">"$1" öğesini silmek istediğiniz emin misiniz?</translation>
@@ -3437,7 +3436,6 @@
 <translation id="6231881193380278751">Sayfayı otomatik yenilemek için URL'ye bir sorgu parametresi ekleyin: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Pil</translation>
 <translation id="6232116551750539448"><ph name="NAME" /> bağlantısı kaybedildi</translation>
-<translation id="6235700927623181151">Bu sekme masaüstü içeriğinizi paylaşıyor.</translation>
 <translation id="6237816943013845465">Ekran çözünürlüğünü ayarlamanıza olanak tanır</translation>
 <translation id="6238923052227198598">En son notu kilit ekranında tut</translation>
 <translation id="6239558157302047471">Ç&amp;erçeveyi yeniden yükle</translation>
@@ -4817,7 +4815,6 @@
 <translation id="8366396658833131068">Ağ bağlantınız geri yüklendi. Lütfen farklı bir ağ seçin veya kiosk uygulamanızı başlatmak için "Devam Et" düğmesine basın.</translation>
 <translation id="8366947248864804596">Telefonunuzun kilidi açık ve yakınınızdaysa kilidini açmak için seçmeniz yeterlidir. Aksi halde şifrenizi veya PIN'inizi girin.</translation>
 <translation id="8368859634510605990">&amp;Tüm yer işaretlerini aç</translation>
-<translation id="8369547389711988632">Yükleme durduruldu</translation>
 <translation id="8371695176452482769">Şimdi konuşun</translation>
 <translation id="8372369524088641025">Hatalı WEP anahtarı</translation>
 <translation id="8373553483208508744">Sekmelerin sesini kapat</translation>
@@ -5013,7 +5010,7 @@
 <translation id="8666584013686199826">Bir site USB cihazlarına erişmek istediğinde sor</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> artık tam ekran görüntüleniyor ve fare imlecinizi devre dışı bıraktı.</translation>
 <translation id="8669284339312441707">Daha Sıcak</translation>
-<translation id="8669919703154928649">Asistan'ın size bildirimleri göstermesine izin verin</translation>
+<translation id="8669919703154928649">Asistan'ın bildirim göstermesine izin verin</translation>
 <translation id="8669949407341943408">Taşınıyor...</translation>
 <translation id="8671210955687109937">Yorum yapabilir</translation>
 <translation id="8673026256276578048">Web’de ara...</translation>
@@ -5023,7 +5020,6 @@
 <translation id="8677212948402625567">Tümünü daralt...</translation>
 <translation id="8678648549315280022">İndirme ayarlarını yönet...</translation>
 <translation id="8678933587484842200">Bu uygulamanın nasıl başlatılmasını istersiniz?</translation>
-<translation id="8679788109894721265">Bu sayfa <ph name="MEGABYTES" /> MB'tan fazla veri kullanıyor</translation>
 <translation id="8680251145628383637">Tüm cihazlarınızdaki sekmeleri, geçmişi ve diğer ayarları almak için oturum açın. Google hizmetlerinizde de otomatik olarak oturum açarsınız.</translation>
 <translation id="8686213429977032554">Bu Drive dosyası henüz paylaşılmamış</translation>
 <translation id="8687485617085920635">Sonraki pencere</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 28eeb2bb..65d7ad9d 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -271,6 +271,7 @@
 <translation id="1397854323885047133">Синхронізація й персоналізація</translation>
 <translation id="1398853756734560583">Збільшити</translation>
 <translation id="1399511500114202393">Без сертифіката користувача</translation>
+<translation id="1401165786814632797">Відкривайте Асистент командою "Ok Google", коли пристрій активовано й розблоковано.</translation>
 <translation id="140250605646987970">Ваш телефон знайдено. Однак Smart Lock працює лише на пристроях з ОС Android 5.0 або новішої версії. &lt;a&gt;Докладніше&lt;/a&gt;</translation>
 <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (контрольований користувач)</translation>
 <translation id="1405476660552109915">Зберегти обліковий запис для цього сайту в <ph name="PASSWORD_MANAGER_BRAND" />?</translation>
@@ -1370,6 +1371,7 @@
 <translation id="3031557471081358569">Виберіть елементи для імпорту:</translation>
 <translation id="3031601332414921114">Відновити друк</translation>
 <translation id="303198083543495566">Координати</translation>
+<translation id="3033999583152214331">Користуйтесь інструментами, редакторами й ІСР Linux на Chromebook. &lt;a target="_blank" href="<ph name="URL" />"&gt;Докладніше&lt;/a&gt;</translation>
 <translation id="3036546437875325427">Увімкнути Flash</translation>
 <translation id="3037754279345160234">Неможливо виконати синтаксичний аналіз конфігурації приєднання домену. Зв’яжіться з адміністратором.</translation>
 <translation id="3038612606416062604">Додати принтер вручну</translation>
@@ -1510,6 +1512,7 @@
 <translation id="3271648667212143903">Сайт <ph name="ORIGIN" /> хоче підключитися</translation>
 <translation id="3274763671541996799">Ви перейшли в повноекранний режим.</translation>
 <translation id="3275778913554317645">Відкрити вікно</translation>
+<translation id="3278877214895457897">Налаштувавши Chromebook, натисніть кнопку Асистента або скажіть "Ok Google", щоб отримати допомогу від Асистента.</translation>
 <translation id="3279230909244266691">Це може тривати кілька хвилин. Запускається віртуальна машина.</translation>
 <translation id="3279741024917655738">Показувати відео на весь екран на</translation>
 <translation id="3280237271814976245">Зберегти &amp;як...</translation>
@@ -2166,7 +2169,6 @@
 <translation id="4275830172053184480">Перезапустіть пристрій</translation>
 <translation id="4278101229438943600">Ваш Асистент готовий</translation>
 <translation id="4278390842282768270">Дозволено</translation>
-<translation id="4280864916190672950">Зупинити завантаження</translation>
 <translation id="4281844954008187215">Умови використання</translation>
 <translation id="4282196459431406533">Smart Lock увімкнено</translation>
 <translation id="4284105660453474798">Дійсно видалити "$1"?</translation>
@@ -2604,6 +2606,7 @@
 <translation id="4992066212339426712">Увімкнути звук</translation>
 <translation id="4992458225095111526">Підтвердити Powerwash</translation>
 <translation id="4992473555164495036">Адміністратор обмежив доступні методи введення.</translation>
+<translation id="4992926179187649719">Увімкнути команду "Ok Google"</translation>
 <translation id="4994474651455208930">Дозволити сайтам запитувати встановлення обробників протоколів за умовчанням.</translation>
 <translation id="4994754230098574403">Налаштування</translation>
 <translation id="4996978546172906250">Надіслати через</translation>
@@ -3436,7 +3439,6 @@
 <translation id="6231881193380278751">Додайте в URL-адресу параметр запиту для автоматичного оновлення сторінки: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Акумулятор</translation>
 <translation id="6232116551750539448">З’єднання з мережею "<ph name="NAME" />" утрачено</translation>
-<translation id="6235700927623181151">Ця вкладка має доступ до вмісту на робочому столі.</translation>
 <translation id="6237816943013845465">Дає змогу налаштувати роздільну здатність екрана</translation>
 <translation id="6238923052227198598">Показувати останню нотатку на заблокованому екрані</translation>
 <translation id="6239558157302047471">Перезавантажити фрейм</translation>
@@ -4533,6 +4535,7 @@
 <translation id="7908378463497120834">На жаль, підключити принаймні один розділ пристрою зовнішньої пам’яті неможливо.</translation>
 <translation id="7909969815743704077">Завантажено в режимі анонімного перегляду</translation>
 <translation id="7910768399700579500">&amp;Нова папка</translation>
+<translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">Ваш пароль змінено на сервері. Вийдіть і знову ввійдіть в обліковий запис.</translation>
 <translation id="7915471803647590281">Перед тим як надіслати відгук, повідомте нас, що відбувається.</translation>
 <translation id="7916556741383518510">Після натискання</translation>
@@ -4817,7 +4820,6 @@
 <translation id="8366396658833131068">З’єднання з мережею відновлено. Виберіть іншу мережу або натисніть кнопку "Продовжити" нижче, щоб запустити додаток для терміналів.</translation>
 <translation id="8366947248864804596">Коли ваш телефон розблокований і розташований поблизу, просто виберіть "Розблокувати". В іншому випадку введіть пароль або PIN-код.</translation>
 <translation id="8368859634510605990">&amp;Відкрити всі закладки</translation>
-<translation id="8369547389711988632">Завантаження зупинено</translation>
 <translation id="8371695176452482769">Диктуйте</translation>
 <translation id="8372369524088641025">Поганий WEP-ключ</translation>
 <translation id="8373553483208508744">Вимкнути звук на вкладках</translation>
@@ -5023,7 +5025,6 @@
 <translation id="8677212948402625567">Згорнути все...</translation>
 <translation id="8678648549315280022">Керувати налаштуваннями завантаження…</translation>
 <translation id="8678933587484842200">Як запускати цей додаток?</translation>
-<translation id="8679788109894721265">Ця сторінка використовує понад <ph name="MEGABYTES" /> МБ</translation>
 <translation id="8680251145628383637">Увійдіть в обліковий запис, щоб мати доступ до закладок, історії, паролів та інших налаштувань на всіх своїх пристроях. Крім того, ви автоматично входитимете в служби Google.</translation>
 <translation id="8686213429977032554">Доступ до цього файлу Диска ще не надано</translation>
 <translation id="8687485617085920635">Наступне вікно</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 7a6922b..3fe04e1 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -2166,7 +2166,6 @@
 <translation id="4275830172053184480">Khởi động lại thiết bị của bạn</translation>
 <translation id="4278101229438943600">Trợ lý của bạn đã sẵn sàng</translation>
 <translation id="4278390842282768270">Được cho phép</translation>
-<translation id="4280864916190672950">Dừng tải</translation>
 <translation id="4281844954008187215">Điều khoản dịch vụ</translation>
 <translation id="4282196459431406533">Đã bật Smart Lock</translation>
 <translation id="4284105660453474798">Bạn có chắc bạn muốn xóa "$1" không?</translation>
@@ -3436,7 +3435,6 @@
 <translation id="6231881193380278751">Thêm thông số truy vấn trong URL để tự động làm mới trang: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">Pin</translation>
 <translation id="6232116551750539448">Đã mất kết nối với <ph name="NAME" /></translation>
-<translation id="6235700927623181151">Tab này đang chia sẻ nội dung trên màn hình.</translation>
 <translation id="6237816943013845465">Cho phép bạn điều chỉnh độ phân giải màn hình</translation>
 <translation id="6238923052227198598">Giữ ghi chú mới nhất trên màn hình khóa</translation>
 <translation id="6239558157302047471">Tải lại &amp;khung</translation>
@@ -4817,7 +4815,6 @@
 <translation id="8366396658833131068">Kết nối mạng của bạn đã được khôi phục. Hãy chọn mạng khác hoặc nhấn nút 'Tiếp tục' bên dưới để khởi chạy ứng dụng kiosk của bạn.</translation>
 <translation id="8366947248864804596">Khi điện thoại của bạn được mở khóa và ở gần, chỉ cần chọn để mở khóa. Nếu không, hãy nhập mật khẩu hoặc mã PIN.</translation>
 <translation id="8368859634510605990">&amp;Mở tất cả dấu trang</translation>
-<translation id="8369547389711988632">Đã dừng tải</translation>
 <translation id="8371695176452482769">Nói ngay bây giờ</translation>
 <translation id="8372369524088641025">Khóa WEP sai</translation>
 <translation id="8373553483208508744">Tắt tiếng tab</translation>
@@ -5023,7 +5020,6 @@
 <translation id="8677212948402625567">Thu gọn tất cả...</translation>
 <translation id="8678648549315280022">Quản lý cài đặt tải xuống...</translation>
 <translation id="8678933587484842200">Bạn muốn ứng dụng này khởi động như thế nào?</translation>
-<translation id="8679788109894721265">Trang này sử dụng trên <ph name="MEGABYTES" /> MB</translation>
 <translation id="8680251145628383637">Đăng nhập để nhận dấu trang, lịch sử, mật khẩu và cài đặt khác trên tất cả thiết bị của bạn. Bạn cũng sẽ tự động được đăng nhập vào các dịch vụ Google của mình.</translation>
 <translation id="8686213429977032554">Tệp Drive này chưa được chia sẻ</translation>
 <translation id="8687485617085920635">Cửa sổ tiếp theo</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 7a84bf6..8cf9093 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1366,6 +1366,7 @@
 <translation id="3031557471081358569">选择要导入的内容:</translation>
 <translation id="3031601332414921114">继续打印</translation>
 <translation id="303198083543495566">地理位置</translation>
+<translation id="3033999583152214331">在 Chromebook 上运行 Linux 工具、编辑器和 IDE。&lt;a target="_blank" href="<ph name="URL" />"&gt;了解详情&lt;/a&gt;</translation>
 <translation id="3036546437875325427">启用 Flash</translation>
 <translation id="3037754279345160234">无法对加入网域的配置进行解析,请与您的管理员联系。</translation>
 <translation id="3038612606416062604">手动添加打印机</translation>
@@ -2159,7 +2160,6 @@
 <translation id="4275830172053184480">重启您的设备</translation>
 <translation id="4278101229438943600">Google 助理已准备就绪</translation>
 <translation id="4278390842282768270">允许</translation>
-<translation id="4280864916190672950">停止加载</translation>
 <translation id="4281844954008187215">服务条款</translation>
 <translation id="4282196459431406533">Smart Lock 已开启</translation>
 <translation id="4284105660453474798">您确定要删除“$1”吗?</translation>
@@ -3423,7 +3423,6 @@
 <translation id="6231881193380278751">在网址中添加查询参数可自动刷新相应网页:chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">电池</translation>
 <translation id="6232116551750539448">与“<ph name="NAME" />”的连接已中断</translation>
-<translation id="6235700927623181151">此标签页正在分享您的桌面内容。</translation>
 <translation id="6237816943013845465">可让您调整屏幕分辨率</translation>
 <translation id="6238923052227198598">始终将最新记事显示在锁定屏幕上</translation>
 <translation id="6239558157302047471">重新加载框架(&amp;F)</translation>
@@ -4801,7 +4800,6 @@
 <translation id="8366396658833131068">您的网络连接已恢复。要启动自助服务终端应用,请选择其他网络或按下方的“继续”按钮。</translation>
 <translation id="8366947248864804596">如果您的手机就在附近且未被锁定,您只需选择它即可解锁此设备。否则,您将需要输入密码或 PIN 码才能为其解锁。</translation>
 <translation id="8368859634510605990">打开所有书签(&amp;O)</translation>
-<translation id="8369547389711988632">已停止加载</translation>
 <translation id="8371695176452482769">请开始说话</translation>
 <translation id="8372369524088641025">WEP 密钥错误</translation>
 <translation id="8373553483208508744">将所有标签页静音</translation>
@@ -5007,7 +5005,6 @@
 <translation id="8677212948402625567">全部收起...</translation>
 <translation id="8678648549315280022">管理下载设置…</translation>
 <translation id="8678933587484842200">您希望通过何种方式启动此应用?</translation>
-<translation id="8679788109894721265">此网页所耗用的流量已超过 <ph name="MEGABYTES" />MB</translation>
 <translation id="8680251145628383637">登录后即可在您的任何设备上获取自己的书签、历史记录、密码和其他设置。此外,您还会自动登录到 Google 服务。</translation>
 <translation id="8686213429977032554">此云端硬盘文件尚未共享</translation>
 <translation id="8687485617085920635">下一个窗口</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 6340bcf..4d42e178 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -2165,7 +2165,6 @@
 <translation id="4275830172053184480">重新啟動裝置</translation>
 <translation id="4278101229438943600">你的 Google 助理已準備就緒</translation>
 <translation id="4278390842282768270">允許</translation>
-<translation id="4280864916190672950">停止載入</translation>
 <translation id="4281844954008187215">服務條款</translation>
 <translation id="4282196459431406533">Smart Lock 已啟用</translation>
 <translation id="4284105660453474798">你確定要刪除「$1」嗎?</translation>
@@ -3434,7 +3433,6 @@
 <translation id="6231881193380278751">在網址中加入查詢間距的參數,設定自動重新整理網頁的時間:chrome://device-log/?refresh=&lt;秒數&gt;</translation>
 <translation id="6232017090690406397">電池</translation>
 <translation id="6232116551750539448">「<ph name="NAME" />」的連線已中斷</translation>
-<translation id="6235700927623181151">這個分頁正在分享你的桌面內容。</translation>
 <translation id="6237816943013845465">讓你調整螢幕解析度</translation>
 <translation id="6238923052227198598">在鎖定畫面上顯示最新記事</translation>
 <translation id="6239558157302047471">重新載入頁框(&amp;F)</translation>
@@ -4813,7 +4811,6 @@
 <translation id="8366396658833131068">你的網路連線已恢復。請選取其他網路,或按底下的 [繼續] 按鈕啟動 Kiosk 應用程式。</translation>
 <translation id="8366947248864804596">當你的手機在適當距離範圍內並已解鎖時,直接選取即可為裝置解鎖。否則,請輸入你的密碼或 PIN 碼。</translation>
 <translation id="8368859634510605990">開啟所有書籤(&amp;O)</translation>
-<translation id="8369547389711988632">已停止載入</translation>
 <translation id="8371695176452482769">請說話</translation>
 <translation id="8372369524088641025">WEP 金鑰有誤</translation>
 <translation id="8373553483208508744">關閉多個分頁音訊</translation>
@@ -5019,7 +5016,6 @@
 <translation id="8677212948402625567">全部收合...</translation>
 <translation id="8678648549315280022">管理下載設定...</translation>
 <translation id="8678933587484842200">你希望如何啟動這個應用程式?</translation>
-<translation id="8679788109894721265">這個網頁的數據用量超過 <ph name="MEGABYTES" />MB</translation>
 <translation id="8680251145628383637">只要登入帳戶,您在任何裝置上都能取得自己的書籤、歷史記錄和密碼,並套用相同的設定。此外,系統還會自動讓您登入各項 Google 服務。</translation>
 <translation id="8686213429977032554">這個雲端硬碟檔案尚未與你共用</translation>
 <translation id="8687485617085920635">下一個視窗</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb
index ecadd64..e7d9740 100644
--- a/chrome/app/resources/google_chrome_strings_hr.xtb
+++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -251,7 +251,7 @@
 <translation id="8179874765710681175">Instalirajte Chrome na telefon. Poslat ćemo vam SMS na telefon.</translation>
 <translation id="8183957050892517584">Chrome će pohraniti vaše osobne podatke na siguran način tako da ih ne morate ponovo upisivati.</translation>
 <translation id="8226081633851087288">{0,plural, =0{OS Chrome sada će se ponovo pokrenuti}=1{OS Chrome ponovo će se pokrenuti za 1 sekundu}one{OS Chrome ponovo će se pokrenuti za # sekundu}few{OS Chrome ponovo će se pokrenuti za # sekunde}other{OS Chrome ponovo će se pokrenuti za # sekundi}}</translation>
-<translation id="825412236959742607">Ova stranica upotrebljava previše memorije, pa je Chrome uklonio neki sadržaj.</translation>
+<translation id="825412236959742607">Ova stranica upotrebljava previše memorije, pa je Chrome uklonio dio sadržaja.</translation>
 <translation id="8255190535488645436">Google Chrome upotrebljava vašu kameru i mikrofon.</translation>
 <translation id="8286862437124483331">Google Chrome pokušava prikazati zaporke. Upišite svoju zaporku za Windows da biste to dopustili.</translation>
 <translation id="8290100596633877290">Opa! Google Chrome je pao. Ponovo pokrenuti sada?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb
index 2bb8e9f3..ccc85af 100644
--- a/chrome/app/resources/google_chrome_strings_no.xtb
+++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -154,7 +154,7 @@
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5028489144783860647">Google Chrome kunne ikke synkronisere dataene dine. Oppdater passordfrasen for synkronisering.</translation>
 <translation id="5062123544085870375">Start Chrome OS på nytt</translation>
-<translation id="5090044601776247154">Overvåkede brukerprofiler vil ikke lengre være tilgjengelig fra og med Google Chrome 70.</translation>
+<translation id="5090044601776247154">Administrerte brukerprofiler kommer ikke lenger til å være tilgjengelige fra og med Google Chrome 70.</translation>
 <translation id="5132929315877954718">Oppdag flotte apper, spill, utvidelser og temaer for Google Chrome.</translation>
 <translation id="5166975452760862670">Google Chrome vises på dette språket</translation>
 <translation id="5170938038195470297">Profilen din kan ikke brukes fordi den er fra en nyere versjon av Google Chrome. Enkelte funksjoner kan være utilgjengelige. Angi en annen profilkatalog, eller bruk en nyere versjon av Chrome.</translation>
@@ -165,7 +165,7 @@
 <translation id="5386244825306882791">Den styrer også hvilken side som vises når du starter Chrome eller søker fra multifunksjonsfeltet.</translation>
 <translation id="5430073640787465221">Innstillingsfilen er skadet eller ugyldig. Google Chrome kan ikke gjenopprette innstillingene dine.</translation>
 <translation id="5483595757826856374">{0,plural, =0{Chrome starter på nytt nå}=1{Chrome starter på nytt om 1 sekund}other{Chrome starter på nytt om # sekunder}}</translation>
-<translation id="5514308096618405748">Chrome OS muliggjøres av <ph name="BEGIN_LINK_CROS_OSS" />tilleggsprogramvare med åpen kildekode<ph name="END_LINK_CROS_OSS" />, som Linux(Beta).</translation>
+<translation id="5514308096618405748">Chrome OS er basert på <ph name="BEGIN_LINK_CROS_OSS" />tilleggsprogramvare med åpen kildekode<ph name="END_LINK_CROS_OSS" />, i likhet med Linux (beta).</translation>
 <translation id="556024056938947818">Google Chrome prøver å vise passord.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-Inn)</translation>
 <translation id="565744775970812598"><ph name="FILE_NAME" /> kan være farlig, så Chrome har blokkert den.</translation>
@@ -221,7 +221,7 @@
 <translation id="7419046106786626209">Chrome OS kunne ikke synkronisere dataene dine fordi synkronisering ikke er tilgjengelig for domenet ditt.</translation>
 <translation id="7459554271817304652">Konfigurer Synkronisering til å lagre de personlig tilpassede nettleserfunksjonene dine på nettet slik at du kan bruke dem fra Google Chrome på enhver datamaskin.</translation>
 <translation id="7473136999113284234">Chrome oppdateres automatisk, sånn at du alltid har den nyeste versjonen.</translation>
-<translation id="7486227612705979895">Chrome får tilgang til disken din for å kunne gi deg forslag i adressefeltet</translation>
+<translation id="7486227612705979895">Chrome får tilgang til Disk-lagringen din for å kunne gi deg forslag i adressefeltet</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
 <translation id="7552219221109926349">Vis Chrome OS på dette språket</translation>
 <translation id="7561940363513215021">{0,plural, =1{Chrome starter på nytt om 1 minutt}other{Chrome starter på nytt om # minutter}}</translation>
@@ -246,12 +246,12 @@
 <translation id="8008534537613507642">Installer Chrome på nytt</translation>
 <translation id="8030318113982266900">Oppdaterer enheten din til <ph name="CHANNEL_NAME" />-kanalen ...</translation>
 <translation id="8032142183999901390">Når du har fjernet kontoen din fra Chrome, kan det hende at du må laste inn de åpne fanene på nytt før endringene trer i kraft.</translation>
-<translation id="8077352834923175128">Administratoren din ber deg om å starte Chrome OS på nytt for at denne oppdateringen skal tas i bruk</translation>
+<translation id="8077352834923175128">Administratoren din ber deg om å starte Chrome OS på nytt for å ta i bruk denne oppdateringen</translation>
 <translation id="8129812357326543296">Om &amp;Google Chrome</translation>
 <translation id="8179874765710681175">Installer Chrome på telefonen din. Vi sender deg en SMS.</translation>
 <translation id="8183957050892517584">Chrome lagrer personopplysningene dine sikkert, slik at du slipper å skrive dem inn på nytt.</translation>
-<translation id="8226081633851087288">{0,plural, =0{Chrome OS starter nå på nytt}=1{Chrome OS starter på nytt om 1 sekund}other{Chrome OS starter på nytt om # sekunder}}</translation>
-<translation id="825412236959742607">Denne siden bruker for mye minne, så har Chrome fjernet noe av innholdet.</translation>
+<translation id="8226081633851087288">{0,plural, =0{Chrome OS starter på nytt nå}=1{Chrome OS starter på nytt om 1 sekund}other{Chrome OS starter på nytt om # sekunder}}</translation>
+<translation id="825412236959742607">Denne siden bruker for mye minne, så Chrome har fjernet noe av innholdet.</translation>
 <translation id="8255190535488645436">Google Chrome bruker kameraet og mikrofonen din.</translation>
 <translation id="8286862437124483331">Google Chrome forsøker å vise passord. Skriv inn Windows-passordet ditt for å tillate dette.</translation>
 <translation id="8290100596633877290">Google Chrome har fått et programstopp. Vil du starte på nytt nå?</translation>
@@ -274,7 +274,7 @@
 <translation id="870251953148363156">Oppdater &amp;Google Chrome</translation>
 <translation id="873133009373065397">Google Chrome kan ikke fastslå eller angi standardnettleseren</translation>
 <translation id="8736674169840206667">Administratoren din krever at du starter Chrome på nytt for at en oppdatering skal tas i bruk</translation>
-<translation id="8791470158600044404">{0,plural, =1{Chrome OS startr på nytt om 1 minutt}other{Chrome OS starter på nytt om # minutter}}</translation>
+<translation id="8791470158600044404">{0,plural, =1{Chrome OS starter på nytt om 1 minutt}other{Chrome OS starter på nytt om # minutter}}</translation>
 <translation id="8796108026289707191">Du bør starte Google Chrome på nytt nå.</translation>
 <translation id="8823341990149967727">Chrome er utdatert</translation>
 <translation id="884296878221830158">Den styrer også hvilken side som vises når du starter Chrome eller klikker på Startside-knappen.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb
index f2daf71..e1f3424c 100644
--- a/chrome/app/resources/google_chrome_strings_sk.xtb
+++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -246,7 +246,7 @@
 <translation id="7888186132678118370">Pripnutie Chromu na paneli úloh</translation>
 <translation id="7890208801193284374">Ak počítač zdieľate s rodinou a priateľmi, môžu v prehliadači Chrome prehliadať oddelene a tiež si ho nastaviť podľa vlastných požiadaviek.</translation>
 <translation id="7896673875602241923">Do Chromu sa už na tomto počítači niekto prihlásil pomocou účtu <ph name="ACCOUNT_EMAIL_LAST" />. Ak chcete ponechať svoje informácie oddelené, vytvorte v Chrome nového používateľa.</translation>
-<translation id="7908168227788431038">Aktualizácia je takmer hotová! Dokončite ju reštartovaním prehliadača Google Chrome.</translation>
+<translation id="7908168227788431038">Aktualizácia je takmer hotová! Dokončíte ju novým spustením Chromu.</translation>
 <translation id="7962410387636238736">Tento počítač už nebude dostávať aktualizácie prehliadača Google Chrome, pretože systémy Windows XP a Windows Vista už nie sú podporované</translation>
 <translation id="8005540215158006229">Prehliadač Chrome je takmer pripravený.</translation>
 <translation id="8008534537613507642">Preinštalovať prehliadač Chrome</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index 7a6aedc..50d8330 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -2954,7 +2954,7 @@
     Block
   </message>
   <message name="IDS_SETTINGS_SITE_SETTINGS_BLOCK_SOUND" desc="Label for add muted sites in site settings.">
-    Muted
+    Mute
   </message>
   <message name="IDS_SETTINGS_SITE_SETTINGS_SESSION_ONLY" desc="Label for sites in site settings allowing cookies for the current session only.">
     Clear on exit
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 995dff3..aa3449df 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -693,6 +693,8 @@
     "media/webrtc/desktop_media_list_base.h",
     "media/webrtc/desktop_media_picker.cc",
     "media/webrtc/desktop_media_picker.h",
+    "media/webrtc/desktop_media_picker_factory.cc",
+    "media/webrtc/desktop_media_picker_factory.h",
     "media/webrtc/media_capture_devices_dispatcher.cc",
     "media/webrtc/media_capture_devices_dispatcher.h",
     "media/webrtc/media_stream_capture_indicator.cc",
@@ -1577,12 +1579,12 @@
     "usb/usb_tab_helper.h",
     "usb/web_usb_chooser_service.cc",
     "usb/web_usb_chooser_service.h",
-    "usb/web_usb_device_manager.cc",
-    "usb/web_usb_device_manager.h",
     "usb/web_usb_histograms.cc",
     "usb/web_usb_histograms.h",
     "usb/web_usb_permission_provider.cc",
     "usb/web_usb_permission_provider.h",
+    "usb/web_usb_service_impl.cc",
+    "usb/web_usb_service_impl.h",
     "vr/ui_suppressed_element.h",
     "vr/vr_tab_helper.cc",
     "vr/vr_tab_helper.h",
@@ -2264,6 +2266,7 @@
       "android/signin/signin_manager_android.h",
       "android/signin/signin_promo_util_android.cc",
       "android/signin/signin_promo_util_android.h",
+      "android/signin/unified_consent_service_bridge.cc",
       "android/subresource_filter/test_subresource_filter_publisher.cc",
       "android/tab_android.cc",
       "android/tab_android.h",
@@ -2587,6 +2590,8 @@
       "lifetime/termination_notification.h",
       "media/unified_autoplay_config.cc",
       "media/unified_autoplay_config.h",
+      "media/webrtc/desktop_media_picker_factory_impl.cc",
+      "media/webrtc/desktop_media_picker_factory_impl.h",
       "media/webrtc/tab_desktop_media_list.cc",
       "media/webrtc/tab_desktop_media_list.h",
       "media_galleries/chromeos/mtp_device_delegate_impl_chromeos.cc",
@@ -2937,9 +2942,9 @@
       "themes/theme_service_mac.mm",
       "themes/theme_syncable_service.cc",
       "themes/theme_syncable_service.h",
-      "upgrade_detector.cc",
-      "upgrade_detector.h",
-      "upgrade_observer.h",
+      "upgrade_detector/upgrade_detector.cc",
+      "upgrade_detector/upgrade_detector.h",
+      "upgrade_detector/upgrade_observer.h",
       "usb/web_usb_chooser_service_desktop.cc",
       "usb/web_usb_chooser_service_desktop.h",
       "usb/web_usb_detector.cc",
@@ -3036,6 +3041,8 @@
       "task_manager/providers/arc/arc_process_task.h",
       "task_manager/providers/arc/arc_process_task_provider.cc",
       "task_manager/providers/arc/arc_process_task_provider.h",
+      "upgrade_detector/upgrade_detector_chromeos.cc",
+      "upgrade_detector/upgrade_detector_chromeos.h",
     ]
     deps += [
       "//ash",
@@ -3356,8 +3363,8 @@
       "signin/signin_global_error.h",
       "signin/signin_global_error_factory.cc",
       "signin/signin_global_error_factory.h",
-      "upgrade_detector_impl.cc",
-      "upgrade_detector_impl.h",
+      "upgrade_detector/upgrade_detector_impl.cc",
+      "upgrade_detector/upgrade_detector_impl.h",
     ]
   } else {
     sources += [
@@ -4593,6 +4600,7 @@
       "../android/java/src/org/chromium/chrome/browser/signin/SigninInvestigator.java",
       "../android/java/src/org/chromium/chrome/browser/signin/SigninManager.java",
       "../android/java/src/org/chromium/chrome/browser/signin/SigninPromoUtil.java",
+      "../android/java/src/org/chromium/chrome/browser/signin/UnifiedConsentServiceBridge.java",
       "../android/java/src/org/chromium/chrome/browser/snackbar/smartlockautosignin/AutoSigninSnackbarController.java",
       "../android/java/src/org/chromium/chrome/browser/ssl/CaptivePortalHelper.java",
       "../android/java/src/org/chromium/chrome/browser/ssl/SecurityStateModel.java",
@@ -4838,6 +4846,8 @@
     "history/history_test_utils.h",
     "media/webrtc/fake_desktop_media_list.cc",
     "media/webrtc/fake_desktop_media_list.h",
+    "media/webrtc/fake_desktop_media_picker_factory.cc",
+    "media/webrtc/fake_desktop_media_picker_factory.h",
     "net/dns_probe_test_util.cc",
     "net/dns_probe_test_util.h",
     "net/url_request_mock_util.cc",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index 05207e8..0a7fb31 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -198,7 +198,8 @@
   # Ozone does not run in process. If the linux build transitions to Ozone then
   # we likely need to make these restrictions applicable only to ChromeOS files.
   "-ui/events/ozone",
-  "-ui/ozone",
+  "-ui/ozone/",
+  "+ui/ozone/public/ozone_platform.h",
   "+ui/ozone/public/ozone_switches.h",
   # ui/events/devices is tied with ozone, which is controlled by mus, and
   # shouldn't be used by Chrome directly.
diff --git a/chrome/browser/android/signin/unified_consent_service_bridge.cc b/chrome/browser/android/signin/unified_consent_service_bridge.cc
new file mode 100644
index 0000000..1a57750
--- /dev/null
+++ b/chrome/browser/android/signin/unified_consent_service_bridge.cc
@@ -0,0 +1,21 @@
+// 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 "base/android/jni_android.h"
+#include "chrome/browser/profiles/profile_android.h"
+#include "chrome/browser/unified_consent/unified_consent_service_factory.h"
+#include "components/unified_consent/unified_consent_service.h"
+#include "jni/UnifiedConsentServiceBridge_jni.h"
+
+using base::android::JavaParamRef;
+
+static jboolean JNI_UnifiedConsentServiceBridge_ShouldShowConsentBump(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jclass>& jcaller,
+    const base::android::JavaParamRef<jobject>& profileAndroid) {
+  Profile* profile = ProfileAndroid::FromProfileAndroid(profileAndroid);
+  auto* unifiedConsentService =
+      UnifiedConsentServiceFactory::GetForProfile(profile);
+  return unifiedConsentService->ShouldShowConsentBump();
+}
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
index ddb62c85..ae54f4b 100644
--- a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
+++ b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
@@ -423,6 +423,7 @@
 }
 
 void BackgroundFetchDelegateImpl::OpenItem(
+    offline_items_collection::LaunchLocation location,
     const offline_items_collection::ContentId& id) {
   if (client())
     client()->OnUIActivated(id.id);
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_impl.h b/chrome/browser/background_fetch/background_fetch_delegate_impl.h
index e2b351c..97a787b48 100644
--- a/chrome/browser/background_fetch/background_fetch_delegate_impl.h
+++ b/chrome/browser/background_fetch/background_fetch_delegate_impl.h
@@ -78,7 +78,8 @@
                            uint64_t size);
 
   // OfflineContentProvider implementation:
-  void OpenItem(const offline_items_collection::ContentId& id) override;
+  void OpenItem(offline_items_collection::LaunchLocation location,
+                const offline_items_collection::ContentId& id) override;
   void RemoveItem(const offline_items_collection::ContentId& id) override;
   void CancelDownload(const offline_items_collection::ContentId& id) override;
   void PauseDownload(const offline_items_collection::ContentId& id) override;
diff --git a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
index b66a3aa..254a53d4 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
@@ -240,15 +240,16 @@
 
 class BrowsingDataRemoverBrowserTest : public InProcessBrowserTest {
  public:
-  BrowsingDataRemoverBrowserTest() {}
-
-  void SetUpOnMainThread() override {
+  BrowsingDataRemoverBrowserTest() {
     feature_list_.InitWithFeatures(
         {browsing_data::features::kRemoveNavigationHistory,
          // Ensure that MojoSessionStorage is enabled because the old
          // SessionStorage implementation causes flaky tests.
          features::kMojoSessionStorage},
         {});
+  }
+
+  void SetUpOnMainThread() override {
     base::FilePath path;
     base::PathService::Get(content::DIR_TEST_DATA, &path);
     host_resolver()->AddRule(kExampleHost, "127.0.0.1");
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index f34402e..429f6ef 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -250,7 +250,6 @@
 #include "content/public/common/url_utils.h"
 #include "content/public/common/web_preferences.h"
 #include "device/usb/public/mojom/chooser_service.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
 #include "device/vr/buildflags/buildflags.h"
 #include "extensions/buildflags/buildflags.h"
 #include "google_apis/gaia/gaia_urls.h"
@@ -4516,9 +4515,9 @@
 #endif
 }
 
-void ChromeContentBrowserClient::CreateUsbDeviceManager(
+void ChromeContentBrowserClient::CreateWebUsbService(
     content::RenderFrameHost* render_frame_host,
-    device::mojom::UsbDeviceManagerRequest request) {
+    mojo::InterfaceRequest<blink::mojom::WebUsbService> request) {
   if (!base::FeatureList::IsEnabled(features::kWebUsb))
     return;
 
@@ -4539,7 +4538,7 @@
 
   UsbTabHelper* tab_helper =
       UsbTabHelper::GetOrCreateForWebContents(web_contents);
-  tab_helper->CreateDeviceManager(render_frame_host, std::move(request));
+  tab_helper->CreateWebUsbService(render_frame_host, std::move(request));
 }
 
 void ChromeContentBrowserClient::CreateUsbChooserService(
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index 9aa0e926..6aebbe0 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -38,6 +38,7 @@
 namespace blink {
 namespace mojom {
 class WindowFeatures;
+class WebUsbService;
 }
 }
 
@@ -449,9 +450,9 @@
       content::NavigationUIData* navigation_ui_data) override;
   bool ShouldForceDownloadResource(const GURL& url,
                                    const std::string& mime_type) override;
-  void CreateUsbDeviceManager(
+  void CreateWebUsbService(
       content::RenderFrameHost* render_frame_host,
-      device::mojom::UsbDeviceManagerRequest request) override;
+      mojo::InterfaceRequest<blink::mojom::WebUsbService> request) override;
   void CreateUsbChooserService(
       content::RenderFrameHost* render_frame_host,
       device::mojom::UsbChooserServiceRequest request) override;
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index db60e48..ed9a451 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -264,6 +264,8 @@
     "accessibility/spoken_feedback_event_rewriter_delegate.h",
     "accessibility/switch_access_event_handler.cc",
     "accessibility/switch_access_event_handler.h",
+    "account_mapper_util.cc",
+    "account_mapper_util.h",
     "app_mode/app_launch_utils.cc",
     "app_mode/app_launch_utils.h",
     "app_mode/app_session.cc",
@@ -1013,6 +1015,8 @@
     "login/lock/webui_screen_locker.h",
     "login/lock_screen_utils.cc",
     "login/lock_screen_utils.h",
+    "login/login_auth_recorder.cc",
+    "login/login_auth_recorder.h",
     "login/login_wizard.h",
     "login/mojo_version_info_dispatcher.cc",
     "login/mojo_version_info_dispatcher.h",
@@ -1751,8 +1755,6 @@
     "ui/request_pin_view.h",
     "ui/screen_capture_notification_ui_chromeos.cc",
     "ui/screen_capture_notification_ui_chromeos.h",
-    "upgrade_detector_chromeos.cc",
-    "upgrade_detector_chromeos.h",
     "virtual_machines/virtual_machines_util.cc",
     "virtual_machines/virtual_machines_util.h",
 
diff --git a/chrome/browser/chromeos/account_mapper_util.cc b/chrome/browser/chromeos/account_mapper_util.cc
new file mode 100644
index 0000000..69aa2e7
--- /dev/null
+++ b/chrome/browser/chromeos/account_mapper_util.cc
@@ -0,0 +1,45 @@
+// 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 "chrome/browser/chromeos/account_mapper_util.h"
+
+#include "components/signin/core/browser/account_tracker_service.h"
+
+namespace chromeos {
+
+AccountMapperUtil::AccountMapperUtil(
+    AccountTrackerService* account_tracker_service)
+    : account_tracker_service_(account_tracker_service) {}
+
+AccountMapperUtil::~AccountMapperUtil() = default;
+
+std::string AccountMapperUtil::AccountKeyToOAuthAccountId(
+    const AccountManager::AccountKey& account_key) const {
+  DCHECK(account_key.IsValid());
+
+  if (account_key.account_type !=
+      account_manager::AccountType::ACCOUNT_TYPE_GAIA) {
+    return std::string();
+  }
+
+  const std::string& account_id =
+      account_tracker_service_->FindAccountInfoByGaiaId(account_key.id)
+          .account_id;
+  DCHECK(!account_id.empty()) << "Can't find account id";
+  return account_id;
+}
+
+AccountManager::AccountKey AccountMapperUtil::OAuthAccountIdToAccountKey(
+    const std::string& account_id) const {
+  DCHECK(!account_id.empty());
+
+  const AccountInfo& account_info =
+      account_tracker_service_->GetAccountInfo(account_id);
+
+  DCHECK(!account_info.gaia.empty()) << "Can't find account info";
+  return AccountManager::AccountKey{
+      account_info.gaia, account_manager::AccountType::ACCOUNT_TYPE_GAIA};
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/account_mapper_util.h b/chrome/browser/chromeos/account_mapper_util.h
new file mode 100644
index 0000000..14e5b82
--- /dev/null
+++ b/chrome/browser/chromeos/account_mapper_util.h
@@ -0,0 +1,43 @@
+// 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 CHROME_BROWSER_CHROMEOS_ACCOUNT_MAPPER_UTIL_H_
+#define CHROME_BROWSER_CHROMEOS_ACCOUNT_MAPPER_UTIL_H_
+
+#include <string>
+
+#include "base/macros.h"
+#include "chromeos/account_manager/account_manager.h"
+
+class AccountTrackerService;
+
+namespace chromeos {
+
+class AccountMapperUtil {
+ public:
+  explicit AccountMapperUtil(AccountTrackerService* account_tracker_service);
+  ~AccountMapperUtil();
+
+  // A utility method to map an |account_key| to the account id used by the
+  // OAuth2TokenService chain (see |AccountInfo|). Returns an empty string for
+  // non-Gaia accounts.
+  std::string AccountKeyToOAuthAccountId(
+      const AccountManager::AccountKey& account_key) const;
+
+  // A utility method to map the |account_id| used by the OAuth2TokenService
+  // chain (see |AccountInfo|) to an |AccountManager::AccountKey|.
+  AccountManager::AccountKey OAuthAccountIdToAccountKey(
+      const std::string& account_id) const;
+
+ private:
+  // A non-owning pointer to |AccountTrackerService|, which itself is a
+  // |KeyedService|.
+  AccountTrackerService* const account_tracker_service_;
+
+  DISALLOW_COPY_AND_ASSIGN(AccountMapperUtil);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_ACCOUNT_MAPPER_UTIL_H_
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index c11f80a..319fbbb 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -93,7 +93,6 @@
 #include "chrome/browser/chromeos/system/input_device_settings.h"
 #include "chrome/browser/chromeos/system/user_removal_manager.h"
 #include "chrome/browser/chromeos/ui/low_disk_notification.h"
-#include "chrome/browser/chromeos/upgrade_detector_chromeos.h"
 #include "chrome/browser/component_updater/cros_component_installer_chromeos.h"
 #include "chrome/browser/defaults.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
@@ -102,6 +101,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/task_manager/task_manager_interface.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector_chromeos.h"
 #include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_features.h"
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
index 9d09a111..e58c2a3 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
@@ -459,7 +459,7 @@
   DISALLOW_COPY_AND_ASSIGN(DownloadsTestVolume);
 };
 
-// CrostiniTestVolume: local test volume for the "Linux Files" directory.
+// CrostiniTestVolume: local test volume for the "Linux files" directory.
 class CrostiniTestVolume : public LocalTestVolume {
  public:
   CrostiniTestVolume() : LocalTestVolume("Crostini") {}
diff --git a/chrome/browser/chromeos/file_manager/path_util.h b/chrome/browser/chromeos/file_manager/path_util.h
index 1b025f8..524fac5 100644
--- a/chrome/browser/chromeos/file_manager/path_util.h
+++ b/chrome/browser/chromeos/file_manager/path_util.h
@@ -46,13 +46,13 @@
 // The canonical mount point name for "Downloads" folder.
 std::string GetDownloadsMountPointName(Profile* profile);
 
-// The canonical mount point name for crostini "Linux Files" folder.
+// The canonical mount point name for crostini "Linux files" folder.
 std::string GetCrostiniMountPointName(Profile* profile);
 
-// The actual directory the crostini "Linux Files" folder is mounted.
+// The actual directory the crostini "Linux files" folder is mounted.
 base::FilePath GetCrostiniMountDirectory(Profile* profile);
 
-// The sshfs mount options for crostini "Linux Files" mount.
+// The sshfs mount options for crostini "Linux files" mount.
 std::vector<std::string> GetCrostiniMountOptions(
     const std::string& hostname,
     const std::string& host_private_key,
diff --git a/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc b/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
index 6d9b6ba..1200924 100644
--- a/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
+++ b/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
@@ -571,6 +571,7 @@
     SetFirstRunCompletedIfNeeded(app_->id());
 
     session_manager_->SetSessionState(session_manager::SessionState::LOCKED);
+    state_controller_->FlushTrayActionForTesting();
 
     if (app_manager_->state() != TestAppManager::State::kStarted) {
       ADD_FAILURE() << "Lock app manager Start not invoked.";
@@ -770,8 +771,8 @@
   EXPECT_EQ(TestAppManager::State::kNotInitialized, app_manager()->state());
   EXPECT_EQ(TrayActionState::kNotAvailable,
             state_controller()->GetLockScreenNoteState());
-  EXPECT_EQ(0u, observer()->observed_states().size());
   EXPECT_FALSE(lock_screen_profile_creator()->Initialized());
+  ExpectObservedStatesMatch(std::vector<TrayActionState>(), "No state change.");
 }
 
 TEST_F(LockScreenAppStateNoStylusInputTest,
@@ -787,7 +788,7 @@
   EXPECT_EQ(TestAppManager::State::kStopped, app_manager()->state());
   EXPECT_EQ(TrayActionState::kNotAvailable,
             state_controller()->GetLockScreenNoteState());
-  EXPECT_EQ(0u, observer()->observed_states().size());
+  ExpectObservedStatesMatch(std::vector<TrayActionState>(), "No state change.");
 
   // Enable stylus input.
   SetStylusEnabled();
@@ -812,7 +813,7 @@
   EXPECT_EQ(TestAppManager::State::kStopped, app_manager()->state());
   EXPECT_EQ(TrayActionState::kNotAvailable,
             state_controller()->GetLockScreenNoteState());
-  EXPECT_EQ(0u, observer()->observed_states().size());
+  ExpectObservedStatesMatch(std::vector<TrayActionState>(), "No state change.");
 
   // Given that the screen is locked, lock screen apps should become available.
   session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
@@ -837,8 +838,7 @@
   EXPECT_EQ(TrayActionState::kNotAvailable,
             state_controller()->GetLockScreenNoteState());
 
-  EXPECT_EQ(0u, observer()->observed_states().size());
-  EXPECT_EQ(0u, tray_action()->observed_states().size());
+  ExpectObservedStatesMatch(std::vector<TrayActionState>(), "No state change.");
 }
 
 TEST_F(LockScreenAppStateTest, SetPrimaryProfile) {
@@ -848,7 +848,7 @@
   EXPECT_EQ(TestAppManager::State::kStopped, app_manager()->state());
   EXPECT_EQ(TrayActionState::kNotAvailable,
             state_controller()->GetLockScreenNoteState());
-  EXPECT_EQ(0u, observer()->observed_states().size());
+  ExpectObservedStatesMatch(std::vector<TrayActionState>(), "No state change.");
 }
 
 TEST_F(LockScreenAppStateTest, SetPrimaryProfileWhenSessionLocked) {
@@ -1030,9 +1030,8 @@
 
   EXPECT_EQ(TrayActionState::kNotAvailable,
             state_controller()->GetLockScreenNoteState());
-  state_controller()->FlushTrayActionForTesting();
-  EXPECT_EQ(0u, observer()->observed_states().size());
-  EXPECT_EQ(0u, tray_action()->observed_states().size());
+  ExpectObservedStatesMatch(std::vector<TrayActionState>(),
+                            "No state change on session unlock.");
 
   // Test that subsequent session lock works as expected.
   session_manager()->SetSessionState(session_manager::SessionState::LOCKED);
@@ -1055,18 +1054,17 @@
 
   EXPECT_EQ(TrayActionState::kNotAvailable,
             state_controller()->GetLockScreenNoteState());
-  state_controller()->FlushTrayActionForTesting();
-  EXPECT_EQ(0u, observer()->observed_states().size());
-  EXPECT_EQ(0u, tray_action()->observed_states().size());
+  ExpectObservedStatesMatch(std::vector<TrayActionState>(),
+                            "No state change on session lock.");
 
   tray_action()->SendNewNoteRequest(
       LockScreenNoteOrigin::kLockScreenButtonSwipe);
+  state_controller()->FlushTrayActionForTesting();
 
   EXPECT_EQ(TrayActionState::kNotAvailable,
             state_controller()->GetLockScreenNoteState());
-  state_controller()->FlushTrayActionForTesting();
-  EXPECT_EQ(0u, observer()->observed_states().size());
-  EXPECT_EQ(0u, tray_action()->observed_states().size());
+  ExpectObservedStatesMatch(std::vector<TrayActionState>(),
+                            "No state change on note request.");
 
   // App manager should be started on next session lock.
   session_manager()->SetSessionState(session_manager::SessionState::ACTIVE);
@@ -1137,8 +1135,8 @@
       LockScreenNoteOrigin::kLockScreenButtonSwipe);
   state_controller()->FlushTrayActionForTesting();
 
-  EXPECT_EQ(0u, observer()->observed_states().size());
-  EXPECT_EQ(0u, tray_action()->observed_states().size());
+  ExpectObservedStatesMatch(std::vector<TrayActionState>(),
+                            "No state change on note request");
 }
 
 TEST_F(LockScreenAppStateTest, HandleAction) {
@@ -1160,8 +1158,8 @@
 
   // There should be no state change - the state_controller was already in
   // launching state when the request was received.
-  EXPECT_EQ(0u, observer()->observed_states().size());
-  EXPECT_EQ(0u, tray_action()->observed_states().size());
+  ExpectObservedStatesMatch(std::vector<TrayActionState>(),
+                            "No state change on repeated launch");
   EXPECT_EQ(1, app_manager()->launch_count());
 }
 
@@ -1200,6 +1198,7 @@
   ASSERT_TRUE(InitializeNoteTakingApp(TrayActionState::kAvailable,
                                       true /* enable_app_launch */));
   tray_action()->SendNewNoteRequest(LockScreenNoteOrigin::kStylusEject);
+  state_controller()->FlushTrayActionForTesting();
 
   ExpectObservedStatesMatch({TrayActionState::kLaunching},
                             "Launch on new note request");
@@ -1219,8 +1218,8 @@
   // is closed/canceled before that.
   state_controller()->NewNoteLaunchAnimationDone();
   EXPECT_EQ(0, app_manager()->launch_count());
-  EXPECT_TRUE(observer()->observed_states().empty());
-  EXPECT_TRUE(tray_action()->observed_states().empty());
+  ExpectObservedStatesMatch(std::vector<TrayActionState>(),
+                            "No state change if canceled");
 }
 
 TEST_F(LockScreenAppStateTest, AppWindowRegistration) {
diff --git a/chrome/browser/chromeos/login/lock/screen_locker.cc b/chrome/browser/chromeos/login/lock/screen_locker.cc
index de8dc81..a225a8d 100644
--- a/chrome/browser/chromeos/login/lock/screen_locker.cc
+++ b/chrome/browser/chromeos/login/lock/screen_locker.cc
@@ -29,6 +29,7 @@
 #include "chrome/browser/chromeos/login/helper.h"
 #include "chrome/browser/chromeos/login/lock/views_screen_locker.h"
 #include "chrome/browser/chromeos/login/lock/webui_screen_locker.h"
+#include "chrome/browser/chromeos/login/login_auth_recorder.h"
 #include "chrome/browser/chromeos/login/quick_unlock/pin_backend.h"
 #include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_factory.h"
 #include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_storage.h"
@@ -688,6 +689,9 @@
     return;
   }
 
+  LoginScreenClient::Get()->auth_recorder()->RecordAuthMethod(
+      LoginAuthRecorder::AuthMethod::kFingerprint);
+
   if (scan_result != biod::ScanResult::SCAN_RESULT_SUCCESS) {
     OnFingerprintAuthFailure(*active_user);
     return;
@@ -701,6 +705,9 @@
   delegate_->SetFingerprintState(active_user->GetAccountId(),
                                  FingerprintState::kSignin);
   OnAuthSuccess(user_context);
+  LoginScreenClient::Get()->auth_recorder()->RecordFingerprintAuthSuccess(
+      true /*success*/,
+      quick_unlock_storage->fingerprint_storage()->unlock_attempt_count());
 }
 
 void ScreenLocker::OnSessionFailed() {
@@ -710,7 +717,8 @@
 void ScreenLocker::OnFingerprintAuthFailure(const user_manager::User& user) {
   UMA_HISTOGRAM_ENUMERATION("ScreenLocker.AuthenticationFailure",
                             unlock_attempt_type_, UnlockType::AUTH_COUNT);
-
+  LoginScreenClient::Get()->auth_recorder()->RecordFingerprintAuthSuccess(
+      false /*success*/, base::nullopt /*num_attempts*/);
   delegate_->SetFingerprintState(user.GetAccountId(),
                                  FingerprintState::kFailed);
 
diff --git a/chrome/browser/chromeos/login/login_auth_recorder.cc b/chrome/browser/chromeos/login/login_auth_recorder.cc
new file mode 100644
index 0000000..588acce
--- /dev/null
+++ b/chrome/browser/chromeos/login/login_auth_recorder.cc
@@ -0,0 +1,160 @@
+// 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 "chrome/browser/chromeos/login/login_auth_recorder.h"
+
+#include "base/metrics/histogram_macros.h"
+#include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h"
+#include "chrome/browser/ui/ash/tablet_mode_client.h"
+#include "components/session_manager/core/session_manager.h"
+
+namespace chromeos {
+
+using AuthMethod = LoginAuthRecorder::AuthMethod;
+using AuthMethodSwitchType = LoginAuthRecorder::AuthMethodSwitchType;
+
+namespace {
+
+AuthMethodSwitchType SwitchFromPasswordTo(AuthMethod current) {
+  DCHECK_NE(AuthMethod::kPassword, current);
+  switch (current) {
+    case AuthMethod::kPin:
+      return AuthMethodSwitchType::kPasswordToPin;
+    case AuthMethod::kSmartlock:
+      return AuthMethodSwitchType::kPasswordToSmartlock;
+    case AuthMethod::kFingerprint:
+      return AuthMethodSwitchType::kPasswordToFingerprint;
+    case AuthMethod::kPassword:
+    case AuthMethod::kMethodCount:
+      NOTREACHED();
+      return AuthMethodSwitchType::kSwitchTypeCount;
+  }
+}
+
+AuthMethodSwitchType SwitchFromPinTo(AuthMethod current) {
+  DCHECK_NE(AuthMethod::kPin, current);
+  switch (current) {
+    case AuthMethod::kPassword:
+      return AuthMethodSwitchType::kPinToPassword;
+    case AuthMethod::kSmartlock:
+      return AuthMethodSwitchType::kPinToSmartlock;
+    case AuthMethod::kFingerprint:
+      return AuthMethodSwitchType::kPinToFingerprint;
+    case AuthMethod::kPin:
+    case AuthMethod::kMethodCount:
+      NOTREACHED();
+      return AuthMethodSwitchType::kSwitchTypeCount;
+  }
+}
+
+AuthMethodSwitchType SwitchFromSmartlockTo(AuthMethod current) {
+  DCHECK_NE(AuthMethod::kSmartlock, current);
+  switch (current) {
+    case AuthMethod::kPassword:
+      return AuthMethodSwitchType::kSmartlockToPassword;
+    case AuthMethod::kPin:
+      return AuthMethodSwitchType::kSmartlockToPin;
+    case AuthMethod::kFingerprint:
+      return AuthMethodSwitchType::kSmartlockToFingerprint;
+    case AuthMethod::kSmartlock:
+    case AuthMethod::kMethodCount:
+      NOTREACHED();
+      return AuthMethodSwitchType::kSwitchTypeCount;
+  }
+}
+
+AuthMethodSwitchType SwitchFromFingerprintTo(AuthMethod current) {
+  DCHECK_NE(AuthMethod::kFingerprint, current);
+  switch (current) {
+    case AuthMethod::kPassword:
+      return AuthMethodSwitchType::kFingerprintToPassword;
+    case AuthMethod::kSmartlock:
+      return AuthMethodSwitchType::kFingerprintToSmartlock;
+    case AuthMethod::kPin:
+      return AuthMethodSwitchType::kFingerprintToPin;
+    case AuthMethod::kFingerprint:
+    case AuthMethod::kMethodCount:
+      NOTREACHED();
+      return AuthMethodSwitchType::kSwitchTypeCount;
+  }
+}
+
+AuthMethodSwitchType FindSwitchType(AuthMethod previous, AuthMethod current) {
+  DCHECK_NE(previous, current);
+  switch (previous) {
+    case AuthMethod::kPassword:
+      return SwitchFromPasswordTo(current);
+    case AuthMethod::kPin:
+      return SwitchFromPinTo(current);
+    case AuthMethod::kSmartlock:
+      return SwitchFromSmartlockTo(current);
+    case AuthMethod::kFingerprint:
+      return SwitchFromFingerprintTo(current);
+    case AuthMethod::kMethodCount:
+      NOTREACHED();
+      return AuthMethodSwitchType::kSwitchTypeCount;
+  }
+}
+
+}  // namespace
+
+LoginAuthRecorder::LoginAuthRecorder() {
+  session_manager::SessionManager::Get()->AddObserver(this);
+  UMA_HISTOGRAM_BOOLEAN("Fingerprint.UnlockEnabled",
+                        chromeos::quick_unlock::IsFingerprintEnabled());
+}
+
+LoginAuthRecorder::~LoginAuthRecorder() {
+  session_manager::SessionManager::Get()->RemoveObserver(this);
+}
+
+void LoginAuthRecorder::RecordAuthMethod(AuthMethod method) {
+  DCHECK_NE(method, AuthMethod::kMethodCount);
+  if (session_manager::SessionManager::Get()->session_state() !=
+      session_manager::SessionState::LOCKED) {
+    return;
+  }
+
+  // Record usage of PIN / Password / Smartlock / Fingerprint in lock screen.
+  const bool is_tablet_mode = TabletModeClient::Get()->tablet_mode_enabled();
+  if (is_tablet_mode) {
+    UMA_HISTOGRAM_ENUMERATION("Ash.Login.Lock.AuthMethod.Used.TabletMode",
+                              method, AuthMethod::kMethodCount);
+  } else {
+    UMA_HISTOGRAM_ENUMERATION("Ash.Login.Lock.AuthMethod.Used.ClamShellMode",
+                              method, AuthMethod::kMethodCount);
+  }
+
+  if (last_auth_method_ != method) {
+    // Record switching between unlock methods.
+    UMA_HISTOGRAM_ENUMERATION("Ash.Login.Lock.AuthMethod.Switched",
+                              FindSwitchType(last_auth_method_, method),
+                              AuthMethodSwitchType::kSwitchTypeCount);
+
+    last_auth_method_ = method;
+  }
+}
+
+void LoginAuthRecorder::RecordFingerprintAuthSuccess(
+    bool success,
+    const base::Optional<int>& num_attempts) {
+  if (session_manager::SessionManager::Get()->session_state() !=
+      session_manager::SessionState::LOCKED) {
+    return;
+  }
+
+  UMA_HISTOGRAM_BOOLEAN("Fingerprint.Unlock.AuthSuccessful", success);
+  if (success) {
+    DCHECK(num_attempts);
+    UMA_HISTOGRAM_COUNTS_100("Fingerprint.Unlock.AttemptsCountBeforeSuccess",
+                             num_attempts.value());
+  }
+}
+
+void LoginAuthRecorder::OnSessionStateChanged() {
+  // Reset local state.
+  last_auth_method_ = AuthMethod::kPassword;
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/login_auth_recorder.h b/chrome/browser/chromeos/login/login_auth_recorder.h
new file mode 100644
index 0000000..fdd4899
--- /dev/null
+++ b/chrome/browser/chromeos/login/login_auth_recorder.h
@@ -0,0 +1,72 @@
+// 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 CHROME_BROWSER_CHROMEOS_LOGIN_LOGIN_AUTH_RECORDER_H_
+#define CHROME_BROWSER_CHROMEOS_LOGIN_LOGIN_AUTH_RECORDER_H_
+
+#include "base/macros.h"
+#include "base/optional.h"
+#include "components/session_manager/core/session_manager_observer.h"
+
+namespace chromeos {
+
+// A metrics recorder that records login authentication related metrics.
+// This keeps track of the last authentication method we used and records
+// switching between different authentication methods.
+// This is tied to LoginScreenClient lifetime.
+class LoginAuthRecorder : public session_manager::SessionManagerObserver {
+ public:
+  // Authentication method to unlock the screen. This enum is used to back an
+  // UMA histogram and new values should be inserted immediately above
+  // kMethodCount.
+  enum class AuthMethod {
+    kPassword = 0,
+    kPin,
+    kSmartlock,
+    kFingerprint,
+    kMethodCount,
+  };
+
+  // The type of switching between auth methods. This enum is used to back an
+  // UMA histogram and new values should be inserted immediately above
+  // kSwitchTypeCount.
+  enum class AuthMethodSwitchType {
+    kPasswordToPin = 0,
+    kPasswordToSmartlock,
+    kPinToPassword,
+    kPinToSmartlock,
+    kSmartlockToPassword,
+    kSmartlockToPin,
+    kPasswordToFingerprint,
+    kPinToFingerprint,
+    kSmartlockToFingerprint,
+    kFingerprintToPassword,
+    kFingerprintToPin,
+    kFingerprintToSmartlock,
+    kSwitchTypeCount,
+  };
+
+  LoginAuthRecorder();
+  ~LoginAuthRecorder() override;
+
+  // Called when user attempts authentication using AuthMethod |type|.
+  void RecordAuthMethod(AuthMethod type);
+
+  // Called after a fingerprint attempt to record the auth result.
+  // |num_attempts|:  Only valid when auth success to record number of attempts.
+  void RecordFingerprintAuthSuccess(bool success,
+                                    const base::Optional<int>& num_attempts);
+
+  // session_manager::SessionManagerObserver
+  void OnSessionStateChanged() override;
+
+ private:
+  AuthMethod last_auth_method_ = AuthMethod::kPassword;
+
+  DISALLOW_COPY_AND_ASSIGN(LoginAuthRecorder);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_LOGIN_AUTH_RECORDER_H_
diff --git a/chrome/browser/chromeos/login/login_auth_recorder_browsertest.cc b/chrome/browser/chromeos/login/login_auth_recorder_browsertest.cc
new file mode 100644
index 0000000..4f9f960
--- /dev/null
+++ b/chrome/browser/chromeos/login/login_auth_recorder_browsertest.cc
@@ -0,0 +1,206 @@
+// 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 "chrome/browser/chromeos/login/login_auth_recorder.h"
+
+#include "base/test/metrics/histogram_tester.h"
+#include "chrome/browser/ui/ash/login_screen_client.h"
+#include "chrome/browser/ui/ash/tablet_mode_client.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "components/session_manager/core/session_manager.h"
+
+namespace chromeos {
+namespace {
+
+constexpr char kAuthMethodUsageAsTabletHistogramName[] =
+    "Ash.Login.Lock.AuthMethod.Used.TabletMode";
+constexpr char kAuthMethodUsageAsClamShellHistogramName[] =
+    "Ash.Login.Lock.AuthMethod.Used.ClamShellMode";
+constexpr char kAuthMethodSwitchHistogramName[] =
+    "Ash.Login.Lock.AuthMethod.Switched";
+constexpr char kFingerprintSuccessHistogramName[] =
+    "Fingerprint.Unlock.AuthSuccessful";
+constexpr char kFingerprintAttemptsCountBeforeSuccessHistogramName[] =
+    "Fingerprint.Unlock.AttemptsCountBeforeSuccess";
+
+}  // namespace
+
+// Test fixture for the LoginAuthRecorder class.
+class LoginAuthRecorderTest : public InProcessBrowserTest {
+ public:
+  LoginAuthRecorderTest() = default;
+  ~LoginAuthRecorderTest() override = default;
+
+ protected:
+  // InProcessBrowserTest:
+  void SetUpOnMainThread() override {
+    InProcessBrowserTest::SetUpOnMainThread();
+    histogram_tester_ = std::make_unique<base::HistogramTester>();
+  }
+
+  void EnableTabletMode(bool enable) {
+    TabletModeClient::Get()->OnTabletModeToggled(enable);
+  }
+
+  LoginAuthRecorder* metrics_recorder() {
+    return LoginScreenClient::Get()->auth_recorder();
+  }
+
+  void SetAuthMethod(LoginAuthRecorder::AuthMethod auth_method) {
+    metrics_recorder()->RecordAuthMethod(auth_method);
+  }
+
+  void SetFingerprintAuthSuccess(bool success) {
+    metrics_recorder()->RecordFingerprintAuthSuccess(
+        success, success ? base::Optional<int>(1) : base::nullopt);
+  }
+
+  void ExpectBucketCount(const std::string& name,
+                         LoginAuthRecorder::AuthMethod method,
+                         int count) {
+    histogram_tester_->ExpectBucketCount(name, static_cast<int>(method), count);
+  }
+
+  void ExpectBucketCount(const std::string& name,
+                         LoginAuthRecorder::AuthMethodSwitchType switch_type,
+                         int count) {
+    histogram_tester_->ExpectBucketCount(name, static_cast<int>(switch_type),
+                                         count);
+  }
+
+  // Used to verify recorded data.
+  std::unique_ptr<base::HistogramTester> histogram_tester_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(LoginAuthRecorderTest);
+};
+
+// Verifies that auth method usage is recorded correctly.
+IN_PROC_BROWSER_TEST_F(LoginAuthRecorderTest, AuthMethodUsage) {
+  session_manager::SessionManager::Get()->SetSessionState(
+      session_manager::SessionState::LOCKED);
+
+  EnableTabletMode(false);
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kPassword);
+  ExpectBucketCount(kAuthMethodUsageAsClamShellHistogramName,
+                    LoginAuthRecorder::AuthMethod::kPassword, 1);
+  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsTabletHistogramName, 0);
+
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kPin);
+  ExpectBucketCount(kAuthMethodUsageAsClamShellHistogramName,
+                    LoginAuthRecorder::AuthMethod::kPin, 1);
+  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsTabletHistogramName, 0);
+
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kSmartlock);
+  ExpectBucketCount(kAuthMethodUsageAsClamShellHistogramName,
+                    LoginAuthRecorder::AuthMethod::kSmartlock, 1);
+  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsTabletHistogramName, 0);
+
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kFingerprint);
+  ExpectBucketCount(kAuthMethodUsageAsClamShellHistogramName,
+                    LoginAuthRecorder::AuthMethod::kFingerprint, 1);
+  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsTabletHistogramName, 0);
+  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsClamShellHistogramName,
+                                      4);
+
+  EnableTabletMode(true);
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kPassword);
+  ExpectBucketCount(kAuthMethodUsageAsTabletHistogramName,
+                    LoginAuthRecorder::AuthMethod::kPassword, 1);
+  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsClamShellHistogramName,
+                                      4);
+
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kPin);
+  ExpectBucketCount(kAuthMethodUsageAsTabletHistogramName,
+                    LoginAuthRecorder::AuthMethod::kPin, 1);
+  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsClamShellHistogramName,
+                                      4);
+
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kSmartlock);
+  ExpectBucketCount(kAuthMethodUsageAsTabletHistogramName,
+                    LoginAuthRecorder::AuthMethod::kSmartlock, 1);
+  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsClamShellHistogramName,
+                                      4);
+
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kFingerprint);
+  ExpectBucketCount(kAuthMethodUsageAsTabletHistogramName,
+                    LoginAuthRecorder::AuthMethod::kFingerprint, 1);
+  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsClamShellHistogramName,
+                                      4);
+  histogram_tester_->ExpectTotalCount(kAuthMethodUsageAsTabletHistogramName, 4);
+}
+
+// Verifies that auth method switching is recorded correctly.
+IN_PROC_BROWSER_TEST_F(LoginAuthRecorderTest, AuthMethodSwitch) {
+  session_manager::SessionManager::Get()->SetSessionState(
+      session_manager::SessionState::LOCKED);
+
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kPassword);
+  histogram_tester_->ExpectTotalCount(kAuthMethodSwitchHistogramName, 0);
+
+  // Switch from password to pin.
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kPin);
+  ExpectBucketCount(kAuthMethodSwitchHistogramName,
+                    LoginAuthRecorder::AuthMethodSwitchType::kPasswordToPin, 1);
+
+  // Switch from pin to smart lock.
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kSmartlock);
+  ExpectBucketCount(kAuthMethodSwitchHistogramName,
+                    LoginAuthRecorder::AuthMethodSwitchType::kPinToSmartlock,
+                    1);
+
+  // Switch from smart lock to fingerprint.
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kFingerprint);
+  ExpectBucketCount(
+      kAuthMethodSwitchHistogramName,
+      LoginAuthRecorder::AuthMethodSwitchType::kSmartlockToFingerprint, 1);
+
+  // Switch from fingerprint to password.
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kPassword);
+  ExpectBucketCount(
+      kAuthMethodSwitchHistogramName,
+      LoginAuthRecorder::AuthMethodSwitchType::kFingerprintToPassword, 1);
+
+  // Switch from password to fingerprint.
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kFingerprint);
+  ExpectBucketCount(
+      kAuthMethodSwitchHistogramName,
+      LoginAuthRecorder::AuthMethodSwitchType::kPasswordToFingerprint, 1);
+
+  // Switch from fingerprint to smart lock.
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kSmartlock);
+  ExpectBucketCount(
+      kAuthMethodSwitchHistogramName,
+      LoginAuthRecorder::AuthMethodSwitchType::kFingerprintToSmartlock, 1);
+
+  // Switch from smart lock to pin.
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kPin);
+  ExpectBucketCount(kAuthMethodSwitchHistogramName,
+                    LoginAuthRecorder::AuthMethodSwitchType::kSmartlockToPin,
+                    1);
+
+  // Switch from pin to password.
+  SetAuthMethod(LoginAuthRecorder::AuthMethod::kPassword);
+  ExpectBucketCount(kAuthMethodSwitchHistogramName,
+                    LoginAuthRecorder::AuthMethodSwitchType::kPinToPassword, 1);
+}
+
+// Verifies that fingerprint auth success is recorded correctly.
+IN_PROC_BROWSER_TEST_F(LoginAuthRecorderTest, FingerprintAuthSuccess) {
+  session_manager::SessionManager::Get()->SetSessionState(
+      session_manager::SessionState::LOCKED);
+  SetFingerprintAuthSuccess(true /*success*/);
+  histogram_tester_->ExpectBucketCount(kFingerprintSuccessHistogramName,
+                                       1 /*success*/, 1);
+  histogram_tester_->ExpectTotalCount(
+      kFingerprintAttemptsCountBeforeSuccessHistogramName, 1);
+
+  SetFingerprintAuthSuccess(false /*success*/);
+  histogram_tester_->ExpectBucketCount(kFingerprintSuccessHistogramName,
+                                       0 /*success*/, 1);
+  histogram_tester_->ExpectTotalCount(
+      kFingerprintAttemptsCountBeforeSuccessHistogramName, 1);
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/oauth2_token_service_delegate.cc b/chrome/browser/chromeos/oauth2_token_service_delegate.cc
index f7cf11b..1979aba6 100644
--- a/chrome/browser/chromeos/oauth2_token_service_delegate.cc
+++ b/chrome/browser/chromeos/oauth2_token_service_delegate.cc
@@ -5,12 +5,13 @@
 #include "chrome/browser/chromeos/oauth2_token_service_delegate.h"
 
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "chrome/browser/chromeos/account_mapper_util.h"
 #include "chromeos/account_manager/account_manager.h"
-#include "components/signin/core/browser/account_tracker_service.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace chromeos {
@@ -18,10 +19,10 @@
 ChromeOSOAuth2TokenServiceDelegate::ChromeOSOAuth2TokenServiceDelegate(
     AccountTrackerService* account_tracker_service,
     chromeos::AccountManager* account_manager)
-    : account_tracker_service_(account_tracker_service),
+    : account_mapper_util_(
+          std::make_unique<AccountMapperUtil>(account_tracker_service)),
       account_manager_(account_manager),
-      weak_factory_(this) {
-}
+      weak_factory_(this) {}
 
 ChromeOSOAuth2TokenServiceDelegate::~ChromeOSOAuth2TokenServiceDelegate() {
   account_manager_->RemoveObserver(this);
@@ -38,7 +39,7 @@
   ValidateAccountId(account_id);
 
   const AccountManager::AccountKey& account_key =
-      MapAccountIdToAccountKey(account_id);
+      account_mapper_util_->OAuthAccountIdToAccountKey(account_id);
 
   // |OAuth2TokenService| will manage the lifetime of the released pointer.
   return account_manager_
@@ -53,7 +54,7 @@
   }
 
   return account_manager_->IsTokenAvailable(
-      MapAccountIdToAccountKey(account_id));
+      account_mapper_util_->OAuthAccountIdToAccountKey(account_id));
 }
 
 void ChromeOSOAuth2TokenServiceDelegate::UpdateAuthError(
@@ -94,7 +95,8 @@
 
   std::vector<std::string> accounts;
   for (auto& account_key : account_keys_) {
-    std::string account_id = MapAccountKeyToAccountId(account_key);
+    std::string account_id =
+        account_mapper_util_->AccountKeyToOAuthAccountId(account_key);
     if (!account_id.empty()) {
       accounts.emplace_back(account_id);
     }
@@ -131,7 +133,7 @@
   ValidateAccountId(account_id);
 
   const AccountManager::AccountKey& account_key =
-      MapAccountIdToAccountKey(account_id);
+      account_mapper_util_->OAuthAccountIdToAccountKey(account_id);
 
   // Will result in AccountManager calling
   // |ChromeOSOAuth2TokenServiceDelegate::OnTokenUpserted|.
@@ -173,41 +175,13 @@
   FireRefreshTokensLoaded();
 }
 
-std::string ChromeOSOAuth2TokenServiceDelegate::MapAccountKeyToAccountId(
-    const AccountManager::AccountKey& account_key) const {
-  DCHECK(account_key.IsValid());
-
-  if (account_key.account_type !=
-      account_manager::AccountType::ACCOUNT_TYPE_GAIA) {
-    return std::string();
-  }
-
-  const std::string& account_id =
-      account_tracker_service_->FindAccountInfoByGaiaId(account_key.id)
-          .account_id;
-  DCHECK(!account_id.empty()) << "Can't find account id";
-  return account_id;
-}
-
-AccountManager::AccountKey
-ChromeOSOAuth2TokenServiceDelegate::MapAccountIdToAccountKey(
-    const std::string& account_id) const {
-  DCHECK(!account_id.empty());
-
-  const AccountInfo& account_info =
-      account_tracker_service_->GetAccountInfo(account_id);
-
-  DCHECK(!account_info.gaia.empty()) << "Can't find account info";
-  return AccountManager::AccountKey{
-      account_info.gaia, account_manager::AccountType::ACCOUNT_TYPE_GAIA};
-}
-
 void ChromeOSOAuth2TokenServiceDelegate::OnTokenUpserted(
     const AccountManager::AccountKey& account_key) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   account_keys_.insert(account_key);
 
-  std::string account_id = MapAccountKeyToAccountId(account_key);
+  std::string account_id =
+      account_mapper_util_->AccountKeyToOAuthAccountId(account_key);
   if (account_id.empty()) {
     return;
   }
@@ -237,7 +211,8 @@
   }
 
   account_keys_.erase(it);
-  std::string account_id = MapAccountKeyToAccountId(account_key);
+  std::string account_id =
+      account_mapper_util_->AccountKeyToOAuthAccountId(account_key);
   if (account_id.empty()) {
     return;
   }
diff --git a/chrome/browser/chromeos/oauth2_token_service_delegate.h b/chrome/browser/chromeos/oauth2_token_service_delegate.h
index 841fbed3..f8cf4da 100644
--- a/chrome/browser/chromeos/oauth2_token_service_delegate.h
+++ b/chrome/browser/chromeos/oauth2_token_service_delegate.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_CHROMEOS_OAUTH2_TOKEN_SERVICE_DELEGATE_H_
 
 #include <map>
+#include <memory>
 #include <set>
 #include <string>
 #include <vector>
@@ -20,6 +21,8 @@
 
 namespace chromeos {
 
+class AccountMapperUtil;
+
 class ChromeOSOAuth2TokenServiceDelegate : public OAuth2TokenServiceDelegate,
                                            public AccountManager::Observer {
  public:
@@ -61,23 +64,10 @@
   void GetAccountsCallback(
       std::vector<AccountManager::AccountKey> account_keys);
 
-  // A utility method to map an |account_key| to the account id used by the
-  // OAuth2TokenService chain (see |AccountInfo|). Returns an empty string for
-  // non-Gaia accounts.
-  std::string MapAccountKeyToAccountId(
-      const AccountManager::AccountKey& account_key) const;
-
-  // A utility method to map the |account_id| used by the OAuth2TokenService
-  // chain (see |AccountInfo|) to an |AccountManager::AccountKey|.
-  AccountManager::AccountKey MapAccountIdToAccountKey(
-      const std::string& account_id) const;
-
   LoadCredentialsState load_credentials_state_ =
       LoadCredentialsState::LOAD_CREDENTIALS_NOT_STARTED;
 
-  // A non-owning pointer to |AccountTrackerService|, which itself is a
-  // |KeyedService|.
-  AccountTrackerService* account_tracker_service_;
+  std::unique_ptr<AccountMapperUtil> account_mapper_util_;
 
   // A non-owning pointer to |AccountManager|. |AccountManager| is available
   // throughout the lifetime of a user session.
diff --git a/chrome/browser/chromeos/policy/configuration_policy_handler_chromeos.cc b/chrome/browser/chromeos/policy/configuration_policy_handler_chromeos.cc
index a487065..d746172 100644
--- a/chrome/browser/chromeos/policy/configuration_policy_handler_chromeos.cc
+++ b/chrome/browser/chromeos/policy/configuration_policy_handler_chromeos.cc
@@ -213,7 +213,8 @@
         false,  // Ignore unknown fields.
         false,  // Ignore invalid recommended field names.
         true,   // Fail on missing fields.
-        true);  // Validate for managed ONC
+        true,   // Validate for managed ONC.
+        true);  // Log warnings.
     validator.SetOncSource(onc_source_);
 
     // ONC policies are always unencrypted.
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager.cc b/chrome/browser/chromeos/power/ml/user_activity_manager.cc
index ae08692..cbff5fe8d 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager.cc
@@ -484,26 +484,30 @@
     *activity_event.mutable_model_prediction() = model_prediction_.value();
   }
 
-  // Log to metrics.
-  ukm_logger_->LogActivity(activity_event);
-  LogMetricsToUMA(activity_event);
-
   // If there's an earlier idle event that has not received its own event, log
-  // it here too.
+  // it here too. Note, we log the earlier event before the current event.
   if (previous_idle_event_data_) {
-    if (event->has_log_duration_sec()) {
-      event->set_log_duration_sec(
-          event->log_duration_sec() +
+    UserActivityEvent previous_activity_event = activity_event;
+    UserActivityEvent::Event* previous_event =
+        previous_activity_event.mutable_event();
+    if (previous_event->has_log_duration_sec()) {
+      previous_event->set_log_duration_sec(
+          previous_event->log_duration_sec() +
           previous_idle_event_data_->dim_imminent_signal_interval.InSeconds());
     }
 
-    *activity_event.mutable_features() = previous_idle_event_data_->features;
-    *activity_event.mutable_model_prediction() =
+    *previous_activity_event.mutable_features() =
+        previous_idle_event_data_->features;
+    *previous_activity_event.mutable_model_prediction() =
         previous_idle_event_data_->model_prediction;
-    ukm_logger_->LogActivity(activity_event);
-    LogMetricsToUMA(activity_event);
+    ukm_logger_->LogActivity(previous_activity_event);
+    LogMetricsToUMA(previous_activity_event);
   }
 
+  // Log to metrics.
+  ukm_logger_->LogActivity(activity_event);
+  LogMetricsToUMA(activity_event);
+
   // Update the counters for next event logging.
   if (type == UserActivityEvent::Event::REACTIVATE) {
     previous_negative_actions_count_++;
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc b/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc
index 2705128..3f4f530 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc
@@ -1046,7 +1046,7 @@
   const std::vector<UserActivityEvent>& events = delegate_.events();
   ASSERT_EQ(2U, events.size());
 
-  // The first event logged is the current one.
+  // The current event logged is after the earlier idle event.
   UserActivityEvent::Event expected_event1;
   expected_event1.set_type(UserActivityEvent::Event::TIMEOUT);
   expected_event1.set_reason(UserActivityEvent::Event::IDLE_SLEEP);
@@ -1054,7 +1054,7 @@
   expected_event1.set_screen_dim_occurred(false);
   expected_event1.set_screen_off_occurred(false);
   expected_event1.set_screen_lock_occurred(false);
-  EqualEvent(expected_event1, events[0].event());
+  EqualEvent(expected_event1, events[1].event());
 
   UserActivityEvent::ModelPrediction expected_prediction1;
   expected_prediction1.set_decision_threshold(50);
@@ -1062,12 +1062,11 @@
   expected_prediction1.set_model_applied(false);
   expected_prediction1.set_response(UserActivityEvent::ModelPrediction::NO_DIM);
 
-  EqualModelPrediction(expected_prediction1, events[0].model_prediction());
+  EqualModelPrediction(expected_prediction1, events[1].model_prediction());
 
-  // The earlier idle event is logged afterwards.
   UserActivityEvent::Event expected_event2 = expected_event1;
   expected_event2.set_log_duration_sec(30);
-  EqualEvent(expected_event2, events[1].event());
+  EqualEvent(expected_event2, events[0].event());
 
   UserActivityEvent::ModelPrediction expected_prediction2;
   expected_prediction2.set_decision_threshold(50);
@@ -1075,7 +1074,7 @@
   expected_prediction2.set_model_applied(true);
   expected_prediction2.set_response(UserActivityEvent::ModelPrediction::NO_DIM);
 
-  EqualModelPrediction(expected_prediction2, events[1].model_prediction());
+  EqualModelPrediction(expected_prediction2, events[0].model_prediction());
 }
 
 TEST_F(UserActivityManagerTest, ModelError) {
diff --git a/chrome/browser/chromeos/preferences.cc b/chrome/browser/chromeos/preferences.cc
index 540f8f61..659167ea 100644
--- a/chrome/browser/chromeos/preferences.cc
+++ b/chrome/browser/chromeos/preferences.cc
@@ -303,6 +303,7 @@
       prefs::kUse24HourClock,
       base::GetHourClockType() == base::k24HourClock,
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
+  registry->RegisterBooleanPref(prefs::kAppListContinueReadingEnabled, true);
   registry->RegisterBooleanPref(prefs::kCameraMediaConsolidated, false);
   registry->RegisterBooleanPref(
       drive::prefs::kDisableDrive, false,
diff --git a/chrome/browser/content_settings/sound_content_setting_observer.cc b/chrome/browser/content_settings/sound_content_setting_observer.cc
index d9572565..b42f03a 100644
--- a/chrome/browser/content_settings/sound_content_setting_observer.cc
+++ b/chrome/browser/content_settings/sound_content_setting_observer.cc
@@ -10,12 +10,17 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/content_settings/core/common/content_settings_utils.h"
+#include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_service.h"
 #include "components/ukm/content/source_url_recorder.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/common/url_constants.h"
+#include "media/base/media_switches.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
+#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
+#include "third_party/blink/public/platform/autoplay.mojom.h"
 
 #if !defined(OS_ANDROID)
 #include "chrome/browser/ui/tabs/tab_utils.h"
@@ -44,6 +49,45 @@
 
 SoundContentSettingObserver::~SoundContentSettingObserver() = default;
 
+void SoundContentSettingObserver::ReadyToCommitNavigation(
+    content::NavigationHandle* navigation_handle) {
+  if (navigation_handle->IsSameDocument())
+    return;
+
+  if (!base::FeatureList::IsEnabled(media::kAutoplaySoundSettings))
+    return;
+
+  GURL url = navigation_handle->IsInMainFrame()
+                 ? navigation_handle->GetURL()
+                 : navigation_handle->GetWebContents()->GetLastCommittedURL();
+
+  content_settings::SettingInfo setting_info;
+  std::unique_ptr<base::Value> setting =
+      host_content_settings_map_->GetWebsiteSetting(
+          url, navigation_handle->GetURL(),
+          CONTENT_SETTINGS_TYPE_SOUND, std::string(), &setting_info);
+
+  if (content_settings::ValueToContentSetting(setting.get()) !=
+      CONTENT_SETTING_ALLOW) {
+    return;
+  }
+
+  if (setting_info.source != content_settings::SETTING_SOURCE_USER)
+    return;
+
+  if (setting_info.primary_pattern == ContentSettingsPattern::Wildcard() &&
+      setting_info.secondary_pattern == ContentSettingsPattern::Wildcard()) {
+    return;
+  }
+
+  blink::mojom::AutoplayConfigurationClientAssociatedPtr client;
+  navigation_handle->GetRenderFrameHost()
+      ->GetRemoteAssociatedInterfaces()
+      ->GetInterface(&client);
+  client->AddAutoplayFlags(url::Origin::Create(navigation_handle->GetURL()),
+                           blink::mojom::kAutoplayFlagUserException);
+}
+
 void SoundContentSettingObserver::DidFinishNavigation(
     content::NavigationHandle* navigation_handle) {
   if (navigation_handle->IsInMainFrame() && navigation_handle->HasCommitted() &&
diff --git a/chrome/browser/content_settings/sound_content_setting_observer.h b/chrome/browser/content_settings/sound_content_setting_observer.h
index d289115..3217ca9f 100644
--- a/chrome/browser/content_settings/sound_content_setting_observer.h
+++ b/chrome/browser/content_settings/sound_content_setting_observer.h
@@ -31,6 +31,8 @@
   ~SoundContentSettingObserver() override;
 
   // content::WebContentsObserver implementation.
+  void ReadyToCommitNavigation(
+      content::NavigationHandle* navigation_handle) override;
   void DidFinishNavigation(
       content::NavigationHandle* navigation_handle) override;
   void OnAudioStateChanged(bool audible) override;
diff --git a/chrome/browser/download/download_offline_content_provider.cc b/chrome/browser/download/download_offline_content_provider.cc
index 2a612f1..392b99e6 100644
--- a/chrome/browser/download/download_offline_content_provider.cc
+++ b/chrome/browser/download/download_offline_content_provider.cc
@@ -57,7 +57,8 @@
 }
 
 // TODO(shaktisahu) : Pass DownloadOpenSource.
-void DownloadOfflineContentProvider::OpenItem(const ContentId& id) {
+void DownloadOfflineContentProvider::OpenItem(LaunchLocation location,
+                                              const ContentId& id) {
   download::DownloadItem* item = manager_->GetDownloadByGuid(id.id);
   if (item)
     item->OpenDownload();
diff --git a/chrome/browser/download/download_offline_content_provider.h b/chrome/browser/download/download_offline_content_provider.h
index 9b9bda6..aa8ebdfe 100644
--- a/chrome/browser/download/download_offline_content_provider.h
+++ b/chrome/browser/download/download_offline_content_provider.h
@@ -20,6 +20,7 @@
 using OfflineContentProvider = offline_items_collection::OfflineContentProvider;
 using OfflineContentAggregator =
     offline_items_collection::OfflineContentAggregator;
+using LaunchLocation = offline_items_collection::LaunchLocation;
 
 class SkBitmap;
 
@@ -33,7 +34,7 @@
   ~DownloadOfflineContentProvider() override;
 
   // OfflineContentProvider implmentation.
-  void OpenItem(const ContentId& id) override;
+  void OpenItem(LaunchLocation location, const ContentId& id) override;
   void RemoveItem(const ContentId& id) override;
   void CancelDownload(const ContentId& id) override;
   void PauseDownload(const ContentId& id) override;
diff --git a/chrome/browser/extensions/activity_log/counting_policy.cc b/chrome/browser/extensions/activity_log/counting_policy.cc
index 1e54bfd7..210c0936 100644
--- a/chrome/browser/extensions/activity_log/counting_policy.cc
+++ b/chrome/browser/extensions/activity_log/counting_policy.cc
@@ -56,7 +56,7 @@
 
 // Delay between cleaning passes (to delete old action records) through the
 // database.
-const int kCleaningDelayInHours = 12;
+constexpr base::TimeDelta kCleaningDelay = base::TimeDelta::FromHours(12);
 
 // We should log the arguments to these API calls.  Be careful when
 // constructing this whitelist to not keep arguments that might compromise
@@ -244,8 +244,7 @@
   // always check on the first database flush (since there might be a large
   // amount of data to clear).
   bool clean_database = (last_database_cleaning_time_.is_null() ||
-                         Now() - last_database_cleaning_time_ >
-                             base::TimeDelta::FromHours(kCleaningDelayInHours));
+                         Now() - last_database_cleaning_time_ > kCleaningDelay);
 
   if (queue.empty() && !clean_database)
     return true;
diff --git a/chrome/browser/extensions/api/autotest_private/DEPS b/chrome/browser/extensions/api/autotest_private/DEPS
new file mode 100644
index 0000000..53fd62a1
--- /dev/null
+++ b/chrome/browser/extensions/api/autotest_private/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+chrome/browser/ui/views/crostini",
+]
diff --git a/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc b/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc
index 49f4f32..1bc8a40 100644
--- a/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc
@@ -31,11 +31,14 @@
 #include "ash/public/interfaces/constants.mojom.h"
 #include "base/feature_list.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/crostini/crostini_manager.h"
+#include "chrome/browser/chromeos/crostini/crostini_util.h"
 #include "chrome/browser/chromeos/login/lock/screen_locker.h"
 #include "chrome/browser/chromeos/printing/cups_printers_manager.h"
 #include "chrome/browser/chromeos/system/input_device_settings.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/ash/login_screen_client.h"
+#include "chrome/browser/ui/views/crostini/crostini_installer_view.h"
 #include "chrome/common/chrome_features.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/session_manager_client.h"
@@ -581,6 +584,44 @@
   return RespondNow(Error("ARC is not available for the current platform"));
 }
 
+ExtensionFunction::ResponseAction
+AutotestPrivateRunCrostiniInstallerFunction::Run() {
+  DVLOG(1) << "AutotestPrivateInstallCrostiniFunction";
+#if defined(OS_CHROMEOS)
+  if (!IsCrostiniUIAllowedForProfile(ProfileManager::GetActiveUserProfile())) {
+    return RespondNow(Error("Crostini is not available for the current user"));
+  }
+  // Run GUI installer which will install crostini vm / container and
+  // start terminal app on completion.  After starting the installer,
+  // we call RestartCrostini and we will be put in the pending restarters
+  // queue and be notified on success/otherwise of installation.
+  Profile* profile = Profile::FromBrowserContext(browser_context());
+  CrostiniInstallerView::Show(profile);
+  CrostiniInstallerView::GetActiveViewForTesting()->Accept();
+  crostini::CrostiniManager::GetInstance()->RestartCrostini(
+      profile, kCrostiniDefaultVmName, kCrostiniDefaultContainerName,
+      base::BindOnce(
+          &AutotestPrivateRunCrostiniInstallerFunction::CrostiniRestarted,
+          this));
+
+  return RespondLater();
+#else
+  return RespondNow(
+      Error("Crostini is not available for the current platform"));
+#endif
+}
+
+#if defined(OS_CHROMEOS)
+void AutotestPrivateRunCrostiniInstallerFunction::CrostiniRestarted(
+    crostini::ConciergeClientResult result) {
+  if (result == crostini::ConciergeClientResult::SUCCESS) {
+    Respond(NoArguments());
+  } else {
+    Respond(Error("Error installing crostini"));
+  }
+}
+#endif
+
 static base::LazyInstance<BrowserContextKeyedAPIFactory<AutotestPrivateAPI>>::
     DestructorAtExit g_autotest_private_api_factory = LAZY_INSTANCE_INITIALIZER;
 
diff --git a/chrome/browser/extensions/api/autotest_private/autotest_private_api.h b/chrome/browser/extensions/api/autotest_private/autotest_private_api.h
index 4575604..b0623a3 100644
--- a/chrome/browser/extensions/api/autotest_private/autotest_private_api.h
+++ b/chrome/browser/extensions/api/autotest_private/autotest_private_api.h
@@ -21,6 +21,12 @@
 class Notification;
 }
 
+#if defined(OS_CHROMEOS)
+namespace crostini {
+enum class ConciergeClientResult;
+}
+#endif
+
 namespace extensions {
 
 class AutotestPrivateLogoutFunction : public UIThreadExtensionFunction {
@@ -225,6 +231,23 @@
   ResponseAction Run() override;
 };
 
+class AutotestPrivateRunCrostiniInstallerFunction
+    : public UIThreadExtensionFunction {
+ public:
+  AutotestPrivateRunCrostiniInstallerFunction() = default;
+  DECLARE_EXTENSION_FUNCTION("autotestPrivate.runCrostiniInstaller",
+                             AUTOTESTPRIVATE_RUNCROSTINIINSTALLER)
+
+ private:
+  ~AutotestPrivateRunCrostiniInstallerFunction() override = default;
+  ResponseAction Run() override;
+#if defined(OS_CHROMEOS)
+  void CrostiniRestarted(crostini::ConciergeClientResult);
+#endif
+
+  DISALLOW_COPY_AND_ASSIGN(AutotestPrivateRunCrostiniInstallerFunction);
+};
+
 class AutotestPrivateGetPrinterListFunction : public UIThreadExtensionFunction {
  public:
   AutotestPrivateGetPrinterListFunction() = default;
diff --git a/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.cc b/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.cc
index 04e43c13..9b50621 100644
--- a/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.cc
+++ b/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.cc
@@ -27,12 +27,17 @@
 namespace braille_display_private {
 
 namespace {
+
 // Delay between detecting a directory update and trying to connect
 // to the brlapi.
-const int64_t kConnectionDelayMs = 500;
+constexpr base::TimeDelta kConnectionDelay =
+    base::TimeDelta::FromMilliseconds(500);
+
 // How long to periodically retry connecting after a brltty restart.
 // Some displays are slow to connect.
-const int64_t kConnectRetryTimeout = 20000;
+constexpr base::TimeDelta kConnectRetryTimeout =
+    base::TimeDelta::FromSeconds(20);
+
 }  // namespace
 
 BrailleController::BrailleController() {
@@ -248,19 +253,16 @@
 
 void BrailleControllerImpl::ResetRetryConnectHorizon() {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  retry_connect_horizon_ =
-      base::Time::Now() +
-      base::TimeDelta::FromMilliseconds(kConnectRetryTimeout);
+  retry_connect_horizon_ = base::Time::Now() + kConnectRetryTimeout;
 }
 
 void BrailleControllerImpl::ScheduleTryToConnect() {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  base::TimeDelta delay(base::TimeDelta::FromMilliseconds(kConnectionDelayMs));
   // Don't reschedule if there's already a connect scheduled or
   // the next attempt would fall outside of the retry limit.
   if (connect_scheduled_)
     return;
-  if (base::Time::Now() + delay > retry_connect_horizon_) {
+  if (base::Time::Now() + kConnectionDelay > retry_connect_horizon_) {
     VLOG(1) << "Stopping to retry to connect to brlapi";
     return;
   }
@@ -270,7 +272,7 @@
       BrowserThread::IO, FROM_HERE,
       base::BindOnce(&BrailleControllerImpl::TryToConnect,
                      base::Unretained(this)),
-      delay);
+      kConnectionDelay);
 }
 
 void BrailleControllerImpl::Disconnect() {
diff --git a/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc b/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc
index 66e3efd..43454096 100644
--- a/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc
+++ b/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc
@@ -8,11 +8,10 @@
 #include "base/macros.h"
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "chrome/browser/extensions/api/desktop_capture/desktop_capture_api.h"
 #include "chrome/browser/extensions/extension_apitest.h"
-#include "chrome/browser/media/webrtc/fake_desktop_media_list.h"
+#include "chrome/browser/media/webrtc/fake_desktop_media_picker_factory.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
@@ -30,20 +29,6 @@
 
 namespace {
 
-struct TestFlags {
-  bool expect_screens;
-  bool expect_windows;
-  bool expect_tabs;
-  bool expect_audio;
-  DesktopMediaID selected_source;
-  bool cancelled;
-
-  // Following flags are set by FakeDesktopMediaPicker when it's created and
-  // deleted.
-  bool picker_created;
-  bool picker_deleted;
-};
-
 // TODO(crbug.com/805145): Uncomment this when test is re-enabled.
 #if 0
 DesktopMediaID MakeFakeWebContentsMediaId(bool audio_share) {
@@ -56,104 +41,6 @@
 }
 #endif
 
-class FakeDesktopMediaPicker : public DesktopMediaPicker {
- public:
-  explicit FakeDesktopMediaPicker(TestFlags* expectation)
-      : expectation_(expectation),
-        weak_factory_(this) {
-    expectation_->picker_created = true;
-  }
-  ~FakeDesktopMediaPicker() override { expectation_->picker_deleted = true; }
-
-  // DesktopMediaPicker interface.
-  void Show(const DesktopMediaPicker::Params& params,
-            std::vector<std::unique_ptr<DesktopMediaList>> source_lists,
-            const DoneCallback& done_callback) override {
-    bool show_screens = false;
-    bool show_windows = false;
-    bool show_tabs = false;
-
-    for (auto& source_list : source_lists) {
-      switch (source_list->GetMediaListType()) {
-        case DesktopMediaID::TYPE_NONE:
-          break;
-        case DesktopMediaID::TYPE_SCREEN:
-          show_screens = true;
-          break;
-        case DesktopMediaID::TYPE_WINDOW:
-          show_windows = true;
-          break;
-        case DesktopMediaID::TYPE_WEB_CONTENTS:
-          show_tabs = true;
-          break;
-      }
-    }
-    EXPECT_EQ(expectation_->expect_screens, show_screens);
-    EXPECT_EQ(expectation_->expect_windows, show_windows);
-    EXPECT_EQ(expectation_->expect_tabs, show_tabs);
-    EXPECT_EQ(expectation_->expect_audio, params.request_audio);
-    EXPECT_EQ(params.modality, ui::ModalType::MODAL_TYPE_CHILD);
-
-    if (!expectation_->cancelled) {
-      // Post a task to call the callback asynchronously.
-      base::ThreadTaskRunnerHandle::Get()->PostTask(
-          FROM_HERE, base::BindOnce(&FakeDesktopMediaPicker::CallCallback,
-                                    weak_factory_.GetWeakPtr(), done_callback));
-    } else {
-      // If we expect the dialog to be cancelled then store the callback to
-      // retain reference to the callback handler.
-      done_callback_ = done_callback;
-    }
-  }
-
- private:
-  void CallCallback(DoneCallback done_callback) {
-    done_callback.Run(expectation_->selected_source);
-  }
-
-  TestFlags* expectation_;
-  DoneCallback done_callback_;
-
-  base::WeakPtrFactory<FakeDesktopMediaPicker> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(FakeDesktopMediaPicker);
-};
-
-class FakeDesktopMediaPickerFactory :
-    public DesktopCaptureChooseDesktopMediaFunction::PickerFactory {
- public:
-  FakeDesktopMediaPickerFactory() {}
-  ~FakeDesktopMediaPickerFactory() override {}
-
-  void SetTestFlags(TestFlags* test_flags, int tests_count) {
-    test_flags_ = test_flags;
-    tests_count_ = tests_count;
-    current_test_ = 0;
-  }
-
-  std::unique_ptr<DesktopMediaPicker> CreatePicker() override {
-    EXPECT_LE(current_test_, tests_count_);
-    if (current_test_ >= tests_count_)
-      return std::unique_ptr<DesktopMediaPicker>();
-    ++current_test_;
-    return std::unique_ptr<DesktopMediaPicker>(
-        new FakeDesktopMediaPicker(test_flags_ + current_test_ - 1));
-  }
-
-  std::unique_ptr<DesktopMediaList> CreateMediaList(
-      DesktopMediaID::Type type) override {
-    EXPECT_LE(current_test_, tests_count_);
-    return std::unique_ptr<DesktopMediaList>(new FakeDesktopMediaList(type));
-  }
-
- private:
-  TestFlags* test_flags_;
-  int tests_count_;
-  int current_test_;
-
-  DISALLOW_COPY_AND_ASSIGN(FakeDesktopMediaPickerFactory);
-};
-
 class DesktopCaptureApiTest : public ExtensionApiTest {
  public:
   DesktopCaptureApiTest() {
@@ -195,7 +82,7 @@
 IN_PROC_BROWSER_TEST_F(DesktopCaptureApiTest, MAYBE_ChooseDesktopMedia) {
   // Each element in the following array corresponds to one test in
   // chrome/test/data/extensions/api_test/desktop_capture/test.js .
-  TestFlags test_flags[] = {
+  FakeDesktopMediaPickerFactory::TestFlags test_flags[] = {
     // pickerUiCanceled()
     {true, true, false, false, DesktopMediaID()},
     // chooseMedia()
@@ -269,7 +156,7 @@
   ui_test_utils::NavigateToURL(
       browser(), GetURLForPath("example.com", "/example.com.html"));
 
-  TestFlags test_flags[] = {
+  FakeDesktopMediaPickerFactory::TestFlags test_flags[] = {
       {true, true, false, false,
        DesktopMediaID(DesktopMediaID::TYPE_SCREEN, DesktopMediaID::kNullId)},
       {true, true, false, false,
diff --git a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
index 60f93b72..29040b2 100644
--- a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
+++ b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
@@ -13,6 +13,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/media/webrtc/desktop_media_list_ash.h"
+#include "chrome/browser/media/webrtc/desktop_media_picker_factory_impl.h"
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
 #include "chrome/browser/media/webrtc/native_desktop_media_list.h"
 #include "chrome/browser/media/webrtc/tab_desktop_media_list.h"
@@ -39,20 +40,18 @@
 const char kEmptySourcesListError[] =
     "At least one source type must be specified.";
 
-DesktopCaptureChooseDesktopMediaFunctionBase::PickerFactory* g_picker_factory =
-    NULL;
+DesktopMediaPickerFactory* g_picker_factory = nullptr;
 
 }  // namespace
 
 // static
 void DesktopCaptureChooseDesktopMediaFunctionBase::SetPickerFactoryForTests(
-    PickerFactory* factory) {
+    DesktopMediaPickerFactory* factory) {
   g_picker_factory = factory;
 }
 
 DesktopCaptureChooseDesktopMediaFunctionBase::
-    DesktopCaptureChooseDesktopMediaFunctionBase() {
-}
+    DesktopCaptureChooseDesktopMediaFunctionBase() = default;
 
 DesktopCaptureChooseDesktopMediaFunctionBase::
     ~DesktopCaptureChooseDesktopMediaFunctionBase() {
@@ -94,12 +93,8 @@
       parent_window = target_browser->window()->GetNativeWindow();
   }
 
-  // Keep same order as the input |sources| and avoid duplicates.
-  std::vector<std::unique_ptr<DesktopMediaList>> source_lists;
-  bool have_screen_list = false;
-  bool have_window_list = false;
-  bool have_tab_list = false;
   bool request_audio = false;
+  std::vector<content::DesktopMediaID::Type> media_types;
   for (auto source_type : sources) {
     switch (source_type) {
       case api::desktop_capture::DESKTOP_CAPTURE_SOURCE_TYPE_NONE: {
@@ -107,98 +102,45 @@
         return false;
       }
       case api::desktop_capture::DESKTOP_CAPTURE_SOURCE_TYPE_SCREEN: {
-        if (have_screen_list) {
-          continue;
-        }
-        std::unique_ptr<DesktopMediaList> screen_list;
-        if (g_picker_factory) {
-          screen_list =
-              g_picker_factory->CreateMediaList(DesktopMediaID::TYPE_SCREEN);
-        } else {
-#if defined(OS_CHROMEOS)
-          screen_list = std::make_unique<DesktopMediaListAsh>(
-              DesktopMediaID::TYPE_SCREEN);
-#else   // !defined(OS_CHROMEOS)
-          screen_list = std::make_unique<NativeDesktopMediaList>(
-              content::DesktopMediaID::TYPE_SCREEN,
-              content::desktop_capture::CreateScreenCapturer());
-#endif  // !defined(OS_CHROMEOS)
-        }
-        have_screen_list = true;
-        source_lists.push_back(std::move(screen_list));
+        media_types.push_back(content::DesktopMediaID::TYPE_SCREEN);
         break;
       }
       case api::desktop_capture::DESKTOP_CAPTURE_SOURCE_TYPE_WINDOW: {
-        if (have_window_list) {
-          continue;
-        }
-        std::unique_ptr<DesktopMediaList> window_list;
-        if (g_picker_factory) {
-          window_list =
-              g_picker_factory->CreateMediaList(DesktopMediaID::TYPE_WINDOW);
-        } else {
-#if defined(OS_CHROMEOS)
-          window_list = std::make_unique<DesktopMediaListAsh>(
-              DesktopMediaID::TYPE_WINDOW);
-#else   // !defined(OS_CHROMEOS)
-          // NativeDesktopMediaList calls the capturers on a background thread.
-          // This means that the two DesktopCapturer instances (for screens and
-          // windows) created here cannot share the same DesktopCaptureOptions
-          // instance. DesktopCaptureOptions owns X connection, which cannot be
-          // used on multiple threads concurrently.
-          window_list = std::make_unique<NativeDesktopMediaList>(
-              content::DesktopMediaID::TYPE_WINDOW,
-              content::desktop_capture::CreateWindowCapturer());
-#endif  // !defined(OS_CHROMEOS)
-        }
-        have_window_list = true;
-        source_lists.push_back(std::move(window_list));
+        media_types.push_back(content::DesktopMediaID::TYPE_WINDOW);
         break;
       }
       case api::desktop_capture::DESKTOP_CAPTURE_SOURCE_TYPE_TAB: {
         if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-                extensions::switches::kDisableTabForDesktopShare) ||
-            have_tab_list) {
+                extensions::switches::kDisableTabForDesktopShare)) {
           continue;
         }
-        std::unique_ptr<DesktopMediaList> tab_list;
-        if (g_picker_factory) {
-          tab_list = g_picker_factory->CreateMediaList(
-              DesktopMediaID::TYPE_WEB_CONTENTS);
-        } else {
-          tab_list = std::make_unique<TabDesktopMediaList>();
-        }
-        have_tab_list = true;
-        source_lists.push_back(std::move(tab_list));
+        media_types.push_back(content::DesktopMediaID::TYPE_WEB_CONTENTS);
         break;
       }
       case api::desktop_capture::DESKTOP_CAPTURE_SOURCE_TYPE_AUDIO: {
-        bool audio_capture_disabled =
-            base::CommandLine::ForCurrentProcess()->HasSwitch(
-                extensions::switches::kDisableDesktopCaptureAudio);
-        if (!audio_capture_disabled) {
+        if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
+                extensions::switches::kDisableDesktopCaptureAudio)) {
           request_audio = true;
         }
         break;
       }
     }
   }
+
+  DesktopMediaPickerFactory* picker_factory =
+      g_picker_factory ? g_picker_factory
+                       : DesktopMediaPickerFactoryImpl::GetInstance();
+  // Keep same order as the input |sources| and avoid duplicates.
+  std::vector<std::unique_ptr<DesktopMediaList>> source_lists =
+      picker_factory->CreateMediaList(media_types);
   if (source_lists.empty()) {
     error_ = kEmptySourcesListError;
     return false;
   }
-
-  if (g_picker_factory) {
-    picker_ = g_picker_factory->CreatePicker();
-  } else {
-    // DesktopMediaPicker is implemented only for Windows, OSX and
-    // Aura Linux builds.
-#if defined(TOOLKIT_VIEWS) || defined(OS_MACOSX)
-    picker_ = DesktopMediaPicker::Create();
-#else
+  picker_ = picker_factory->CreatePicker();
+  if (!picker_) {
     error_ = "Desktop Capture API is not yet implemented for this platform.";
     return false;
-#endif
   }
 
   DesktopMediaPicker::DoneCallback callback = base::Bind(
@@ -253,9 +195,7 @@
 
 DesktopCaptureRequestsRegistry::RequestId::RequestId(int process_id,
                                                      int request_id)
-    : process_id(process_id),
-      request_id(request_id) {
-}
+    : process_id(process_id), request_id(request_id) {}
 
 bool DesktopCaptureRequestsRegistry::RequestId::operator<(
     const RequestId& other) const {
@@ -307,5 +247,4 @@
     it->second->Cancel();
 }
 
-
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h
index a5643287..595a331 100644
--- a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h
+++ b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.h
@@ -14,6 +14,7 @@
 #include "chrome/browser/extensions/chrome_extension_function.h"
 #include "chrome/browser/media/webrtc/desktop_media_list.h"
 #include "chrome/browser/media/webrtc/desktop_media_picker.h"
+#include "chrome/browser/media/webrtc/desktop_media_picker_factory.h"
 #include "chrome/common/extensions/api/desktop_capture.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "url/gurl.h"
@@ -24,26 +25,10 @@
     : public ChromeAsyncExtensionFunction,
       public content::WebContentsObserver {
  public:
-  // Factory creating DesktopMediaList and DesktopMediaPicker instances.
-  // Used for tests to supply fake picker.
-  class PickerFactory {
-   public:
-    virtual std::unique_ptr<DesktopMediaPicker> CreatePicker() = 0;
-    virtual std::unique_ptr<DesktopMediaList> CreateMediaList(
-        content::DesktopMediaID::Type type) = 0;
-
-   protected:
-    PickerFactory() = default;
-    virtual ~PickerFactory() {}
-
-   private:
-    DISALLOW_COPY_AND_ASSIGN(PickerFactory);
-  };
-
   // Used to set PickerFactory used to create mock DesktopMediaPicker instances
   // for tests. Calling tests keep ownership of the factory. Can be called with
   // |factory| set to NULL at the end of the test.
-  static void SetPickerFactoryForTests(PickerFactory* factory);
+  static void SetPickerFactoryForTests(DesktopMediaPickerFactory* factory);
 
   DesktopCaptureChooseDesktopMediaFunctionBase();
 
@@ -77,6 +62,7 @@
   // URL of page that desktop capture was requested for.
   GURL origin_;
 
+  std::unique_ptr<DesktopMediaPickerFactory> picker_factory_;
   std::unique_ptr<DesktopMediaPicker> picker_;
 };
 
diff --git a/chrome/browser/extensions/api/system_private/system_private_api.cc b/chrome/browser/extensions/api/system_private/system_private_api.cc
index 132abe1..bc91204 100644
--- a/chrome/browser/extensions/api/system_private/system_private_api.cc
+++ b/chrome/browser/extensions/api/system_private/system_private_api.cc
@@ -22,7 +22,7 @@
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/update_engine_client.h"
 #else
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #endif
 
 namespace {
diff --git a/chrome/browser/extensions/api/tab_capture/offscreen_tab.cc b/chrome/browser/extensions/api/tab_capture/offscreen_tab.cc
index 185deae..535c16e 100644
--- a/chrome/browser/extensions/api/tab_capture/offscreen_tab.cc
+++ b/chrome/browser/extensions/api/tab_capture/offscreen_tab.cc
@@ -34,8 +34,8 @@
 
 // Time intervals used by the logic that detects when the capture of an
 // offscreen tab has stopped, to automatically tear it down and free resources.
-const int kMaxSecondsToWaitForCapture = 60;
-const int kPollIntervalInSeconds = 1;
+constexpr base::TimeDelta kMaxWaitForCapture = base::TimeDelta::FromMinutes(1);
+constexpr base::TimeDelta kPollInterval = base::TimeDelta::FromSeconds(1);
 
 }  // namespace
 
@@ -392,8 +392,7 @@
     DVLOG(2) << "Capture of OffscreenTab content has started for start_url="
              << start_url_.spec();
     content_capture_was_detected_ = true;
-  } else if (base::TimeTicks::Now() - start_time_ >
-                 base::TimeDelta::FromSeconds(kMaxSecondsToWaitForCapture)) {
+  } else if (base::TimeTicks::Now() - start_time_ > kMaxWaitForCapture) {
     // More than a minute has elapsed since this OffscreenTab was started and
     // content capture still hasn't started.  As a safety precaution, assume
     // that content capture is never going to start and die to free up
@@ -405,11 +404,9 @@
   }
 
   // Schedule the timer to check again in a second.
-  capture_poll_timer_.Start(
-      FROM_HERE,
-      base::TimeDelta::FromSeconds(kPollIntervalInSeconds),
-      base::Bind(&OffscreenTab::DieIfContentCaptureEnded,
-                 base::Unretained(this)));
+  capture_poll_timer_.Start(FROM_HERE, kPollInterval,
+                            base::Bind(&OffscreenTab::DieIfContentCaptureEnded,
+                                       base::Unretained(this)));
 }
 
 void OffscreenTab::DieIfOriginalProfileDestroyed(Profile* profile) {
diff --git a/chrome/browser/extensions/bookmark_app_helper.cc b/chrome/browser/extensions/bookmark_app_helper.cc
index 6ea2b79..18a69668 100644
--- a/chrome/browser/extensions/bookmark_app_helper.cc
+++ b/chrome/browser/extensions/bookmark_app_helper.cc
@@ -6,6 +6,7 @@
 
 #include <stddef.h>
 
+#include <cctype>
 #include <string>
 #include <utility>
 
@@ -45,6 +46,7 @@
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #include "chrome/common/origin_trials/chrome_origin_trial_policy.h"
 #include "chrome/common/url_constants.h"
+#include "chrome/grit/platform_locale_settings.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/notification_service.h"
@@ -59,9 +61,21 @@
 #include "extensions/common/extension.h"
 #include "extensions/common/url_pattern.h"
 #include "net/base/load_flags.h"
+#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 #include "net/url_request/url_request.h"
+#include "skia/ext/image_operations.h"
+#include "skia/ext/platform_canvas.h"
 #include "third_party/blink/public/common/manifest/web_display_mode.h"
 #include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/color_analysis.h"
+#include "ui/gfx/color_utils.h"
+#include "ui/gfx/font.h"
+#include "ui/gfx/font_list.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/image/canvas_image_source.h"
+#include "ui/gfx/image/image.h"
 
 #if defined(OS_MACOSX)
 #include "chrome/browser/web_applications/extensions/web_app_extension_shortcut_mac.h"
@@ -78,6 +92,62 @@
 
 namespace {
 
+// Overlays a shortcut icon over the bottom left corner of a given image.
+class GeneratedIconImageSource : public gfx::CanvasImageSource {
+ public:
+  explicit GeneratedIconImageSource(char letter, SkColor color, int output_size)
+      : gfx::CanvasImageSource(gfx::Size(output_size, output_size), false),
+        letter_(letter),
+        color_(color),
+        output_size_(output_size) {}
+  ~GeneratedIconImageSource() override {}
+
+ private:
+  // gfx::CanvasImageSource overrides:
+  void Draw(gfx::Canvas* canvas) override {
+    const uint8_t kLumaThreshold = 190;
+    const int icon_size = output_size_ * 3 / 4;
+    const int icon_inset = output_size_ / 8;
+    const size_t border_radius = output_size_ / 16;
+    const size_t font_size = output_size_ * 7 / 16;
+
+    std::string font_name =
+        l10n_util::GetStringUTF8(IDS_SANS_SERIF_FONT_FAMILY);
+#if defined(OS_CHROMEOS)
+    const std::string kChromeOSFontFamily = "Noto Sans";
+    font_name = kChromeOSFontFamily;
+#endif
+
+    // Draw a rounded rect of the given |color|.
+    cc::PaintFlags background_flags;
+    background_flags.setAntiAlias(true);
+    background_flags.setColor(color_);
+
+    gfx::Rect icon_rect(icon_inset, icon_inset, icon_size, icon_size);
+    canvas->DrawRoundRect(icon_rect, border_radius, background_flags);
+
+    // The text rect's size needs to be odd to center the text correctly.
+    gfx::Rect text_rect(icon_inset, icon_inset, icon_size + 1, icon_size + 1);
+    // Draw the letter onto the rounded rect. The letter's color depends on the
+    // luma of |color|.
+    const uint8_t luma = color_utils::GetLuma(color_);
+    canvas->DrawStringRectWithFlags(
+        base::string16(1, std::toupper(letter_)),
+        gfx::FontList(gfx::Font(font_name, font_size)),
+        (luma > kLumaThreshold) ? SK_ColorBLACK : SK_ColorWHITE,
+        text_rect,
+        gfx::Canvas::TEXT_ALIGN_CENTER);
+  }
+
+  char letter_;
+
+  SkColor color_;
+
+  int output_size_;
+
+  DISALLOW_COPY_AND_ASSIGN(GeneratedIconImageSource);
+};
+
 std::set<int> SizesToGenerate() {
   // Generate container icons from smaller icons.
   const int kIconSizesToGenerate[] = {
@@ -92,8 +162,49 @@
                        kIconSizesToGenerate + arraysize(kIconSizesToGenerate));
 }
 
-void ReplaceWebAppIcons(std::map<int, web_app::BitmapAndSource> bitmap_map,
-                        WebApplicationInfo* web_app_info) {
+void GenerateIcons(
+    std::set<int> generate_sizes,
+    const GURL& app_url,
+    SkColor generated_icon_color,
+    std::map<int, BookmarkAppHelper::BitmapAndSource>* bitmap_map) {
+  // The letter that will be painted on the generated icon.
+  char icon_letter = ' ';
+  std::string domain_and_registry(
+      net::registry_controlled_domains::GetDomainAndRegistry(
+          app_url,
+          net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES));
+  if (!domain_and_registry.empty()) {
+    icon_letter = domain_and_registry[0];
+  } else if (app_url.has_host()) {
+    icon_letter = app_url.host_piece()[0];
+  }
+
+  // If no color has been specified, use a dark gray so it will stand out on the
+  // black shelf.
+  if (generated_icon_color == SK_ColorTRANSPARENT)
+    generated_icon_color = SK_ColorDKGRAY;
+
+  for (int size : generate_sizes) {
+    BookmarkAppHelper::GenerateIcon(bitmap_map, size, generated_icon_color,
+                                    icon_letter);
+  }
+}
+
+SkBitmap GenerateBitmap(int output_size, SkColor color, char letter) {
+  gfx::ImageSkia icon_image(
+      std::make_unique<GeneratedIconImageSource>(letter, color, output_size),
+      gfx::Size(output_size, output_size));
+  SkBitmap dst;
+  if (dst.tryAllocPixels(icon_image.bitmap()->info())) {
+    icon_image.bitmap()->readPixels(dst.info(), dst.getPixels(), dst.rowBytes(),
+                                    0, 0);
+  }
+  return dst;
+}
+
+void ReplaceWebAppIcons(
+    std::map<int, BookmarkAppHelper::BitmapAndSource> bitmap_map,
+    WebApplicationInfo* web_app_info) {
   web_app_info->icons.clear();
 
   // Populate the icon data into the WebApplicationInfo we are using to
@@ -186,7 +297,7 @@
             continue;
 
           downloaded_bitmaps_.push_back(
-              web_app::BitmapAndSource(url_bitmaps.first, bitmap));
+              BookmarkAppHelper::BitmapAndSource(url_bitmaps.first, bitmap));
         }
       }
     }
@@ -208,7 +319,7 @@
     for (const auto& icon : web_app_info_.icons)
       sizes_to_generate.insert(icon.width);
 
-    std::map<int, web_app::BitmapAndSource> size_map =
+    std::map<int, BookmarkAppHelper::BitmapAndSource> size_map =
         BookmarkAppHelper::ResizeIconsAndGenerateMissing(
             downloaded_bitmaps_, sizes_to_generate, &web_app_info_);
     BookmarkAppHelper::UpdateWebAppIconsWithoutChangingLinks(size_map,
@@ -224,7 +335,7 @@
   std::unique_ptr<content::WebContents> web_contents_;
   std::unique_ptr<WebAppIconDownloader> web_app_icon_downloader_;
   std::vector<GURL> urls_to_download_;
-  std::vector<web_app::BitmapAndSource> downloaded_bitmaps_;
+  std::vector<BookmarkAppHelper::BitmapAndSource> downloaded_bitmaps_;
 };
 
 }  // namespace
@@ -272,6 +383,54 @@
 }
 
 // static
+std::map<int, BookmarkAppHelper::BitmapAndSource>
+BookmarkAppHelper::ConstrainBitmapsToSizes(
+    const std::vector<BookmarkAppHelper::BitmapAndSource>& bitmaps,
+    const std::set<int>& sizes) {
+  std::map<int, BitmapAndSource> output_bitmaps;
+  std::map<int, BitmapAndSource> ordered_bitmaps;
+  for (const BitmapAndSource& bitmap_and_source : bitmaps) {
+    const SkBitmap& bitmap = bitmap_and_source.bitmap;
+    DCHECK(bitmap.width() == bitmap.height());
+    ordered_bitmaps[bitmap.width()] = bitmap_and_source;
+  }
+
+  if (ordered_bitmaps.size() > 0) {
+    for (const auto& size : sizes) {
+      // Find the closest not-smaller bitmap, or failing that use the largest
+      // icon available.
+      auto bitmaps_it = ordered_bitmaps.lower_bound(size);
+      if (bitmaps_it != ordered_bitmaps.end())
+        output_bitmaps[size] = bitmaps_it->second;
+      else
+        output_bitmaps[size] = ordered_bitmaps.rbegin()->second;
+
+      // Resize the bitmap if it does not exactly match the desired size.
+      if (output_bitmaps[size].bitmap.width() != size) {
+        output_bitmaps[size].bitmap = skia::ImageOperations::Resize(
+            output_bitmaps[size].bitmap, skia::ImageOperations::RESIZE_LANCZOS3,
+            size, size);
+      }
+    }
+  }
+
+  return output_bitmaps;
+}
+
+// static
+void BookmarkAppHelper::GenerateIcon(
+    std::map<int, BookmarkAppHelper::BitmapAndSource>* bitmaps,
+    int output_size,
+    SkColor color,
+    char letter) {
+  // Do nothing if there is already an icon of |output_size|.
+  if (bitmaps->count(output_size))
+    return;
+
+  (*bitmaps)[output_size].bitmap = GenerateBitmap(output_size, color, letter);
+}
+
+// static
 WebApplicationInfo::IconInfo BookmarkAppHelper::GenerateIconInfo(
     int output_size,
     SkColor color,
@@ -279,7 +438,7 @@
   WebApplicationInfo::IconInfo icon_info;
   icon_info.width = output_size;
   icon_info.height = output_size;
-  icon_info.data = web_app::GenerateBitmap(output_size, color, letter);
+  icon_info.data = GenerateBitmap(output_size, color, letter);
   return icon_info;
 }
 
@@ -305,25 +464,47 @@
 }
 
 // static
-std::map<int, web_app::BitmapAndSource>
+std::map<int, BookmarkAppHelper::BitmapAndSource>
 BookmarkAppHelper::ResizeIconsAndGenerateMissing(
-    std::vector<web_app::BitmapAndSource> icons,
+    std::vector<BookmarkAppHelper::BitmapAndSource> icons,
     std::set<int> sizes_to_generate,
     WebApplicationInfo* web_app_info) {
-  SkColor generated_icon_color = SK_ColorTRANSPARENT;
+  // Resize provided icons to make sure we have versions for each size in
+  // |sizes_to_generate|.
+  std::map<int, BitmapAndSource> resized_bitmaps(
+      ConstrainBitmapsToSizes(icons, sizes_to_generate));
 
-  std::map<int, web_app::BitmapAndSource> resized_bitmaps =
-      web_app::ResizeIconsAndGenerateMissing(icons, sizes_to_generate,
-                                             web_app_info->app_url,
-                                             &generated_icon_color);
+  // Also add all provided icon sizes.
+  for (const BitmapAndSource& icon : icons) {
+    if (resized_bitmaps.find(icon.bitmap.width()) == resized_bitmaps.end())
+      resized_bitmaps.insert(std::make_pair(icon.bitmap.width(), icon));
+  }
 
-  web_app_info->generated_icon_color = generated_icon_color;
+  // Determine the color that will be used for the icon's background. For this
+  // the dominant color of the first icon found is used.
+  if (resized_bitmaps.size()) {
+    color_utils::GridSampler sampler;
+    web_app_info->generated_icon_color =
+        color_utils::CalculateKMeanColorOfBitmap(
+            resized_bitmaps.begin()->second.bitmap);
+  }
+
+  // Work out what icons we need to generate here. Icons are only generated if
+  // there is no icon in the required size.
+  std::set<int> generate_sizes;
+  for (int size : sizes_to_generate) {
+    if (resized_bitmaps.find(size) == resized_bitmaps.end())
+      generate_sizes.insert(size);
+  }
+  GenerateIcons(generate_sizes, web_app_info->app_url,
+                web_app_info->generated_icon_color, &resized_bitmaps);
+
   return resized_bitmaps;
 }
 
 // static
 void BookmarkAppHelper::UpdateWebAppIconsWithoutChangingLinks(
-    std::map<int, web_app::BitmapAndSource> bitmap_map,
+    std::map<int, BookmarkAppHelper::BitmapAndSource> bitmap_map,
     WebApplicationInfo* web_app_info) {
   // First add in the icon data that have urls with the url / size data from the
   // original web app info, and the data from the new icons (if any).
@@ -347,6 +528,17 @@
   }
 }
 
+BookmarkAppHelper::BitmapAndSource::BitmapAndSource() {
+}
+
+BookmarkAppHelper::BitmapAndSource::BitmapAndSource(const GURL& source_url_p,
+                                                    const SkBitmap& bitmap_p)
+    : source_url(source_url_p),
+      bitmap(bitmap_p) {
+}
+
+BookmarkAppHelper::BitmapAndSource::~BitmapAndSource() {
+}
 
 BookmarkAppHelper::BookmarkAppHelper(Profile* profile,
                                      WebApplicationInfo web_app_info,
@@ -484,14 +676,13 @@
     return;
   }
 
-  std::vector<web_app::BitmapAndSource> downloaded_icons;
+  std::vector<BitmapAndSource> downloaded_icons;
   for (const std::pair<GURL, std::vector<SkBitmap>>& url_bitmap : bitmaps) {
     for (const SkBitmap& bitmap : url_bitmap.second) {
       if (bitmap.empty() || bitmap.width() != bitmap.height())
         continue;
 
-      downloaded_icons.push_back(
-          web_app::BitmapAndSource(url_bitmap.first, bitmap));
+      downloaded_icons.push_back(BitmapAndSource(url_bitmap.first, bitmap));
     }
   }
 
@@ -499,7 +690,7 @@
   for (const WebApplicationInfo::IconInfo& icon_info : web_app_info_.icons) {
     const SkBitmap& icon = icon_info.data;
     if (!icon.drawsNothing() && icon.width() == icon.height()) {
-      downloaded_icons.push_back(web_app::BitmapAndSource(icon_info.url, icon));
+      downloaded_icons.push_back(BitmapAndSource(icon_info.url, icon));
     }
   }
 
@@ -507,9 +698,8 @@
   // icons down to smaller sizes, and generating icons for sizes where resizing
   // is not possible.
   web_app_info_.generated_icon_color = SK_ColorTRANSPARENT;
-  std::map<int, web_app::BitmapAndSource> size_to_icons =
-      ResizeIconsAndGenerateMissing(downloaded_icons, SizesToGenerate(),
-                                    &web_app_info_);
+  std::map<int, BitmapAndSource> size_to_icons = ResizeIconsAndGenerateMissing(
+      downloaded_icons, SizesToGenerate(), &web_app_info_);
   ReplaceWebAppIcons(size_to_icons, &web_app_info_);
   web_app_icon_downloader_.reset();
 
diff --git a/chrome/browser/extensions/bookmark_app_helper.h b/chrome/browser/extensions/bookmark_app_helper.h
index 382dd3c9..31827d5a0 100644
--- a/chrome/browser/extensions/bookmark_app_helper.h
+++ b/chrome/browser/extensions/bookmark_app_helper.h
@@ -15,7 +15,6 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/installable/installable_metrics.h"
-#include "chrome/browser/web_applications/components/web_app_icon_generator.h"
 #include "chrome/common/web_application_info.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
@@ -46,6 +45,15 @@
     kUnknown,
   };
 
+  struct BitmapAndSource {
+    BitmapAndSource();
+    BitmapAndSource(const GURL& source_url_p, const SkBitmap& bitmap_p);
+    ~BitmapAndSource();
+
+    GURL source_url;
+    SkBitmap bitmap;
+  };
+
   typedef base::Callback<void(const Extension*, const WebApplicationInfo&)>
       CreateBookmarkAppCallback;
 
@@ -67,10 +75,24 @@
                                            WebApplicationInfo* web_app_info,
                                            ForInstallableSite installable_site);
 
+  // This finds the closest not-smaller bitmap in |bitmaps| for each size in
+  // |sizes| and resizes it to that size. This returns a map of sizes to bitmaps
+  // which contains only bitmaps of a size in |sizes| and at most one bitmap of
+  // each size.
+  static std::map<int, BitmapAndSource> ConstrainBitmapsToSizes(
+      const std::vector<BitmapAndSource>& bitmaps,
+      const std::set<int>& sizes);
+
   // Adds a square container icon of |output_size| and 2 * |output_size| pixels
   // to |bitmaps| by drawing the given |letter| into a rounded background of
   // |color|. For each size, if an icon of the requested size already exists in
-  // |bitmaps|, nothing will happen. The generated icon is returned in a
+  // |bitmaps|, nothing will happen.
+  static void GenerateIcon(std::map<int, BitmapAndSource>* bitmaps,
+                           int output_size,
+                           SkColor color,
+                           char letter);
+
+  // Same as above, but the generated icon is returned in a
   // `WebApplicationInfo::IconInfo`.
   static WebApplicationInfo::IconInfo GenerateIconInfo(int output_size,
                                                        SkColor color,
@@ -83,8 +105,8 @@
 
   // Resize icons to the accepted sizes, and generate any that are missing. Does
   // not update |web_app_info| except to update |generated_icon_color|.
-  static std::map<int, web_app::BitmapAndSource> ResizeIconsAndGenerateMissing(
-      std::vector<web_app::BitmapAndSource> icons,
+  static std::map<int, BitmapAndSource> ResizeIconsAndGenerateMissing(
+      std::vector<BitmapAndSource> icons,
       std::set<int> sizes_to_generate,
       WebApplicationInfo* web_app_info);
 
@@ -96,7 +118,7 @@
   // |bitmap_map| that has a URL and size matching that in |web_app_info|, as
   // well as adding any new images from |bitmap_map| that have no URL.
   static void UpdateWebAppIconsWithoutChangingLinks(
-      std::map<int, web_app::BitmapAndSource> bitmap_map,
+      std::map<int, BookmarkAppHelper::BitmapAndSource> bitmap_map,
       WebApplicationInfo* web_app_info);
 
   // Begins the asynchronous bookmark app creation.
diff --git a/chrome/browser/extensions/bookmark_app_helper_unittest.cc b/chrome/browser/extensions/bookmark_app_helper_unittest.cc
index 4c430cf..3255caa 100644
--- a/chrome/browser/extensions/bookmark_app_helper_unittest.cc
+++ b/chrome/browser/extensions/bookmark_app_helper_unittest.cc
@@ -53,11 +53,18 @@
 const char kAppIcon3[] = "fav3.png";
 const char kAppIconURL1[] = "http://foo.com/1.png";
 const char kAppIconURL2[] = "http://foo.com/2.png";
+const char kAppIconURL3[] = "http://foo.com/3.png";
+const char kAppIconURL4[] = "http://foo.com/4.png";
 
 const int kIconSizeTiny = extension_misc::EXTENSION_ICON_BITTY;
 const int kIconSizeSmall = extension_misc::EXTENSION_ICON_SMALL;
 const int kIconSizeMedium = extension_misc::EXTENSION_ICON_MEDIUM;
 const int kIconSizeLarge = extension_misc::EXTENSION_ICON_LARGE;
+const int kIconSizeGigantor = extension_misc::EXTENSION_ICON_GIGANTOR;
+const int kIconSizeUnsupported = 123;
+
+const int kIconSizeSmallBetweenMediumAndLarge = 63;
+const int kIconSizeLargeBetweenMediumAndLarge = 96;
 
 class BookmarkAppHelperTest : public testing::Test {
  public:
@@ -105,6 +112,20 @@
   return bitmap;
 }
 
+BookmarkAppHelper::BitmapAndSource CreateSquareBitmapAndSourceWithColor(
+    int size,
+    SkColor color) {
+  return BookmarkAppHelper::BitmapAndSource(
+      GURL(), CreateSquareBitmapWithColor(size, color));
+}
+
+void ValidateBitmapSizeAndColor(SkBitmap bitmap, int size, SkColor color) {
+  // Obtain pixel lock to access pixels.
+  EXPECT_EQ(color, bitmap.getColor(0, 0));
+  EXPECT_EQ(size, bitmap.width());
+  EXPECT_EQ(size, bitmap.height());
+}
+
 WebApplicationInfo::IconInfo CreateIconInfoWithBitmap(int size, SkColor color) {
   WebApplicationInfo::IconInfo icon_info;
   icon_info.width = size;
@@ -113,6 +134,152 @@
   return icon_info;
 }
 
+std::set<int> TestSizesToGenerate() {
+  const int kIconSizesToGenerate[] = {
+      extension_misc::EXTENSION_ICON_SMALL,
+      extension_misc::EXTENSION_ICON_MEDIUM,
+      extension_misc::EXTENSION_ICON_LARGE,
+  };
+  return std::set<int>(kIconSizesToGenerate,
+                       kIconSizesToGenerate + arraysize(kIconSizesToGenerate));
+}
+
+void ValidateAllIconsWithURLsArePresent(const WebApplicationInfo& info_to_check,
+                                        const WebApplicationInfo& other_info) {
+  for (const auto& icon : info_to_check.icons) {
+    if (!icon.url.is_empty()) {
+      bool found = false;
+      for (const auto& other_icon : info_to_check.icons) {
+        if (other_icon.url == icon.url && other_icon.width == icon.width) {
+          found = true;
+          break;
+        }
+      }
+      EXPECT_TRUE(found);
+    }
+  }
+}
+
+std::vector<BookmarkAppHelper::BitmapAndSource>::const_iterator
+FindLargestBitmapAndSourceVector(
+    const std::vector<BookmarkAppHelper::BitmapAndSource>& bitmap_vector) {
+  auto result = bitmap_vector.end();
+  int largest = -1;
+  for (std::vector<BookmarkAppHelper::BitmapAndSource>::const_iterator it =
+           bitmap_vector.begin();
+       it != bitmap_vector.end(); ++it) {
+    if (it->bitmap.width() > largest) {
+      result = it;
+    }
+  }
+  return result;
+}
+
+std::vector<BookmarkAppHelper::BitmapAndSource>::const_iterator
+FindMatchingBitmapAndSourceVector(
+    const std::vector<BookmarkAppHelper::BitmapAndSource>& bitmap_vector,
+    int size) {
+  for (std::vector<BookmarkAppHelper::BitmapAndSource>::const_iterator it =
+           bitmap_vector.begin();
+       it != bitmap_vector.end(); ++it) {
+    if (it->bitmap.width() == size) {
+      return it;
+    }
+  }
+  return bitmap_vector.end();
+}
+
+std::vector<BookmarkAppHelper::BitmapAndSource>::const_iterator
+FindEqualOrLargerBitmapAndSourceVector(
+    const std::vector<BookmarkAppHelper::BitmapAndSource>& bitmap_vector,
+    int size) {
+  for (std::vector<BookmarkAppHelper::BitmapAndSource>::const_iterator it =
+           bitmap_vector.begin();
+       it != bitmap_vector.end(); ++it) {
+    if (it->bitmap.width() >= size) {
+      return it;
+    }
+  }
+  return bitmap_vector.end();
+}
+
+void ValidateIconsGeneratedAndResizedCorrectly(
+    std::vector<BookmarkAppHelper::BitmapAndSource> downloaded,
+    std::map<int, BookmarkAppHelper::BitmapAndSource> size_map,
+    std::set<int> sizes_to_generate,
+    int expected_generated,
+    int expected_resized) {
+  GURL empty_url("");
+  int number_generated = 0;
+  int number_resized = 0;
+
+  auto icon_largest = FindLargestBitmapAndSourceVector(downloaded);
+  for (const auto& size : sizes_to_generate) {
+    auto icon_downloaded = FindMatchingBitmapAndSourceVector(downloaded, size);
+    auto icon_larger = FindEqualOrLargerBitmapAndSourceVector(downloaded, size);
+    if (icon_downloaded == downloaded.end()) {
+      auto icon_resized = size_map.find(size);
+      if (icon_largest == downloaded.end()) {
+        // There are no downloaded icons. Expect an icon to be generated.
+        EXPECT_NE(size_map.end(), icon_resized);
+        EXPECT_EQ(size, icon_resized->second.bitmap.width());
+        EXPECT_EQ(size, icon_resized->second.bitmap.height());
+        EXPECT_EQ(size, icon_resized->second.bitmap.height());
+        EXPECT_EQ(empty_url, icon_resized->second.source_url);
+        ++number_generated;
+      } else {
+        // If there is a larger downloaded icon, it should be resized. Otherwise
+        // the largest downloaded icon should be resized.
+        auto icon_to_resize = icon_largest;
+        if (icon_larger != downloaded.end())
+          icon_to_resize = icon_larger;
+        EXPECT_NE(size_map.end(), icon_resized);
+        EXPECT_EQ(size, icon_resized->second.bitmap.width());
+        EXPECT_EQ(size, icon_resized->second.bitmap.height());
+        EXPECT_EQ(size, icon_resized->second.bitmap.height());
+        EXPECT_EQ(icon_to_resize->source_url, icon_resized->second.source_url);
+        ++number_resized;
+      }
+    } else {
+      // There is an icon of exactly this size downloaded. Expect no icon to be
+      // generated, and the existing downloaded icon to be used.
+      auto icon_resized = size_map.find(size);
+      EXPECT_NE(size_map.end(), icon_resized);
+      EXPECT_EQ(size, icon_resized->second.bitmap.width());
+      EXPECT_EQ(size, icon_resized->second.bitmap.height());
+      EXPECT_EQ(size, icon_downloaded->bitmap.width());
+      EXPECT_EQ(size, icon_downloaded->bitmap.height());
+      EXPECT_EQ(icon_downloaded->source_url, icon_resized->second.source_url);
+    }
+  }
+  EXPECT_EQ(expected_generated, number_generated);
+  EXPECT_EQ(expected_resized, number_resized);
+}
+
+void TestIconGeneration(int icon_size,
+                        int expected_generated,
+                        int expected_resized) {
+  std::vector<BookmarkAppHelper::BitmapAndSource> downloaded;
+
+  // Add an icon with a URL and bitmap. 'Download' it.
+  WebApplicationInfo::IconInfo icon_info =
+      CreateIconInfoWithBitmap(icon_size, SK_ColorRED);
+  icon_info.url = GURL(kAppIconURL1);
+  downloaded.push_back(BookmarkAppHelper::BitmapAndSource(
+        icon_info.url, icon_info.data));
+
+  // Now run the resizing/generation and validation.
+  WebApplicationInfo web_app_info;
+  std::map<int, BookmarkAppHelper::BitmapAndSource> size_map =
+      BookmarkAppHelper::ResizeIconsAndGenerateMissing(
+          downloaded, TestSizesToGenerate(), &web_app_info);
+
+  ValidateIconsGeneratedAndResizedCorrectly(downloaded, size_map,
+                                            TestSizesToGenerate(),
+                                            expected_generated,
+                                            expected_resized);
+}
+
 class TestBookmarkAppHelper : public BookmarkAppHelper {
  public:
   TestBookmarkAppHelper(ExtensionService* service,
@@ -524,6 +691,53 @@
   }
 }
 
+TEST_F(BookmarkAppHelperExtensionServiceTest, LinkedAppIconsAreNotChanged) {
+  WebApplicationInfo web_app_info;
+
+  // Add two icons with a URL and bitmap, two icons with just a bitmap, an
+  // icon with just URL and an icon in an unsupported size with just a URL.
+  WebApplicationInfo::IconInfo icon_info =
+      CreateIconInfoWithBitmap(kIconSizeSmall, SK_ColorRED);
+  icon_info.url = GURL(kAppIconURL1);
+  web_app_info.icons.push_back(icon_info);
+
+  icon_info = CreateIconInfoWithBitmap(kIconSizeMedium, SK_ColorRED);
+  icon_info.url = GURL(kAppIconURL2);
+  web_app_info.icons.push_back(icon_info);
+
+  icon_info.data = SkBitmap();
+  icon_info.url = GURL(kAppIconURL3);
+  icon_info.width = 0;
+  icon_info.height = 0;
+  web_app_info.icons.push_back(icon_info);
+
+  icon_info.url = GURL(kAppIconURL4);
+  web_app_info.icons.push_back(icon_info);
+
+  icon_info = CreateIconInfoWithBitmap(kIconSizeLarge, SK_ColorRED);
+  web_app_info.icons.push_back(icon_info);
+
+  icon_info = CreateIconInfoWithBitmap(kIconSizeUnsupported, SK_ColorRED);
+  web_app_info.icons.push_back(icon_info);
+
+  // 'Download' one of the icons without a size or bitmap.
+  std::vector<BookmarkAppHelper::BitmapAndSource> downloaded;
+  downloaded.push_back(BookmarkAppHelper::BitmapAndSource(
+      GURL(kAppIconURL3),
+      CreateSquareBitmapWithColor(kIconSizeLarge, SK_ColorBLACK)));
+
+  // Now run the resizing and generation into a new web app info.
+  WebApplicationInfo new_web_app_info;
+  std::map<int, BookmarkAppHelper::BitmapAndSource> size_map =
+      BookmarkAppHelper::ResizeIconsAndGenerateMissing(
+          downloaded, TestSizesToGenerate(), &new_web_app_info);
+
+  // Now check that the linked app icons (i.e. those with URLs) are matching in
+  // both lists.
+  ValidateAllIconsWithURLsArePresent(web_app_info, new_web_app_info);
+  ValidateAllIconsWithURLsArePresent(new_web_app_info, web_app_info);
+}
+
 TEST_F(BookmarkAppHelperTest, UpdateWebAppInfoFromManifest) {
   WebApplicationInfo web_app_info;
   web_app_info.title = base::UTF8ToUTF16(kAlternativeAppTitle);
@@ -598,6 +812,53 @@
   }
 }
 
+TEST_F(BookmarkAppHelperTest, ConstrainBitmapsToSizes) {
+  std::set<int> desired_sizes;
+  desired_sizes.insert(16);
+  desired_sizes.insert(32);
+  desired_sizes.insert(48);
+  desired_sizes.insert(96);
+  desired_sizes.insert(128);
+  desired_sizes.insert(256);
+
+  {
+    std::vector<BookmarkAppHelper::BitmapAndSource> bitmaps;
+    bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(16, SK_ColorRED));
+    bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(32, SK_ColorGREEN));
+    bitmaps.push_back(
+        CreateSquareBitmapAndSourceWithColor(144, SK_ColorYELLOW));
+
+    std::map<int, BookmarkAppHelper::BitmapAndSource> results(
+        BookmarkAppHelper::ConstrainBitmapsToSizes(bitmaps, desired_sizes));
+
+    EXPECT_EQ(6u, results.size());
+    ValidateBitmapSizeAndColor(results[16].bitmap, 16, SK_ColorRED);
+    ValidateBitmapSizeAndColor(results[32].bitmap, 32, SK_ColorGREEN);
+    ValidateBitmapSizeAndColor(results[48].bitmap, 48, SK_ColorYELLOW);
+    ValidateBitmapSizeAndColor(results[96].bitmap, 96, SK_ColorYELLOW);
+    ValidateBitmapSizeAndColor(results[128].bitmap, 128, SK_ColorYELLOW);
+    ValidateBitmapSizeAndColor(results[256].bitmap, 256, SK_ColorYELLOW);
+  }
+  {
+    std::vector<BookmarkAppHelper::BitmapAndSource> bitmaps;
+    bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(512, SK_ColorRED));
+    bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(18, SK_ColorGREEN));
+    bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(33, SK_ColorBLUE));
+    bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(17, SK_ColorYELLOW));
+
+    std::map<int, BookmarkAppHelper::BitmapAndSource> results(
+        BookmarkAppHelper::ConstrainBitmapsToSizes(bitmaps, desired_sizes));
+
+    EXPECT_EQ(6u, results.size());
+    ValidateBitmapSizeAndColor(results[16].bitmap, 16, SK_ColorYELLOW);
+    ValidateBitmapSizeAndColor(results[32].bitmap, 32, SK_ColorBLUE);
+    ValidateBitmapSizeAndColor(results[48].bitmap, 48, SK_ColorRED);
+    ValidateBitmapSizeAndColor(results[96].bitmap, 96, SK_ColorRED);
+    ValidateBitmapSizeAndColor(results[128].bitmap, 128, SK_ColorRED);
+    ValidateBitmapSizeAndColor(results[256].bitmap, 256, SK_ColorRED);
+  }
+}
+
 TEST_F(BookmarkAppHelperTest, IsValidBookmarkAppUrl) {
   EXPECT_TRUE(IsValidBookmarkAppUrl(GURL("https://chromium.org")));
   EXPECT_TRUE(IsValidBookmarkAppUrl(GURL("https://www.chromium.org")));
@@ -618,4 +879,140 @@
   EXPECT_FALSE(IsValidBookmarkAppUrl(GURL("chrome://extensions")));
 }
 
+TEST_F(BookmarkAppHelperTest, IconsResizedFromOddSizes) {
+  std::vector<BookmarkAppHelper::BitmapAndSource> downloaded;
+
+  // Add three icons with a URL and bitmap. 'Download' each of them.
+  WebApplicationInfo::IconInfo icon_info =
+      CreateIconInfoWithBitmap(kIconSizeSmall, SK_ColorRED);
+  icon_info.url = GURL(kAppIconURL1);
+  downloaded.push_back(BookmarkAppHelper::BitmapAndSource(
+        icon_info.url, icon_info.data));
+
+  icon_info = CreateIconInfoWithBitmap(kIconSizeSmallBetweenMediumAndLarge,
+                                       SK_ColorRED);
+  icon_info.url = GURL(kAppIconURL2);
+  downloaded.push_back(BookmarkAppHelper::BitmapAndSource(
+        icon_info.url, icon_info.data));
+
+  icon_info = CreateIconInfoWithBitmap(kIconSizeLargeBetweenMediumAndLarge,
+                                       SK_ColorRED);
+  icon_info.url = GURL(kAppIconURL3);
+  downloaded.push_back(BookmarkAppHelper::BitmapAndSource(
+        icon_info.url, icon_info.data));
+
+  // Now run the resizing and generation.
+  WebApplicationInfo web_app_info;
+  std::map<int, BookmarkAppHelper::BitmapAndSource> size_map =
+      BookmarkAppHelper::ResizeIconsAndGenerateMissing(
+          downloaded, TestSizesToGenerate(), &web_app_info);
+
+  // No icons should be generated. The LARGE and MEDIUM sizes should be resized.
+  ValidateIconsGeneratedAndResizedCorrectly(
+      downloaded, size_map, TestSizesToGenerate(), 0, 2);
+}
+
+TEST_F(BookmarkAppHelperTest, IconsResizedFromLarger) {
+  std::vector<BookmarkAppHelper::BitmapAndSource> downloaded;
+
+  // Add three icons with a URL and bitmap. 'Download' two of them and pretend
+  // the third failed to download.
+  WebApplicationInfo::IconInfo icon_info =
+      CreateIconInfoWithBitmap(kIconSizeSmall, SK_ColorRED);
+  icon_info.url = GURL(kAppIconURL1);
+  downloaded.push_back(BookmarkAppHelper::BitmapAndSource(
+        icon_info.url, icon_info.data));
+
+  icon_info = CreateIconInfoWithBitmap(kIconSizeLarge, SK_ColorBLUE);
+  icon_info.url = GURL(kAppIconURL2);
+
+  icon_info = CreateIconInfoWithBitmap(kIconSizeGigantor, SK_ColorBLACK);
+  icon_info.url = GURL(kAppIconURL3);
+  downloaded.push_back(BookmarkAppHelper::BitmapAndSource(
+        icon_info.url, icon_info.data));
+
+  // Now run the resizing and generation.
+  WebApplicationInfo web_app_info;
+  std::map<int, BookmarkAppHelper::BitmapAndSource> size_map =
+      BookmarkAppHelper::ResizeIconsAndGenerateMissing(
+          downloaded, TestSizesToGenerate(), &web_app_info);
+
+  // Expect icon for MEDIUM and LARGE to be resized from the gigantor icon
+  // as it was not downloaded.
+  ValidateIconsGeneratedAndResizedCorrectly(
+      downloaded, size_map, TestSizesToGenerate(), 0, 2);
+}
+
+TEST_F(BookmarkAppHelperTest, AllIconsGeneratedWhenNotDownloaded) {
+  std::vector<BookmarkAppHelper::BitmapAndSource> downloaded;
+
+  // Add three icons with a URL and bitmap. 'Download' none of them.
+  WebApplicationInfo::IconInfo icon_info =
+      CreateIconInfoWithBitmap(kIconSizeSmall, SK_ColorRED);
+  icon_info.url = GURL(kAppIconURL1);
+
+  icon_info = CreateIconInfoWithBitmap(kIconSizeLarge, SK_ColorBLUE);
+  icon_info.url = GURL(kAppIconURL2);
+
+  icon_info = CreateIconInfoWithBitmap(kIconSizeGigantor, SK_ColorBLACK);
+  icon_info.url = GURL(kAppIconURL3);
+
+  // Now run the resizing and generation.
+  WebApplicationInfo web_app_info;
+  std::map<int, BookmarkAppHelper::BitmapAndSource> size_map =
+      BookmarkAppHelper::ResizeIconsAndGenerateMissing(
+          downloaded, TestSizesToGenerate(), &web_app_info);
+
+  // Expect all icons to be generated.
+  ValidateIconsGeneratedAndResizedCorrectly(
+      downloaded, size_map, TestSizesToGenerate(), 3, 0);
+}
+
+TEST_F(BookmarkAppHelperTest, IconResizedFromLargerAndSmaller) {
+  std::vector<BookmarkAppHelper::BitmapAndSource> downloaded;
+
+  // Pretend the huge icon wasn't downloaded but two smaller ones were.
+  WebApplicationInfo::IconInfo icon_info =
+      CreateIconInfoWithBitmap(kIconSizeTiny, SK_ColorRED);
+  icon_info.url = GURL(kAppIconURL1);
+  downloaded.push_back(BookmarkAppHelper::BitmapAndSource(
+        icon_info.url, icon_info.data));
+
+  icon_info = CreateIconInfoWithBitmap(kIconSizeMedium, SK_ColorBLUE);
+  icon_info.url = GURL(kAppIconURL2);
+  downloaded.push_back(BookmarkAppHelper::BitmapAndSource(
+        icon_info.url, icon_info.data));
+
+  icon_info = CreateIconInfoWithBitmap(kIconSizeGigantor, SK_ColorBLACK);
+  icon_info.url = GURL(kAppIconURL3);
+
+  // Now run the resizing and generation.
+  WebApplicationInfo web_app_info;
+  std::map<int, BookmarkAppHelper::BitmapAndSource> size_map =
+      BookmarkAppHelper::ResizeIconsAndGenerateMissing(
+          downloaded, TestSizesToGenerate(), &web_app_info);
+
+  // Expect no icons to be generated, but the LARGE and SMALL icons to be
+  // resized from the MEDIUM icon.
+  ValidateIconsGeneratedAndResizedCorrectly(
+      downloaded, size_map, TestSizesToGenerate(), 0, 2);
+
+  // Verify specifically that the LARGE icons was resized from the medium icon.
+  const auto it = size_map.find(kIconSizeLarge);
+  EXPECT_NE(size_map.end(), it);
+  EXPECT_EQ(GURL(kAppIconURL2), it->second.source_url);
+}
+
+TEST_F(BookmarkAppHelperTest, IconsResizedWhenOnlyATinyOneIsProvided) {
+  // When only a tiny icon is downloaded (smaller than the three desired
+  // sizes), 3 icons should be resized.
+  TestIconGeneration(kIconSizeTiny, 0, 3);
+}
+
+TEST_F(BookmarkAppHelperTest, IconsResizedWhenOnlyAGigantorOneIsProvided) {
+  // When an enormous icon is provided, each desired icon size should be resized
+  // from it, and no icons should be generated.
+  TestIconGeneration(kIconSizeGigantor, 0, 3);
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/extension_garbage_collector.cc b/chrome/browser/extensions/extension_garbage_collector.cc
index 5b74ac1..3ff2f91 100644
--- a/chrome/browser/extensions/extension_garbage_collector.cc
+++ b/chrome/browser/extensions/extension_garbage_collector.cc
@@ -42,12 +42,14 @@
 
 namespace {
 
-// Wait this many seconds before trying to garbage collect extensions again.
-const int kGarbageCollectRetryDelayInSeconds = 30;
+// Wait this long before trying to garbage collect extensions again.
+constexpr base::TimeDelta kGarbageCollectRetryDelay =
+    base::TimeDelta::FromSeconds(30);
 
-// Wait this many seconds after startup to see if there are any extensions
-// which can be garbage collected.
-const int kGarbageCollectStartupDelay = 30;
+// Wait this long after startup to see if there are any extensions which can be
+// garbage collected.
+constexpr base::TimeDelta kGarbageCollectStartupDelay =
+    base::TimeDelta::FromSeconds(30);
 
 typedef std::multimap<std::string, base::FilePath> ExtensionPathsMultimap;
 
@@ -117,7 +119,7 @@
       FROM_HERE,
       base::Bind(&ExtensionGarbageCollector::GarbageCollectExtensions,
                  weak_factory_.GetWeakPtr()),
-      base::TimeDelta::FromSeconds(kGarbageCollectStartupDelay));
+      kGarbageCollectStartupDelay);
 
   extension_system->ready().Post(
       FROM_HERE,
@@ -182,7 +184,7 @@
         FROM_HERE,
         base::BindOnce(&ExtensionGarbageCollector::GarbageCollectExtensions,
                        weak_factory_.GetWeakPtr()),
-        base::TimeDelta::FromSeconds(kGarbageCollectRetryDelayInSeconds));
+        kGarbageCollectRetryDelay);
     return;
   }
 
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index f39888b..9625318 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -60,7 +60,7 @@
 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h"
 #include "chrome/browser/ui/webui/favicon_source.h"
 #include "chrome/browser/ui/webui/theme_source.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/buildflags.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/crash_keys.h"
@@ -122,12 +122,12 @@
 
 namespace {
 
-// Wait this many seconds after an extensions becomes idle before updating it.
-const int kUpdateIdleDelay = 5;
+// Wait this long after an extensions becomes idle before updating it.
+constexpr base::TimeDelta kUpdateIdleDelay = base::TimeDelta::FromSeconds(5);
 
 // IDs of extensions that have been replaced by component extensions and need to
 // be uninstalled.
-const char* kMigratedExtensionIds[] = {
+const char* const kMigratedExtensionIds[] = {
     "boadgeojelhgndaghljhdicfkmllpafd",  // Google Cast
     "dliochdbjfkdbacpmhlcpmleaejidimm"   // Google Cast (Beta)
 };
@@ -1812,7 +1812,7 @@
                     base::IgnoreResult(
                         &ExtensionService::FinishDelayedInstallationIfReady),
                     AsWeakPtr(), *it, false /*install_immediately*/),
-                base::TimeDelta::FromSeconds(kUpdateIdleDelay));
+                kUpdateIdleDelay);
           }
         }
       }
diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h
index 0e93279..eef19e97 100644
--- a/chrome/browser/extensions/extension_service.h
+++ b/chrome/browser/extensions/extension_service.h
@@ -24,7 +24,7 @@
 #include "chrome/browser/extensions/forced_extensions/installation_tracker.h"
 #include "chrome/browser/extensions/install_gate.h"
 #include "chrome/browser/extensions/pending_extension_manager.h"
-#include "chrome/browser/upgrade_observer.h"
+#include "chrome/browser/upgrade_detector/upgrade_observer.h"
 #include "components/sync/model/string_ordinal.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
diff --git a/chrome/browser/extensions/updater/extension_cache_delegate.cc b/chrome/browser/extensions/updater/extension_cache_delegate.cc
index b3ba719..0765f0ea 100644
--- a/chrome/browser/extensions/updater/extension_cache_delegate.cc
+++ b/chrome/browser/extensions/updater/extension_cache_delegate.cc
@@ -5,32 +5,26 @@
 #include "chrome/browser/extensions/updater/extension_cache_delegate.h"
 
 namespace extensions {
-namespace {
-
-// Default maximum size of local cache on disk, in bytes.
-const size_t kDefaultCacheSizeLimit = 256 * 1024 * 1024;
-
-// Default minimum size of local cache on disk, in bytes.
-const int kDefaultMinimumCacheSize = 1024 * 1024;
-
-// Maximum age of unused extensions in the cache.
-const int kMaxCacheAgeInDays = 30;
-
-}  // namespace
 
 ExtensionCacheDelegate::~ExtensionCacheDelegate() {
 }
 
 size_t ExtensionCacheDelegate::GetMinimumCacheSize() const {
+  // Default minimum size of local cache on disk, in bytes.
+  static constexpr int kDefaultMinimumCacheSize = 1024 * 1024;
   return kDefaultMinimumCacheSize;
 }
 
 size_t ExtensionCacheDelegate::GetMaximumCacheSize() const {
+  // Default maximum size of local cache on disk, in bytes.
+  static constexpr size_t kDefaultCacheSizeLimit = 256 * 1024 * 1024;
   return kDefaultCacheSizeLimit;
 }
 
 base::TimeDelta ExtensionCacheDelegate::GetMaximumCacheAge() const {
-  return base::TimeDelta::FromDays(kMaxCacheAgeInDays);
+  // Maximum age of unused extensions in the cache.
+  static constexpr base::TimeDelta kMaxCacheAge = base::TimeDelta::FromDays(30);
+  return kMaxCacheAge;
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/updater/local_extension_cache.cc b/chrome/browser/extensions/updater/local_extension_cache.cc
index c6a5d32..ae5f9d9 100644
--- a/chrome/browser/extensions/updater/local_extension_cache.cc
+++ b/chrome/browser/extensions/updater/local_extension_cache.cc
@@ -23,7 +23,8 @@
 
 // Delay between checks for flag file presence when waiting for the cache to
 // become ready.
-const int64_t kCacheStatusPollingDelayMs = 1000;
+constexpr base::TimeDelta kCacheStatusPollingDelay =
+    base::TimeDelta::FromSeconds(1);
 
 }  // namespace
 
@@ -39,8 +40,7 @@
       min_cache_age_(base::Time::Now() - max_cache_age),
       backend_task_runner_(backend_task_runner),
       state_(kUninitialized),
-      cache_status_polling_delay_(
-          base::TimeDelta::FromMilliseconds(kCacheStatusPollingDelayMs)),
+      cache_status_polling_delay_(kCacheStatusPollingDelay),
       weak_ptr_factory_(this) {}
 
 LocalExtensionCache::~LocalExtensionCache() {
diff --git a/chrome/browser/extensions/webstore_installer.cc b/chrome/browser/extensions/webstore_installer.cc
index a6d6335..c1f220b9 100644
--- a/chrome/browser/extensions/webstore_installer.cc
+++ b/chrome/browser/extensions/webstore_installer.cc
@@ -102,7 +102,8 @@
 // See http://crbug.com/371398.
 const char kAuthUserQueryKey[] = "authuser";
 
-const size_t kTimeRemainingMinutesThreshold = 1u;
+constexpr base::TimeDelta kTimeRemainingThreshold =
+    base::TimeDelta::FromSeconds(1);
 
 // Folder for downloading crx files from the webstore. This is used so that the
 // crx files don't go via the usual downloads folder.
@@ -738,13 +739,9 @@
   // timer.
   base::TimeDelta time_remaining;
   if (download_item_->TimeRemaining(&time_remaining) &&
-      time_remaining >
-          base::TimeDelta::FromSeconds(kTimeRemainingMinutesThreshold)) {
-    download_progress_timer_.Start(
-        FROM_HERE,
-        base::TimeDelta::FromSeconds(kTimeRemainingMinutesThreshold),
-        this,
-        &WebstoreInstaller::UpdateDownloadProgress);
+      time_remaining > kTimeRemainingThreshold) {
+    download_progress_timer_.Start(FROM_HERE, kTimeRemainingThreshold, this,
+                                   &WebstoreInstaller::UpdateDownloadProgress);
   } else {
     download_progress_timer_.Stop();
   }
diff --git a/chrome/browser/media/unified_autoplay_browsertest.cc b/chrome/browser/media/unified_autoplay_browsertest.cc
index 599f60d..bdc7f14f 100644
--- a/chrome/browser/media/unified_autoplay_browsertest.cc
+++ b/chrome/browser/media/unified_autoplay_browsertest.cc
@@ -3,13 +3,17 @@
 // found in the LICENSE file.
 
 #include "base/test/scoped_feature_list.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/test/browser_test_utils.h"
+#include "content/public/test/test_frame_navigation_observer.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "media/base/media_switches.h"
 #include "net/dns/mock_host_resolver.h"
@@ -18,6 +22,9 @@
 
 namespace {
 
+static constexpr char const kFramedTestPagePath[] =
+    "/media/autoplay_iframe.html";
+
 static constexpr char const kTestPagePath[] = "/media/unified_autoplay.html";
 
 }  // anonymous namespace
@@ -226,3 +233,159 @@
 
   EXPECT_TRUE(AttemptPlay(GetWebContents()));
 }
+
+// Integration tests for the new unified autoplay sound settings UI.
+
+class UnifiedAutoplaySettingBrowserTest : public UnifiedAutoplayBrowserTest {
+ public:
+  ~UnifiedAutoplaySettingBrowserTest() override = default;
+
+  void SetUpOnMainThread() override {
+    scoped_feature_list_.InitAndEnableFeature(media::kAutoplaySoundSettings);
+    UnifiedAutoplayBrowserTest::SetUpOnMainThread();
+  }
+
+  bool AutoplayAllowed(const content::ToRenderFrameHost& adapter) {
+    bool played = false;
+    EXPECT_TRUE(content::ExecuteScriptWithoutUserGestureAndExtractBool(
+        adapter, "tryPlayback();", &played));
+    return played;
+  }
+
+  void NavigateFrameAndWait(content::RenderFrameHost* rfh, const GURL& url) {
+    content::TestFrameNavigationObserver observer(rfh);
+    content::NavigationController::LoadURLParams params(url);
+    params.transition_type = ui::PAGE_TRANSITION_LINK;
+    params.frame_tree_node_id = rfh->GetFrameTreeNodeId();
+    content::WebContents::FromRenderFrameHost(rfh)
+        ->GetController()
+        .LoadURLWithParams(params);
+    observer.Wait();
+  }
+
+  HostContentSettingsMap* GetSettingsMap() {
+    return HostContentSettingsMapFactory::GetForProfile(
+        Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
+  }
+
+  content::RenderFrameHost* main_frame() const {
+    return web_contents()->GetAllFrames()[0];
+  }
+
+  content::RenderFrameHost* first_child() const {
+    return web_contents()->GetAllFrames()[1];
+  }
+
+ private:
+  content::WebContents* web_contents() const {
+    return browser()->tab_strip_model()->GetActiveWebContents();
+  }
+
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(UnifiedAutoplaySettingBrowserTest, Allow) {
+  GURL main_url(
+      embedded_test_server()->GetURL("example.com", kFramedTestPagePath));
+  GURL foo_url(embedded_test_server()->GetURL("foo.com", kFramedTestPagePath));
+
+  GetSettingsMap()->SetContentSettingDefaultScope(
+      main_url, main_url, CONTENT_SETTINGS_TYPE_SOUND, std::string(),
+      CONTENT_SETTING_ALLOW);
+
+  NavigateFrameAndWait(main_frame(), main_url);
+  NavigateFrameAndWait(first_child(), foo_url);
+
+  EXPECT_TRUE(AutoplayAllowed(main_frame()));
+  EXPECT_TRUE(AutoplayAllowed(first_child()));
+
+  // Simulate a same document navigation by navigating to #test.
+  GURL::Replacements replace_ref;
+  replace_ref.SetRefStr("test");
+  ui_test_utils::NavigateToURL(browser(),
+                               main_url.ReplaceComponents(replace_ref));
+
+  EXPECT_TRUE(AutoplayAllowed(main_frame()));
+  EXPECT_TRUE(AutoplayAllowed(first_child()));
+}
+
+IN_PROC_BROWSER_TEST_F(UnifiedAutoplaySettingBrowserTest, Allow_Wildcard) {
+  GURL main_url(
+      embedded_test_server()->GetURL("example.com", kFramedTestPagePath));
+  GURL foo_url(embedded_test_server()->GetURL("foo.org", kFramedTestPagePath));
+  GURL bar_url(embedded_test_server()->GetURL("bar.com", kFramedTestPagePath));
+
+  // Set a wildcard allow sound setting for *.com.
+  ContentSettingsPattern pattern(ContentSettingsPattern::FromString("[*.]com"));
+  GetSettingsMap()->SetWebsiteSettingCustomScope(
+      pattern, pattern, CONTENT_SETTINGS_TYPE_SOUND, std::string(),
+      std::make_unique<base::Value>(CONTENT_SETTING_ALLOW));
+
+  NavigateFrameAndWait(main_frame(), main_url);
+  EXPECT_TRUE(AutoplayAllowed(main_frame()));
+
+  NavigateFrameAndWait(main_frame(), foo_url);
+  EXPECT_FALSE(AutoplayAllowed(main_frame()));
+
+  NavigateFrameAndWait(main_frame(), bar_url);
+  EXPECT_TRUE(AutoplayAllowed(main_frame()));
+}
+
+IN_PROC_BROWSER_TEST_F(UnifiedAutoplaySettingBrowserTest, Block) {
+  GURL main_url(
+      embedded_test_server()->GetURL("example.com", kFramedTestPagePath));
+  GURL foo_url(embedded_test_server()->GetURL("foo.com", kFramedTestPagePath));
+
+  GetSettingsMap()->SetContentSettingDefaultScope(
+      main_url, main_url, CONTENT_SETTINGS_TYPE_SOUND, std::string(),
+      CONTENT_SETTING_BLOCK);
+
+  NavigateFrameAndWait(main_frame(), main_url);
+  NavigateFrameAndWait(first_child(), foo_url);
+
+  EXPECT_FALSE(AutoplayAllowed(main_frame()));
+  EXPECT_FALSE(AutoplayAllowed(first_child()));
+}
+
+IN_PROC_BROWSER_TEST_F(UnifiedAutoplaySettingBrowserTest, Block_Wildcard) {
+  GURL main_url(
+      embedded_test_server()->GetURL("example.com", kFramedTestPagePath));
+  GURL foo_url(embedded_test_server()->GetURL("foo.org", kFramedTestPagePath));
+  GURL bar_url(embedded_test_server()->GetURL("bar.com", kFramedTestPagePath));
+
+  // Set a wildcard block sound setting for *.com.
+  ContentSettingsPattern pattern(ContentSettingsPattern::FromString("[*.]com"));
+  GetSettingsMap()->SetWebsiteSettingCustomScope(
+      pattern, pattern, CONTENT_SETTINGS_TYPE_SOUND, std::string(),
+      std::make_unique<base::Value>(CONTENT_SETTING_BLOCK));
+
+  GetSettingsMap()->SetContentSettingDefaultScope(
+      foo_url, foo_url, CONTENT_SETTINGS_TYPE_SOUND, std::string(),
+      CONTENT_SETTING_ALLOW);
+
+  NavigateFrameAndWait(main_frame(), main_url);
+  EXPECT_FALSE(AutoplayAllowed(main_frame()));
+
+  NavigateFrameAndWait(main_frame(), foo_url);
+  EXPECT_TRUE(AutoplayAllowed(main_frame()));
+
+  NavigateFrameAndWait(main_frame(), bar_url);
+  EXPECT_FALSE(AutoplayAllowed(main_frame()));
+}
+
+IN_PROC_BROWSER_TEST_F(UnifiedAutoplaySettingBrowserTest, DefaultAllow) {
+  GURL main_url(
+      embedded_test_server()->GetURL("example.com", kFramedTestPagePath));
+  GURL foo_url(embedded_test_server()->GetURL("foo.com", kFramedTestPagePath));
+
+  EXPECT_EQ(
+      CONTENT_SETTING_ALLOW,
+      GetSettingsMap()->GetContentSetting(
+          main_url, main_url, CONTENT_SETTINGS_TYPE_SOUND, std::string()));
+
+  NavigateFrameAndWait(main_frame(), main_url);
+  NavigateFrameAndWait(first_child(), foo_url);
+
+  EXPECT_FALSE(AutoplayAllowed(main_frame()));
+  EXPECT_FALSE(AutoplayAllowed(first_child()));
+}
diff --git a/chrome/browser/media/webrtc/desktop_media_picker_factory.cc b/chrome/browser/media/webrtc/desktop_media_picker_factory.cc
new file mode 100644
index 0000000..cbb3e722
--- /dev/null
+++ b/chrome/browser/media/webrtc/desktop_media_picker_factory.cc
@@ -0,0 +1,9 @@
+// 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 "chrome/browser/media/webrtc/desktop_media_picker_factory.h"
+
+DesktopMediaPickerFactory::DesktopMediaPickerFactory() = default;
+
+DesktopMediaPickerFactory::~DesktopMediaPickerFactory() = default;
diff --git a/chrome/browser/media/webrtc/desktop_media_picker_factory.h b/chrome/browser/media/webrtc/desktop_media_picker_factory.h
new file mode 100644
index 0000000..3dbb871
--- /dev/null
+++ b/chrome/browser/media/webrtc/desktop_media_picker_factory.h
@@ -0,0 +1,32 @@
+// 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 CHROME_BROWSER_MEDIA_WEBRTC_DESKTOP_MEDIA_PICKER_FACTORY_H_
+#define CHROME_BROWSER_MEDIA_WEBRTC_DESKTOP_MEDIA_PICKER_FACTORY_H_
+
+#include <memory>
+#include <vector>
+
+#include "chrome/browser/media/webrtc/desktop_media_list.h"
+#include "chrome/browser/media/webrtc/desktop_media_picker.h"
+#include "content/public/browser/desktop_media_id.h"
+
+// Interface for factory creating DesktopMediaList and DesktopMediaPicker
+// instances.
+class DesktopMediaPickerFactory {
+ public:
+  virtual ~DesktopMediaPickerFactory();
+
+  virtual std::unique_ptr<DesktopMediaPicker> CreatePicker() = 0;
+  virtual std::vector<std::unique_ptr<DesktopMediaList>> CreateMediaList(
+      const std::vector<content::DesktopMediaID::Type>& types) = 0;
+
+ protected:
+  DesktopMediaPickerFactory();
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DesktopMediaPickerFactory);
+};
+
+#endif  // CHROME_BROWSER_MEDIA_WEBRTC_DESKTOP_MEDIA_PICKER_FACTORY_H_
diff --git a/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.cc b/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.cc
new file mode 100644
index 0000000..fa7d8728
--- /dev/null
+++ b/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.cc
@@ -0,0 +1,91 @@
+// 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 "chrome/browser/media/webrtc/desktop_media_picker_factory_impl.h"
+
+#include "base/no_destructor.h"
+#include "build/build_config.h"
+#include "chrome/browser/media/webrtc/desktop_media_list_ash.h"
+#include "chrome/browser/media/webrtc/native_desktop_media_list.h"
+#include "chrome/browser/media/webrtc/tab_desktop_media_list.h"
+#include "content/public/browser/desktop_capture.h"
+
+DesktopMediaPickerFactoryImpl::DesktopMediaPickerFactoryImpl() = default;
+
+DesktopMediaPickerFactoryImpl::~DesktopMediaPickerFactoryImpl() = default;
+
+// static
+DesktopMediaPickerFactoryImpl* DesktopMediaPickerFactoryImpl::GetInstance() {
+  static base::NoDestructor<DesktopMediaPickerFactoryImpl> impl;
+  return impl.get();
+}
+
+std::unique_ptr<DesktopMediaPicker>
+DesktopMediaPickerFactoryImpl::CreatePicker() {
+// DesktopMediaPicker is implemented only for Windows, OSX and Aura Linux
+// builds.
+#if defined(TOOLKIT_VIEWS) || defined(OS_MACOSX)
+  return DesktopMediaPicker::Create();
+#else
+  return nullptr;
+#endif
+}
+
+std::vector<std::unique_ptr<DesktopMediaList>>
+DesktopMediaPickerFactoryImpl::CreateMediaList(
+    const std::vector<content::DesktopMediaID::Type>& types) {
+  // Keep same order as the input |sources| and avoid duplicates.
+  std::vector<std::unique_ptr<DesktopMediaList>> source_lists;
+  bool have_screen_list = false;
+  bool have_window_list = false;
+  bool have_tab_list = false;
+  for (auto source_type : types) {
+    switch (source_type) {
+      case content::DesktopMediaID::TYPE_NONE:
+        break;
+      case content::DesktopMediaID::TYPE_SCREEN: {
+        if (have_screen_list)
+          continue;
+        std::unique_ptr<DesktopMediaList> screen_list;
+#if defined(OS_CHROMEOS)
+        screen_list = std::make_unique<DesktopMediaListAsh>(
+            content::DesktopMediaID::TYPE_SCREEN);
+#else   // !defined(OS_CHROMEOS)
+        screen_list = std::make_unique<NativeDesktopMediaList>(
+            content::DesktopMediaID::TYPE_SCREEN,
+            content::desktop_capture::CreateScreenCapturer());
+#endif  // !defined(OS_CHROMEOS)
+        have_screen_list = true;
+        source_lists.push_back(std::move(screen_list));
+        break;
+      }
+      case content::DesktopMediaID::TYPE_WINDOW: {
+        if (have_window_list)
+          continue;
+        std::unique_ptr<DesktopMediaList> window_list;
+#if defined(OS_CHROMEOS)
+        window_list = std::make_unique<DesktopMediaListAsh>(
+            content::DesktopMediaID::TYPE_WINDOW);
+#else   // !defined(OS_CHROMEOS)
+        window_list = std::make_unique<NativeDesktopMediaList>(
+            content::DesktopMediaID::TYPE_WINDOW,
+            content::desktop_capture::CreateWindowCapturer());
+#endif  // !defined(OS_CHROMEOS)
+        have_window_list = true;
+        source_lists.push_back(std::move(window_list));
+        break;
+      }
+      case content::DesktopMediaID::TYPE_WEB_CONTENTS: {
+        if (have_tab_list)
+          continue;
+        std::unique_ptr<DesktopMediaList> tab_list =
+            std::make_unique<TabDesktopMediaList>();
+        have_tab_list = true;
+        source_lists.push_back(std::move(tab_list));
+        break;
+      }
+    }
+  }
+  return source_lists;
+}
diff --git a/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.h b/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.h
new file mode 100644
index 0000000..4888b59
--- /dev/null
+++ b/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.h
@@ -0,0 +1,35 @@
+// 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 CHROME_BROWSER_MEDIA_WEBRTC_DESKTOP_MEDIA_PICKER_FACTORY_IMPL_H_
+#define CHROME_BROWSER_MEDIA_WEBRTC_DESKTOP_MEDIA_PICKER_FACTORY_IMPL_H_
+
+#include <memory>
+#include <vector>
+
+#include "chrome/browser/media/webrtc/desktop_media_list.h"
+#include "chrome/browser/media/webrtc/desktop_media_picker.h"
+#include "chrome/browser/media/webrtc/desktop_media_picker_factory.h"
+#include "content/public/browser/desktop_media_id.h"
+
+// Factory creating DesktopMediaList and DesktopMediaPicker instances.
+class DesktopMediaPickerFactoryImpl : public DesktopMediaPickerFactory {
+ public:
+  DesktopMediaPickerFactoryImpl();
+  ~DesktopMediaPickerFactoryImpl() override;
+
+  // Get the lazy initialized instance of the factory.
+  static DesktopMediaPickerFactoryImpl* GetInstance();
+
+  // DesktopMediaPickerFactory implementation
+  // Can return |nullptr| if platform doesn't support DesktopMediaPicker.
+  std::unique_ptr<DesktopMediaPicker> CreatePicker() override;
+  std::vector<std::unique_ptr<DesktopMediaList>> CreateMediaList(
+      const std::vector<content::DesktopMediaID::Type>& types) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DesktopMediaPickerFactoryImpl);
+};
+
+#endif  // CHROME_BROWSER_MEDIA_WEBRTC_DESKTOP_MEDIA_PICKER_FACTORY_IMPL_H_
diff --git a/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc b/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc
new file mode 100644
index 0000000..d627b28
--- /dev/null
+++ b/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc
@@ -0,0 +1,104 @@
+// 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 "chrome/browser/media/webrtc/fake_desktop_media_picker_factory.h"
+
+#include "base/memory/weak_ptr.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "chrome/browser/media/webrtc/fake_desktop_media_list.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+class FakeDesktopMediaPicker : public DesktopMediaPicker {
+ public:
+  explicit FakeDesktopMediaPicker(
+      FakeDesktopMediaPickerFactory::TestFlags* expectation)
+      : expectation_(expectation), weak_factory_(this) {
+    expectation_->picker_created = true;
+  }
+  ~FakeDesktopMediaPicker() override { expectation_->picker_deleted = true; }
+
+  // DesktopMediaPicker interface.
+  void Show(const DesktopMediaPicker::Params& params,
+            std::vector<std::unique_ptr<DesktopMediaList>> source_lists,
+            const DoneCallback& done_callback) override {
+    bool show_screens = false;
+    bool show_windows = false;
+    bool show_tabs = false;
+
+    for (auto& source_list : source_lists) {
+      switch (source_list->GetMediaListType()) {
+        case content::DesktopMediaID::TYPE_NONE:
+          break;
+        case content::DesktopMediaID::TYPE_SCREEN:
+          show_screens = true;
+          break;
+        case content::DesktopMediaID::TYPE_WINDOW:
+          show_windows = true;
+          break;
+        case content::DesktopMediaID::TYPE_WEB_CONTENTS:
+          show_tabs = true;
+          break;
+      }
+    }
+    EXPECT_EQ(expectation_->expect_screens, show_screens);
+    EXPECT_EQ(expectation_->expect_windows, show_windows);
+    EXPECT_EQ(expectation_->expect_tabs, show_tabs);
+    EXPECT_EQ(expectation_->expect_audio, params.request_audio);
+    EXPECT_EQ(params.modality, ui::ModalType::MODAL_TYPE_CHILD);
+
+    if (!expectation_->cancelled) {
+      // Post a task to call the callback asynchronously.
+      base::ThreadTaskRunnerHandle::Get()->PostTask(
+          FROM_HERE, base::BindOnce(&FakeDesktopMediaPicker::CallCallback,
+                                    weak_factory_.GetWeakPtr(), done_callback));
+    } else {
+      // If we expect the dialog to be cancelled then store the callback to
+      // retain reference to the callback handler.
+      done_callback_ = done_callback;
+    }
+  }
+
+ private:
+  void CallCallback(DoneCallback done_callback) {
+    done_callback.Run(expectation_->selected_source);
+  }
+
+  FakeDesktopMediaPickerFactory::TestFlags* expectation_;
+  DoneCallback done_callback_;
+
+  base::WeakPtrFactory<FakeDesktopMediaPicker> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeDesktopMediaPicker);
+};
+
+FakeDesktopMediaPickerFactory::FakeDesktopMediaPickerFactory() = default;
+
+FakeDesktopMediaPickerFactory::~FakeDesktopMediaPickerFactory() = default;
+
+void FakeDesktopMediaPickerFactory::SetTestFlags(TestFlags* test_flags,
+                                                 int tests_count) {
+  test_flags_ = test_flags;
+  tests_count_ = tests_count;
+  current_test_ = 0;
+}
+
+std::unique_ptr<DesktopMediaPicker>
+FakeDesktopMediaPickerFactory::CreatePicker() {
+  EXPECT_LE(current_test_, tests_count_);
+  if (current_test_ >= tests_count_)
+    return std::unique_ptr<DesktopMediaPicker>();
+  ++current_test_;
+  return std::unique_ptr<DesktopMediaPicker>(
+      new FakeDesktopMediaPicker(test_flags_ + current_test_ - 1));
+}
+
+std::vector<std::unique_ptr<DesktopMediaList>>
+FakeDesktopMediaPickerFactory::CreateMediaList(
+    const std::vector<content::DesktopMediaID::Type>& types) {
+  EXPECT_LE(current_test_, tests_count_);
+  std::vector<std::unique_ptr<DesktopMediaList>> media_lists;
+  for (auto source_type : types)
+    media_lists.emplace_back(new FakeDesktopMediaList(source_type));
+  return media_lists;
+}
diff --git a/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.h b/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.h
new file mode 100644
index 0000000..4899bdde
--- /dev/null
+++ b/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.h
@@ -0,0 +1,52 @@
+// 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 CHROME_BROWSER_MEDIA_WEBRTC_FAKE_DESKTOP_MEDIA_PICKER_FACTORY_H_
+#define CHROME_BROWSER_MEDIA_WEBRTC_FAKE_DESKTOP_MEDIA_PICKER_FACTORY_H_
+
+#include <memory>
+#include <vector>
+
+#include "chrome/browser/media/webrtc/desktop_media_list.h"
+#include "chrome/browser/media/webrtc/desktop_media_picker.h"
+#include "chrome/browser/media/webrtc/desktop_media_picker_factory.h"
+#include "content/public/browser/desktop_media_id.h"
+
+// Used in tests to supply fake picker.
+class FakeDesktopMediaPickerFactory : public DesktopMediaPickerFactory {
+ public:
+  struct TestFlags {
+    bool expect_screens = false;
+    bool expect_windows = false;
+    bool expect_tabs = false;
+    bool expect_audio = false;
+    content::DesktopMediaID selected_source;
+    bool cancelled = false;
+
+    // Following flags are set by FakeDesktopMediaPicker when it's created and
+    // deleted.
+    bool picker_created = false;
+    bool picker_deleted = false;
+  };
+
+  FakeDesktopMediaPickerFactory();
+  ~FakeDesktopMediaPickerFactory() override;
+
+  //  |test_flags| are expected to outlive the factory.
+  void SetTestFlags(TestFlags* test_flags, int tests_count);
+
+  // DesktopMediaPickerFactory implementation
+  std::unique_ptr<DesktopMediaPicker> CreatePicker() override;
+  std::vector<std::unique_ptr<DesktopMediaList>> CreateMediaList(
+      const std::vector<content::DesktopMediaID::Type>& types) override;
+
+ private:
+  TestFlags* test_flags_;
+  int tests_count_;
+  int current_test_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeDesktopMediaPickerFactory);
+};
+
+#endif  // CHROME_BROWSER_MEDIA_WEBRTC_FAKE_DESKTOP_MEDIA_PICKER_FACTORY_H_
diff --git a/chrome/browser/metrics/upgrade_metrics_provider.cc b/chrome/browser/metrics/upgrade_metrics_provider.cc
index 826a67773..cd8c1166 100644
--- a/chrome/browser/metrics/upgrade_metrics_provider.cc
+++ b/chrome/browser/metrics/upgrade_metrics_provider.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/metrics/upgrade_metrics_provider.h"
 
 #include "base/metrics/histogram_macros.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 
 UpgradeMetricsProvider::UpgradeMetricsProvider() {}
 
diff --git a/chrome/browser/metrics/upgrade_metrics_provider_unittest.cc b/chrome/browser/metrics/upgrade_metrics_provider_unittest.cc
index 6068a99..d8685e5 100644
--- a/chrome/browser/metrics/upgrade_metrics_provider_unittest.cc
+++ b/chrome/browser/metrics/upgrade_metrics_provider_unittest.cc
@@ -6,7 +6,7 @@
 
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_task_environment.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 class UpgradeMetricsProviderTest : public testing::Test {
diff --git a/chrome/browser/metrics/variations/chrome_variations_service_client.cc b/chrome/browser/metrics/variations/chrome_variations_service_client.cc
index e89337b..420e21eb 100644
--- a/chrome/browser/metrics/variations/chrome_variations_service_client.cc
+++ b/chrome/browser/metrics/variations/chrome_variations_service_client.cc
@@ -13,7 +13,7 @@
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
-#include "chrome/browser/upgrade_detector_impl.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector_impl.h"
 #endif
 
 #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/net/network_request_metrics_browsertest.cc b/chrome/browser/net/network_request_metrics_browsertest.cc
index de69271..9ee15b7d 100644
--- a/chrome/browser/net/network_request_metrics_browsertest.cc
+++ b/chrome/browser/net/network_request_metrics_browsertest.cc
@@ -79,6 +79,7 @@
   // content::WebContentsObserver implementation:
   void ResourceLoadComplete(
       RenderFrameHost* render_frame_host,
+      const content::GlobalRequestID& request_id,
       const content::mojom::ResourceLoadInfo& resource_load_info) override {
     EXPECT_EQ(RESOURCE_TYPE_MAIN_FRAME, resource_load_info.resource_type);
     EXPECT_EQ(net::OK, resource_load_info.net_error);
diff --git a/chrome/browser/net_benchmarking.cc b/chrome/browser/net_benchmarking.cc
index f74bf002..03aeba4 100644
--- a/chrome/browser/net_benchmarking.cc
+++ b/chrome/browser/net_benchmarking.cc
@@ -77,39 +77,36 @@
   return command_line.HasSwitch(switches::kEnableNetBenchmarking);
 }
 
-void NetBenchmarking::ClearCache(const ClearCacheCallback& callback) {
+void NetBenchmarking::ClearCache(ClearCacheCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   auto* network_context = GetNetworkContext(render_process_id_);
-  if (network_context) {
-    network_context->ClearHttpCache(base::Time(), base::Time(), nullptr,
-                                    callback);
-  }
+  CHECK(network_context);
+  network_context->ClearHttpCache(base::Time(), base::Time(), nullptr,
+                                  std::move(callback));
 }
 
 void NetBenchmarking::ClearHostResolverCache(
-    const ClearHostResolverCacheCallback& callback) {
+    ClearHostResolverCacheCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   auto* network_context = GetNetworkContext(render_process_id_);
-  if (network_context) {
-    network_context->ClearHostCache(nullptr, callback);
-  }
+  CHECK(network_context);
+  network_context->ClearHostCache(nullptr, std::move(callback));
 }
 
 void NetBenchmarking::CloseCurrentConnections(
-    const CloseCurrentConnectionsCallback& callback) {
+    CloseCurrentConnectionsCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   auto* network_context = GetNetworkContext(render_process_id_);
-  if (network_context) {
-    network_context->CloseAllConnections(callback);
-  }
+  CHECK(network_context);
+  network_context->CloseAllConnections(std::move(callback));
 }
 
 void NetBenchmarking::ClearPredictorCache(
-    const ClearPredictorCacheCallback& callback) {
+    ClearPredictorCacheCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (loading_predictor_)
     loading_predictor_->resource_prefetch_predictor()->DeleteAllUrls();
   if (predictor_)
     predictor_->DiscardAllResultsAndClearPrefsOnUIThread();
-  callback.Run();
+  std::move(callback).Run();
 }
diff --git a/chrome/browser/net_benchmarking.h b/chrome/browser/net_benchmarking.h
index fc862a56..48218e2 100644
--- a/chrome/browser/net_benchmarking.h
+++ b/chrome/browser/net_benchmarking.h
@@ -42,12 +42,10 @@
  private:
   // chrome:mojom:NetBenchmarking.
   void CloseCurrentConnections(
-      const CloseCurrentConnectionsCallback& callback) override;
-  void ClearCache(const ClearCacheCallback& callback) override;
-  void ClearHostResolverCache(
-      const ClearHostResolverCacheCallback& callback) override;
-  void ClearPredictorCache(
-      const ClearPredictorCacheCallback& callback) override;
+      CloseCurrentConnectionsCallback callback) override;
+  void ClearCache(ClearCacheCallback callback) override;
+  void ClearHostResolverCache(ClearHostResolverCacheCallback callback) override;
+  void ClearPredictorCache(ClearPredictorCacheCallback callback) override;
 
   // These weak pointers should be dereferenced only on the UI thread.
   base::WeakPtr<predictors::LoadingPredictor> loading_predictor_;
diff --git a/chrome/browser/offline_pages/android/downloads/offline_page_download_bridge.cc b/chrome/browser/offline_pages/android/downloads/offline_page_download_bridge.cc
index df91c2f..a3569bc1 100644
--- a/chrome/browser/offline_pages/android/downloads/offline_page_download_bridge.cc
+++ b/chrome/browser/offline_pages/android/downloads/offline_page_download_bridge.cc
@@ -67,7 +67,9 @@
   // DownloadUIAdapter::Delegate
   bool IsVisibleInUI(const ClientId& client_id) override;
   void SetUIAdapter(DownloadUIAdapter* ui_adapter) override;
-  void OpenItem(const OfflineItem& item, int64_t offline_id) override;
+  void OpenItem(const OfflineItem& item,
+                int64_t offline_id,
+                offline_items_collection::LaunchLocation location) override;
   bool MaybeSuppressNotification(const std::string& origin,
                                  const ClientId& id) override;
 
@@ -87,11 +89,14 @@
 
 void DownloadUIAdapterDelegate::SetUIAdapter(DownloadUIAdapter* ui_adapter) {}
 
-void DownloadUIAdapterDelegate::OpenItem(const OfflineItem& item,
-                                         int64_t offline_id) {
+void DownloadUIAdapterDelegate::OpenItem(
+    const OfflineItem& item,
+    int64_t offline_id,
+    offline_items_collection::LaunchLocation location) {
   JNIEnv* env = AttachCurrentThread();
   Java_OfflinePageDownloadBridge_openItem(
       env, ConvertUTF8ToJavaString(env, item.page_url.spec()), offline_id,
+      static_cast<int>(location),
       offline_pages::ShouldOfflinePagesInDownloadHomeOpenInCct());
 }
 
diff --git a/chrome/browser/offline_pages/android/offline_page_bridge.cc b/chrome/browser/offline_pages/android/offline_page_bridge.cc
index 17bb27c..f15d6ff 100644
--- a/chrome/browser/offline_pages/android/offline_page_bridge.cc
+++ b/chrome/browser/offline_pages/android/offline_page_bridge.cc
@@ -169,22 +169,28 @@
   base::android::RunObjectCallbackAndroid(j_callback_obj, j_result);
 }
 
-void GetLaunchUrlBySizeAndDigestCallback(
+void RunLoadUrlParamsCallbackAndroid(
     const ScopedJavaGlobalRef<jobject>& j_callback_obj,
     const GURL& url,
-    const std::string& extra_headers) {
+    const OfflinePageHeader& offline_page_header) {
   JNIEnv* env = base::android::AttachCurrentThread();
   ScopedJavaLocalRef<jobject> loadUrlParams =
       Java_OfflinePageBridge_createLoadUrlParams(
           env, ConvertUTF8ToJavaString(env, url.spec()),
-          ConvertUTF8ToJavaString(env, extra_headers));
+          ConvertUTF8ToJavaString(env,
+                                  offline_page_header.GetHeaderKeyString()),
+          ConvertUTF8ToJavaString(env,
+                                  offline_page_header.GetHeaderValueString()));
   base::android::RunObjectCallbackAndroid(j_callback_obj, loadUrlParams);
 }
 
-void ValidateFileCallback(const ScopedJavaGlobalRef<jobject>& j_callback_obj,
-                          const GURL& url,
-                          const base::FilePath& file_path,
-                          bool is_trusted) {
+void ValidateFileCallback(
+    offline_items_collection::LaunchLocation launch_location,
+    const ScopedJavaGlobalRef<jobject>& j_callback_obj,
+    int64_t offline_id,
+    const GURL& url,
+    const base::FilePath& file_path,
+    bool is_trusted) {
   // If trusted, the launch url will be the http/https url of the offline
   // page. Otherwise, the launch url will be the file URL pointing to the
   // archive file of the offline page.
@@ -193,7 +199,32 @@
     launch_url = url;
   else
     launch_url = net::FilePathToFileURL(file_path);
-  base::android::RunStringCallbackAndroid(j_callback_obj, launch_url.spec());
+
+  offline_pages::OfflinePageHeader offline_header;
+  switch (launch_location) {
+    case offline_items_collection::LaunchLocation::NOTIFICATION:
+      offline_header.reason =
+          offline_pages::OfflinePageHeader::Reason::NOTIFICATION;
+      break;
+    case offline_items_collection::LaunchLocation::PROGRESS_BAR:
+      offline_header.reason =
+          offline_pages::OfflinePageHeader::Reason::PROGRESS_BAR;
+      break;
+    case offline_items_collection::LaunchLocation::SUGGESTION:
+      offline_header.reason =
+          offline_pages::OfflinePageHeader::Reason::SUGGESTION;
+      break;
+    case offline_items_collection::LaunchLocation::DOWNLOAD_HOME:
+      offline_header.reason =
+          offline_pages::OfflinePageHeader::Reason::DOWNLOAD;
+      break;
+    default:
+      NOTREACHED();
+  }
+  offline_header.need_to_persist = true;
+  offline_header.id = base::Int64ToString(offline_id);
+
+  RunLoadUrlParamsCallbackAndroid(j_callback_obj, launch_url, offline_header);
 }
 
 ScopedJavaLocalRef<jobjectArray> JNI_SavePageRequest_CreateJavaSavePageRequests(
@@ -896,16 +927,21 @@
       &CheckForNewOfflineContentCallback, pages_created_after, j_callback_ref));
 }
 
-void OfflinePageBridge::GetLaunchUrlByOfflineId(
+void OfflinePageBridge::GetLoadUrlParamsByOfflineId(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& obj,
     jlong j_offline_id,
+    jint launch_location,
     const base::android::JavaParamRef<jobject>& j_callback_obj) {
   ScopedJavaGlobalRef<jobject> j_callback_ref(j_callback_obj);
 
   offline_page_model_->GetPageByOfflineId(
-      j_offline_id, base::Bind(&OfflinePageBridge::GetPageByOfflineIdDone,
-                               weak_ptr_factory_.GetWeakPtr(), j_callback_ref));
+      j_offline_id,
+      base::Bind(&OfflinePageBridge::GetPageByOfflineIdDone,
+                 weak_ptr_factory_.GetWeakPtr(),
+                 static_cast<offline_items_collection::LaunchLocation>(
+                     launch_location),
+                 j_callback_ref));
 }
 
 void OfflinePageBridge::GetLoadUrlParamsForOpeningMhtmlFileOrContent(
@@ -945,16 +981,18 @@
 }
 
 void OfflinePageBridge::GetPageByOfflineIdDone(
+    offline_items_collection::LaunchLocation launch_location,
     const ScopedJavaGlobalRef<jobject>& j_callback_obj,
     const OfflinePageItem* offline_page) {
   if (!offline_page) {
-    base::android::RunStringCallbackAndroid(j_callback_obj, std::string());
+    base::android::RunObjectCallbackAndroid(j_callback_obj, nullptr);
     return;
   }
 
   if (offline_page_model_->IsArchiveInInternalDir(offline_page->file_path)) {
-    base::android::RunStringCallbackAndroid(j_callback_obj,
-                                            offline_page->url.spec());
+    ValidateFileCallback(launch_location, j_callback_obj,
+                         offline_page->offline_id, offline_page->url,
+                         offline_page->file_path, true /* is_trusted*/);
     return;
   }
 
@@ -962,7 +1000,8 @@
       FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
       base::Bind(&ArchiveValidator::ValidateFile, offline_page->file_path,
                  offline_page->file_size, offline_page->digest),
-      base::Bind(&ValidateFileCallback, j_callback_obj, offline_page->url,
+      base::Bind(&ValidateFileCallback, launch_location, j_callback_obj,
+                 offline_page->offline_id, offline_page->url,
                  offline_page->file_path));
 }
 
@@ -972,8 +1011,8 @@
     std::pair<int64_t, std::string> size_and_digest) {
   // If size or digest can't be obtained, launch the intent URL.
   if (!size_and_digest.first || size_and_digest.second.empty()) {
-    GetLaunchUrlBySizeAndDigestCallback(j_callback_obj, intent_url,
-                                        std::string());
+    RunLoadUrlParamsCallbackAndroid(j_callback_obj, intent_url,
+                                    offline_pages::OfflinePageHeader());
     return;
   }
 
@@ -989,10 +1028,9 @@
     const GURL& intent_url,
     const OfflinePageItem* offline_page) {
   GURL launch_url;
-  std::string extra_headers;
+  offline_pages::OfflinePageHeader offline_header;
   if (offline_page) {
     launch_url = offline_page->url;
-    offline_pages::OfflinePageHeader offline_header;
     offline_header.reason =
         intent_url.SchemeIsFile()
             ? offline_pages::OfflinePageHeader::Reason::FILE_URL_INTENT
@@ -1000,13 +1038,11 @@
     offline_header.need_to_persist = true;
     offline_header.id = base::Int64ToString(offline_page->offline_id);
     offline_header.intent_url = intent_url;
-    extra_headers = offline_header.GetCompleteHeaderString();
   } else {
     // If the offline page can't be found, launch the intent URL.
     launch_url = intent_url;
   }
-  GetLaunchUrlBySizeAndDigestCallback(j_callback_obj, launch_url,
-                                      extra_headers);
+  RunLoadUrlParamsCallbackAndroid(j_callback_obj, launch_url, offline_header);
 }
 
 void OfflinePageBridge::AcquireFileAccessPermission(
diff --git a/chrome/browser/offline_pages/android/offline_page_bridge.h b/chrome/browser/offline_pages/android/offline_page_bridge.h
index bc98db62..70c34f42 100644
--- a/chrome/browser/offline_pages/android/offline_page_bridge.h
+++ b/chrome/browser/offline_pages/android/offline_page_bridge.h
@@ -13,6 +13,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/supports_user_data.h"
+#include "components/offline_items_collection/core/launch_location.h"
 #include "components/offline_pages/core/offline_page_item.h"
 #include "components/offline_pages/core/offline_page_model.h"
 
@@ -209,10 +210,11 @@
       const jlong j_timestamp_millis,
       const base::android::JavaParamRef<jobject>& j_callback_obj);
 
-  void GetLaunchUrlByOfflineId(
+  void GetLoadUrlParamsByOfflineId(
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& obj,
       jlong j_offline_id,
+      jint launch_location,
       const base::android::JavaParamRef<jobject>& j_callback_obj);
 
   void GetLoadUrlParamsForOpeningMhtmlFileOrContent(
@@ -234,6 +236,7 @@
 
  private:
   void GetPageByOfflineIdDone(
+      offline_items_collection::LaunchLocation launch_location,
       const base::android::ScopedJavaGlobalRef<jobject>& j_callback_obj,
       const OfflinePageItem* offline_page);
 
diff --git a/chrome/browser/offline_pages/offline_page_request_handler.cc b/chrome/browser/offline_pages/offline_page_request_handler.cc
index fa65338..f63f0a6 100644
--- a/chrome/browser/offline_pages/offline_page_request_handler.cc
+++ b/chrome/browser/offline_pages/offline_page_request_handler.cc
@@ -701,6 +701,10 @@
       return AccessEntryPoint::FILE_URL_INTENT;
     case OfflinePageHeader::Reason::CONTENT_URL_INTENT:
       return AccessEntryPoint::CONTENT_URL_INTENT;
+    case OfflinePageHeader::Reason::PROGRESS_BAR:
+      return AccessEntryPoint::PROGRESS_BAR;
+    case OfflinePageHeader::Reason::SUGGESTION:
+      return AccessEntryPoint::NTP_SUGGESTIONS_OR_BOOKMARKS;
     default:
       break;
   }
diff --git a/chrome/browser/offline_pages/offline_page_request_handler.h b/chrome/browser/offline_pages/offline_page_request_handler.h
index d504cf7..07204c9 100644
--- a/chrome/browser/offline_pages/offline_page_request_handler.h
+++ b/chrome/browser/offline_pages/offline_page_request_handler.h
@@ -105,6 +105,8 @@
     FILE_URL_INTENT = 8,
     // Launched due to processing a content URL intent to view MHTML content.
     CONTENT_URL_INTENT = 9,
+    // Launched due to clicking "Open" link in the progress bar.
+    PROGRESS_BAR = 10,
     COUNT
   };
 
diff --git a/chrome/browser/page_load_metrics/metrics_web_contents_observer.cc b/chrome/browser/page_load_metrics/metrics_web_contents_observer.cc
index a78989f..efec4022 100644
--- a/chrome/browser/page_load_metrics/metrics_web_contents_observer.cc
+++ b/chrome/browser/page_load_metrics/metrics_web_contents_observer.cc
@@ -24,11 +24,13 @@
 #include "content/public/browser/navigation_details.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
 #include "net/base/net_errors.h"
+#include "services/network/public/cpp/features.h"
 #include "ui/base/page_transition_types.h"
 
 namespace page_load_metrics {
@@ -286,6 +288,43 @@
   }
   return nullptr;
 }
+void MetricsWebContentsObserver::ResourceLoadComplete(
+    content::RenderFrameHost* render_frame_host,
+    const content::GlobalRequestID& request_id,
+    const content::mojom::ResourceLoadInfo& resource_load_info) {
+  if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
+    return;
+
+  if (!resource_load_info.url.SchemeIsHTTPOrHTTPS())
+    return;
+
+  PageLoadTracker* tracker = GetTrackerOrNullForRequest(
+      request_id, render_frame_host, resource_load_info.resource_type,
+      resource_load_info.load_timing_info.request_start);
+  if (tracker) {
+    // TODO(crbug.com/721403): Fill in data reduction proxy fields when this is
+    // available in the network service.
+    // int original_content_length =
+    //     was_cached ? 0
+    //                : data_reduction_proxy::util::EstimateOriginalBodySize(
+    //                      request, lofi_decider);
+    int original_content_length = 0;
+    std::unique_ptr<data_reduction_proxy::DataReductionProxyData>
+        data_reduction_proxy_data;
+
+    const content::mojom::CommonNetworkInfoPtr& network_info =
+        resource_load_info.network_info;
+    ExtraRequestCompleteInfo extra_request_complete_info(
+        resource_load_info.url, network_info->ip_port_pair.value(),
+        render_frame_host->GetFrameTreeNodeId(), resource_load_info.was_cached,
+        resource_load_info.raw_body_bytes, original_content_length,
+        std::move(data_reduction_proxy_data), resource_load_info.resource_type,
+        resource_load_info.net_error,
+        std::make_unique<net::LoadTimingInfo>(
+            resource_load_info.load_timing_info));
+    tracker->OnLoadedResource(extra_request_complete_info);
+  }
+}
 
 void MetricsWebContentsObserver::OnRequestComplete(
     const GURL& url,
@@ -302,6 +341,8 @@
     base::TimeTicks creation_time,
     int net_error,
     std::unique_ptr<net::LoadTimingInfo> load_timing_info) {
+  DCHECK(!base::FeatureList::IsEnabled(network::features::kNetworkService));
+
   // Ignore non-HTTP(S) resources (blobs, data uris, etc).
   if (!url.SchemeIsHTTPOrHTTPS())
     return;
diff --git a/chrome/browser/page_load_metrics/metrics_web_contents_observer.h b/chrome/browser/page_load_metrics/metrics_web_contents_observer.h
index 83990ed..e6430afa 100644
--- a/chrome/browser/page_load_metrics/metrics_web_contents_observer.h
+++ b/chrome/browser/page_load_metrics/metrics_web_contents_observer.h
@@ -103,6 +103,10 @@
       const content::WebContentsObserver::MediaPlayerInfo& video_type,
       const content::WebContentsObserver::MediaPlayerId& id) override;
   void WebContentsDestroyed() override;
+  void ResourceLoadComplete(
+      content::RenderFrameHost* render_frame_host,
+      const content::GlobalRequestID& request_id,
+      const content::mojom::ResourceLoadInfo& resource_load_info) override;
 
   // These methods are forwarded from the MetricsNavigationThrottle.
   void WillStartNavigationRequest(content::NavigationHandle* navigation_handle);
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc
index 1f58e5d..38ff519 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -155,6 +155,19 @@
           profile->GetPrefs()));
 }
 
+#if !defined(OS_ANDROID)
+// Adds |observer| to the input observers of |widget_host|.
+void AddToWidgetInputEventObservers(
+    content::RenderWidgetHost* widget_host,
+    content::RenderWidgetHost::InputEventObserver* observer) {
+  // Since Widget API doesn't allow to check whether the observer is already
+  // added, the observer is removed and added again, to ensure that it is added
+  // only once.
+  widget_host->RemoveInputEventObserver(observer);
+  widget_host->AddInputEventObserver(observer);
+}
+#endif
+
 }  // namespace
 
 // static
@@ -550,13 +563,8 @@
 // TODO(crbug.com/706392): Fix password reuse detection for Android.
 #if !defined(OS_ANDROID)
   password_reuse_detection_manager_.DidNavigateMainFrame(GetMainFrameURL());
-  // After some navigations RenderViewHost persists and just adding the observer
-  // will cause multiple call of OnInputEvent. Since Widget API doesn't allow to
-  // check whether the observer is already added, the observer is removed and
-  // added again, to ensure that it is added only once.
-  web_contents()->GetRenderViewHost()->GetWidget()->RemoveInputEventObserver(
-      this);
-  web_contents()->GetRenderViewHost()->GetWidget()->AddInputEventObserver(this);
+  AddToWidgetInputEventObservers(
+      web_contents()->GetRenderViewHost()->GetWidget(), this);
 #else   // defined(OS_ANDROID)
   PasswordAccessoryController* accessory =
       PasswordAccessoryController::FromWebContents(web_contents());
@@ -566,6 +574,18 @@
 }
 
 #if !defined(OS_ANDROID)
+void ChromePasswordManagerClient::RenderFrameCreated(
+    content::RenderFrameHost* render_frame_host) {
+  // TODO(drubery): We should handle input events on subframes separately, so
+  // that we can accurately report that the password was reused on a subframe.
+  // Currently any password reuse for this WebContents will report password
+  // reuse on the main frame URL.
+  AddToWidgetInputEventObservers(
+      render_frame_host->GetView()->GetRenderWidgetHost(), this);
+}
+#endif
+
+#if !defined(OS_ANDROID)
 void ChromePasswordManagerClient::OnInputEvent(
     const blink::WebInputEvent& event) {
   if (event.GetType() != blink::WebInputEvent::kChar)
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.h b/chrome/browser/password_manager/chrome_password_manager_client.h
index 2ac5d7a..d4d6c84 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.h
+++ b/chrome/browser/password_manager/chrome_password_manager_client.h
@@ -215,6 +215,7 @@
 
 // TODO(crbug.com/706392): Fix password reuse detection for Android.
 #if !defined(OS_ANDROID)
+  void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
   // content::RenderWidgetHost::InputEventObserver overrides.
   void OnInputEvent(const blink::WebInputEvent&) override;
 #endif
diff --git a/chrome/browser/permissions/permission_manager.cc b/chrome/browser/permissions/permission_manager.cc
index 042b3e15..b6c6d202 100644
--- a/chrome/browser/permissions/permission_manager.cc
+++ b/chrome/browser/permissions/permission_manager.cc
@@ -416,6 +416,13 @@
     ContentSettingsType permission,
     const GURL& requesting_origin,
     const GURL& embedding_origin) {
+  // With permission delegation enabled, this function should only ever be
+  // called for the top level origin (or a service worker origin).
+  // GetPermissionStatusForFrame should be called when to determine the status
+  // for an embedded frame.
+  DCHECK(!base::FeatureList::IsEnabled(features::kPermissionDelegation) ||
+         requesting_origin == embedding_origin);
+
   return GetPermissionStatusHelper(permission, nullptr /* render_frame_host */,
                                    requesting_origin, embedding_origin);
 }
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc b/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
index 5c5058a..c6a1ae03 100644
--- a/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
+++ b/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
@@ -21,6 +21,7 @@
 #include "content/public/test/test_navigation_observer.h"
 #include "net/dns/mock_host_resolver.h"
 #include "testing/gmock/include/gmock/gmock.h"
+#include "third_party/blink/public/common/picture_in_picture/picture_in_picture_control_info.h"
 
 #if !defined(OS_ANDROID)
 #include "chrome/browser/ui/views/overlay/overlay_window_views.h"
@@ -42,6 +43,8 @@
   MOCK_METHOD1(Close, void(bool));
   MOCK_METHOD0(OnWindowDestroyed, void());
   MOCK_METHOD1(ClickCustomControl, void(const std::string&));
+  MOCK_METHOD1(SetPictureInPictureCustomControls,
+               void(const std::vector<blink::PictureInPictureControlInfo>&));
   MOCK_METHOD2(EmbedSurface, void(const viz::SurfaceId&, const gfx::Size&));
   MOCK_METHOD0(GetWindowForTesting, content::OverlayWindow*());
   MOCK_METHOD0(UpdateLayerBounds, void());
diff --git a/chrome/browser/plugins/plugin_info_host_impl.cc b/chrome/browser/plugins/plugin_info_host_impl.cc
index 484e07a..7092c5d 100644
--- a/chrome/browser/plugins/plugin_info_host_impl.cc
+++ b/chrome/browser/plugins/plugin_info_host_impl.cc
@@ -209,7 +209,7 @@
                                        const GURL& url,
                                        const url::Origin& origin,
                                        const std::string& mime_type,
-                                       const GetPluginInfoCallback& callback) {
+                                       GetPluginInfoCallback callback) {
   GetPluginInfo_Params params = {render_frame_id, url, origin, mime_type};
   PluginService::GetInstance()->GetPlugins(base::BindOnce(
       &PluginInfoHostImpl::PluginsLoaded, this, params, std::move(callback)));
diff --git a/chrome/browser/plugins/plugin_info_host_impl.h b/chrome/browser/plugins/plugin_info_host_impl.h
index e1683f3..9c9f487 100644
--- a/chrome/browser/plugins/plugin_info_host_impl.h
+++ b/chrome/browser/plugins/plugin_info_host_impl.h
@@ -135,7 +135,7 @@
                      const GURL& url,
                      const url::Origin& origin,
                      const std::string& mime_type,
-                     const GetPluginInfoCallback& callback) override;
+                     GetPluginInfoCallback callback) override;
 
   // |params| wraps the parameters passed to |OnGetPluginInfo|, because
   // |base::Bind| doesn't support the required arity <http://crbug.com/98542>.
diff --git a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
index aab2298..1dead4c 100644
--- a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
+++ b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
@@ -28,15 +28,16 @@
 
 void PluginResponseInterceptorURLLoaderThrottle::WillProcessResponse(
     const GURL& response_url,
-    const network::ResourceResponseHead& response_head,
+    network::ResourceResponseHead* response_head,
     bool* defer) {
-  if (content::download_utils::MustDownload(
-          response_url, response_head.headers.get(), response_head.mime_type)) {
+  if (content::download_utils::MustDownload(response_url,
+                                            response_head->headers.get(),
+                                            response_head->mime_type)) {
     return;
   }
 
   std::string extension_id = PluginUtils::GetExtensionIdForMimeType(
-      resource_context_, response_head.mime_type);
+      resource_context_, response_head->mime_type);
   if (extension_id.empty())
     return;
 
@@ -68,7 +69,7 @@
 
   // Make a deep copy of ResourceResponseHead before passing it cross-thread.
   auto resource_response = base::MakeRefCounted<network::ResourceResponse>();
-  resource_response->head = response_head;
+  resource_response->head = *response_head;
   auto deep_copied_response = resource_response->DeepCopy();
 
   auto transferrable_loader = content::mojom::TransferrableURLLoader::New();
@@ -79,7 +80,7 @@
   transferrable_loader->url_loader_client = std::move(original_client);
   transferrable_loader->head = std::move(deep_copied_response->head);
 
-  int64_t expected_content_size = response_head.content_length;
+  int64_t expected_content_size = response_head->content_length;
   bool embedded = resource_type_ != content::RESOURCE_TYPE_MAIN_FRAME;
   content::BrowserThread::PostTask(
       content::BrowserThread::UI, FROM_HERE,
diff --git a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h
index a7772dc..897f8e4 100644
--- a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h
+++ b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h
@@ -34,7 +34,7 @@
  private:
   // content::URLLoaderThrottle overrides;
   void WillProcessResponse(const GURL& response_url,
-                           const network::ResourceResponseHead& response_head,
+                           network::ResourceResponseHead* response_head,
                            bool* defer) override;
 
   content::ResourceContext* const resource_context_;
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 2a73c28..c3b6f992 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -657,6 +657,9 @@
   { key::kDeviceLocalAccountManagedSessionEnabled,
     prefs::kManagedSessionEnabled,
     base::Value::Type::BOOLEAN },
+  { key::kPowerSmartDimEnabled,
+    ash::prefs::kPowerSmartDimEnabled,
+    base::Value::Type::BOOLEAN },
 #endif  // defined(OS_CHROMEOS)
 
 // Metrics reporting is controlled by a platform specific policy for ChromeOS
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index 68deb184..bed9ab3 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -11,6 +11,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/atomic_ref_count.h"
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/callback.h"
@@ -334,10 +335,6 @@
 const char kSimpleWithIconCrxId[] = "dehdlahnlebladnfleagmjdapdjdcnlp";
 const char kHostedAppCrxId[] = "kbmnembihfiondgfjekmnmcbddelicoi";
 
-const base::FilePath::CharType kGood2CrxManifestName[] =
-    FILE_PATH_LITERAL("good2_update_manifest.xml");
-const base::FilePath::CharType kGoodV1CrxManifestName[] =
-    FILE_PATH_LITERAL("good_v1_update_manifest.xml");
 const base::FilePath::CharType kGoodV1CrxName[] =
     FILE_PATH_LITERAL("good_v1.crx");
 const base::FilePath::CharType kSimpleWithPopupExt[] =
@@ -2364,19 +2361,76 @@
   UninstallExtension(kGoodCrxId, true);
 }
 
+namespace {
+
+class ExtensionRequestInterceptor {
+ public:
+  ExtensionRequestInterceptor()
+      : interceptor_(
+            base::BindRepeating(&ExtensionRequestInterceptor::OnRequest,
+                                base::Unretained(this))) {}
+
+  void set_interceptor_hook(
+      content::URLLoaderInterceptor::InterceptCallback callback) {
+    callback_ = std::move(callback);
+  }
+
+ private:
+  bool OnRequest(content::URLLoaderInterceptor::RequestParams* params) {
+    if (callback_ && callback_.Run(params))
+      return true;
+    // Mock out requests to the Web Store.
+    if (params->url_request.url.host() == "clients2.google.com" &&
+        params->url_request.url.path() == "/service/update2/crx") {
+      content::URLLoaderInterceptor::WriteResponse(
+          "chrome/test/data/extensions/good2_update_manifest.xml",
+          params->client.get());
+      return true;
+    }
+
+    if (params->url_request.url.path() == "/good_update_manifest.xml") {
+      content::URLLoaderInterceptor::WriteResponse(
+          "chrome/test/data/extensions/good2_update_manifest.xml",
+          params->client.get());
+      return true;
+    }
+    if (params->url_request.url.path() == "/extensions/good_v1.crx") {
+      content::URLLoaderInterceptor::WriteResponse(
+          "chrome/test/data/extensions/good_v1.crx", params->client.get());
+      return true;
+    }
+    if (params->url_request.url.path() == "/extensions/good2.crx") {
+      content::URLLoaderInterceptor::WriteResponse(
+          "chrome/test/data/extensions/good2.crx", params->client.get());
+      return true;
+    }
+
+    return false;
+  }
+
+  content::URLLoaderInterceptor::InterceptCallback callback_;
+  content::URLLoaderInterceptor interceptor_;
+};
+
+}  // namespace
+
 IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallForcelist) {
   // Verifies that extensions that are force-installed by policies are
   // installed and can't be uninstalled.
 
+  ExtensionRequestInterceptor interceptor;
+
   extensions::ExtensionService* service = extension_service();
   ASSERT_FALSE(service->GetExtensionById(kGoodCrxId, true));
 
   // Extensions that are force-installed come from an update URL, which defaults
-  // to the webstore. Use a mock URL for this test with an update manifest
+  // to the webstore. Use a test URL for this test with an update manifest
   // that includes "good_v1.crx".
-  base::FilePath path =
-      base::FilePath(kTestExtensionsDir).Append(kGoodV1CrxManifestName);
-  GURL url(URLRequestMockHTTPJob::GetMockUrl(path.MaybeAsASCII()));
+  embedded_test_server()->AddDefaultHandlers(
+      base::FilePath(FILE_PATH_LITERAL("chrome/test/data")));
+  ASSERT_TRUE(embedded_test_server()->Start());
+  GURL url =
+      embedded_test_server()->GetURL("/extensions/good_v1_update_manifest.xml");
 
   // Setting the forcelist extension should install "good_v1.crx".
   base::ListValue forcelist;
@@ -2420,15 +2474,9 @@
   const std::string old_version_number =
       service->GetExtensionById(kGoodCrxId, true)->version().GetString();
 
-  base::FilePath test_path;
-  GetTestDataDirectory(&test_path);
-
-  TestRequestInterceptor interceptor(
-      "update.extension",
-      BrowserThread::GetTaskRunnerForThread(BrowserThread::IO));
-  interceptor.PushJobCallback(
-      TestRequestInterceptor::FileJob(
-          test_path.Append(kTestExtensionsDir).Append(kGood2CrxManifestName)));
+  content::WindowedNotificationObserver new_process_observer(
+      content::NOTIFICATION_RENDERER_PROCESS_CREATED,
+      content::NotificationService::AllSources());
 
   // Updating the force-installed extension.
   extensions::ExtensionUpdater* updater = service->updater();
@@ -2447,7 +2495,8 @@
 
   EXPECT_EQ(1, new_version.CompareTo(old_version));
 
-  EXPECT_EQ(0u, interceptor.GetPendingSize());
+  // Wait for the new extension process to launch.
+  new_process_observer.Wait();
 
   // Wait until any background pages belonging to force-installed extensions
   // have been loaded.
@@ -2494,23 +2543,11 @@
   // Verifies the ExtensionInstallForcelist policy with an empty (defaulted)
   // "update" URL.
 
+  ExtensionRequestInterceptor interceptor;
+
   extensions::ExtensionService* service = extension_service();
   ASSERT_FALSE(service->GetExtensionById(kGoodCrxId, true));
 
-  base::FilePath test_path;
-  GetTestDataDirectory(&test_path);
-
-  // Mock out requests to the Web Store.
-  net::TestURLRequestInterceptor interceptor(
-      "https", "clients2.google.com",
-      BrowserThread::GetTaskRunnerForThread(BrowserThread::IO),
-      base::CreateTaskRunnerWithTraits(
-          {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
-           base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}));
-  interceptor.SetResponseIgnoreQuery(
-      GURL("https://clients2.google.com/service/update2/crx"),
-      test_path.Append(kTestExtensionsDir).Append(kGood2CrxManifestName));
-
   // Setting the forcelist extension should install "good_v1.crx".
   base::ListValue forcelist;
   forcelist.AppendString(kGoodCrxId);
@@ -2523,8 +2560,6 @@
   UpdateProviderPolicy(policies);
   observer.WaitForExtensionWillBeInstalled();
 
-  EXPECT_LT(0, interceptor.GetHitCount());
-
   EXPECT_TRUE(service->GetExtensionById(kGoodCrxId, true));
 }
 
@@ -2532,6 +2567,17 @@
   // Verifies that extensions that are recommended-installed by policies are
   // installed, can be disabled but not uninstalled.
 
+  ExtensionRequestInterceptor interceptor;
+
+  // Extensions that are force-installed come from an update URL, which defaults
+  // to the webstore. Use a test URL for this test with an update manifest
+  // that includes "good_v1.crx".
+  embedded_test_server()->AddDefaultHandlers(
+      base::FilePath(FILE_PATH_LITERAL("chrome/test/data")));
+  ASSERT_TRUE(embedded_test_server()->Start());
+  GURL url =
+      embedded_test_server()->GetURL("/extensions/good_v1_update_manifest.xml");
+
 // Mark as enterprise managed.
 #if defined(OS_WIN)
   base::win::SetDomainStateForTesting(true);
@@ -2540,10 +2586,6 @@
   extensions::ExtensionService* service = extension_service();
   ASSERT_FALSE(service->GetExtensionById(kGoodCrxId, true));
 
-  base::FilePath path =
-      base::FilePath(kTestExtensionsDir).Append(kGoodV1CrxManifestName);
-  GURL url(URLRequestMockHTTPJob::GetMockUrl(path.MaybeAsASCII()));
-
   // Setting the forcelist extension should install "good_v1.crx".
   base::DictionaryValue dict_value;
   dict_value.SetString(std::string(kGoodCrxId) + "." +
@@ -2665,6 +2707,32 @@
 // by policy will get disabled, and will be auto-updated and/or re-enabled upon
 // policy changes as well as regular auto-updater scheduled updates.
 IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionMinimumVersionRequired) {
+  ExtensionRequestInterceptor interceptor;
+
+  base::AtomicRefCount update_extension_count;
+  base::RunLoop first_update_extension_runloop;
+  interceptor.set_interceptor_hook(base::BindLambdaForTesting(
+      [&](content::URLLoaderInterceptor::RequestParams* params) {
+        if (params->url_request.url.host() != "update.extension")
+          return false;
+
+        if (!update_extension_count.IsZero() && !update_extension_count.IsOne())
+          return false;
+
+        if (update_extension_count.IsZero()) {
+          content::URLLoaderInterceptor::WriteResponse(
+              "400 Bad request", std::string(), params->client.get());
+        } else {
+          content::URLLoaderInterceptor::WriteResponse(
+              "chrome/test/data/extensions/good2_update_manifest.xml",
+              params->client.get());
+        }
+        if (update_extension_count.IsZero())
+          first_update_extension_runloop.Quit();
+        update_extension_count.Increment();
+        return true;
+      }));
+
   extensions::ExtensionService* service = extension_service();
   extensions::ExtensionRegistry* registry =
       extensions::ExtensionRegistry::Get(browser()->profile());
@@ -2674,16 +2742,6 @@
   // Explicitly stop the timer to avoid all scheduled extension auto-updates.
   service->updater()->StopTimerForTesting();
 
-  // Setup interceptor for extension updates.
-  base::FilePath test_path;
-  GetTestDataDirectory(&test_path);
-  TestRequestInterceptor interceptor(
-      "update.extension",
-      BrowserThread::GetTaskRunnerForThread(BrowserThread::IO));
-  interceptor.PushJobCallback(TestRequestInterceptor::BadRequestJob());
-  interceptor.PushJobCallback(TestRequestInterceptor::FileJob(
-      test_path.Append(kTestExtensionsDir).Append(kGood2CrxManifestName)));
-
   // Install the extension.
   EXPECT_TRUE(InstallExtension(kGoodV1CrxName));
   EXPECT_TRUE(registry->enabled_extensions().Contains(kGoodCrxId));
@@ -2700,16 +2758,13 @@
 
   // Update policy to set a minimum version of 1.0.0.1, the extension (with
   // version 1.0.0.0) should now be disabled.
-  EXPECT_EQ(2u, interceptor.GetPendingSize());
-  base::RunLoop service_request_run_loop;
-  interceptor.AddRequestServicedCallback(
-      service_request_run_loop.QuitClosure());
+  EXPECT_TRUE(update_extension_count.IsZero());
   {
     extensions::ExtensionManagementPolicyUpdater management_policy(&provider_);
     management_policy.SetMinimumVersionRequired(kGoodCrxId, "1.0.0.1");
   }
-  service_request_run_loop.Run();
-  EXPECT_EQ(1u, interceptor.GetPendingSize());
+  first_update_extension_runloop.Run();
+  EXPECT_TRUE(update_extension_count.IsOne());
 
   EXPECT_TRUE(registry->disabled_extensions().Contains(kGoodCrxId));
   EXPECT_EQ(extensions::disable_reason::DISABLE_UPDATE_REQUIRED_BY_POLICY,
@@ -2717,14 +2772,14 @@
 
   // Provide a new version (1.0.0.1) which is expected to be auto updated to
   // via the update URL in the manifest of the older version.
-  EXPECT_EQ(1u, interceptor.GetPendingSize());
+  EXPECT_TRUE(update_extension_count.IsOne());
   {
     extensions::TestExtensionRegistryObserver update_observer(
         extensions::ExtensionRegistry::Get(browser()->profile()));
     service->updater()->CheckSoon();
     update_observer.WaitForExtensionWillBeInstalled();
   }
-  EXPECT_EQ(0u, interceptor.GetPendingSize());
+  EXPECT_EQ(2, update_extension_count.SubtleRefCountForDebug());
 
   // The extension should be auto-updated to newer version and re-enabled.
   EXPECT_EQ("1.0.0.1",
@@ -2735,6 +2790,22 @@
 // Similar to ExtensionMinimumVersionRequired test, but with different settings
 // and orders.
 IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionMinimumVersionRequiredAlt) {
+  ExtensionRequestInterceptor interceptor;
+
+  base::AtomicRefCount update_extension_count;
+  interceptor.set_interceptor_hook(base::BindLambdaForTesting(
+      [&](content::URLLoaderInterceptor::RequestParams* params) {
+        if (params->url_request.url.host() == "update.extension" &&
+            update_extension_count.IsZero()) {
+          content::URLLoaderInterceptor::WriteResponse(
+              "chrome/test/data/extensions/good2_update_manifest.xml",
+              params->client.get());
+          update_extension_count.Increment();
+          return true;
+        }
+        return false;
+      }));
+
   extensions::ExtensionService* service = extension_service();
   extensions::ExtensionRegistry* registry =
       extensions::ExtensionRegistry::Get(browser()->profile());
@@ -2744,15 +2815,6 @@
   // Explicitly stop the timer to avoid all scheduled extension auto-updates.
   service->updater()->StopTimerForTesting();
 
-  // Setup interceptor for extension updates.
-  base::FilePath test_path;
-  GetTestDataDirectory(&test_path);
-  TestRequestInterceptor interceptor(
-      "update.extension",
-      BrowserThread::GetTaskRunnerForThread(BrowserThread::IO));
-  interceptor.PushJobCallback(TestRequestInterceptor::FileJob(
-      test_path.Append(kTestExtensionsDir).Append(kGood2CrxManifestName)));
-
   // Set the policy to require an even higher minimum version this time.
   {
     extensions::ExtensionManagementPolicyUpdater management_policy(&provider_);
@@ -2769,7 +2831,7 @@
             service->GetInstalledExtension(kGoodCrxId)->version().GetString());
 
   // An extension management policy update should trigger an update as well.
-  EXPECT_EQ(1u, interceptor.GetPendingSize());
+  EXPECT_TRUE(update_extension_count.IsZero());
   {
     extensions::TestExtensionRegistryObserver update_observer(
         extensions::ExtensionRegistry::Get(browser()->profile()));
@@ -2782,7 +2844,7 @@
     base::RunLoop().RunUntilIdle();
     update_observer.WaitForExtensionWillBeInstalled();
   }
-  EXPECT_EQ(0u, interceptor.GetPendingSize());
+  EXPECT_TRUE(update_extension_count.IsOne());
 
   // It should be updated to 1.0.0.1 but remain disabled.
   EXPECT_EQ("1.0.0.1",
@@ -2807,6 +2869,8 @@
 // Verifies that a force-installed extension which does not meet a subsequently
 // set minimum version requirement is handled well.
 IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionMinimumVersionForceInstalled) {
+  ExtensionRequestInterceptor interceptor;
+
 // Mark as enterprise managed.
 #if defined(OS_WIN)
   base::win::SetDomainStateForTesting(true);
@@ -2817,9 +2881,11 @@
       extensions::ExtensionPrefs::Get(browser()->profile());
 
   // Prepare the update URL for force installing.
-  const base::FilePath path =
-      base::FilePath(kTestExtensionsDir).Append(kGoodV1CrxManifestName);
-  const GURL url(URLRequestMockHTTPJob::GetMockUrl(path.MaybeAsASCII()));
+  embedded_test_server()->AddDefaultHandlers(
+      base::FilePath(FILE_PATH_LITERAL("chrome/test/data")));
+  ASSERT_TRUE(embedded_test_server()->Start());
+  GURL url =
+      embedded_test_server()->GetURL("/extensions/good_v1_update_manifest.xml");
 
   // Set policy to force-install the extension, it should be installed and
   // enabled.
diff --git a/chrome/browser/predictors/loading_predictor_tab_helper.cc b/chrome/browser/predictors/loading_predictor_tab_helper.cc
index ba50dd8a..f8392b8 100644
--- a/chrome/browser/predictors/loading_predictor_tab_helper.cc
+++ b/chrome/browser/predictors/loading_predictor_tab_helper.cc
@@ -79,6 +79,7 @@
 
 void LoadingPredictorTabHelper::ResourceLoadComplete(
     content::RenderFrameHost* render_frame_host,
+    const content::GlobalRequestID& request_id,
     const content::mojom::ResourceLoadInfo& resource_load_info) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (!predictor_)
diff --git a/chrome/browser/predictors/loading_predictor_tab_helper.h b/chrome/browser/predictors/loading_predictor_tab_helper.h
index 33735a67..06680cd7 100644
--- a/chrome/browser/predictors/loading_predictor_tab_helper.h
+++ b/chrome/browser/predictors/loading_predictor_tab_helper.h
@@ -35,6 +35,7 @@
       content::NavigationHandle* navigation_handle) override;
   void ResourceLoadComplete(
       content::RenderFrameHost* render_frame_host,
+      const content::GlobalRequestID& request_id,
       const content::mojom::ResourceLoadInfo& resource_load_info) override;
   void DidLoadResourceFromMemoryCache(
       const GURL& url,
diff --git a/chrome/browser/predictors/loading_predictor_tab_helper_unittest.cc b/chrome/browser/predictors/loading_predictor_tab_helper_unittest.cc
index 827b243a..451a8183 100644
--- a/chrome/browser/predictors/loading_predictor_tab_helper_unittest.cc
+++ b/chrome/browser/predictors/loading_predictor_tab_helper_unittest.cc
@@ -192,7 +192,8 @@
   EXPECT_CALL(*mock_collector_,
               RecordResourceLoadComplete(navigation_id,
                                          Eq(ByRef(*resource_load_info))));
-  tab_helper_->ResourceLoadComplete(main_rfh(), *resource_load_info);
+  tab_helper_->ResourceLoadComplete(main_rfh(), content::GlobalRequestID(),
+                                    *resource_load_info);
 }
 
 // Tests that a resource loaded in a subframe is not recorded.
@@ -207,7 +208,8 @@
   // Resource loaded in subframe shouldn't be recorded.
   auto resource_load_info = CreateResourceLoadInfo(
       "http://sub.test.org/script.js", content::RESOURCE_TYPE_SCRIPT);
-  tab_helper_->ResourceLoadComplete(subframe, *resource_load_info);
+  tab_helper_->ResourceLoadComplete(subframe, content::GlobalRequestID(),
+                                    *resource_load_info);
 }
 
 // Tests that a resource load from the memory cache is correctly recorded.
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index d05890fc..30d21901 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -201,7 +201,7 @@
 #include "components/feed/core/refresh_throttler.h"
 #include "components/feed/core/user_classifier.h"
 #endif  // BUILDFLAG(ENABLE_FEED_IN_CHROME)
-#else
+#else   // defined(OS_ANDROID)
 #include "chrome/browser/gcm/gcm_product_util.h"
 #include "chrome/browser/metrics/tab_stats_tracker.h"
 #include "chrome/browser/search/instant_service.h"
@@ -210,8 +210,8 @@
 #include "chrome/browser/ui/webui/foreign_session_handler.h"
 #include "chrome/browser/ui/webui/md_history_ui.h"
 #include "chrome/browser/ui/webui/settings/md_settings_ui.h"
-#include "chrome/browser/upgrade_detector.h"
-#endif
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
+#endif  // defined(OS_ANDROID)
 
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h"
diff --git a/chrome/browser/recovery/recovery_install_global_error.cc b/chrome/browser/recovery/recovery_install_global_error.cc
index 27db27b..5a2c4d3 100644
--- a/chrome/browser/recovery/recovery_install_global_error.cc
+++ b/chrome/browser/recovery/recovery_install_global_error.cc
@@ -11,7 +11,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/global_error/global_error_service.h"
 #include "chrome/browser/ui/global_error/global_error_service_factory.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/chromium_strings.h"
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
index 67fe033..6f511d0 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
@@ -1161,6 +1161,7 @@
 
   void ResourceLoadComplete(
       content::RenderFrameHost* render_frame_host,
+      const content::GlobalRequestID& request_id,
       const content::mojom::ResourceLoadInfo& resource_load_info) override {
     if (resource_load_info.url.path() == path_)
       run_loop_.Quit();
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/background.js b/chrome/browser/resources/chromeos/chromevox/chromevox/background/background.js
index 1172bc1f..fd29544 100644
--- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/background.js
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/background.js
@@ -130,7 +130,7 @@
   cvox.ChromeVoxBackground.readPrefs();
 
   var consoleTts = cvox.ConsoleTts.getInstance();
-  consoleTts.setEnabled(true);
+  consoleTts.setEnabled(this.prefs.getPrefs()['enableSpeechLogging'] == 'true');
 
   /**
    * Chrome's actual TTS which knows and cares about pitch, volume, etc.
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.html b/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.html
index 5ca9076..e25ca5c 100644
--- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.html
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.html
@@ -133,11 +133,13 @@
   <h2 class="i18n" msgid="options_developer_options" id="developerDescription">
     Developer Options
   </h2>
-  <div class="option" id="developerOption">
-    <input id="developerOptionCheckBox" type="checkbox" class="checkbox pref"
-           name="developerOptionCheckBox">
+  <div class="option" id="developerSpeechLogging">
     <label>
-      Enable developer option test.
+      <input id="enableSpeechLogging" type="checkbox" class="checkbox pref"
+             name="enableSpeechLogging">
+      <span class="i18n" msgid="options_developer_speech_logging">
+        Enable speech logging
+      </span>
     </label>
   </div>
 
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.js b/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.js
index 27519b1..0e3fb31 100644
--- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.js
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.js
@@ -18,6 +18,7 @@
 goog.require('cvox.ChromeVox');
 goog.require('cvox.ChromeVoxPrefs');
 goog.require('cvox.CommandStore');
+goog.require('cvox.ConsoleTts');
 goog.require('cvox.ExtensionBridge');
 goog.require('cvox.PlatformFilter');
 goog.require('cvox.PlatformUtil');
@@ -35,12 +36,20 @@
 cvox.OptionsPage.prefs;
 
 /**
+ * The ChromeVoxConsoleTts object.
+ * @type {cvox.ConsoleTts}
+ */
+cvox.OptionsPage.consoleTts;
+
+/**
  * Initialize the options page by setting the current value of all prefs, and
  * adding event listeners.
  * @suppress {missingProperties} Property prefs never defined on Window
  */
 cvox.OptionsPage.init = function() {
   cvox.OptionsPage.prefs = chrome.extension.getBackgroundPage().prefs;
+  cvox.OptionsPage.consoleTts =
+      chrome.extension.getBackgroundPage().cvox.ConsoleTts.getInstance();
   cvox.OptionsPage.populateVoicesSelect();
   cvox.BrailleTable.getAll(function(tables) {
     /** @type {!Array<cvox.BrailleTable.Table>} */
@@ -92,7 +101,7 @@
       'enable-chromevox-developer-option', function(enable) {
         if (!enable) {
           $('developerDescription').hidden = true;
-          $('developerOption').hidden = true;
+          $('developerSpeechLogging').hidden = true;
         }
       });
 
@@ -349,6 +358,9 @@
     var target = event.target;
     if (target.id == 'brailleWordWrap') {
       chrome.storage.local.set({brailleWordWrap: target.checked});
+    } else if (target.name == 'enableSpeechLogging') {
+      cvox.OptionsPage.consoleTts.setEnabled(target.checked);
+      cvox.OptionsPage.prefs.setPref(target.name, target.checked);
     } else if (target.classList.contains('pref')) {
       if (target.tagName == 'INPUT' && target.type == 'checkbox') {
         cvox.OptionsPage.prefs.setPref(target.name, target.checked);
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/prefs.js b/chrome/browser/resources/chromeos/chromevox/chromevox/background/prefs.js
index 842e74d7..d6cc1f0 100644
--- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/prefs.js
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/prefs.js
@@ -72,6 +72,7 @@
   // should just store in local storage.
   'currentKeyMap': cvox.KeyMap.DEFAULT_KEYMAP,
   'cvoxKey': '',
+  'enableSpeechLogging': true,
   'earcons': true,
   'focusFollowsMouse': false,
   'granularity': undefined,
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/live_regions.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/live_regions.js
index 8838b3b3..09b67ba 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/live_regions.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/live_regions.js
@@ -85,8 +85,9 @@
    * @param {TreeChange} treeChange
    */
   onTreeChange: function(treeChange) {
+    var type = treeChange.type;
     var node = treeChange.target;
-    if (!node.containerLiveStatus)
+    if (!node.containerLiveStatus && type != TreeChangeType.SUBTREE_UPDATE_END)
       return;
 
     var currentRange = this.chromeVoxState_.currentRange;
@@ -105,8 +106,7 @@
       return;
     }
 
-    var type = treeChange.type;
-    var relevant = node.containerLiveRelevant;
+    var relevant = node.containerLiveRelevant || '';
     var additions = relevant.indexOf('additions') >= 0;
     var text = relevant.indexOf('text') >= 0;
     var removals = relevant.indexOf('removals') >= 0;
@@ -117,12 +117,11 @@
          (type == TreeChangeType.NODE_CREATED ||
           type == TreeChangeType.SUBTREE_CREATED))) {
       this.queueLiveRegionChange_(node);
+    } else if (all || (text && type == TreeChangeType.TEXT_CHANGED)) {
+      this.queueLiveRegionChange_(node);
     }
 
-    if (all || (text && type == TreeChangeType.TEXT_CHANGED))
-      this.queueLiveRegionChange_(node);
-
-    if (all || (removals && type == TreeChangeType.NODE_REMOVED))
+    if ((all || removals) && type == TreeChangeType.NODE_REMOVED)
       this.outputLiveRegionChange_(node, '@live_regions_removed');
 
     if (type == TreeChangeType.SUBTREE_UPDATE_END)
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
index ab21c9e..7173f550 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
@@ -468,9 +468,12 @@
     },
     listMarker: {speak: `$name`},
     menu: {
-      enter: `$name $role`,
+      enter:
+          `$name $role
+          @@list_with_items($countChildren(menuItem, menuItemCheckBox, menuItemRadio))`,
       speak: `$name $node(activeDescendant)
-          $role @@list_with_items($countChildren(menuItem))
+          $role @@list_with_items(
+              $countChildren(menuItem, menuItemCheckBox, menuItemRadio))
           $description $state $restriction`
     },
     menuItem: {
@@ -1476,10 +1479,14 @@
                 tree.firstChild.value, node.location || undefined));
             this.append_(buff, '', options);
           } else if (token == 'countChildren') {
-            var role = tree.firstChild.value;
+            var roles = [];
+            var currentNode = tree.firstChild;
+            for (; currentNode; currentNode = currentNode.nextSibling)
+              roles.push(currentNode.value);
+
             var count = node.children
                             .filter(function(e) {
-                              return e.role == role;
+                              return roles.includes(e.role);
                             })
                             .length;
             this.append_(buff, String(count));
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output_test.extjs
index 5baa9af..17662432 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output_test.extjs
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output_test.extjs
@@ -468,19 +468,21 @@
   this.runWithLoadedTree(function() {/*!
     <div role="menu">
       <div role="menuitem">a</div>
+      <div role="menuitemcheckbox">b</div>
+      <div role="menuitemradio">c</div>
     </div>
   */},
   function(root) {
     var el = root.firstChild.firstChild;
     var range = cursors.Range.fromNode(el);
     var o = new Output().withSpeechAndBraille(range, null, 'navigate');
-    checkSpeechOutput('a|Menu item| 1 of 1 |Menu', [
+    checkSpeechOutput('a|Menu item| 1 of 1 |Menu|with 3 items', [
       {value: 'name', start: 0, end: 1},
       {value: 'role', start: 21, end: 25}], o);
     checkBrailleOutput(
-        'a mnuitm 1/1 mnu',
+        'a mnuitm 1/1 mnu +3',
         [{value: new Output.NodeSpan(el), start: 0, end: 12},
-         {value: new Output.NodeSpan(el.parent), start: 13, end: 16}],
+         {value: new Output.NodeSpan(el.parent), start: 13, end: 19}],
         o);
   });
 });
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd
index 195df15..a30644f 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd
@@ -562,6 +562,9 @@
       <message desc="List of chromevox developer options." name="IDS_CHROMEVOX_OPTIONS_DEVELOPER_OPTIONS">
         Developer Options
       </message>
+      <message desc="Enable chromevox speech logging." name="IDS_CHROMEVOX_OPTIONS_DEVELOPER_SPEECH_LOGGING">
+        Enable speech logging
+      </message>
       <message desc="The title of ChromeVox Learn Mode page.  The keyboard explorer voices the name of each key when the user presses it." name="IDS_CHROMEVOX_KBEXPLORER_TITLE">
         ChromeVox Learn Mode
       </message>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
index 125d2aa..8098dad 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="am">
 <translation id="100812568230599391">የማሳያ ቅጡን ወደ ማትሪያ ቀይር።</translation>
+<translation id="1011903154582639569">አንድ ቁልፍ ያግኙ፣ ከዚያ ለመተየ ያንሱት</translation>
 <translation id="1012173283529841972">የዝርዝር ንጥል</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">የChromeVox የሚነገር ግብረመልስን ለመጀመሪያ ጊዜ እየተጠቀሙ ነው? ይህ ፈጣን አጋዥ ሥልጠና በChromeVox ለመጀመር የሚያስፈልጉትን ነገሮች ያብራራል።</translation>
@@ -162,6 +163,7 @@
 <translation id="2553108862507765288">የስዋስው ስህተት</translation>
 <translation id="257674075312929031">ቡድን</translation>
 <translation id="2582407057977008361">ከጎን</translation>
+<translation id="2592212930811759050">ማርትዕ ለመጀመር ሁለቴ መታ ያድርጉ</translation>
 <translation id="2606210917827248971">ከ {COUNT,plural, =1{# ንጥል}one{# ንጥሎች}other{# ንጥሎች}}</translation>
 <translation id="2614981083756825552">የMath ML አቀማመጥ</translation>
 <translation id="2624431853467395961">የመማር ሁነታን ይክፈቱ</translation>
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 3f3f62b..3e071d6 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ar">
 <translation id="100812568230599391">تغيير نمط العرض لتضمين النص.</translation>
+<translation id="1011903154582639569">العثور على مفتاح، ثم حمله للكتابة</translation>
 <translation id="1012173283529841972">عنصر قائمة</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">‏هل تستخدم التعليقات والملاحظات المنطوقة في ChromeVox لأول مرة؟ يشرح هذا البرنامج التعليمي السريع أساسيات بدء استخدام ChromeVox.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">خطأ نحوي</translation>
 <translation id="257674075312929031">مجموعة</translation>
 <translation id="2582407057977008361">جانبًا</translation>
+<translation id="2592212930811759050">انقر مرّتين لبدء التعديل</translation>
 <translation id="2606210917827248971">مع {COUNT,plural, =1{عنصر واحد (#)}zero{# عنصر}two{عنصران (#)}few{# عناصر}many{# عنصرًا}other{# عنصر}}</translation>
 <translation id="2614981083756825552">تخطيط لغة التوصيف الرياضية</translation>
 <translation id="2624431853467395961">فتح وضع التعلّم</translation>
@@ -754,7 +756,7 @@
 <translation id="7241683698754534149">فتح الوصف المطول في علامة تبويب جديدة</translation>
 <translation id="7248671827512403053">تطبيق</translation>
 <translation id="725969808843520477">زر الاختيار التالي</translation>
-<translation id="7261612856573623172">صوت تحويل النص إلى كلام في النظام</translation>
+<translation id="7261612856573623172">اسم الصوت المستخدَم في ميزة "تحويل النص إلى كلام" في النظام</translation>
 <translation id="7269119382257320590">بدون علامات ترقيم</translation>
 <translation id="7273174640290488576">فارغ</translation>
 <translation id="7274770952766771364">ملاحظة مرجعية</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
index ec5b872..9b878ae 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="bg">
 <translation id="100812568230599391">Преминаване към изгледа с наслагване.</translation>
+<translation id="1011903154582639569">Намерете клавиш, след което вдигнете пръст, за да въведете</translation>
 <translation id="1012173283529841972">Списъчен елемент</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">За първи път ли използвате обратната връзка с говор на ChromeVox? В този кратък урок са обяснени основните положения за започване на работа с екранния четец.</translation>
@@ -162,6 +163,7 @@
 <translation id="2553108862507765288">grammatical mistake</translation>
 <translation id="257674075312929031">Група</translation>
 <translation id="2582407057977008361">Странично съдържание</translation>
+<translation id="2592212930811759050">Докоснете двукратно, за да започнете да редактирате</translation>
 <translation id="2606210917827248971">с/ъс {COUNT,plural, =1{# елемент}other{# елемента}}</translation>
 <translation id="2614981083756825552">Оформление в Math ML</translation>
 <translation id="2624431853467395961">Включване на режима за изговаряне на клавишите</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
index 45238678..de21a5c 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
@@ -893,7 +893,7 @@
 <translation id="8631359288236106450">নির্বাচিত <ph name="COUNT" />টি আইটেম</translation>
 <translation id="8638532244051952400">বর্তমান কক্ষ স্থানাঙ্কগুলি ঘোষণা করে</translation>
 <translation id="8650576015643545550">কোনো পূর্ববর্তী তালিকা নেই৷</translation>
-<translation id="8651481478098336970">ভলিউম নিঃশব্দ</translation>
+<translation id="8651481478098336970">ভলিউম মিউট</translation>
 <translation id="8653646212587894517">লিঙ্কের তালিকাগুলি দেখান</translation>
 <translation id="8664519043722036194">সেকেন্ড</translation>
 <translation id="867187640362843212">শিরোনাম ৫</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
index a9ae309ce2..cc7474f 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ca">
 <translation id="100812568230599391">Canvia l'estil de pantalla a entrellaçat.</translation>
+<translation id="1011903154582639569">Cerca una tecla i, a continuació, aixeca el dit per escriure</translation>
 <translation id="1012173283529841972">Element de la llista</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">És el primer cop que fas servir els comentaris de veu de l'extensió ChromeVox? En aquest tutorial ràpid s'expliquen els aspectes bàsics per començar a utilitzar-la.</translation>
@@ -162,6 +163,7 @@
 <translation id="2553108862507765288">error gramatical</translation>
 <translation id="257674075312929031">Grup</translation>
 <translation id="2582407057977008361">A part</translation>
+<translation id="2592212930811759050">Fes doble toc per començar a editar</translation>
 <translation id="2606210917827248971">amb {COUNT,plural, =1{# element}other{# elements}}</translation>
 <translation id="2614981083756825552">Disseny de MathML</translation>
 <translation id="2624431853467395961">Obre el mode d'aprenentatge</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
index 3b65adf..0e6609d5 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="cs">
 <translation id="100812568230599391">Změnit styl zobrazení na prokládání.</translation>
+<translation id="1011903154582639569">Najděte klávesu a zvednutím prstu pište</translation>
 <translation id="1012173283529841972">Položka seznamu</translation>
 <translation id="1013742170491673792">upr vyhl</translation>
 <translation id="1022586497894531524">Používáte hlasovou odezvu ChromeVox poprvé? Tento stručný výukový program vysvětluje základy, které vám pomohou začít ChromeVox používat.</translation>
@@ -162,6 +163,7 @@
 <translation id="2553108862507765288">pravopisná chyba</translation>
 <translation id="257674075312929031">Skupina</translation>
 <translation id="2582407057977008361">Stranou</translation>
+<translation id="2592212930811759050">Úpravu spustíte dvojitým klepnutím</translation>
 <translation id="2606210917827248971">s {COUNT,plural, =1{# položkou}few{# položkami}many{# položky}other{# položkami}}</translation>
 <translation id="2614981083756825552">Rozvržení MathML</translation>
 <translation id="2624431853467395961">Otevřít režim výuky</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
index ce1597d..9b315f5 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="da">
 <translation id="100812568230599391">Skift visningsformat for at sammenflette.</translation>
+<translation id="1011903154582639569">Find en tast, og løft fingeren for at skrive</translation>
 <translation id="1012173283529841972">Punkt på listen</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">Er det første gang, du bruger oplæsning i ChromeVox? Dette hurtige selvstudie giver dig de grundlæggende oplysninger, du skal bruge for at komme godt i gang med ChromeVox.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">grammatisk fejl</translation>
 <translation id="257674075312929031">Gruppe</translation>
 <translation id="2582407057977008361">Uden for</translation>
+<translation id="2592212930811759050">Tryk to gange for at redigere</translation>
 <translation id="2606210917827248971">med {COUNT,plural, =1{# element}one{# element}other{# elementer}}</translation>
 <translation id="2614981083756825552">Math ML-layout</translation>
 <translation id="2624431853467395961">Åbn indlæringstilstanden</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
index df93c23b..aac65b4 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="de">
 <translation id="100812568230599391">Für die Displaydarstellung wird "Überlappen" festgelegt.</translation>
+<translation id="1011903154582639569">Suchen Sie sich einen Schlüssel aus und heben Sie zum Tippen den Finger an</translation>
 <translation id="1012173283529841972">Listenelement</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">Verwenden Sie gesprochenes Feedback von ChromeVox zum ersten Mal? In dieser kurzen Anleitung erfahren Sie die Grundlagen für die Nutzung von ChromeVox.</translation>
@@ -162,6 +163,7 @@
 <translation id="2553108862507765288">Grammatikfehler</translation>
 <translation id="257674075312929031">Gruppe</translation>
 <translation id="2582407057977008361">Aside-Element</translation>
+<translation id="2592212930811759050">Tippen Sie zum Bearbeiten doppelt</translation>
 <translation id="2606210917827248971">mit {COUNT,plural, =1{# Eintrag}other{# Einträgen}}</translation>
 <translation id="2614981083756825552">MathML-Layout</translation>
 <translation id="2624431853467395961">Lernmodus öffnen</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
index db67f90..a6b0f609 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="el">
 <translation id="100812568230599391">Αλλάξτε το στυλ προβολής σε παρεμβολή.</translation>
+<translation id="1011903154582639569">Εντοπίστε ένα πλήκτρο και έπειτα σηκώστε το δάκτυλό σας για να πληκτρολογήσετε</translation>
 <translation id="1012173283529841972">Στοιχείο λίστας</translation>
 <translation id="1013742170491673792">αναζήτηση ρόλου</translation>
 <translation id="1022586497894531524">Χρησιμοποιείτε τα εκφωνημένα σχόλια του ChromeVox για πρώτη φορά; Αυτός ο γρήγορος οδηγός εξηγεί τα βασικά για να ξεκινήσετε τη χρήση του ChromeVox.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">γραμματικό λάθος</translation>
 <translation id="257674075312929031">Ομάδα</translation>
 <translation id="2582407057977008361">Ετικέτα "εκτός" (aside)</translation>
+<translation id="2592212930811759050">Πατήστε δύο φορές για να ξεκινήσετε την επεξεργασία</translation>
 <translation id="2606210917827248971">με {COUNT,plural, =1{# στοιχείο}other{# στοιχεία}}</translation>
 <translation id="2614981083756825552">Διάταξη Math ML</translation>
 <translation id="2624431853467395961">Άνοιγμα λειτουργίας εκμάθησης</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
index fa01dfb..abe6f5bb 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="en-GB">
 <translation id="100812568230599391">Change display style to interleave.</translation>
+<translation id="1011903154582639569">Find a key, then lift to type</translation>
 <translation id="1012173283529841972">List item</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">Are you using ChromeVox spoken feedback for the first time? This quick tutorial explains the essentials for getting started with ChromeVox.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">grammatical mistake</translation>
 <translation id="257674075312929031">Group</translation>
 <translation id="2582407057977008361">Aside</translation>
+<translation id="2592212930811759050">Double-tap to start editing</translation>
 <translation id="2606210917827248971">with {COUNT,plural, =1{# item}other{# items}}</translation>
 <translation id="2614981083756825552">Math ML Layout</translation>
 <translation id="2624431853467395961">Open learn mode</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
index 74f2b2d..ce42cd9f 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="es">
 <translation id="100812568230599391">Cambia el estilo de presentación al formato intercalado.</translation>
+<translation id="1011903154582639569">Ve a una tecla y levanta el dedo para pulsarla</translation>
 <translation id="1012173283529841972">Elemento de lista</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">¿Es la primera vez que utilizas los mensajes de voz de ChromeVox? En este rápido tutorial encontrarás los conceptos básicos para empezar a utilizar ChromeVox.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">error gramatical</translation>
 <translation id="257674075312929031">Grupo</translation>
 <translation id="2582407057977008361">Etiqueta de contenido tangencial</translation>
+<translation id="2592212930811759050">Toca dos veces para empezar a editar</translation>
 <translation id="2606210917827248971">con {COUNT,plural, =1{# elemento}other{# elementos}}</translation>
 <translation id="2614981083756825552">Diseño de MathML</translation>
 <translation id="2624431853467395961">Abrir modo de aprendizaje</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
index 2175852..3895cd71 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="et">
 <translation id="100812568230599391">Aktiveeri vahelehtedega kuvastiil.</translation>
+<translation id="1011903154582639569">Leidke soovitud klahv ja tõstke sisestamiseks sõrm ekraanilt</translation>
 <translation id="1012173283529841972">Loendiüksus</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">Kas kasutate esimest korda ChromeVoxi suulist tagasisidet? Selles kiirõpetuses selgitatakse ChromeVoxi kasutamiseks vajalikku põhiteavet.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">grammatical mistake</translation>
 <translation id="257674075312929031">Rühm</translation>
 <translation id="2582407057977008361">Kõrvale</translation>
+<translation id="2592212930811759050">Topeltpuudutage muutmise alustamiseks</translation>
 <translation id="2606210917827248971">koos {COUNT,plural, =1{# üksusega}other{# üksusega}}</translation>
 <translation id="2614981083756825552">Math ML-i paigutus</translation>
 <translation id="2624431853467395961">Õppimisrežiimi avamine</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
index d256242..3ac0c15 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fa">
 <translation id="100812568230599391">سبک نمایش را به جاگذاری تغییر دهید.</translation>
+<translation id="1011903154582639569">کلیدی را پیدا کنید، سپس سراغ تایپ کردن بروید</translation>
 <translation id="1012173283529841972">مورد فهرست</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">‏اولین بار است که از بازخورد گفتاری ChromeVox استفاده می‌کنید؟ این آموزش گام‌به‌گام سریع، اصول اولیه شروع به کار با ChromeVox را توضیح می‌دهد.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">اشتباه دستوری</translation>
 <translation id="257674075312929031">گروه</translation>
 <translation id="2582407057977008361">جدا</translation>
+<translation id="2592212930811759050">برای شروع ویرایش، دو ضربه سریع بزنید</translation>
 <translation id="2606210917827248971">با {COUNT,plural, =1{# مورد}one{# مورد}other{# مورد}}</translation>
 <translation id="2614981083756825552">‏چیدمان ML ریاضی</translation>
 <translation id="2624431853467395961">باز کردن حالت یادگیری</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
index 3700cdc7..edcc95d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fr">
 <translation id="100812568230599391">Définir le style d'affichage sur "entrelacé".</translation>
+<translation id="1011903154582639569">Trouver une touche, puis relever le doigt pour taper</translation>
 <translation id="1012173283529841972">Élément de liste</translation>
 <translation id="1013742170491673792">recherche</translation>
 <translation id="1022586497894531524">Est-ce la première fois que vous utilisez les commentaires audio de ChromeVox ? Ce didacticiel rapide explique les bases pour commencer à utiliser ChromeVox.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">erreur grammaticale</translation>
 <translation id="257674075312929031">Groupe</translation>
 <translation id="2582407057977008361">Contenu relatif</translation>
+<translation id="2592212930811759050">Appuyer deux fois pour commencer la modification</translation>
 <translation id="2606210917827248971">avec {COUNT,plural, =1{1 élément}one{# élément}other{# éléments}}</translation>
 <translation id="2614981083756825552">Mise en page MathML</translation>
 <translation id="2624431853467395961">Ouvrir le mode d'apprentissage</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
index 7583bd40..bca4bcd 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hi">
 <translation id="100812568230599391">प्रदर्शन शैली को इंटरलीव में बदलें.</translation>
+<translation id="1011903154582639569">कुंजी ढूंढें, फिर लिखने के लिए उठाएं</translation>
 <translation id="1012173283529841972">सूची आइटम</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">क्या आप ChromeVox के बोलकर दिए जाने वाले जवाब का पहली बार उपयोग कर रहे हैं? यह झटपट ट्यूटोरियल ChromeVox के साथ शुरुआत करने के लिए ज़रूरी बातें समझाता है.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">व्याकरण की गलती</translation>
 <translation id="257674075312929031">समूह</translation>
 <translation id="2582407057977008361">अलग</translation>
+<translation id="2592212930811759050">बदलाव शुरू करने के लिए दो बार टैप करें</translation>
 <translation id="2606210917827248971">इनके साथ {COUNT,plural, =1{# आइटम}one{# आइटम}other{# आइटम}}</translation>
 <translation id="2614981083756825552">गणित ML लेआउट</translation>
 <translation id="2624431853467395961">जानें मोड खोलें</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
index 24d54a51..7511cef 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hr">
 <translation id="100812568230599391">Promijeni stil prikaza na ispreplitanje.</translation>
+<translation id="1011903154582639569">Pronađite tipku, zatim podignite za unos</translation>
 <translation id="1012173283529841972">Stavka popisa</translation>
 <translation id="1013742170491673792">prtrž</translation>
 <translation id="1022586497894531524">Prvi put upotrebljavate govorne povratne informacije ChromeVox? Ovaj će vam brzi vodič pokazati osnovne upute za početak upotrebe ChromeVoxa.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">gramatička pogreška</translation>
 <translation id="257674075312929031">Grupa</translation>
 <translation id="2582407057977008361">Pored</translation>
+<translation id="2592212930811759050">Dvaput dodirnite za početak uređivanja</translation>
 <translation id="2606210917827248971">s {COUNT,plural, =1{# stavkom}one{# stavkom}few{# stavke}other{# stavki}}</translation>
 <translation id="2614981083756825552">Math ML raspored</translation>
 <translation id="2624431853467395961">Otvaranje načina vodiča</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
index 4a479280..3d4879a 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="id">
 <translation id="100812568230599391">Mengubah gaya tampilan menjadi disisipkan.</translation>
+<translation id="1011903154582639569">Cari tombol, lalu angkat untuk mengetik</translation>
 <translation id="1012173283529841972">Item daftar</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">Baru pertama kali menggunakan masukan lisan ChromeVox? Tutorial singkat ini akan menjelaskan dasar-dasar memulai ChromeVox.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">kesalahan tata bahasa</translation>
 <translation id="257674075312929031">Grup</translation>
 <translation id="2582407057977008361">Pinggir</translation>
+<translation id="2592212930811759050">Tap dua kali untuk mulai mengedit</translation>
 <translation id="2606210917827248971">dengan {COUNT,plural, =1{# item}other{# item}}</translation>
 <translation id="2614981083756825552">Tata Letak Math ML</translation>
 <translation id="2624431853467395961">Buka mode pembelajaran</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
index c1ce0e66..0826b368 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="it">
 <translation id="100812568230599391">Cambia stile display su interfoliazione.</translation>
+<translation id="1011903154582639569">Trova un tasto, poi solleva il dito per digitarlo</translation>
 <translation id="1012173283529841972">Voce elenco</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">È la prima volta che utilizzi la funzione di lettura vocale di ChromeVox? Questo breve tutorial spiega le nozioni di base per iniziare a utilizzare ChromeVox.</translation>
@@ -162,6 +163,7 @@
 <translation id="2553108862507765288">grammatical mistake</translation>
 <translation id="257674075312929031">Gruppo</translation>
 <translation id="2582407057977008361">Di lato</translation>
+<translation id="2592212930811759050">Tocca due volte per iniziare la modifica</translation>
 <translation id="2606210917827248971">con {COUNT,plural, =1{# voce}other{# voci}}</translation>
 <translation id="2614981083756825552">Layout MathML</translation>
 <translation id="2624431853467395961">Apri la modalità di apprendimento</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
index 38f8ef0b..f99d7b8 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="lv">
 <translation id="100812568230599391">Mainiet displeja stilu uz mijas attēlojumu.</translation>
+<translation id="1011903154582639569">Atrodiet taustiņu, pēc tam atlaidiet pirkstu, lai ierakstītu</translation>
 <translation id="1012173283529841972">Saraksta vienums</translation>
 <translation id="1013742170491673792">meklēšana</translation>
 <translation id="1022586497894531524">Vai izmantojat ChromeVox balss funkciju pirmo reizi? Šajā ātrajā pamācībā ir izskaidroti darba sākšanas ar ChromeVox pamati.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">gramatikas kļūda</translation>
 <translation id="257674075312929031">Grupa</translation>
 <translation id="2582407057977008361">malā novietots saturs</translation>
+<translation id="2592212930811759050">Veiciet dubultskārienu, lai sāktu rediģēšanu</translation>
 <translation id="2606210917827248971">ar {COUNT,plural, =1{# vienumu}zero{# vienumiem}one{# vienumu}other{# vienumiem}}</translation>
 <translation id="2614981083756825552">MathML izkārtojums</translation>
 <translation id="2624431853467395961">Atvērt mācību režīmu</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
index 6af129d..181c0210 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ms">
 <translation id="100812568230599391">Tukar gaya paparan kepada antara lembar</translation>
+<translation id="1011903154582639569">Cari kekunci, kemudian angkat untuk menaip</translation>
 <translation id="1012173283529841972">Item senarai</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">Adakah ini kali pertama anda menggunakan maklum balas yang dituturkan ChromeVox? Tutorial pantas ini menerangkan perkara asas untuk bermula dengan ChromeVox.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">kesilapan tatabahasa</translation>
 <translation id="257674075312929031">Kumpulan</translation>
 <translation id="2582407057977008361">Ke sebelah</translation>
+<translation id="2592212930811759050">Ketik dua kali untuk mula mengedit</translation>
 <translation id="2606210917827248971">dengan {COUNT,plural, =1{# item}other{# item}}</translation>
 <translation id="2614981083756825552">Reka Letak ML Matematik</translation>
 <translation id="2624431853467395961">Buka mod belajar</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
index 23989606..84ede8d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="nl">
 <translation id="100812568230599391">De weergavestijl wijzigen in interleave.</translation>
+<translation id="1011903154582639569">Zoek een toets en til je vinger op om te typen</translation>
 <translation id="1012173283529841972">Lijstitem</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">Gebruik je de gesproken feedback van ChromeVox voor de eerste keer? In deze korte handleiding worden de basisprincipes uitgelegd, zodat je aan de slag kunt met ChromeVox.</translation>
@@ -162,6 +163,7 @@
 <translation id="2553108862507765288">grammaticafout</translation>
 <translation id="257674075312929031">Groep</translation>
 <translation id="2582407057977008361">Terzijde</translation>
+<translation id="2592212930811759050">Dubbeltik om te beginnen met bewerken</translation>
 <translation id="2606210917827248971">met {COUNT,plural, =1{# item}other{# items}}</translation>
 <translation id="2614981083756825552">MathML-indeling</translation>
 <translation id="2624431853467395961">Leermodus openen</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
index 0eb69b6d..e8f8c10 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
@@ -754,7 +754,7 @@
 <translation id="7241683698754534149">Åpne lange beskrivelser i en ny fane</translation>
 <translation id="7248671827512403053">App</translation>
 <translation id="725969808843520477">Neste alternativknapp</translation>
-<translation id="7261612856573623172">System teskt til tale stemme</translation>
+<translation id="7261612856573623172">Systemstemme for tekst til tale</translation>
 <translation id="7269119382257320590">Ingen tegnsetting</translation>
 <translation id="7273174640290488576">Tom</translation>
 <translation id="7274770952766771364">Kommentarreferanse</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
index b296bb3..670d1d2 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="pl">
 <translation id="100812568230599391">Zmień styl wyświetlania na Przeplatany.</translation>
+<translation id="1011903154582639569">Znajdź klawisz, a potem unieś palec, by wpisać znak</translation>
 <translation id="1012173283529841972">Element listy</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">Korzystasz z czytnika ChromeVox po raz pierwszy? Pomoże Ci ten krótki samouczek.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">błąd gramatyczny</translation>
 <translation id="257674075312929031">Grupa</translation>
 <translation id="2582407057977008361">Z boku</translation>
+<translation id="2592212930811759050">Kliknij dwukrotnie, by rozpocząć edycję</translation>
 <translation id="2606210917827248971">z {COUNT,plural, =1{# elementem}few{# elementami}many{# elementami}other{# elementu}}</translation>
 <translation id="2614981083756825552">Układ MathML</translation>
 <translation id="2624431853467395961">Otwórz tryb informacyjny</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
index 8a79353a..4815a3f 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="pt-BR">
 <translation id="100812568230599391">Alterar o estilo de exibição para intercalado.</translation>
+<translation id="1011903154582639569">Encontre uma tecla e levante o dedo para digitá-la</translation>
 <translation id="1012173283529841972">Item da lista</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">Está usando o feedback falado do ChromeVox pela primeira vez? Este tutorial rápido explica os fundamentos para começar a usar o ChromeVox.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">grammatical mistake</translation>
 <translation id="257674075312929031">Grupo</translation>
 <translation id="2582407057977008361">Lateral</translation>
+<translation id="2592212930811759050">Toque duas vezes para começar a editar</translation>
 <translation id="2606210917827248971">com {COUNT,plural, =1{# item}one{# itens}other{# itens}}</translation>
 <translation id="2614981083756825552">Layout Math ML</translation>
 <translation id="2624431853467395961">Abre o modo de aprendizado</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb
index d12c7b5..dc75935 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="pt-PT">
 <translation id="100812568230599391">Alterar o estilo do ecrã para intercalado.</translation>
+<translation id="1011903154582639569">Encontre uma tecla e, em seguida, levante o dedo para escrever.</translation>
 <translation id="1012173283529841972">Item de lista</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">Está a utilizar os comentários de voz do ChromeVox pela primeira vez? Este tutorial rápido explica as noções básicas para começar a utilizar o ChromeVox.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">erro gramatical</translation>
 <translation id="257674075312929031">Grupo</translation>
 <translation id="2582407057977008361">À parte</translation>
+<translation id="2592212930811759050">Toque duas vezes para começar a editar.</translation>
 <translation id="2606210917827248971">com {COUNT,plural, =1{# item}other{# itens}}</translation>
 <translation id="2614981083756825552">Esquema de Matemática ML</translation>
 <translation id="2624431853467395961">Abrir modo de aprendizagem</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
index e315162..1907cac 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ro">
 <translation id="100812568230599391">Schimbă stilul de afișare la intercalat.</translation>
+<translation id="1011903154582639569">Găsește o tastă, apoi ridică degetul ca să o selectezi</translation>
 <translation id="1012173283529841972">Element din listă</translation>
 <translation id="1013742170491673792">căutare</translation>
 <translation id="1022586497894531524">Folosești feedbackul rostit ChromeVox pentru prima dată? Acest tutorial rapid explică noțiunile de bază pentru a începe să folosești ChromeVox.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">greșeală gramaticală</translation>
 <translation id="257674075312929031">Grup</translation>
 <translation id="2582407057977008361">Separat</translation>
+<translation id="2592212930811759050">Atinge de două ori pentru a începe editarea</translation>
 <translation id="2606210917827248971">cu {COUNT,plural, =1{# element}few{# elemente}other{# de elemente}}</translation>
 <translation id="2614981083756825552">Aspect Math ML</translation>
 <translation id="2624431853467395961">Deschide modul de învățare</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
index 31e58596..7a28f6d4 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sk">
 <translation id="100812568230599391">Zmeniť štýl zobrazenia na prekladaný</translation>
+<translation id="1011903154582639569">Nájdite kláves, potom napíšte písmeno zdvihnutím prsta</translation>
 <translation id="1012173283529841972">Položka zoznamu</translation>
 <translation id="1013742170491673792">srched</translation>
 <translation id="1022586497894531524">Používate hovorenú spätnú väzbu čítačky ChromeVox prvýkrát? Tento stručný návod vám vysvetlí základy potrebné na začatie používania čítačky ChromeVox.</translation>
@@ -162,6 +163,7 @@
 <translation id="2553108862507765288">gramatická chyba</translation>
 <translation id="257674075312929031">Skupina</translation>
 <translation id="2582407057977008361">Vedľa</translation>
+<translation id="2592212930811759050">Začnite upravovať dvojitým klepnutím</translation>
 <translation id="2606210917827248971">s {COUNT,plural, =1{# položkou}few{# položkami}many{# položkami}other{# položkami}}</translation>
 <translation id="2614981083756825552">Rozloženie jazyka Math ML</translation>
 <translation id="2624431853467395961">Otvoriť režim učenia</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
index 02e7af3..96e5877 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sl">
 <translation id="100812568230599391">Spreminjanje sloga prikaza na prepletanje.</translation>
+<translation id="1011903154582639569">Poiščite tipko, nato dvignite prst, če jo želite vnesti</translation>
 <translation id="1012173283529841972">Element seznama</translation>
 <translation id="1013742170491673792">iskel</translation>
 <translation id="1022586497894531524">Ali prvič uporabljate glasovni odziv ChromeVoxa? V tej kratki vadnici so pojasnjene osnove, ki jih morate vedeti, če želite začeti uporabljati ChromeVox.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">slovnična napaka</translation>
 <translation id="257674075312929031">Skupina</translation>
 <translation id="2582407057977008361">Razen</translation>
+<translation id="2592212930811759050">Dvakrat se dotaknite, če želite začeti urejati</translation>
 <translation id="2606210917827248971">s/z {COUNT,plural, =1{# elementom}one{# elementom}two{# elementoma}few{# elementi}other{# elementi}}</translation>
 <translation id="2614981083756825552">Postavitev Math ML</translation>
 <translation id="2624431853467395961">Odpiranje načina za učenje</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
index eae8f2a..3111abe 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sr">
 <translation id="100812568230599391">Промени стил приказа у „преклапање“.</translation>
+<translation id="1011903154582639569">Нађите тастер, па подигните прст да бисте унели</translation>
 <translation id="1012173283529841972">Ставка листе</translation>
 <translation id="1013742170491673792">претрага</translation>
 <translation id="1022586497894531524">Да ли први пут користите ChromeVox говорне повратне информације? Овај кратки водич објашњава основне ствари потребне за почетне кораке са услугом ChromeVox.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">граматичка грешка</translation>
 <translation id="257674075312929031">Група</translation>
 <translation id="2582407057977008361">Додатно</translation>
+<translation id="2592212930811759050">Двапут додирните да бисте почели да мењате</translation>
 <translation id="2606210917827248971">са {COUNT,plural, =1{# ставком}one{# ставком}few{# ставке}other{# ставки}}</translation>
 <translation id="2614981083756825552">Math ML распоред</translation>
 <translation id="2624431853467395961">Отвара режим за учење</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
index bed1442..0502846 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sv">
 <translation id="100812568230599391">Ändra visningsformatet till omlott.</translation>
+<translation id="1011903154582639569">Leta upp en tangent och lyft sedan fingret för att skriva tecknet</translation>
 <translation id="1012173283529841972">Post i lista</translation>
 <translation id="1013742170491673792">sökfält</translation>
 <translation id="1022586497894531524">Är det första gången du använder talad feedback med ChromeVox? I dessa korta självstudier förklaras de grundläggande stegen för att komma igång med ChromeVox.</translation>
@@ -163,6 +164,7 @@
 <translation id="2553108862507765288">grammatiskt fel</translation>
 <translation id="257674075312929031">Grupp</translation>
 <translation id="2582407057977008361">Sidopanel</translation>
+<translation id="2592212930811759050">Börja redigera genom att trycka snabbt två gånger</translation>
 <translation id="2606210917827248971">med {COUNT,plural, =1{# objekt}other{# objekt}}</translation>
 <translation id="2614981083756825552">Math ML-layout</translation>
 <translation id="2624431853467395961">Öppna inlärningsläge</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
index 772b0446..b4f0998c 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sw">
 <translation id="100812568230599391">Badilisha mtindo wa onyesho uwe mchanganyiko.</translation>
+<translation id="1011903154582639569">Tafuta kitufe, kisha ukiinue ili uandike</translation>
 <translation id="1012173283529841972">Kipengee cha orodha</translation>
 <translation id="1013742170491673792">imetafuta</translation>
 <translation id="1022586497894531524">Je, unatumia maelezo yanayotamkwa ya ChromeVox kwa mara ya kwanza? Mafunzo haya ya haraka yanaeleza mambo muhimu katika mwongozo wa kuanza kutumia ChromeVox.</translation>
@@ -162,6 +163,7 @@
 <translation id="2553108862507765288">kosa la sarufi</translation>
 <translation id="257674075312929031">Kikundi</translation>
 <translation id="2582407057977008361">Kando</translation>
+<translation id="2592212930811759050">Gusa mara mbili ili uanze kubadilisha</translation>
 <translation id="2606210917827248971">ina {COUNT,plural, =1{Kipengee #}other{Vipengee #}}</translation>
 <translation id="2614981083756825552">Mpangilio wa Hisabati ML</translation>
 <translation id="2624431853467395961">Fungua hali ya kujifunza</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
index f7da537..1a69ebe1 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="uk">
 <translation id="100812568230599391">Змінити стиль дисплея на чергування.</translation>
+<translation id="1011903154582639569">Знайдіть клавішу й підніміть палець, щоб ввести символ</translation>
 <translation id="1012173283529841972">Пункт списку</translation>
 <translation id="1013742170491673792">пошук</translation>
 <translation id="1022586497894531524">Уперше користуєтеся голосовими підказками ChromeVox? З цього посібника ви швидко дізнаєтеся про основні функції програми.</translation>
@@ -162,6 +163,7 @@
 <translation id="2553108862507765288">граматична помилка</translation>
 <translation id="257674075312929031">Група</translation>
 <translation id="2582407057977008361">Бічний колонтитул</translation>
+<translation id="2592212930811759050">Двічі торкніться, щоб змінити текст</translation>
 <translation id="2606210917827248971">з {COUNT,plural, =1{1 пунктом}one{# пунктом}few{# пунктами}many{# пунктами}other{# пункту}}</translation>
 <translation id="2614981083756825552">Розмітка Math ML</translation>
 <translation id="2624431853467395961">Відкрити сторінку "Докладніше"</translation>
diff --git a/chrome/browser/resources/chromeos/login/images/welcome_illustration_1x.png b/chrome/browser/resources/chromeos/login/images/welcome_illustration_1x.png
deleted file mode 100644
index 31342a6b..0000000
--- a/chrome/browser/resources/chromeos/login/images/welcome_illustration_1x.png
+++ /dev/null
Binary files differ
diff --git a/chrome/browser/resources/chromeos/login/images/welcome_illustration_2x.png b/chrome/browser/resources/chromeos/login/images/welcome_illustration_2x.png
deleted file mode 100644
index bbdbccf3b..0000000
--- a/chrome/browser/resources/chromeos/login/images/welcome_illustration_2x.png
+++ /dev/null
Binary files differ
diff --git a/chrome/browser/resources/chromeos/login/images/welcome_illustration_tablet_mode_1x.png b/chrome/browser/resources/chromeos/login/images/welcome_illustration_tablet_mode_1x.png
deleted file mode 100644
index 7f50829f..0000000
--- a/chrome/browser/resources/chromeos/login/images/welcome_illustration_tablet_mode_1x.png
+++ /dev/null
Binary files differ
diff --git a/chrome/browser/resources/chromeos/login/images/welcome_illustration_tablet_mode_2x.png b/chrome/browser/resources/chromeos/login/images/welcome_illustration_tablet_mode_2x.png
deleted file mode 100644
index fc281935..0000000
--- a/chrome/browser/resources/chromeos/login/images/welcome_illustration_tablet_mode_2x.png
+++ /dev/null
Binary files differ
diff --git a/chrome/browser/resources/chromeos/login/images/welcome_illustration_tablet_mode_portraight_1x.png b/chrome/browser/resources/chromeos/login/images/welcome_illustration_tablet_mode_portraight_1x.png
deleted file mode 100644
index c1558bb3..0000000
--- a/chrome/browser/resources/chromeos/login/images/welcome_illustration_tablet_mode_portraight_1x.png
+++ /dev/null
Binary files differ
diff --git a/chrome/browser/resources/chromeos/login/images/welcome_illustration_tablet_mode_portraight_2x.png b/chrome/browser/resources/chromeos/login/images/welcome_illustration_tablet_mode_portraight_2x.png
deleted file mode 100644
index 6c651a9..0000000
--- a/chrome/browser/resources/chromeos/login/images/welcome_illustration_tablet_mode_portraight_2x.png
+++ /dev/null
Binary files differ
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome.js b/chrome/browser/resources/chromeos/login/oobe_welcome.js
index 876d61e..ab8a912 100644
--- a/chrome/browser/resources/chromeos/login/oobe_welcome.js
+++ b/chrome/browser/resources/chromeos/login/oobe_welcome.js
@@ -94,6 +94,10 @@
       if (behavior.onBeforeShow)
         behavior.onBeforeShow.call(this);
     });
+
+    let activeScreen = this.getActiveScreen_();
+    if (activeScreen.show)
+      activeScreen.show();
   },
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html
index 75e2650b1..b6b7e07 100644
--- a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html
+++ b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html
@@ -66,17 +66,41 @@
         <div class="layout vertical end-justified" id="titleContainer">
           <h1 id="title">[[i18nDynamic(locale, 'welcomeScreenGreeting')]]</h1>
         </div>
-        <div class="welcome-illustration" hidden="[[isInTabletMode]]">
-          <img srcset="images/welcome_illustration_1x.png 1x,
-                       images/welcome_illustration_2x.png 2x">
-        </div>
-        <div class="welcome-illustration" hidden="[[!isInTabletMode]]">
-          <img hidden="[[!isInPortraitMode]]"
-              srcset="images/welcome_illustration_tablet_mode_portraight_1x.png 1x,
-                      images/welcome_illustration_tablet_mode_portraight_2x.png 2x">
-          <img hidden="[[isInPortraitMode]]"
-              srcset="images/welcome_illustration_tablet_mode_1x.png 1x,
-                      images/welcome_illustration_tablet_mode_2x.png 2x">
+        <div class="welcome-illustration">
+          <if expr="chromeos and _google_chrome">
+            <video muted hidden oobe_devices="laptop_G"
+                oobe_orientations="portrait,landscape" oobe_types="intro"
+                src="../../../internal/resources/chromeos/animations/oobe-welcome/laptop_G_intro.webm">
+            </video>
+            <video muted loop hidden oobe_devices="laptop_G"
+                oobe_orientations="portrait,landscape" oobe_types="loop"
+                src="../../../internal/resources/chromeos/animations/oobe-welcome/laptop_G_loop.webm">
+            </video>
+            <video muted hidden oobe_devices="laptop"
+                oobe_orientations="portrait,landscape" oobe_types="intro"
+                src="../../../internal/resources/chromeos/animations/oobe-welcome/laptop_intro.webm">
+            </video>
+            <video muted loop hidden oobe_devices="laptop"
+                oobe_orientations="portrait,landscape" oobe_types="loop"
+                src="../../../internal/resources/chromeos/animations/oobe-welcome/laptop_loop.webm">
+            </video>
+            <video muted hidden oobe_devices="tablet_G"
+                oobe_orientations="portrait,landscape" oobe_types="intro"
+                src="../../../internal/resources/chromeos/animations/oobe-welcome/tablet_G_intro.webm">
+            </video>
+            <video muted loop hidden oobe_devices="tablet_G"
+                oobe_orientations="portrait,landscape" oobe_types="loop"
+                src="../../../internal/resources/chromeos/animations/oobe-welcome/tablet_G_loop.webm">
+            </video>
+            <video muted hidden oobe_devices="tablet"
+                oobe_orientations="portrait,landscape" oobe_types="intro"
+                src="../../../internal/resources/chromeos/animations/oobe-welcome/tablet_intro.webm">
+            </video>
+            <video muted loop hidden oobe_devices="tablet"
+                oobe_orientations="portrait,landscape" oobe_types="loop"
+                src="../../../internal/resources/chromeos/animations/oobe-welcome/tablet_loop.webm">
+            </video>
+          </if>
         </div>
         <div hidden="[[!debuggingLinkVisible]]">
           <a href="#" on-tap="onDebuggingLinkClicked_">
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.js b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.js
index 60a3b14..5c385a8 100644
--- a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.js
+++ b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.js
@@ -3,9 +3,9 @@
 // found in the LICENSE file.
 
 {
-  var LONG_TOUCH_TIME_MS = 1000;
+  const LONG_TOUCH_TIME_MS = 1000;
 
-  function LongTouchDetector(element, callback) {
+  function TitleLongTouchDetector(element, callback) {
     this.callback_ = callback;
 
     element.addEventListener('touchstart', this.onTouchStart_.bind(this));
@@ -17,7 +17,7 @@
     element.addEventListener('mouseleave', this.killTimer_.bind(this));
   }
 
-  LongTouchDetector.prototype = {
+  TitleLongTouchDetector.prototype = {
     /**
      * This is timeout ID used to kill window timeout that fires "detected"
      * callback if touch event was cancelled.
@@ -57,6 +57,195 @@
     },
   };
 
+  const VIDEO_DEVICE = {
+    LAPTOP: 'laptop',
+    TABLET: 'tablet',
+    LAPTOP_G: 'laptop_G',
+    TABLET_G: 'tablet_G',
+  };
+
+  const VIDEO_ORIENTATION = {
+    PORTRAIT: 'portrait',
+    LANDSCAPE: 'landscape',
+  };
+
+  const VIDEO_TYPE = {
+    INTRO: 'intro',
+    LOOP: 'loop',
+  };
+
+  class WelcomeVideoController {
+    /**
+     * This calculates key that is used to identify <video> node in internal
+     * mapping between possible video configurations and actual videos.
+     *
+     * @param {VIDEO_DEVICE} device Allowed device type.
+     * @param {VIDEO_ORIENTATION} orientation Allowed orientation.
+     * @param {VIDEO_TYPE} type Allowed type.
+     * @return {String} Returns <video> key to be stored in this.videos.
+     * @private
+     */
+    calcKey_(device, orientation, type) {
+      return device + '-' + orientation + '-' + type;
+    }
+
+    /**
+     * @param {VIDEO_DEVICE} device Allowed device type.
+     * @param {VIDEO_ORIENTATION} orientation Allowed orientation.
+     */
+    constructor(device, orientation) {
+      this.devices = new Set();
+      this.orientations = new Set();
+      this.types = new Set();
+      for (let key in VIDEO_DEVICE)
+        this.devices.add(VIDEO_DEVICE[key]);
+
+      for (let key in VIDEO_ORIENTATION)
+        this.orientations.add(VIDEO_ORIENTATION[key]);
+
+      for (let key in VIDEO_TYPE)
+        this.types.add(VIDEO_TYPE[key]);
+
+      assert(this.devices.has(device));
+      assert(this.orientations.has(orientation));
+
+      this.device = device;
+      this.orientation = orientation;
+      this.type = VIDEO_TYPE.INTRO;
+
+      // This is map from 'device-orientation-video_type' to video DOM object.
+      this.videos = new Map();
+    }
+
+    /**
+     * Returns currently playing video.
+     * If none are playing, falls back to currently visible one, because
+     * it might have accidentally stopped because of media error.
+     *
+     * @return {Object|null} Returns <video> DOM node.
+     * @private
+     */
+    getActiveVideo_() {
+      for (let node of this.videos.values()) {
+        if (!node.paused)
+          return node;
+      }
+      // Media decode error stops video play. Try 'hidden' instead.
+      for (let node of this.videos.values()) {
+        if (!node.hasAttribute('hidden'))
+          return node;
+      }
+      return null;
+    }
+
+    /**
+     * @param {Object} video <video> DOM node with valid |oobe_devices|,
+     *     |oobe_orientations| and |oobe_types|.
+     * |oobe_devices| is a comma-separated list of VIDEO_DEVICE values.
+     * |oobe_orientations| is a comma-separated list of VIDEO_ORIENTATION
+     *     values.
+     * |oobe_types| is a comma-separated list of VIDEO_TYPE values.
+     */
+    add(video) {
+      // Split strings by comma and trim space.
+      let devices = video.getAttribute('oobe_devices')
+                        .split(',')
+                        .map((str) => str.replace(/\s/g, ''));
+      let orientations = video.getAttribute('oobe_orientations')
+                             .split(',')
+                             .map((str) => str.replace(/\s/g, ''));
+      let types = video.getAttribute('oobe_types')
+                      .split(',')
+                      .map((str) => str.replace(/\s/g, ''));
+
+      for (let device of devices) {
+        assert(this.devices.has(device));
+
+        for (let orientation of orientations) {
+          assert(this.orientations.has(orientation));
+
+          for (let type of types) {
+            assert(this.types.has(type));
+
+            let key = this.calcKey_(device, orientation, type);
+            assert(!this.videos.has(key));
+
+            this.videos.set(key, video);
+
+            if (type == VIDEO_TYPE.INTRO)
+              video.addEventListener('ended', (event) => {
+                event.target.setAttribute('hidden', '');
+                this.type = VIDEO_TYPE.LOOP;
+                this.play();
+              });
+          }
+        }
+      }
+    }
+
+    /**
+     * Hides all videos.
+     * @private
+     */
+    hideAll_() {
+      for (let node of this.videos.values())
+        node.setAttribute('hidden', '');
+    }
+
+    /**
+     * Updates screen configuration, and switches to appropriate video to match
+     * it.
+     *
+     * @param {String} device Allowed device type.
+     * @param {String} orientation Allowed orientation.
+     */
+    updateConfiguration(device, orientation) {
+      assert(this.devices.has(device));
+      assert(this.orientations.has(orientation));
+
+      if (device === this.device && orientation === this.orientation)
+        return;
+
+      this.device = device;
+      this.orientation = orientation;
+      let previousVideo = this.getActiveVideo_();
+      let nextKey = this.calcKey_(device, orientation, this.type);
+      let nextVideo = this.videos.get(nextKey);
+
+      // Some video may match more than one key.
+      if (previousVideo === nextVideo)
+        return;
+
+      if (previousVideo)
+        previousVideo.pause();
+
+      if (previousVideo && nextVideo)
+        nextVideo.currentTime = previousVideo.currentTime;
+
+      this.hideAll_();
+      if (nextVideo) {
+        nextVideo.removeAttribute('hidden');
+        nextVideo.play();
+      }
+    }
+
+    /**
+     *  Starts active video.
+     */
+    play() {
+      if (this.getActiveVideo_())
+        return;
+
+      let key = this.calcKey_(this.device, this.orientation, this.type);
+      let video = this.videos.get(key);
+
+      if (video) {
+        video.removeAttribute('hidden');
+        video.play();
+      }
+    }
+  }
+
   Polymer({
     is: 'oobe-welcome-dialog',
 
@@ -87,20 +276,45 @@
       /**
        * True when in tablet mode.
        */
-      isInTabletMode: Boolean,
+      isInTabletMode: {
+        type: Boolean,
+        observer: 'updateVideoMode_',
+      },
 
       /**
-       * True when scree orientation is portraight.
+       * True when scree orientation is portrait.
        */
-      isInPortraitMode: Boolean,
+      isInPortraitMode: {
+        type: Boolean,
+        observer: 'updateVideoMode_',
+      }
+    },
+
+    getVideoDeviceType_: function() {
+      return this.isInTabletMode ? VIDEO_DEVICE.TABLET : VIDEO_DEVICE.LAPTOP;
+    },
+
+    getVideoOrientationType_: function() {
+      return this.isInPortraitMode ? VIDEO_ORIENTATION.PORTRAIT :
+                                     VIDEO_ORIENTATION.LANDSCAPE;
+    },
+
+    updateVideoMode_: function() {
+      this.welcomeVideoController_.updateConfiguration(
+          this.getVideoDeviceType_(), this.getVideoOrientationType_());
     },
 
     /**
-     * @private {LongTouchDetector}
+     * @private {TitleLongTouchDetector}
      */
     titleLongTouchDetector_: null,
 
     /**
+     * @private {WelcomeVideoController}
+     */
+    welcomeVideoController_: null,
+
+    /**
      * This is stored ID of currently focused element to restore id on returns
      * to this dialog from Language / Timezone Selection dialogs.
      */
@@ -141,14 +355,20 @@
     },
 
     attached: function() {
-      this.titleLongTouchDetector_ = new LongTouchDetector(
+      this.welcomeVideoController_ = new WelcomeVideoController(
+          this.getVideoDeviceType_(), this.getVideoOrientationType_());
+      let videos = Polymer.dom(this.root).querySelectorAll('video');
+      for (let video of videos)
+        this.welcomeVideoController_.add(video);
+
+      this.titleLongTouchDetector_ = new TitleLongTouchDetector(
           this.$.title, this.onTitleLongTouch_.bind(this));
       this.focus();
     },
 
     focus: function() {
       this.onWindowResize();
-      var focusedElement = this.$[this.focusedElement_];
+      let focusedElement = this.$[this.focusedElement_];
       if (focusedElement)
         focusedElement.focus();
     },
@@ -158,6 +378,7 @@
      */
     show: function() {
       this.focus();
+      this.welcomeVideoController_.play();
     },
 
     /**
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ar.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ar.xtb
index 774477b..cf155a1a 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ar.xtb
@@ -1,10 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ar">
-<translation id="111880247472081232">تم ترحيل إعداداتك لتحويل النص إلى كلام لخدمة سماع الاختيار إلى الإعدادات العامة لتحويل النص إلى كلام.</translation>
+<translation id="111880247472081232">تمّ ترحيل إعدادات "تحويل النص إلى كلام" الخاصة بخدمة "سماع الاختيار" إلى الإعدادات العامة لميزة "تحويل النص إلى كلام".</translation>
 <translation id="1197088940767939838">برتقالي</translation>
-<translation id="1273314450961659276">إعدادات تحويل النص إلى كلام</translation>
-<translation id="1498542103351704084">تم تحديث إعدادات الكلام لخدمة سماع الاختيار</translation>
+<translation id="1273314450961659276">إعدادات ميزة "تحويل النص إلى كلام"</translation>
+<translation id="1498542103351704084">تم تحديث إعدادات الكلام لخدمة "سماع الاختيار"</translation>
 <translation id="1555130319947370107">أزرق</translation>
 <translation id="1666326070478924810">إعدادات "سماع الاختيار"</translation>
 <translation id="1966649499058910679">تحديد كل كلمة أثناء نطقها</translation>
@@ -12,14 +12,14 @@
 <translation id="2714180132046334502">خلفية معتمة</translation>
 <translation id="27349076983469322">خلفية فاتحة</translation>
 <translation id="335581015389089642">الحديث</translation>
-<translation id="3784184786832188702">تستخدم الآن خدمة سماع الاختيار الإعدادات العامة لتحويل النص إلى كلام.</translation>
+<translation id="3784184786832188702">تستخدم الآن خدمة "سماع الاختيار" الإعدادات العامة لميزة "تحويل النص إلى كلام".</translation>
 <translation id="5901630391730855834">أصفر</translation>
 <translation id="6017514345406065928">أخضر</translation>
 <translation id="6475604559827479857">لون لتمييز الكلمة:</translation>
 <translation id="6837853484260746864">تحديد صوت:</translation>
-<translation id="7261612856573623172">صوت تحويل النص إلى كلام في النظام</translation>
+<translation id="7261612856573623172">اسم الصوت المستخدَم في ميزة "تحويل النص إلى كلام" في النظام</translation>
 <translation id="7768784765476638775">سماع الاختيار</translation>
 <translation id="7914870167134465181">التمييز</translation>
-<translation id="8324974933005349667">تخصيص إعدادات تحويل النص إلى كلام</translation>
+<translation id="8324974933005349667">تخصيص إعدادات ميزة "تحويل النص إلى كلام"</translation>
 <translation id="992256792861109788">وردي</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_cs.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_cs.xtb
index 2a877778..9da1e38d 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_cs.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_cs.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="cs">
-<translation id="111880247472081232">Nastavení převodu textu na řeč pro poslech vybraného textu byla migrována do globálních nastavení převodu textu na řeč.</translation>
+<translation id="111880247472081232">Nastavení převodu textu na řeč pro poslech vybraného textu byla převedena do globálních nastavení převodu textu na řeč.</translation>
 <translation id="1197088940767939838">Oranžová</translation>
 <translation id="1273314450961659276">Nastavení převodu textu na řeč</translation>
 <translation id="1498542103351704084">Byla aktualizována nastavení převodu textu na řeč pro poslech vybraného textu</translation>
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_de.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_de.xtb
index b6150b2..718571d 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_de.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_de.xtb
@@ -4,7 +4,7 @@
 <translation id="111880247472081232">Ihre Sprachausgabe-Einstellungen für die Funktion "Vorlesen" wurden zu den globalen Sprachausgabe-Einstellungen migriert.</translation>
 <translation id="1197088940767939838">Orange</translation>
 <translation id="1273314450961659276">Einstellungen für Sprachausgabe</translation>
-<translation id="1498542103351704084">Spracheinstellungen der Funktion "Vorlesen" wurden aktualisiert</translation>
+<translation id="1498542103351704084">Spracheinstellungen für die Funktion "Vorlesen" wurden aktualisiert</translation>
 <translation id="1555130319947370107">Blau</translation>
 <translation id="1666326070478924810">Einstellungen für "Vorlesen"</translation>
 <translation id="1966649499058910679">Jedes Wort hervorheben, das gerade gesprochen wird</translation>
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_es-419.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_es-419.xtb
index b9cb16c..9157e4a 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_es-419.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_es-419.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="es-419">
-<translation id="111880247472081232">Tus opciones de configuración de Seleccionar para pronunciar texto a voz migraron a la configuración de texto a voz.</translation>
+<translation id="111880247472081232">Tus opciones de configuración de Seleccionar para pronunciar texto a voz migraron a la configuración de texto a voz global.</translation>
 <translation id="1197088940767939838">Naranja</translation>
 <translation id="1273314450961659276">Configuración de texto a voz</translation>
 <translation id="1498542103351704084">Se actualizó la configuración de Seleccionar para pronunciar</translation>
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hi.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hi.xtb
index 4337c13..2f562f4 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hi.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hi.xtb
@@ -4,7 +4,7 @@
 <translation id="111880247472081232">आपकी 'चुनें और सुनें' सेवा की लिखाई को बोली में बदलने की सेटिंग, लिखाई को बोली में बदलने की वैश्विक सेटिंग में माइग्रेट की गई हैं.</translation>
 <translation id="1197088940767939838">नारंगी</translation>
 <translation id="1273314450961659276">लिखाई को बोली में बदलने की सेटिंग</translation>
-<translation id="1498542103351704084">'चुनें और चुनें' सेवा की बोली सेटिंग अपडेट की गईं</translation>
+<translation id="1498542103351704084">'चुनें और सुनें' सेवा की बोली सेटिंग अपडेट की गईं</translation>
 <translation id="1555130319947370107">नीला</translation>
 <translation id="1666326070478924810">चुनें और सुनें सेटिंग</translation>
 <translation id="1966649499058910679">जैसे-जैसे हर शब्द बोला जाए, उसे हाइलाइट करें</translation>
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_kn.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_kn.xtb
index 8c54dd8..201c285 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_kn.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_kn.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="kn">
-<translation id="111880247472081232">ಧ್ವನಿ ಆಯ್ಕೆ ಮಾಡಿ ವೈಶಿಷ್ಟ್ಯದಲ್ಲಿ ಪಠ್ಯದಿಂದ ಧ್ವನಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಜಾಗತಿಕ ಪಠ್ಯದಿಂದ ಧ್ವನಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ರವಾನಿಸಲಾಗಿದೆ.</translation>
+<translation id="111880247472081232">"ಧ್ವನಿ ಆಯ್ಕೆ ಮಾಡಿ" ವೈಶಿಷ್ಟ್ಯದಲ್ಲಿ "ಪಠ್ಯದಿಂದ ಧ್ವನಿ" ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಜಾಗತಿಕ "ಪಠ್ಯದಿಂದ ಧ್ವನಿ" ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಸ್ಥಳಾಂತರಗೊಳಿಸಲಾಗಿದೆ.</translation>
 <translation id="1197088940767939838">ಕಿತ್ತಳೆ</translation>
 <translation id="1273314450961659276">ಪಠ್ಯದಿಂದ ಧ್ವನಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="1498542103351704084">ಧ್ವನಿ ಆಯ್ಕೆ ಮಾಡಿ ವೈಶಿಷ್ಟ್ಯದ ಧ್ವನಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗಿದೆ</translation>
@@ -12,7 +12,7 @@
 <translation id="2714180132046334502">ದಟ್ಟ ಬೆಳಕಿನ ಹಿನ್ನೆಲೆ</translation>
 <translation id="27349076983469322">ಮಂದ ಬೆಳಕಿನ ಹಿನ್ನೆಲೆ</translation>
 <translation id="335581015389089642">ಧ್ವನಿ</translation>
-<translation id="3784184786832188702">ಧ್ವನಿ ಆಯ್ಕೆ ಮಾಡಿ ವೈಶಿಶ್ಟ್ಯವು ಈಗ ಪಠ್ಯದಿಂದ ಧ್ವನಿಯ ಜಾಗತಿಕ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬಳಸುತ್ತದೆ.</translation>
+<translation id="3784184786832188702">ಧ್ವನಿ ಆಯ್ಕೆ ಮಾಡಿ ವೈಶಿಷ್ಟ್ಯವು ಈಗ ಪಠ್ಯದಿಂದ ಧ್ವನಿಯ ಜಾಗತಿಕ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬಳಸುತ್ತದೆ.</translation>
 <translation id="5901630391730855834">ಹಳದಿ</translation>
 <translation id="6017514345406065928">ಹಸಿರು</translation>
 <translation id="6475604559827479857">ಪದಗಳ ಹೈಲೈಟ್‌ಗಳಿಗಾಗಿ ಬಣ್ಣ:</translation>
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_no.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_no.xtb
index 1a9119a..7b94a94 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_no.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_no.xtb
@@ -1,10 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="no">
-<translation id="111880247472081232">Innstillingene for tekstopplesning og tekst til tale ble migrert til de globale test til tale innstillingene.</translation>
+<translation id="111880247472081232">Tekst-til-tale-innstillingene for tekstopplesning og er overført til de globale tekst-til-tale-innstillingene.</translation>
 <translation id="1197088940767939838">Oransje</translation>
 <translation id="1273314450961659276">Innstillinger for tekst til tale</translation>
-<translation id="1498542103351704084">Innstillinger for tekstopplesing oppdatert</translation>
+<translation id="1498542103351704084">Innstillingene for tekstopplesing er oppdatert</translation>
 <translation id="1555130319947370107">Blå</translation>
 <translation id="1666326070478924810">Innstillinger for Tekstopplesing</translation>
 <translation id="1966649499058910679">Fremhev enkeltord når de uttales</translation>
@@ -12,14 +12,14 @@
 <translation id="2714180132046334502">Mørk bakgrunn</translation>
 <translation id="27349076983469322">Lys bakgrunn</translation>
 <translation id="335581015389089642">Tale</translation>
-<translation id="3784184786832188702">Tekstopplesning bruker nå globale tekst til tale innstillinger.</translation>
+<translation id="3784184786832188702">Tekstopplesing bruker nå de globale tekst-til-tale-innstillingene.</translation>
 <translation id="5901630391730855834">Gul</translation>
 <translation id="6017514345406065928">Grønn</translation>
 <translation id="6475604559827479857">Farge for fremheving av ord:</translation>
 <translation id="6837853484260746864">Velg en stemme:</translation>
-<translation id="7261612856573623172">System teskt til tale stemme</translation>
+<translation id="7261612856573623172">Systemstemme for tekst til tale</translation>
 <translation id="7768784765476638775">Tekstopplesing</translation>
 <translation id="7914870167134465181">Fremheving</translation>
-<translation id="8324974933005349667">Gi innstillingen for tekst til tale et personlig preg</translation>
+<translation id="8324974933005349667">Gi innstillingene for tekst til tale et personlig preg</translation>
 <translation id="992256792861109788">Rosa</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_tr.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_tr.xtb
index a6dec1e..1eb4b620 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_tr.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_tr.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="tr">
-<translation id="111880247472081232">Seç ve Dinle Metin Okuma ayarlarınız genel Metin Okuma ayarlarına taşınmıştır.</translation>
+<translation id="111880247472081232">Seç ve Dinle'deki Metin Okuma ayarlarınız genel Metin Okuma ayarlarına taşınmıştır.</translation>
 <translation id="1197088940767939838">Turuncu</translation>
 <translation id="1273314450961659276">Metin Okuma ayarları</translation>
 <translation id="1498542103351704084">Seç ve Dinle konuşma ayarları güncellendi</translation>
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_vi.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_vi.xtb
index fbd4357..03607d1 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_vi.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_vi.xtb
@@ -3,7 +3,7 @@
 <translationbundle lang="vi">
 <translation id="111880247472081232">Tùy chọn cài đặt Văn bản sang lời nói của tính năng Chọn để nói đã được chuyển sang tùy chọn cài đặt Văn bản sang lời nói chung.</translation>
 <translation id="1197088940767939838">Màu cam</translation>
-<translation id="1273314450961659276">Tùy chọn cài đặt Văn bản sang lời nói</translation>
+<translation id="1273314450961659276">Cài đặt Văn bản sang lời nói</translation>
 <translation id="1498542103351704084">Đã cập nhật tùy chọn cài đặt giọng nói của tính năng Chọn để nói</translation>
 <translation id="1555130319947370107">Xanh lam</translation>
 <translation id="1666326070478924810">Cài đặt chọn để nói</translation>
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.css b/chrome/browser/resources/local_ntp/custom_backgrounds.css
index 2ade069..9092b67 100644
--- a/chrome/browser/resources/local_ntp/custom_backgrounds.css
+++ b/chrome/browser/resources/local_ntp/custom_backgrounds.css
@@ -467,6 +467,7 @@
   padding: 8px 16px 0 16px;
   position: absolute;
   text-overflow: ellipsis;
+  user-select: none;
   vertical-align: middle;
   white-space: nowrap;
   width: 124px;
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.js b/chrome/browser/resources/local_ntp/custom_links_edit.js
index b205a955a..4c4f06e 100644
--- a/chrome/browser/resources/local_ntp/custom_links_edit.js
+++ b/chrome/browser/resources/local_ntp/custom_links_edit.js
@@ -342,17 +342,17 @@
     event.preventDefault();
     finishEditLink();
   });
-  $(IDS.FORM).onkeyup = (event) => {
+  let finishEditOrClose = (event) => {
     if (event.keyCode === KEYCODES.ENTER) {
       event.preventDefault();
       if ($(IDS.DONE).disabled)
         closeDialog();
       else
         finishEditLink();
-    } else if (event.keyCode === KEYCODES.ESC) {
-      closeDialog();
     }
   };
+  $(IDS.TITLE_FIELD).onkeydown = finishEditOrClose;
+  $(IDS.URL_FIELD).onkeydown = finishEditOrClose;
   disableOutlineOnMouseClick($(IDS.DELETE));
   disableOutlineOnMouseClick($(IDS.CANCEL));
   disableOutlineOnMouseClick($(IDS.DONE));
diff --git a/chrome/browser/resources/settings/internet_page/BUILD.gn b/chrome/browser/resources/settings/internet_page/BUILD.gn
index 19d20ec04..02cd35a 100644
--- a/chrome/browser/resources/settings/internet_page/BUILD.gn
+++ b/chrome/browser/resources/settings/internet_page/BUILD.gn
@@ -12,7 +12,6 @@
     ":internet_page",
     ":internet_page_browser_proxy",
     ":internet_subpage",
-    ":network_listener_behavior",
     ":network_proxy_section",
     ":network_summary",
     ":network_summary_item",
@@ -24,9 +23,9 @@
   deps = [
     ":internet_config",
     ":internet_page_browser_proxy",
-    ":network_listener_behavior",
     "..:route",
     "../settings_page:settings_animated_pages",
+    "//ui/webui/resources/cr_elements/chromeos/network:cr_network_listener_behavior",
     "//ui/webui/resources/cr_elements/chromeos/network:cr_onc_types",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:i18n_behavior",
@@ -101,14 +100,6 @@
   extra_sources = [ "$interfaces_path/networking_private_interface.js" ]
 }
 
-js_library("network_listener_behavior") {
-  deps = [
-    "//ui/webui/resources/js:assert",
-  ]
-  externs_list = [ "$externs_path/networking_private.js" ]
-  extra_sources = [ "$interfaces_path/networking_private_interface.js" ]
-}
-
 js_library("network_proxy_section") {
   deps = [
     "..:route",
diff --git a/chrome/browser/resources/settings/internet_page/internet_page.html b/chrome/browser/resources/settings/internet_page/internet_page.html
index 90fbb772..5544462 100644
--- a/chrome/browser/resources/settings/internet_page/internet_page.html
+++ b/chrome/browser/resources/settings/internet_page/internet_page.html
@@ -1,5 +1,6 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 
+<link rel="import" href="chrome://resources/cr_elements/chromeos/network/cr_network_listener_behavior.html">
 <link rel="import" href="chrome://resources/cr_elements/chromeos/network/cr_onc_types.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_expand_button/cr_expand_button.html">
 <link rel="import" href="chrome://resources/cr_elements/icons.html">
@@ -17,7 +18,6 @@
 <link rel="import" href="internet_detail_page.html">
 <link rel="import" href="internet_known_networks_page.html">
 <link rel="import" href="internet_subpage.html">
-<link rel="import" href="network_listener_behavior.html">
 <link rel="import" href="network_summary.html">
 
 <dom-module id="settings-internet-page">
diff --git a/chrome/browser/resources/settings/internet_page/internet_page.js b/chrome/browser/resources/settings/internet_page/internet_page.js
index a275f1a..7ca43026 100644
--- a/chrome/browser/resources/settings/internet_page/internet_page.js
+++ b/chrome/browser/resources/settings/internet_page/internet_page.js
@@ -12,7 +12,7 @@
 
   behaviors: [
     I18nBehavior, settings.RouteObserverBehavior, WebUIListenerBehavior,
-    NetworkListenerBehavior
+    CrNetworkListenerBehavior
   ],
 
   properties: {
diff --git a/chrome/browser/resources/settings/internet_page/network_listener_behavior.html b/chrome/browser/resources/settings/internet_page/network_listener_behavior.html
deleted file mode 100644
index f564a746..0000000
--- a/chrome/browser/resources/settings/internet_page/network_listener_behavior.html
+++ /dev/null
@@ -1 +0,0 @@
-<script src="network_listener_behavior.js"></script>
diff --git a/chrome/browser/resources/settings/people_page/sync_browser_proxy.js b/chrome/browser/resources/settings/people_page/sync_browser_proxy.js
index 383ea7b..323a22b 100644
--- a/chrome/browser/resources/settings/people_page/sync_browser_proxy.js
+++ b/chrome/browser/resources/settings/people_page/sync_browser_proxy.js
@@ -97,6 +97,9 @@
  *   typedUrlsEnforced: boolean,
  *   typedUrlsRegistered: boolean,
  *   typedUrlsSynced: boolean,
+ *   userEventsEnforced: boolean,
+ *   userEventsRegistered: boolean,
+ *   userEventsSynced: boolean,
  * }}
  */
 settings.SyncPrefs;
diff --git a/chrome/browser/resources/settings/people_page/sync_page.html b/chrome/browser/resources/settings/people_page/sync_page.html
index 73a16e10..6af45d70 100644
--- a/chrome/browser/resources/settings/people_page/sync_page.html
+++ b/chrome/browser/resources/settings/people_page/sync_page.html
@@ -27,7 +27,8 @@
   <template>
     <style include="settings-shared iron-flex">
       #create-password-box,
-      #reset-sync-message-box {
+      #reset-sync-message-box-encryption,
+      #reset-sync-message-box-user-events {
         /* In order to line up with the encryption radio box text. */
         margin-inline-start: var(--settings-indent-width);
       }
@@ -263,8 +264,11 @@
             <div id="historyCheckboxLabel" class="flex">
               $i18n{historyCheckboxLabel}
             </div>
-            <cr-toggle checked="{{syncPrefs.typedUrlsSynced}}"
-                on-change="onSingleSyncDataTypeChanged_"
+            <!-- TypedUrls has a special on-change handler to deal with user
+                 events. -->
+            <cr-toggle id="historyToggle"
+                checked="{{syncPrefs.typedUrlsSynced}}"
+                on-change="onTypedUrlsDataTypeChanged_"
                 disabled="[[shouldSyncCheckboxBeDisabled_(
                     syncPrefs.syncAllDataTypes, syncPrefs.typedUrlsEnforced)]]"
                 aria-labelledby="historyCheckboxLabel">
@@ -344,6 +348,8 @@
             </cr-toggle>
           </div>
 
+          <!-- User events is disabled and unchecked if data is encrypted or
+               typed urls are disabled. -->
           <template is="dom-if" if="[[unifiedConsentEnabled]]">
             <div class="layout horizontal list-item"
                 hidden="[[!syncPrefs.userEventsRegistered]]">
@@ -352,12 +358,20 @@
                 <div class="secondary">
                   $i18n{userEventsCheckboxText}
                 </div>
+                <div id="reset-sync-message-box-user-events" class="list-item"
+                  hidden="[[!syncPrefs.encryptAllData]]">
+                  <span>
+                    <iron-icon icon="settings:info-outline"></iron-icon>
+                    $i18nRaw{passphraseResetHint}
+                  </span>
+                </div>
               </div>
-              <cr-toggle checked="{{syncPrefs.userEventsSynced}}"
-                  on-change="onSingleSyncDataTypeChanged_"
-                  disabled="[[shouldSyncCheckboxBeDisabled_(
-                      syncPrefs.syncAllDataTypes,
-                      syncPrefs.userEventsEnforced)]]"
+              <cr-toggle id="userEventsToggle"
+                  checked="{{userEventsToggleValue}}"
+                  on-change="onUserEventsSyncDataTypeChanged_"
+                  disabled="[[shouldUserEventsCheckboxBeDisabled_(
+                      syncPrefs.syncAllDataTypes, syncPrefs.typedUrlsSynced,
+                      syncPrefs.userEventsEnforced, syncPrefs.encryptAllData)]]"
                   aria-labelledby="userEventsCheckboxLabel">
               </cr-toggle>
             </div>
@@ -431,10 +445,16 @@
                 </template>
               </cr-radio-button>
             </paper-radio-group>
-            <div id="reset-sync-message-box" class="list-item"
+
+            <!-- duplicated from above -->
+            <div id="reset-sync-message-box-encryption" class="list-item"
                 hidden="[[!syncPrefs.encryptAllData]]">
-              <span>$i18nRaw{passphraseResetHint}</span>
+              <span>
+                <iron-icon icon="settings:info-outline"></iron-icon>
+                $i18nRaw{passphraseResetHint}
+              </span>
             </div>
+
           </div>
 
           <template is="dom-if" if="[[creatingNewPassphrase_]]">
diff --git a/chrome/browser/resources/settings/people_page/sync_page.js b/chrome/browser/resources/settings/people_page/sync_page.js
index 348a879..a5520db 100644
--- a/chrome/browser/resources/settings/people_page/sync_page.js
+++ b/chrome/browser/resources/settings/people_page/sync_page.js
@@ -158,6 +158,11 @@
       }
     },
 
+    // The toggle for user events is not reflected directly on
+    // syncPrefs.userEventsSynced, because this sync preference must only be
+    // updated if there is no passphrase and typedUrls are synced as well.
+    userEventsToggleValue: Boolean,
+
     // <if expr="not chromeos">
     diceEnabled: Boolean,
     // </if>
@@ -304,6 +309,11 @@
     if (!this.syncPrefs.autofillRegistered || !this.syncPrefs.autofillSynced)
       this.set('syncPrefs.paymentsIntegrationEnabled', false);
 
+    this.set(
+        'userEventsToggleValue',
+        this.syncPrefs.userEventsSynced && this.syncPrefs.typedUrlsSynced &&
+            !this.syncPrefs.encryptAllData);
+
     // Hide the new passphrase box if the sync data has been encrypted.
     if (this.syncPrefs.encryptAllData)
       this.creatingNewPassphrase_ = false;
@@ -374,6 +384,33 @@
   },
 
   /**
+   * Handler for when the autofill data type checkbox is changed.
+   * @private
+   */
+  onTypedUrlsDataTypeChanged_: function() {
+    // Enabling typed URLs also resets the user events to ON. |encryptAllData|
+    // is not expected to change on the fly, and if it changed the user sync
+    // settings would be reset anyway.
+    if (!this.syncPrefs.encryptAllData && this.syncPrefs.typedUrlsSynced)
+      this.set('syncPrefs.userEventsSynced', true);
+
+    this.onSingleSyncDataTypeChanged_();
+  },
+
+  /**
+   * Handler for when the user events data type checkbox is changed.
+   * @private
+   */
+  onUserEventsSyncDataTypeChanged_: function() {
+    // Only update the sync preference when there is no passphrase and typed
+    // URLs are synced.
+    assert(!this.syncPrefs.encryptAllData && this.syncPrefs.typedUrlsSynced);
+    this.set('syncPrefs.userEventsSynced', this.userEventsToggleValue);
+
+    this.onSingleSyncDataTypeChanged_();
+  },
+
+  /**
    * @param {string} passphrase The passphrase input field value
    * @param {string} confirmation The passphrase confirmation input field value.
    * @return {boolean} Whether the passphrase save button should be enabled.
@@ -507,6 +544,19 @@
   },
 
   /**
+   * @param {boolean} syncAllDataTypes
+   * @param {boolean} typedUrlsSynced
+   * @param {boolean} userEventsEnforced
+   * @param {boolean} encryptAllData
+   * @return {boolean} Whether the sync checkbox should be disabled.
+   */
+  shouldUserEventsCheckboxBeDisabled_: function(
+      syncAllDataTypes, typedUrlsSynced, userEventsEnforced, encryptAllData) {
+    return syncAllDataTypes || !typedUrlsSynced || userEventsEnforced ||
+        encryptAllData;
+  },
+
+  /**
    * Checks the supplied passphrases to ensure that they are not empty and that
    * they match each other. Additionally, displays error UI if they are invalid.
    * @return {boolean} Whether the check was successful (i.e., that the
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd
index c01ff77..01ae5562 100644
--- a/chrome/browser/resources/settings/settings_resources.grd
+++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -1360,12 +1360,6 @@
         <structure name="IDR_SETTINGS_NETWORK_PROXY_SECTION_JS"
                    file="internet_page/network_proxy_section.js"
                    type="chrome_html" />
-        <structure name="IDR_SETTINGS_NETWORK_LISTENER_BEHAVIOR_HTML"
-                   file="internet_page/network_listener_behavior.html"
-                   type="chrome_html" />
-        <structure name="IDR_SETTINGS_NETWORK_LISTENER_BEHAVIOR_JS"
-                   file="internet_page/network_listener_behavior.js"
-                   type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_SUMMARY_HTML"
                    file="internet_page/network_summary.html"
                    type="chrome_html" />
diff --git a/chrome/browser/resources/settings/site_settings/BUILD.gn b/chrome/browser/resources/settings/site_settings/BUILD.gn
index 1acbbbf00..ac2e54be 100644
--- a/chrome/browser/resources/settings/site_settings/BUILD.gn
+++ b/chrome/browser/resources/settings/site_settings/BUILD.gn
@@ -155,6 +155,7 @@
     ":local_data_browser_proxy",
     "..:focus_row_behavior",
     "//ui/webui/resources/js:cr",
+    "//ui/webui/resources/js:i18n_behavior",
     "//ui/webui/resources/js:icon",
   ]
 }
diff --git a/chrome/browser/safe_browsing/client_side_detection_host.cc b/chrome/browser/safe_browsing/client_side_detection_host.cc
index 9a52a19..d7a92fc 100644
--- a/chrome/browser/safe_browsing/client_side_detection_host.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_host.cc
@@ -456,6 +456,7 @@
 
 void ClientSideDetectionHost::ResourceLoadComplete(
     content::RenderFrameHost* render_frame_host,
+    const content::GlobalRequestID& request_id,
     const content::mojom::ResourceLoadInfo& resource_load_info) {
   if (!content::IsResourceTypeFrame(resource_load_info.resource_type) &&
       browse_info_.get() && should_extract_malware_features_ &&
diff --git a/chrome/browser/safe_browsing/client_side_detection_host.h b/chrome/browser/safe_browsing/client_side_detection_host.h
index 623d071..9ee4cd7 100644
--- a/chrome/browser/safe_browsing/client_side_detection_host.h
+++ b/chrome/browser/safe_browsing/client_side_detection_host.h
@@ -47,6 +47,7 @@
       content::NavigationHandle* navigation_handle) override;
   void ResourceLoadComplete(
       content::RenderFrameHost* render_frame_host,
+      const content::GlobalRequestID& request_id,
       const content::mojom::ResourceLoadInfo& resource_load_info) override;
 
   // Called when the SafeBrowsingService found a hit with one of the
diff --git a/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc b/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc
index 83404ef..f0570abd 100644
--- a/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc
@@ -1261,6 +1261,7 @@
   resource_load_info->method = "GET";
   resource_load_info->resource_type = content::RESOURCE_TYPE_SUB_FRAME;
   csd_host_->ResourceLoadComplete(/*render_frame_host=*/nullptr,
+                                  content::GlobalRequestID(),
                                   *resource_load_info);
 
   EXPECT_EQ(0u, GetBrowseInfo()->ips.size());
diff --git a/chrome/browser/service_process/service_process_control.cc b/chrome/browser/service_process/service_process_control.cc
index 70ef37d..1eebebef 100644
--- a/chrome/browser/service_process/service_process_control.cc
+++ b/chrome/browser/service_process/service_process_control.cc
@@ -25,7 +25,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/service_process_util.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/child_process_launcher_utils.h"
diff --git a/chrome/browser/service_process/service_process_control.h b/chrome/browser/service_process/service_process_control.h
index 1745c7e..acc953108 100644
--- a/chrome/browser/service_process/service_process_control.h
+++ b/chrome/browser/service_process/service_process_control.h
@@ -20,7 +20,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/process/process.h"
 #include "build/build_config.h"
-#include "chrome/browser/upgrade_observer.h"
+#include "chrome/browser/upgrade_detector/upgrade_observer.h"
 #include "chrome/common/service_process.mojom.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 
diff --git a/chrome/browser/signin/dice_response_handler.cc b/chrome/browser/signin/dice_response_handler.cc
index a77f7faa..ddef6b3 100644
--- a/chrome/browser/signin/dice_response_handler.cc
+++ b/chrome/browser/signin/dice_response_handler.cc
@@ -208,7 +208,8 @@
   RecordDiceFetchTokenResult(kFetchSuccess);
   gaia_auth_fetcher_.reset();
   timeout_closure_.Cancel();
-  dice_response_handler_->OnTokenExchangeSuccess(this, result.refresh_token);
+  dice_response_handler_->OnTokenExchangeSuccess(
+      this, result.refresh_token, result.is_under_advanced_protection);
   // |this| may be deleted at this point.
 }
 
@@ -434,7 +435,8 @@
 
 void DiceResponseHandler::OnTokenExchangeSuccess(
     DiceTokenFetcher* token_fetcher,
-    const std::string& refresh_token) {
+    const std::string& refresh_token,
+    bool is_under_advanced_protection) {
   const std::string& email = token_fetcher->email();
   const std::string& gaia_id = token_fetcher->gaia_id();
   if (!CanGetTokenForAccount(gaia_id, email))
@@ -443,6 +445,8 @@
   bool should_enable_sync = token_fetcher->should_enable_sync();
   std::string account_id =
       account_tracker_service_->SeedAccountInfo(gaia_id, email);
+  account_tracker_service_->SetIsAdvancedProtectionAccount(
+      account_id, is_under_advanced_protection);
   token_service_->UpdateCredentials(account_id, refresh_token);
   about_signin_internals_->OnRefreshTokenReceived(
       base::StringPrintf("Successful (%s)", account_id.c_str()));
diff --git a/chrome/browser/signin/dice_response_handler.h b/chrome/browser/signin/dice_response_handler.h
index b34e972..765ba76 100644
--- a/chrome/browser/signin/dice_response_handler.h
+++ b/chrome/browser/signin/dice_response_handler.h
@@ -147,7 +147,8 @@
   // Called after exchanging an OAuth 2.0 authorization code for a refresh token
   // after DiceAction::SIGNIN.
   void OnTokenExchangeSuccess(DiceTokenFetcher* token_fetcher,
-                              const std::string& refresh_token);
+                              const std::string& refresh_token,
+                              bool is_under_advanced_protection);
   void OnTokenExchangeFailure(DiceTokenFetcher* token_fetcher,
                               const GoogleServiceAuthError& error);
 
diff --git a/chrome/browser/signin/dice_response_handler_unittest.cc b/chrome/browser/signin/dice_response_handler_unittest.cc
index 693bf680..c8fcd99 100644
--- a/chrome/browser/signin/dice_response_handler_unittest.cc
+++ b/chrome/browser/signin/dice_response_handler_unittest.cc
@@ -284,7 +284,7 @@
   signin_client_.consumer_->OnClientOAuthSuccess(
       GaiaAuthConsumer::ClientOAuthResult("refresh_token", "access_token", 10,
                                           false /* is_child_account */,
-                                          false /* is_advanced_protection*/));
+                                          true /* is_advanced_protection*/));
   // Check that the token has been inserted in the token service.
   EXPECT_TRUE(token_service_.RefreshTokenIsAvailable(account_id));
   EXPECT_TRUE(auth_error_email_.empty());
@@ -292,6 +292,9 @@
   // Check that the reconcilor was blocked and unblocked exactly once.
   EXPECT_EQ(1, reconcilor_blocked_count_);
   EXPECT_EQ(1, reconcilor_unblocked_count_);
+  // Check that the AccountInfo::is_under_advanced_protection is set.
+  EXPECT_TRUE(account_tracker_service_.GetAccountInfo(account_id)
+                  .is_under_advanced_protection);
 }
 
 // Checks that a GaiaAuthFetcher failure is handled correctly.
@@ -347,6 +350,8 @@
       false /* is_advanced_protection*/));
   // Check that the token has been inserted in the token service.
   EXPECT_TRUE(token_service_.RefreshTokenIsAvailable(account_id));
+  EXPECT_FALSE(account_tracker_service_.GetAccountInfo(account_id)
+                   .is_under_advanced_protection);
 }
 
 // Checks that two SIGNIN requests can happen concurrently.
@@ -381,15 +386,19 @@
   // Simulate GaiaAuthFetcher success for the first request.
   consumer_1->OnClientOAuthSuccess(GaiaAuthConsumer::ClientOAuthResult(
       "refresh_token", "access_token", 10, false /* is_child_account */,
-      false /* is_advanced_protection*/));
+      true /* is_advanced_protection*/));
   // Check that the token has been inserted in the token service.
   EXPECT_TRUE(token_service_.RefreshTokenIsAvailable(account_id_1));
+  EXPECT_TRUE(account_tracker_service_.GetAccountInfo(account_id_1)
+                  .is_under_advanced_protection);
   // Simulate GaiaAuthFetcher success for the second request.
   consumer_2->OnClientOAuthSuccess(GaiaAuthConsumer::ClientOAuthResult(
       "refresh_token", "access_token", 10, false /* is_child_account */,
       false /* is_advanced_protection*/));
   // Check that the token has been inserted in the token service.
   EXPECT_TRUE(token_service_.RefreshTokenIsAvailable(account_id_2));
+  EXPECT_FALSE(account_tracker_service_.GetAccountInfo(account_id_2)
+                   .is_under_advanced_protection);
   // Check that the reconcilor was blocked and unblocked exactly once.
   EXPECT_EQ(1, reconcilor_blocked_count_);
   EXPECT_EQ(1, reconcilor_unblocked_count_);
diff --git a/chrome/browser/sync/test/integration/single_client_app_list_sync_test.cc b/chrome/browser/sync/test/integration/single_client_app_list_sync_test.cc
index 4777416..39f59f3 100644
--- a/chrome/browser/sync/test/integration/single_client_app_list_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_app_list_sync_test.cc
@@ -127,7 +127,7 @@
   // Default apps: chrome + web store + internal apps.
   const size_t kNumDefaultApps =
       2u + app_list::GetNumberOfInternalAppsShowInLauncherForTest(
-               /*apps_name=*/nullptr);
+               /*apps_name=*/nullptr, GetProfile(0)->IsGuestSession());
   ASSERT_EQ(kNumApps + kNumDefaultApps, service->GetNumSyncItemsForTest());
 
   ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait());
diff --git a/chrome/browser/themes/increased_contrast_theme_supplier.cc b/chrome/browser/themes/increased_contrast_theme_supplier.cc
index 7ed6bb9..f0bdc72c 100644
--- a/chrome/browser/themes/increased_contrast_theme_supplier.cc
+++ b/chrome/browser/themes/increased_contrast_theme_supplier.cc
@@ -35,7 +35,7 @@
     case ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR:
       *color = SK_ColorLTGRAY;
       return true;
-    case ThemeProperties::COLOR_TOOLBAR_BOTTOM_SEPARATOR:
+    case ThemeProperties::COLOR_TOOLBAR_CONTENT_AREA_SEPARATOR:
       *color = SK_ColorBLACK;
       return true;
     case ThemeProperties::COLOR_LOCATION_BAR_BORDER:
diff --git a/chrome/browser/themes/theme_properties.cc b/chrome/browser/themes/theme_properties.cc
index 733d352..b44a0375 100644
--- a/chrome/browser/themes/theme_properties.cc
+++ b/chrome/browser/themes/theme_properties.cc
@@ -339,7 +339,7 @@
     case COLOR_DETACHED_BOOKMARK_BAR_BACKGROUND:
       return incognito ? kDefaultDetachedBookmarkBarBackgroundIncognito
                        : kDefaultDetachedBookmarkBarBackground;
-    case COLOR_TOOLBAR_BOTTOM_SEPARATOR:
+    case COLOR_TOOLBAR_CONTENT_AREA_SEPARATOR:
       return incognito ? kDefaultToolbarBottomSeparatorIncognito
                        : kDefaultToolbarBottomSeparator;
     case COLOR_TOOLBAR_TOP_SEPARATOR:
diff --git a/chrome/browser/themes/theme_properties.h b/chrome/browser/themes/theme_properties.h
index a7e1f00..c7ef209c 100644
--- a/chrome/browser/themes/theme_properties.h
+++ b/chrome/browser/themes/theme_properties.h
@@ -93,7 +93,7 @@
 
     // The color of the line separating the bottom of the toolbar from the
     // contents.
-    COLOR_TOOLBAR_BOTTOM_SEPARATOR,
+    COLOR_TOOLBAR_CONTENT_AREA_SEPARATOR,
 
     // The color of a normal toolbar button's icon.
     COLOR_TOOLBAR_BUTTON_ICON,
diff --git a/chrome/browser/themes/theme_service.cc b/chrome/browser/themes/theme_service.cc
index 4995a92..64d9cc1 100644
--- a/chrome/browser/themes/theme_service.cc
+++ b/chrome/browser/themes/theme_service.cc
@@ -519,7 +519,7 @@
       if (UsingDefaultTheme())
         break;
       return GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT, incognito);
-    case ThemeProperties::COLOR_TOOLBAR_BOTTOM_SEPARATOR:
+    case ThemeProperties::COLOR_TOOLBAR_CONTENT_AREA_SEPARATOR:
       if (UsingDefaultTheme())
         break;
       return GetColor(ThemeProperties::COLOR_LOCATION_BAR_BORDER, incognito);
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 13b4291..48509f7 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1742,6 +1742,10 @@
       "//ui/events",
     ]
 
+    if (use_ozone && !is_chromeos) {
+      deps += [ "//ui/ozone" ]
+    }
+
     if (!toolkit_views) {
       sources += [ "media_router/cloud_services_dialog.cc" ]
     }
diff --git a/chrome/browser/ui/app_list/app_context_menu_unittest.cc b/chrome/browser/ui/app_list/app_context_menu_unittest.cc
index 4cab9032..7975b53 100644
--- a/chrome/browser/ui/app_list/app_context_menu_unittest.cc
+++ b/chrome/browser/ui/app_list/app_context_menu_unittest.cc
@@ -708,7 +708,8 @@
 
 // Tests that internal app's context menu is correct.
 TEST_P(AppContextMenuTest, InternalAppMenu) {
-  for (const auto& internal_app : app_list::GetInternalAppList()) {
+  for (const auto& internal_app :
+       app_list::GetInternalAppList(profile()->IsGuestSession())) {
     if (!internal_app.show_in_launcher)
       continue;
 
diff --git a/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc b/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc
index 0317cea4..6962e7a 100644
--- a/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc
+++ b/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc
@@ -49,43 +49,51 @@
 constexpr char kAndroidLegacyCameraAppId[] = "obfofkigjfamlldmipdegnjlcpincibc";
 }  // namespace
 
-const std::vector<InternalApp>& GetInternalAppList() {
-  static const base::NoDestructor<std::vector<InternalApp>> internal_app_list(
-      {{kInternalAppIdKeyboardShortcutViewer,
-        IDS_INTERNAL_APP_KEYBOARD_SHORTCUT_VIEWER, IDR_SHORTCUT_VIEWER_LOGO_192,
-        /*recommendable=*/false,
-        /*searchable=*/true,
-        /*show_in_launcher=*/false,
-        InternalAppName::kKeyboardShortcutViewer,
-        IDS_LAUNCHER_SEARCHABLE_KEYBOARD_SHORTCUT_VIEWER},
+const std::vector<InternalApp>& GetInternalAppList(bool is_guest_mode) {
+  static const base::NoDestructor<std::vector<InternalApp>>
+      internal_app_list_static(
+          {{kInternalAppIdKeyboardShortcutViewer,
+            IDS_INTERNAL_APP_KEYBOARD_SHORTCUT_VIEWER,
+            IDR_SHORTCUT_VIEWER_LOGO_192,
+            /*recommendable=*/false,
+            /*searchable=*/true,
+            /*show_in_launcher=*/false,
+            InternalAppName::kKeyboardShortcutViewer,
+            IDS_LAUNCHER_SEARCHABLE_KEYBOARD_SHORTCUT_VIEWER},
 
-       {kInternalAppIdSettings, IDS_INTERNAL_APP_SETTINGS,
-        IDR_SETTINGS_LOGO_192,
-        /*recommendable=*/true,
-        /*searchable=*/true,
-        /*show_in_launcher=*/true,
-        InternalAppName::kSettings,
-        /*searchable_string_resource_id=*/0},
+           {kInternalAppIdSettings, IDS_INTERNAL_APP_SETTINGS,
+            IDR_SETTINGS_LOGO_192,
+            /*recommendable=*/true,
+            /*searchable=*/true,
+            /*show_in_launcher=*/true, InternalAppName::kSettings,
+            /*searchable_string_resource_id=*/0},
 
-       {kInternalAppIdContinueReading, IDS_INTERNAL_APP_CONTINUOUS_READING,
-        IDR_PRODUCT_LOGO_256,
-        /*recommendable=*/true,
-        /*searchable=*/false,
-        /*show_in_launcher=*/false,
-        InternalAppName::kContinueReading,
-        /*searchable_string_resource_id=*/0},
+           {kInternalAppIdContinueReading, IDS_INTERNAL_APP_CONTINUOUS_READING,
+            IDR_PRODUCT_LOGO_256,
+            /*recommendable=*/true,
+            /*searchable=*/false,
+            /*show_in_launcher=*/false, InternalAppName::kContinueReading,
+            /*searchable_string_resource_id=*/0}});
 
-       {kInternalAppIdCamera, IDS_INTERNAL_APP_CAMERA, IDR_CAMERA_LOGO_192,
-        /*recommendable=*/true,
-        /*searchable=*/true,
-        /*show_in_launcher=*/true,
-        InternalAppName::kCamera,
-        /*searchable_string_resource_id=*/0}});
+  static base::NoDestructor<std::vector<InternalApp>> internal_app_list;
+  internal_app_list->clear();
+  internal_app_list->insert(internal_app_list->begin(),
+                            internal_app_list_static->begin(),
+                            internal_app_list_static->end());
+
+  if (!is_guest_mode) {
+    internal_app_list->push_back(
+        {kInternalAppIdCamera, IDS_INTERNAL_APP_CAMERA, IDR_CAMERA_LOGO_192,
+         /*recommendable=*/true,
+         /*searchable=*/true,
+         /*show_in_launcher=*/true, InternalAppName::kCamera,
+         /*searchable_string_resource_id=*/0});
+  }
   return *internal_app_list;
 }
 
 const InternalApp* FindInternalApp(const std::string& app_id) {
-  for (const auto& app : GetInternalAppList()) {
+  for (const auto& app : GetInternalAppList(false)) {
     if (app_id == app.app_id)
       return &app;
   }
@@ -235,10 +243,11 @@
   return app->internal_app_name;
 }
 
-size_t GetNumberOfInternalAppsShowInLauncherForTest(std::string* apps_name) {
+size_t GetNumberOfInternalAppsShowInLauncherForTest(std::string* apps_name,
+                                                    bool is_guest_mode) {
   size_t num_of_internal_apps_show_in_launcher = 0u;
   std::vector<std::string> internal_apps_name;
-  for (const auto& app : GetInternalAppList()) {
+  for (const auto& app : GetInternalAppList(is_guest_mode)) {
     if (app.show_in_launcher) {
       ++num_of_internal_apps_show_in_launcher;
       if (apps_name) {
diff --git a/chrome/browser/ui/app_list/internal_app/internal_app_metadata.h b/chrome/browser/ui/app_list/internal_app/internal_app_metadata.h
index 4b56fe97..120b324 100644
--- a/chrome/browser/ui/app_list/internal_app/internal_app_metadata.h
+++ b/chrome/browser/ui/app_list/internal_app/internal_app_metadata.h
@@ -52,7 +52,7 @@
 };
 
 // Returns a list of Chrome OS internal apps, which are searchable in launcher.
-const std::vector<InternalApp>& GetInternalAppList();
+const std::vector<InternalApp>& GetInternalAppList(bool is_guest_mode);
 
 // Returns InternalApp by |app_id|.
 // Returns nullptr if |app_id| does not correspond to an internal app.
@@ -95,7 +95,8 @@
 // Returns the number of internal apps which can show in launcher.
 // If |apps_name| is not nullptr, it will be the concatenated string of these
 // internal apps' name.
-size_t GetNumberOfInternalAppsShowInLauncherForTest(std::string* apps_name);
+size_t GetNumberOfInternalAppsShowInLauncherForTest(std::string* apps_name,
+                                                    bool is_guest_mode);
 
 }  // namespace app_list
 
diff --git a/chrome/browser/ui/app_list/internal_app/internal_app_model_builder.cc b/chrome/browser/ui/app_list/internal_app/internal_app_model_builder.cc
index 37021a7..fb6c89f 100644
--- a/chrome/browser/ui/app_list/internal_app/internal_app_model_builder.cc
+++ b/chrome/browser/ui/app_list/internal_app/internal_app_model_builder.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/app_list/internal_app/internal_app_model_builder.h"
 
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
 #include "chrome/browser/ui/app_list/internal_app/internal_app_item.h"
 #include "chrome/browser/ui/app_list/internal_app/internal_app_metadata.h"
@@ -13,7 +14,8 @@
     : AppListModelBuilder(controller, InternalAppItem::kItemType) {}
 
 void InternalAppModelBuilder::BuildModel() {
-  for (const auto& internal_app : app_list::GetInternalAppList()) {
+  for (const auto& internal_app :
+       app_list::GetInternalAppList(profile()->IsGuestSession())) {
     if (!internal_app.show_in_launcher)
       continue;
 
diff --git a/chrome/browser/ui/app_list/internal_app/internal_app_model_builder_unittest.cc b/chrome/browser/ui/app_list/internal_app/internal_app_model_builder_unittest.cc
index 26a7f00..338a0015 100644
--- a/chrome/browser/ui/app_list/internal_app/internal_app_model_builder_unittest.cc
+++ b/chrome/browser/ui/app_list/internal_app/internal_app_model_builder_unittest.cc
@@ -6,11 +6,13 @@
 
 #include "base/macros.h"
 #include "base/strings/string_util.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/app_list_test_util.h"
 #include "chrome/browser/ui/app_list/chrome_app_list_item.h"
 #include "chrome/browser/ui/app_list/internal_app/internal_app_metadata.h"
 #include "chrome/browser/ui/app_list/test/fake_app_list_model_updater.h"
 #include "chrome/browser/ui/app_list/test/test_app_list_controller_delegate.h"
+#include "chrome/test/base/testing_profile.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
@@ -33,7 +35,6 @@
   // AppListTestBase:
   void SetUp() override {
     AppListTestBase::SetUp();
-    CreateBuilder();
   }
 
   void TearDown() override {
@@ -42,19 +43,20 @@
   }
 
  protected:
-  std::unique_ptr<FakeAppListModelUpdater> model_updater_;
-
- private:
   // Creates a new builder, destroying any existing one.
-  void CreateBuilder() {
+  void CreateBuilder(bool guest_mode) {
     ResetBuilder();  // Destroy any existing builder in the correct order.
 
+    testing_profile()->SetGuestSession(guest_mode);
     model_updater_ = std::make_unique<FakeAppListModelUpdater>();
     controller_ = std::make_unique<test::TestAppListControllerDelegate>();
     builder_ = std::make_unique<InternalAppModelBuilder>(controller_.get());
     builder_->Initialize(nullptr, profile(), model_updater_.get());
   }
 
+  std::unique_ptr<FakeAppListModelUpdater> model_updater_;
+
+ private:
   void ResetBuilder() {
     builder_.reset();
     controller_.reset();
@@ -71,8 +73,20 @@
   // The internal apps list is provided by GetInternalAppList() in
   // internal_app_metadata.cc. Only count the apps can display in launcher.
   std::string internal_apps_name;
+  CreateBuilder(false);
   EXPECT_EQ(app_list::GetNumberOfInternalAppsShowInLauncherForTest(
-                &internal_apps_name),
+                &internal_apps_name, profile()->IsGuestSession()),
+            model_updater_->ItemCount());
+  EXPECT_EQ(internal_apps_name, GetModelContent(model_updater_.get()));
+}
+
+TEST_F(InternalAppModelBuilderTest, BuildGuestMode) {
+  // The internal apps list is provided by GetInternalAppList() in
+  // internal_app_metadata.cc. Only count the apps can display in launcher.
+  std::string internal_apps_name;
+  CreateBuilder(true);
+  EXPECT_EQ(app_list::GetNumberOfInternalAppsShowInLauncherForTest(
+                &internal_apps_name, profile()->IsGuestSession()),
             model_updater_->ItemCount());
   EXPECT_EQ(internal_apps_name, GetModelContent(model_updater_.get()));
 }
diff --git a/chrome/browser/ui/app_list/search/app_search_provider.cc b/chrome/browser/ui/app_list/search/app_search_provider.cc
index 374a3df5..d2973d5f 100644
--- a/chrome/browser/ui/app_list/search/app_search_provider.cc
+++ b/chrome/browser/ui/app_list/search/app_search_provider.cc
@@ -46,6 +46,7 @@
 #include "chrome/browser/ui/app_list/search/crostini_app_result.h"
 #include "chrome/browser/ui/app_list/search/extension_app_result.h"
 #include "chrome/browser/ui/app_list/search/internal_app_result.h"
+#include "chrome/common/pref_names.h"
 #include "components/browser_sync/profile_sync_service.h"
 #include "components/sync/driver/sync_service.h"
 #include "components/sync/driver/sync_service_observer.h"
@@ -370,9 +371,12 @@
   // AppSearchProvider::DataSource overrides:
   void AddApps(AppSearchProvider::Apps* apps) override {
     const base::Time time;
-    for (const auto& internal_app : GetInternalAppList()) {
+    for (const auto& internal_app :
+         GetInternalAppList(profile()->IsGuestSession())) {
       if (!std::strcmp(internal_app.app_id, kInternalAppIdContinueReading) &&
-          !features::IsContinueReadingEnabled()) {
+          (!features::IsContinueReadingEnabled() ||
+           !profile()->GetPrefs()->GetBoolean(
+               prefs::kAppListContinueReadingEnabled))) {
         continue;
       }
 
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
index ed9bbc7..63baeb4a 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -4306,7 +4306,8 @@
   InitLauncherController();
 
   // Only test the first internal app. The others should be the same.
-  const auto& internal_app = app_list::GetInternalAppList().front();
+  const auto& internal_app =
+      app_list::GetInternalAppList(profile()->IsGuestSession()).front();
   const std::string app_id = internal_app.app_id;
   const ash::ShelfID shelf_id(app_id);
   EXPECT_FALSE(launcher_controller_->GetItem(shelf_id));
@@ -4337,7 +4338,8 @@
   InitLauncherController();
 
   // Only test the first internal app. The others should be the same.
-  const auto& internal_app = app_list::GetInternalAppList().front();
+  const auto& internal_app =
+      app_list::GetInternalAppList(profile()->IsGuestSession()).front();
   std::string app_id;
   ash::ShelfID shelf_id;
   EXPECT_FALSE(launcher_controller_->GetItem(shelf_id));
diff --git a/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc b/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
index 142a120..af35871 100644
--- a/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
@@ -462,7 +462,8 @@
 
 // Tests that the context menu of internal app  is correct.
 TEST_F(LauncherContextMenuTest, InternalAppShelfContextMenu) {
-  for (const auto& internal_app : app_list::GetInternalAppList()) {
+  for (const auto& internal_app :
+       app_list::GetInternalAppList(profile()->IsGuestSession())) {
     if (!internal_app.show_in_launcher)
       continue;
 
@@ -492,7 +493,8 @@
 
 // Tests that the number of context menu options of internal app is correct.
 TEST_F(LauncherContextMenuTest, InternalAppShelfContextMenuOptionsNumber) {
-  for (const auto& internal_app : app_list::GetInternalAppList()) {
+  for (const auto& internal_app :
+       app_list::GetInternalAppList(profile()->IsGuestSession())) {
     const std::string app_id = internal_app.app_id;
     const ash::ShelfID shelf_id(app_id);
     // Pin internal app.
diff --git a/chrome/browser/ui/ash/login_screen_client.cc b/chrome/browser/ui/ash/login_screen_client.cc
index f1a3f9c..86ae83a 100644
--- a/chrome/browser/ui/ash/login_screen_client.cc
+++ b/chrome/browser/ui/ash/login_screen_client.cc
@@ -8,6 +8,7 @@
 
 #include "ash/public/interfaces/constants.mojom.h"
 #include "chrome/browser/chromeos/login/lock/screen_locker.h"
+#include "chrome/browser/chromeos/login/login_auth_recorder.h"
 #include "chrome/browser/chromeos/login/reauth_stats.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
 #include "chrome/browser/chromeos/login/ui/user_adding_screen.h"
@@ -26,7 +27,9 @@
 LoginScreenClient::Delegate::~Delegate() = default;
 
 LoginScreenClient::LoginScreenClient()
-    : binding_(this), weak_ptr_factory_(this) {
+    : binding_(this),
+      auth_recorder_(std::make_unique<chromeos::LoginAuthRecorder>()),
+      weak_ptr_factory_(this) {
   content::ServiceManagerConnection::GetForProcess()
       ->GetConnector()
       ->BindInterface(ash::mojom::kServiceName, &login_screen_);
@@ -63,6 +66,10 @@
   return login_screen_;
 }
 
+chromeos::LoginAuthRecorder* LoginScreenClient::auth_recorder() {
+  return auth_recorder_.get();
+}
+
 void LoginScreenClient::AuthenticateUser(const AccountId& account_id,
                                          const std::string& password,
                                          bool authenticated_by_pin,
@@ -70,6 +77,10 @@
   if (delegate_) {
     delegate_->HandleAuthenticateUser(
         account_id, password, authenticated_by_pin, std::move(callback));
+    auth_recorder_->RecordAuthMethod(
+        authenticated_by_pin
+            ? chromeos::LoginAuthRecorder::AuthMethod::kPin
+            : chromeos::LoginAuthRecorder::AuthMethod::kPassword);
   } else {
     LOG(ERROR) << "Returning failed authentication attempt; no delegate";
     std::move(callback).Run(false);
@@ -77,8 +88,11 @@
 }
 
 void LoginScreenClient::AttemptUnlock(const AccountId& account_id) {
-  if (delegate_)
+  if (delegate_) {
     delegate_->HandleAttemptUnlock(account_id);
+    auth_recorder_->RecordAuthMethod(
+        chromeos::LoginAuthRecorder::AuthMethod::kSmartlock);
+  }
 }
 
 void LoginScreenClient::HardlockPod(const AccountId& account_id) {
diff --git a/chrome/browser/ui/ash/login_screen_client.h b/chrome/browser/ui/ash/login_screen_client.h
index 0525a29..75c3e322 100644
--- a/chrome/browser/ui/ash/login_screen_client.h
+++ b/chrome/browser/ui/ash/login_screen_client.h
@@ -13,6 +13,10 @@
 using AuthenticateUserCallback =
     ash::mojom::LoginScreenClient::AuthenticateUserCallback;
 
+namespace chromeos {
+class LoginAuthRecorder;
+}
+
 // Handles method calls sent from ash to chrome. Also sends messages from chrome
 // to ash.
 class LoginScreenClient : public ash::mojom::LoginScreenClient {
@@ -56,6 +60,8 @@
   // Returns an object which can be used to make calls to ash.
   ash::mojom::LoginScreenPtr& login_screen();
 
+  chromeos::LoginAuthRecorder* auth_recorder();
+
   // ash::mojom::LoginScreenClient:
   void AuthenticateUser(const AccountId& account_id,
                         const std::string& password,
@@ -101,6 +107,9 @@
   mojo::Binding<ash::mojom::LoginScreenClient> binding_;
   Delegate* delegate_ = nullptr;
 
+  // Captures authentication related user metrics for login screen.
+  std::unique_ptr<chromeos::LoginAuthRecorder> auth_recorder_;
+
   base::WeakPtrFactory<LoginScreenClient> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(LoginScreenClient);
diff --git a/chrome/browser/ui/ash/system_tray_client.cc b/chrome/browser/ui/ash/system_tray_client.cc
index 7cb1556e..37b2acfe 100644
--- a/chrome/browser/ui/ash/system_tray_client.cc
+++ b/chrome/browser/ui/ash/system_tray_client.cc
@@ -30,7 +30,7 @@
 #include "chrome/browser/ui/webui/chromeos/internet_config_dialog.h"
 #include "chrome/browser/ui/webui/chromeos/internet_detail_dialog.h"
 #include "chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/url_constants.h"
 #include "chromeos/chromeos_switches.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
diff --git a/chrome/browser/ui/ash/system_tray_client.h b/chrome/browser/ui/ash/system_tray_client.h
index 6be0cd3a..f668bcb 100644
--- a/chrome/browser/ui/ash/system_tray_client.h
+++ b/chrome/browser/ui/ash/system_tray_client.h
@@ -8,7 +8,7 @@
 #include "ash/public/interfaces/system_tray.mojom.h"
 #include "base/macros.h"
 #include "chrome/browser/chromeos/system/system_clock_observer.h"
-#include "chrome/browser/upgrade_observer.h"
+#include "chrome/browser/upgrade_detector/upgrade_observer.h"
 #include "components/policy/core/common/cloud/cloud_policy_store.h"
 #include "mojo/public/cpp/bindings/binding.h"
 
diff --git a/chrome/browser/ui/ash/system_tray_client_browsertest.cc b/chrome/browser/ui/ash/system_tray_client_browsertest.cc
index 6ba3db5e..ac73bc9 100644
--- a/chrome/browser/ui/ash/system_tray_client_browsertest.cc
+++ b/chrome/browser/ui/ash/system_tray_client_browsertest.cc
@@ -15,9 +15,8 @@
 #include "chrome/browser/chromeos/login/ui/user_adding_screen.h"
 #include "chrome/browser/chromeos/policy/device_policy_cros_browser_test.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
-#include "chrome/browser/chromeos/upgrade_detector_chromeos.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 31e080a..a696cf3 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -148,7 +148,6 @@
 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
 #include "chrome/browser/ui/window_sizer/window_sizer.h"
-#include "chrome/browser/upgrade_detector.h"
 #include "chrome/browser/vr/vr_tab_helper.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/chrome_constants.h"
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
index 9b551948..af26865 100644
--- a/chrome/browser/ui/browser_command_controller.cc
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -88,6 +88,10 @@
 #include "chrome/browser/feature_engagement/new_tab/new_tab_tracker_factory.h"
 #endif
 
+#if defined(USE_OZONE)
+#include "ui/ozone/public/ozone_platform.h"
+#endif
+
 using content::NavigationEntry;
 using content::NavigationController;
 using content::WebContents;
@@ -844,7 +848,14 @@
   command_updater_.UpdateCommandEnabled(IDC_MINIMIZE_WINDOW, true);
   command_updater_.UpdateCommandEnabled(IDC_MAXIMIZE_WINDOW, true);
   command_updater_.UpdateCommandEnabled(IDC_RESTORE_WINDOW, true);
-  command_updater_.UpdateCommandEnabled(IDC_USE_SYSTEM_TITLE_BAR, true);
+  bool use_system_title_bar = true;
+#if defined(USE_OZONE)
+  use_system_title_bar = ui::OzonePlatform::GetInstance()
+                             ->GetPlatformProperties()
+                             .use_system_title_bar;
+#endif
+  command_updater_.UpdateCommandEnabled(IDC_USE_SYSTEM_TITLE_BAR,
+                                        use_system_title_bar);
 #endif
   command_updater_.UpdateCommandEnabled(IDC_OPEN_IN_PWA_WINDOW, true);
 
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index e3c9b46..0c5213da 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -54,7 +54,7 @@
 #include "chrome/browser/ui/tab_dialogs.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/translate/translate_bubble_view_state_transition.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/buildflags.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/content_restriction.h"
diff --git a/chrome/browser/ui/browser_ui_prefs.cc b/chrome/browser/ui/browser_ui_prefs.cc
index a2ab09ef..a972e1fc 100644
--- a/chrome/browser/ui/browser_ui_prefs.cc
+++ b/chrome/browser/ui/browser_ui_prefs.cc
@@ -8,7 +8,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/first_run/first_run.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/pref_names.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_registry_simple.h"
diff --git a/chrome/browser/ui/browser_view_prefs.cc b/chrome/browser/ui/browser_view_prefs.cc
index 7cd95bc7..95f077ae 100644
--- a/chrome/browser/ui/browser_view_prefs.cc
+++ b/chrome/browser/ui/browser_view_prefs.cc
@@ -10,6 +10,10 @@
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 
+#if defined(USE_OZONE)
+#include "ui/ozone/public/ozone_platform.h"
+#endif
+
 #if defined(USE_X11)
 #include "ui/base/x/x11_util.h"  // nogncheck
 #endif
@@ -30,10 +34,18 @@
 
 void RegisterBrowserViewProfilePrefs(
     user_prefs::PrefRegistrySyncable* registry) {
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+  bool custom_frame_pref_default = false;
 #if defined(USE_X11)
-  registry->RegisterBooleanPref(prefs::kUseCustomChromeFrame,
-                                ui::GetCustomFramePrefDefault());
+  custom_frame_pref_default = ui::GetCustomFramePrefDefault();
+#elif defined(USE_OZONE)
+  custom_frame_pref_default = ui::OzonePlatform::GetInstance()
+                                  ->GetPlatformProperties()
+                                  .custom_frame_pref_default;
 #endif
+  registry->RegisterBooleanPref(prefs::kUseCustomChromeFrame,
+                                custom_frame_pref_default);
+#endif  // OS_LINUX && !OS_CHROMEOS
 }
 
 void MigrateBrowserTabStripPrefs(PrefService* prefs) {
diff --git a/chrome/browser/ui/cocoa/background_gradient_view.mm b/chrome/browser/ui/cocoa/background_gradient_view.mm
index 403c714..c96fc7a 100644
--- a/chrome/browser/ui/cocoa/background_gradient_view.mm
+++ b/chrome/browser/ui/cocoa/background_gradient_view.mm
@@ -105,7 +105,7 @@
       return [NSColor blackColor];
   }
   return themeProvider->GetNSColor(
-      ThemeProperties::COLOR_TOOLBAR_BOTTOM_SEPARATOR);
+      ThemeProperties::COLOR_TOOLBAR_CONTENT_AREA_SEPARATOR);
 }
 
 - (NSColor*)backgroundImageColor {
diff --git a/chrome/browser/ui/libgtkui/gtk_ui.cc b/chrome/browser/ui/libgtkui/gtk_ui.cc
index 3ce27a594..ce8dc75 100644
--- a/chrome/browser/ui/libgtkui/gtk_ui.cc
+++ b/chrome/browser/ui/libgtkui/gtk_ui.cc
@@ -1033,9 +1033,11 @@
   colors_[ThemeProperties::COLOR_BOOKMARK_BAR_INSTRUCTIONS_TEXT] =
       tab_text_color;
   // Separates the toolbar from the bookmark bar or butter bars.
-  colors_[ThemeProperties::COLOR_TOOLBAR_BOTTOM_SEPARATOR] = tab_border;
+  colors_[ThemeProperties::COLOR_TOOLBAR_CONTENT_AREA_SEPARATOR] = tab_border;
   // Separates entries in the downloads bar.
   colors_[ThemeProperties::COLOR_TOOLBAR_VERTICAL_SEPARATOR] = tab_border;
+  // Separates the detached bookmark bar from the NTP.
+  colors_[ThemeProperties::COLOR_DETACHED_BOOKMARK_BAR_SEPARATOR] = tab_border;
 
   // These colors represent the border drawn around tabs and between
   // the tabstrip and toolbar.
diff --git a/chrome/browser/ui/search/local_ntp_voice_search_browsertest.cc b/chrome/browser/ui/search/local_ntp_voice_search_browsertest.cc
index 18f38c9f..9ae199ef 100644
--- a/chrome/browser/ui/search/local_ntp_voice_search_browsertest.cc
+++ b/chrome/browser/ui/search/local_ntp_voice_search_browsertest.cc
@@ -92,10 +92,9 @@
 
   // Make sure microphone permission for the NTP isn't set yet.
   const PermissionResult mic_permission_before =
-      permission_manager->GetPermissionStatus(
-          CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
-          GURL(chrome::kChromeSearchLocalNtpUrl).GetOrigin(),
-          GURL(chrome::kChromeUINewTabURL).GetOrigin());
+      permission_manager->GetPermissionStatusForFrame(
+          CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, active_tab->GetMainFrame(),
+          GURL(chrome::kChromeSearchLocalNtpUrl).GetOrigin());
   ASSERT_EQ(CONTENT_SETTING_ASK, mic_permission_before.content_setting);
   ASSERT_EQ(PermissionStatusSource::UNSPECIFIED, mic_permission_before.source);
 
@@ -126,9 +125,8 @@
 
   // Now microphone permission for the NTP should be set.
   const PermissionResult mic_permission_after =
-      permission_manager->GetPermissionStatus(
-          CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
-          GURL(chrome::kChromeSearchLocalNtpUrl).GetOrigin(),
-          GURL(chrome::kChromeUINewTabURL).GetOrigin());
+      permission_manager->GetPermissionStatusForFrame(
+          CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, active_tab->GetMainFrame(),
+          GURL(chrome::kChromeSearchLocalNtpUrl).GetOrigin());
   EXPECT_EQ(CONTENT_SETTING_ALLOW, mic_permission_after.content_setting);
 }
diff --git a/chrome/browser/ui/toolbar/app_menu_icon_controller.cc b/chrome/browser/ui/toolbar/app_menu_icon_controller.cc
index c5bb54a..14a2e1b 100644
--- a/chrome/browser/ui/toolbar/app_menu_icon_controller.cc
+++ b/chrome/browser/ui/toolbar/app_menu_icon_controller.cc
@@ -9,7 +9,7 @@
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/ui/global_error/global_error_service.h"
 #include "chrome/browser/ui/global_error/global_error_service_factory.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/channel_info.h"
 #include "components/version_info/channel.h"
 
diff --git a/chrome/browser/ui/toolbar/app_menu_icon_controller.h b/chrome/browser/ui/toolbar/app_menu_icon_controller.h
index b37afb7..8ed6bf2 100644
--- a/chrome/browser/ui/toolbar/app_menu_icon_controller.h
+++ b/chrome/browser/ui/toolbar/app_menu_icon_controller.h
@@ -7,7 +7,7 @@
 
 #include "base/macros.h"
 #include "build/build_config.h"
-#include "chrome/browser/upgrade_observer.h"
+#include "chrome/browser/upgrade_detector/upgrade_observer.h"
 #include "content/public/browser/notification_details.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc
index ad80c85..92b7f16 100644
--- a/chrome/browser/ui/toolbar/app_menu_model.cc
+++ b/chrome/browser/ui/toolbar/app_menu_model.cc
@@ -39,7 +39,7 @@
 #include "chrome/browser/ui/toolbar/bookmark_sub_menu_model.h"
 #include "chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h"
 #include "chrome/browser/ui/toolbar/toolbar_actions_bar.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
diff --git a/chrome/browser/ui/toolbar/app_menu_model_unittest.cc b/chrome/browser/ui/toolbar/app_menu_model_unittest.cc
index 0edae5b68..90cac5b 100644
--- a/chrome/browser/ui/toolbar/app_menu_model_unittest.cc
+++ b/chrome/browser/ui/toolbar/app_menu_model_unittest.cc
@@ -15,7 +15,7 @@
 #include "chrome/browser/ui/global_error/global_error_service.h"
 #include "chrome/browser/ui/global_error/global_error_service_factory.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/menu_model_test.h"
 #include "chrome/test/base/testing_browser_process.h"
diff --git a/chrome/browser/ui/views/apps/DEPS b/chrome/browser/ui/views/apps/DEPS
index 058cea8..99009c9 100644
--- a/chrome/browser/ui/views/apps/DEPS
+++ b/chrome/browser/ui/views/apps/DEPS
@@ -9,5 +9,6 @@
     "+ash/wm/window_properties.h",
     "+ash/wm/window_state.h",
     "+ash/wm/window_state_delegate.h",
+    "+ash/wm/window_state_observer.h",
   ],
 }
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
index aeb2507..bfcbc8b 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
@@ -111,16 +111,9 @@
   init_params.delegate = this;
   init_params.remove_standard_frame = ShouldRemoveStandardFrame();
   init_params.use_system_default_icon = true;
-  if (create_params.alpha_enabled) {
+  if (create_params.alpha_enabled)
     init_params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
 
-    // The given window is most likely not rectangular since it uses
-    // transparency and has no standard frame, don't show a shadow for it.
-    // TODO(skuhne): If we run into an application which should have a shadow
-    // but does not have, a new attribute has to be added.
-    if (IsFrameless())
-      init_params.shadow_type = views::Widget::InitParams::SHADOW_TYPE_NONE;
-  }
   init_params.keep_on_top = create_params.always_on_top;
   init_params.visible_on_all_workspaces =
       create_params.visible_on_all_workspaces;
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc
index da5f2bf..7d25ff8c 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc
@@ -19,6 +19,7 @@
 #include "ash/wm/window_properties.h"
 #include "ash/wm/window_state.h"
 #include "ash/wm/window_state_delegate.h"
+#include "ash/wm/window_state_observer.h"
 #include "base/logging.h"
 #include "chrome/browser/chromeos/note_taking_helper.h"
 #include "chrome/browser/profiles/profile.h"
@@ -54,6 +55,7 @@
 
 // This class handles a user's fullscreen request (Shift+F4/F4).
 class NativeAppWindowStateDelegate : public ash::wm::WindowStateDelegate,
+                                     public ash::wm::WindowStateObserver,
                                      public aura::WindowObserver {
  public:
   NativeAppWindowStateDelegate(AppWindow* app_window,
@@ -67,10 +69,15 @@
     // control.
     // TODO(pkotwicz): This is a hack. Remove ASAP. http://crbug.com/319048
     window_state_->window()->AddObserver(this);
+
+    window_state_->AddObserver(this);
   }
-  ~NativeAppWindowStateDelegate() override {
-    if (window_state_)
-      window_state_->window()->RemoveObserver(this);
+
+  ~NativeAppWindowStateDelegate() override { ClearWindowState(); }
+
+  void set_immersive_fullscreen_controller(
+      ash::ImmersiveFullscreenController* controller) {
+    immersive_fullscreen_controller_ = controller;
   }
 
  private:
@@ -113,14 +120,34 @@
     }
   }
 
-  void OnWindowDestroying(aura::Window* window) override {
-    window_state_->window()->RemoveObserver(this);
-    window_state_ = nullptr;
+  // wm::WindowStateObserver:
+  void OnPostWindowStateTypeChange(
+      ash::wm::WindowState* window_state,
+      ash::mojom::WindowStateType old_type) override {
+    DCHECK_EQ(window_state, window_state_);
+    if (!window_state_->IsFullscreen() && !window_state->IsMinimized() &&
+        immersive_fullscreen_controller_ &&
+        immersive_fullscreen_controller_->IsEnabled()) {
+      immersive_fullscreen_controller_->SetEnabled(
+          ash::ImmersiveFullscreenController::WINDOW_TYPE_OTHER, false);
+    }
+  }
+
+  void OnWindowDestroying(aura::Window* window) override { ClearWindowState(); }
+
+  void ClearWindowState() {
+    if (window_state_) {
+      window_state_->RemoveObserver(this);
+      window_state_->window()->RemoveObserver(this);
+      window_state_ = nullptr;
+    }
   }
 
   // Not owned.
   AppWindow* app_window_;
   ash::wm::WindowState* window_state_;
+  ash::ImmersiveFullscreenController* immersive_fullscreen_controller_ =
+      nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(NativeAppWindowStateDelegate);
 };
@@ -296,9 +323,10 @@
     views::Widget* widget) {
   // Set the delegate now because CustomFrameViewAsh sets the
   // WindowStateDelegate if one is not already set.
-  ash::wm::GetWindowState(GetNativeWindow())
-      ->SetDelegate(std::unique_ptr<ash::wm::WindowStateDelegate>(
-          new NativeAppWindowStateDelegate(app_window(), this)));
+  auto delegate =
+      std::make_unique<NativeAppWindowStateDelegate>(app_window(), this);
+  auto* delegate_ptr = delegate.get();
+  ash::wm::GetWindowState(GetNativeWindow())->SetDelegate(std::move(delegate));
 
   if (IsFrameless())
     return CreateNonStandardAppFrame();
@@ -311,6 +339,9 @@
   // Non-frameless app windows can be put into immersive fullscreen.
   immersive_fullscreen_controller_.reset(
       new ash::ImmersiveFullscreenController());
+  delegate_ptr->set_immersive_fullscreen_controller(
+      immersive_fullscreen_controller_.get());
+
   custom_frame_view->InitImmersiveFullscreenControllerForView(
       immersive_fullscreen_controller_.get());
   custom_frame_view->GetHeaderView()->set_context_menu_controller(this);
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.h b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.h
index 607421aa..c709a61 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.h
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.h
@@ -127,6 +127,8 @@
                            NoImmersiveModeWhenForcedFullscreen);
   FRIEND_TEST_ALL_PREFIXES(ChromeNativeAppWindowViewsAuraAshBrowserTest,
                            PublicSessionImmersiveMode);
+  FRIEND_TEST_ALL_PREFIXES(ChromeNativeAppWindowViewsAuraAshBrowserTest,
+                           RestoreImmersiveMode);
   FRIEND_TEST_ALL_PREFIXES(ChromeNativeAppWindowViewsAuraAshInteractiveTest,
                            NoImmersiveOrBubbleOutsidePublicSessionWindow);
   FRIEND_TEST_ALL_PREFIXES(ChromeNativeAppWindowViewsAuraAshInteractiveTest,
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc
index ee464db..639e93b 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc
@@ -168,3 +168,23 @@
 
   EXPECT_TRUE(window->immersive_fullscreen_controller_->IsEnabled());
 }
+
+// Verifies that apps in immersive fullscreen will correctly exit
+// immersive mode when Restore is called.
+IN_PROC_BROWSER_TEST_F(ChromeNativeAppWindowViewsAuraAshBrowserTest,
+                       RestoreImmersiveMode) {
+  extensions::AppWindow* app_window = CreateTestAppWindow("{}");
+  auto* window = static_cast<ChromeNativeAppWindowViewsAuraAsh*>(
+      GetNativeAppWindowForAppWindow(app_window));
+  ASSERT_TRUE(window != nullptr);
+  ASSERT_TRUE(window->immersive_fullscreen_controller_.get());
+
+  app_window->OSFullscreen();
+  EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED, window->GetRestoredState());
+  EXPECT_TRUE(window->IsFullscreen());
+
+  window->Restore();
+  ASSERT_FALSE(window->immersive_fullscreen_controller_->IsEnabled());
+
+  CloseAppWindow(app_window);
+}
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
index e40abf0..4bcd28a 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
@@ -702,6 +702,8 @@
       size_animation_.Hide();
   } else {
     size_animation_.Reset(state == BookmarkBar::SHOW ? 1 : 0);
+    if (!animations_enabled)
+      AnimationEnded(&size_animation_);
   }
   bookmark_bar_state_ = state;
 }
@@ -1278,6 +1280,8 @@
     browser_view_->ToolbarSizeChanged(false);
     SchedulePaint();
   }
+  for (BookmarkBarViewObserver& observer : observers_)
+    observer.OnBookmarkBarAnimationEnded();
 }
 
 void BookmarkBarView::BookmarkMenuControllerDeleted(
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h
index fa3526c..625f229 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h
@@ -8,6 +8,7 @@
 class BookmarkBarViewObserver {
  public:
   virtual void OnBookmarkBarVisibilityChanged() = 0;
+  virtual void OnBookmarkBarAnimationEnded() = 0;
 
  protected:
   ~BookmarkBarViewObserver() {}
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
index ccd0049..b6142098 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
@@ -80,7 +80,6 @@
   bubble_widget->Show();
   // Select the entire title textfield contents when the bubble is first shown.
   bookmark_bubble_->name_field_->SelectAll(true);
-  bookmark_bubble_->SetArrowPaintType(views::BubbleBorder::PAINT_TRANSPARENT);
 
   if (bookmark_bubble_->observer_) {
     BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile);
diff --git a/chrome/browser/ui/views/critical_notification_bubble_view.cc b/chrome/browser/ui/views/critical_notification_bubble_view.cc
index 2fe220b..ef1c791 100644
--- a/chrome/browser/ui/views/critical_notification_bubble_view.cc
+++ b/chrome/browser/ui/views/critical_notification_bubble_view.cc
@@ -10,7 +10,7 @@
 #include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/views/harmony/chrome_layout_provider.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
diff --git a/chrome/browser/ui/views/download/download_shelf_view.cc b/chrome/browser/ui/views/download/download_shelf_view.cc
index 51e40b1..3eeb9a6 100644
--- a/chrome/browser/ui/views/download/download_shelf_view.cc
+++ b/chrome/browser/ui/views/download/download_shelf_view.cc
@@ -168,7 +168,9 @@
 }
 
 void DownloadShelfView::OnPaintBorder(gfx::Canvas* canvas) {
-  canvas->FillRect(gfx::Rect(0, 0, width(), 1), kBorderColor);
+  canvas->FillRect(gfx::Rect(0, 0, width(), 1),
+                   GetThemeProvider()->GetColor(
+                       ThemeProperties::COLOR_TOOLBAR_CONTENT_AREA_SEPARATOR));
 }
 
 void DownloadShelfView::OpenedDownload() {
diff --git a/chrome/browser/ui/views/download/download_shelf_view.h b/chrome/browser/ui/views/download/download_shelf_view.h
index be5ff1b..0a84c66 100644
--- a/chrome/browser/ui/views/download/download_shelf_view.h
+++ b/chrome/browser/ui/views/download/download_shelf_view.h
@@ -119,9 +119,6 @@
   // Padding between the show all link and close button.
   static constexpr int kCloseAndLinkPadding = 6;
 
-  // Border color.
-  static constexpr SkColor kBorderColor = SkColorSetRGB(214, 214, 214);
-
   // New download item animation speed in milliseconds.
   static constexpr int kNewItemAnimationDurationMs = 800;
 
diff --git a/chrome/browser/ui/views/extensions/extension_popup.cc b/chrome/browser/ui/views/extensions/extension_popup.cc
index 2dc1859a..4ee33a9f 100644
--- a/chrome/browser/ui/views/extensions/extension_popup.cc
+++ b/chrome/browser/ui/views/extensions/extension_popup.cc
@@ -152,7 +152,9 @@
 
 void ExtensionPopup::OnWidgetActivationChanged(views::Widget* widget,
                                                bool active) {
-  if (active && widget == anchor_widget())
+  // Don't close if we haven't shown the widget yet (the widget is shown once
+  // the WebContents finishes loading).
+  if (GetWidget()->IsVisible() && active && widget == anchor_widget())
     CloseUnlessUnderInspection();
 }
 
diff --git a/chrome/browser/ui/views/feature_promos/bookmark_bar_promo_bubble_view.cc b/chrome/browser/ui/views/feature_promos/bookmark_bar_promo_bubble_view.cc
index 238b41c..2a8e0c1 100644
--- a/chrome/browser/ui/views/feature_promos/bookmark_bar_promo_bubble_view.cc
+++ b/chrome/browser/ui/views/feature_promos/bookmark_bar_promo_bubble_view.cc
@@ -6,11 +6,49 @@
 
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h"
+#include "chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h"
 #include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/bookmarks/browser/bookmark_node.h"
 
+// BookmarkBarViewObserverImpl is used to observe when the bookmark bar has
+// finished animating, then show the bookmark bubble. It's important to wait
+// for the bookmark bar to finish animating because otherwise this bubble will
+// overlap it.
+// BookmarkBarViewObserverImpl will delete itself once it shows the bubble to
+// prevent showing the bubble multiple times.
+// BookmarkBarViewObserverImpl will add and remove itself as an observer to the
+// bookmark_bar.
+class BookmarkBarPromoBubbleView::BookmarkBarViewObserverImpl
+    : public BookmarkBarViewObserver {
+ public:
+  BookmarkBarViewObserverImpl(BookmarkBarView* bookmark_bar,
+                              int string_specifier,
+                              const bookmarks::BookmarkNode* node)
+      : bookmark_bar(bookmark_bar),
+        string_specifier(string_specifier),
+        node(node) {
+    bookmark_bar->AddObserver(this);
+  }
+  virtual ~BookmarkBarViewObserverImpl() {}
+
+ private:
+  BookmarkBarView* bookmark_bar;
+  int string_specifier;
+  const bookmarks::BookmarkNode* node;
+
+  void OnBookmarkBarVisibilityChanged() override {}
+
+  void OnBookmarkBarAnimationEnded() override {
+    ShowPromoDelegate::CreatePromoDelegate(string_specifier)->ShowForNode(node);
+    bookmark_bar->RemoveObserver(this);
+    delete this;
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(BookmarkBarViewObserverImpl);
+};
+
 std::unique_ptr<ShowPromoDelegate> ShowPromoDelegate::CreatePromoDelegate(
     int string_specifier) {
   return std::make_unique<BookmarkBarPromoBubbleView>(string_specifier);
@@ -33,10 +71,16 @@
 
 void BookmarkBarPromoBubbleView::ShowForNode(
     const bookmarks::BookmarkNode* node) {
-  views::LabelButton* anchor_view =
+  BookmarkBarView* bookmark_bar =
       BrowserView::GetBrowserViewForBrowser(
           BrowserList::GetInstance()->GetLastActive())
-          ->bookmark_bar()
-          ->GetBookmarkButtonForNode(node);
-  new BookmarkBarPromoBubbleView::BubbleImpl(anchor_view, string_specifier);
+          ->bookmark_bar();
+
+  if (bookmark_bar->visible()) {
+    views::LabelButton* anchor_view =
+        bookmark_bar->GetBookmarkButtonForNode(node);
+    new BookmarkBarPromoBubbleView::BubbleImpl(anchor_view, string_specifier);
+  } else {
+    new BookmarkBarViewObserverImpl(bookmark_bar, string_specifier, node);
+  }
 }
diff --git a/chrome/browser/ui/views/feature_promos/bookmark_bar_promo_bubble_view.h b/chrome/browser/ui/views/feature_promos/bookmark_bar_promo_bubble_view.h
index d8d32e0..4f61263a 100644
--- a/chrome/browser/ui/views/feature_promos/bookmark_bar_promo_bubble_view.h
+++ b/chrome/browser/ui/views/feature_promos/bookmark_bar_promo_bubble_view.h
@@ -31,6 +31,7 @@
 
  private:
   struct BubbleImpl;
+  class BookmarkBarViewObserverImpl;
 
   // The string that will be shown on this bubble.
   int string_specifier;
diff --git a/chrome/browser/ui/views/feature_promos/bookmark_bar_promo_dialog_browsertest.cc b/chrome/browser/ui/views/feature_promos/bookmark_bar_promo_dialog_browsertest.cc
index 4bdf3d6..a4d4a0f 100644
--- a/chrome/browser/ui/views/feature_promos/bookmark_bar_promo_dialog_browsertest.cc
+++ b/chrome/browser/ui/views/feature_promos/bookmark_bar_promo_dialog_browsertest.cc
@@ -8,7 +8,9 @@
 #include "chrome/browser/ui/views/feature_promos/bookmark_bar_promo_bubble_view.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "components/bookmarks/browser/bookmark_model.h"
+#include "components/bookmarks/common/bookmark_pref_names.h"
 #include "components/bookmarks/test/bookmark_test_helpers.h"
+#include "components/prefs/pref_member.h"
 #include "components/strings/grit/components_strings.h"
 
 class BookmarkBarPromoDialogTest : public DialogBrowserTest {
@@ -38,5 +40,9 @@
 // Test that calls ShowUi("default").
 IN_PROC_BROWSER_TEST_F(BookmarkBarPromoDialogTest,
                        InvokeUi_BookmarkBarPromoBubble) {
+  BookmarkBarView::DisableAnimationsForTesting(true);
+  browser()->profile()->GetPrefs()->SetBoolean(
+      bookmarks::prefs::kShowBookmarkBar, true);
   ShowAndVerifyUi();
+  BookmarkBarView::DisableAnimationsForTesting(false);
 }
diff --git a/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc
index 10b47371..217a88bd 100644
--- a/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc
+++ b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc
@@ -74,8 +74,6 @@
     set_shadow(views::BubbleBorder::NO_SHADOW);
   }
   views::Widget* widget = views::BubbleDialogDelegateView::CreateBubble(this);
-  if (activation_action == ActivationAction::DO_NOT_ACTIVATE)
-    SetArrowPaintType(views::BubbleBorder::PAINT_TRANSPARENT);
 
   widget->Show();
   if (activation_action == ActivationAction::ACTIVATE)
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
index 970f1bf..9356ea0d 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
@@ -480,7 +480,7 @@
 }
 
 // This is a regression test that session restore minimized browser should
-// update caption buttons (https://crbug.com/827444).
+// re-layout the header (https://crbug.com/827444).
 IN_PROC_BROWSER_TEST_P(BrowserNonClientFrameViewAshTest,
                        RestoreMinimizedBrowserUpdatesCaption) {
   // Enable session service.
@@ -506,19 +506,25 @@
   SessionRestoreTestHelper restore_observer;
 
   Browser* new_browser = window_observer.WaitForSingleNewBrowser();
-  restore_observer.Wait();
 
-  // Check that caption button image is set.
+  // Check that a layout occurs.
   BrowserView* browser_view =
       BrowserView::GetBrowserViewForBrowser(new_browser);
   Widget* widget = browser_view->GetWidget();
-  // We know we're using Ash, so static cast.
+  restore_observer.Wait();
+
   BrowserNonClientFrameViewAsh* frame_view =
       static_cast<BrowserNonClientFrameViewAsh*>(
           widget->non_client_view()->frame_view());
-  ash::FrameCaptionButtonContainerView::TestApi test(
-      frame_view->caption_button_container_);
-  EXPECT_TRUE(test.size_button()->icon_definition_for_test());
+
+  if (features::IsAshInBrowserProcess()) {
+    ash::FrameCaptionButtonContainerView::TestApi test(
+        frame_view->caption_button_container_);
+    EXPECT_TRUE(test.size_button()->icon_definition_for_test());
+  } else {
+    EXPECT_NE(
+        0, widget->GetNativeWindow()->GetProperty(ash::kFrameImageYInsetKey));
+  }
 }
 
 namespace {
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 9a8c3f1..81127e8 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -269,8 +269,9 @@
                               view->GetLocalBounds(), background_image_offset);
   if (view->height() >= toolbar_overlap) {
     BrowserView::Paint1pxHorizontalLine(
-        canvas, view->GetThemeProvider()->GetColor(
-                    ThemeProperties::COLOR_TOOLBAR_BOTTOM_SEPARATOR),
+        canvas,
+        view->GetThemeProvider()->GetColor(
+            ThemeProperties::COLOR_TOOLBAR_CONTENT_AREA_SEPARATOR),
         view->GetLocalBounds(), true);
   }
 }
diff --git a/chrome/browser/ui/views/frame/browser_view_browsertest.cc b/chrome/browser/ui/views/frame/browser_view_browsertest.cc
index 49fbd6e..022ce2410 100644
--- a/chrome/browser/ui/views/frame/browser_view_browsertest.cc
+++ b/chrome/browser/ui/views/frame/browser_view_browsertest.cc
@@ -195,15 +195,52 @@
   int change_count() const { return change_count_; }
   void clear_change_count() { change_count_ = 0; }
 
+  int end_count() const { return end_count_; }
+  void clear_end_count() { end_count_ = 0; }
+
   // BookmarkBarViewObserver:
   void OnBookmarkBarVisibilityChanged() override { change_count_++; }
+  void OnBookmarkBarAnimationEnded() override { end_count_++; }
 
  private:
-  int change_count_;
+  int change_count_ = 0;
+  int end_count_ = 0;
 
   DISALLOW_COPY_AND_ASSIGN(BookmarkBarViewObserverImpl);
 };
 
+// Verifies we notify the BookmarkBarViewObserver when an animation ends.
+IN_PROC_BROWSER_TEST_F(BrowserViewTest, VerifyAnimationEndObserved) {
+  BookmarkBarView::DisableAnimationsForTesting(true);
+  // No bookmark bar.
+  browser()->profile()->GetPrefs()->SetBoolean(
+      bookmarks::prefs::kShowBookmarkBar, false);
+
+  // Add observer and confirm bookmark bar not visible.
+  ASSERT_TRUE(browser_view()->bookmark_bar());
+  BookmarkBarViewObserverImpl observer;
+  BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar();
+  bookmark_bar->AddObserver(&observer);
+  EXPECT_FALSE(bookmark_bar->visible());
+  EXPECT_EQ(0, observer.end_count());
+
+  // Show the bookmark bar.
+  browser()->profile()->GetPrefs()->SetBoolean(
+      bookmarks::prefs::kShowBookmarkBar, true);
+
+  EXPECT_TRUE(bookmark_bar->visible());
+  EXPECT_EQ(1, observer.end_count());
+  observer.clear_end_count();
+
+  // Hide the bookmark bar.
+  browser()->profile()->GetPrefs()->SetBoolean(
+      bookmarks::prefs::kShowBookmarkBar, false);
+
+  EXPECT_FALSE(bookmark_bar->visible());
+  EXPECT_EQ(1, observer.end_count());
+  BookmarkBarView::DisableAnimationsForTesting(false);
+}
+
 // Verifies we don't unnecessarily change the visibility of the BookmarkBarView.
 IN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) {
   // Create two tabs, the first empty and the second the ntp. Make it so the
@@ -225,12 +262,14 @@
   EXPECT_FALSE(bookmark_bar->visible());
   EXPECT_EQ(1, observer.change_count());
   observer.clear_change_count();
+  EXPECT_EQ(0, observer.end_count());
 
   // Go to ntp tab. Bookmark bar should show.
   browser()->tab_strip_model()->ActivateTabAt(1, true);
   EXPECT_TRUE(bookmark_bar->visible());
   EXPECT_EQ(1, observer.change_count());
   observer.clear_change_count();
+  EXPECT_EQ(0, observer.end_count());
 
   // Repeat with the bookmark bar always visible.
   browser()->profile()->GetPrefs()->SetBoolean(
@@ -238,16 +277,19 @@
   browser()->tab_strip_model()->ActivateTabAt(1, true);
   EXPECT_TRUE(bookmark_bar->visible());
   observer.clear_change_count();
+  EXPECT_EQ(0, observer.end_count());
 
   browser()->tab_strip_model()->ActivateTabAt(0, true);
   EXPECT_TRUE(bookmark_bar->visible());
   EXPECT_EQ(0, observer.change_count());
   observer.clear_change_count();
+  EXPECT_EQ(0, observer.end_count());
 
   browser()->tab_strip_model()->ActivateTabAt(1, true);
   EXPECT_TRUE(bookmark_bar->visible());
   EXPECT_EQ(0, observer.change_count());
   observer.clear_change_count();
+  EXPECT_EQ(0, observer.end_count());
 
   browser_view()->bookmark_bar()->RemoveObserver(&observer);
 }
diff --git a/chrome/browser/ui/views/harmony/material_refresh_layout_provider.cc b/chrome/browser/ui/views/harmony/material_refresh_layout_provider.cc
index 6463f34..ac1259e1c 100644
--- a/chrome/browser/ui/views/harmony/material_refresh_layout_provider.cc
+++ b/chrome/browser/ui/views/harmony/material_refresh_layout_provider.cc
@@ -64,6 +64,7 @@
 }
 
 gfx::ShadowValues MaterialRefreshLayoutProvider::MakeShadowValues(
-    int elevation) const {
-  return gfx::ShadowValue::MakeRefreshShadowValues(elevation);
+    int elevation,
+    SkColor color) const {
+  return gfx::ShadowValue::MakeRefreshShadowValues(elevation, color);
 }
diff --git a/chrome/browser/ui/views/harmony/material_refresh_layout_provider.h b/chrome/browser/ui/views/harmony/material_refresh_layout_provider.h
index 5bd070c..8dc5245 100644
--- a/chrome/browser/ui/views/harmony/material_refresh_layout_provider.h
+++ b/chrome/browser/ui/views/harmony/material_refresh_layout_provider.h
@@ -20,7 +20,8 @@
                             const gfx::Size& size = gfx::Size()) const override;
   int GetShadowElevationMetric(
       views::EmphasisMetric emphasis_metric) const override;
-  gfx::ShadowValues MakeShadowValues(int elevation) const override;
+  gfx::ShadowValues MakeShadowValues(int elevation,
+                                     SkColor color) const override;
 };
 
 #endif  // CHROME_BROWSER_UI_VIEWS_HARMONY_MATERIAL_REFRESH_LAYOUT_PROVIDER_H_
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view.cc b/chrome/browser/ui/views/intent_picker_bubble_view.cc
index 2dda35c..e1856a4 100644
--- a/chrome/browser/ui/views/intent_picker_bubble_view.cc
+++ b/chrome/browser/ui/views/intent_picker_bubble_view.cc
@@ -154,8 +154,6 @@
   }
   views::Widget* widget =
       views::BubbleDialogDelegateView::CreateBubble(intent_picker_bubble_);
-  intent_picker_bubble_->SetArrowPaintType(
-      views::BubbleBorder::PAINT_TRANSPARENT);
   intent_picker_bubble_->GetDialogClientView()->Layout();
   // TODO(aleventhal) Should not need to be focusable as only descendant widgets
   // are interactive; however, it does call RequestFocus(). If it is going to be
diff --git a/chrome/browser/ui/views/location_bar/content_setting_image_view.cc b/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
index 9c611de..adef8f4c 100644
--- a/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
+++ b/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
@@ -197,7 +197,6 @@
     if (!pause_animation_) {
       AnimateInkDrop(views::InkDropState::ACTIVATED,
                      ui::LocatedEvent::FromIfValid(&event));
-      bubble_view_->SetArrowPaintType(views::BubbleBorder::PAINT_TRANSPARENT);
     }
     bubble_widget->Show();
     delegate_->OnContentSettingImageBubbleShown(
diff --git a/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.cc b/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.cc
index eca4ff4..e1de0d5 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.cc
+++ b/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.cc
@@ -81,7 +81,6 @@
 
 void LocationBarBubbleDelegateView::ShowForReason(DisplayReason reason) {
   if (reason == USER_GESTURE) {
-    SetArrowPaintType(views::BubbleBorder::PAINT_TRANSPARENT);
     GetWidget()->Show();
   } else {
     GetWidget()->ShowInactive();
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
index 01c0d70..d789541 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
@@ -1184,7 +1184,8 @@
 }
 
 bool OmniboxViewViews::ShouldShowPlaceholderText() const {
-  return Textfield::ShouldShowPlaceholderText() && !model()->is_caret_visible();
+  return Textfield::ShouldShowPlaceholderText() &&
+         !model()->is_caret_visible() && !model()->is_keyword_selected();
 }
 
 #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc
index 499e885..2336309 100644
--- a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc
+++ b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc
@@ -145,6 +145,10 @@
       gfx::kPlaceholderColor);
   border->SetCornerRadius(corner_radius);
   border->set_md_shadow_elevation(kElevation);
+  // Use a darker shadow that's more visible on darker tints.
+  border->set_md_shadow_color(tint == OmniboxTint::DARK ? SK_ColorBLACK
+                                                        : gfx::kGoogleGrey800);
+
   SetBorder(std::move(border));
 
   AddChildView(contents_host_);
diff --git a/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc b/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc
index d318ae7..b7eb1f63 100644
--- a/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc
+++ b/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc
@@ -12,7 +12,7 @@
 #include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/layout_constants.h"
 #include "chrome/browser/ui/views/harmony/chrome_layout_provider.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.cc b/chrome/browser/ui/views/overlay/overlay_window_views.cc
index 4527318..cb193a7 100644
--- a/chrome/browser/ui/views/overlay/overlay_window_views.cc
+++ b/chrome/browser/ui/views/overlay/overlay_window_views.cc
@@ -23,6 +23,7 @@
 #include "ui/views/vector_icons.h"
 #include "ui/views/widget/widget_delegate.h"
 #include "ui/views/window/non_client_view.h"
+#include "ui/views/window/window_resize_utils.h"
 
 // static
 std::unique_ptr<content::OverlayWindow> content::OverlayWindow::Create(
@@ -169,38 +170,44 @@
   // on UI affordances, such as buttons.
   min_size_ = kMinWindowSize;
 
-  gfx::Size window_size;
-  gfx::Point origin;
-
-  if (is_initialized_) {
-    window_size = window_bounds_.size();
-    origin = window_bounds_.origin();
-  } else {
-    // Determine the initial window bounds:
-    // The initial window size is 20% of the |work_area| screen.
+  gfx::Size window_size = window_bounds_.size();
+  if (!has_been_shown_) {
     window_size = gfx::Size(work_area.width() / 5, work_area.height() / 5);
     window_size.set_width(std::min(
         max_size_.width(), std::max(min_size_.width(), window_size.width())));
     window_size.set_height(
         std::min(max_size_.height(),
                  std::max(min_size_.height(), window_size.height())));
+  }
 
-    // Determine the initial origin point:
-    // The window is positioned on the bottom right of the |work_area| screen.
+  // Determine the window size by fitting |natural_size_| within
+  // |window_size|, keeping to |natural_size_|'s aspect ratio.
+  if (!window_size.IsEmpty() && !natural_size_.IsEmpty()) {
+    float aspect_ratio = (float)natural_size_.width() / natural_size_.height();
+
+    // Update the window size to adhere to the aspect ratio.
+    gfx::Rect window_rect(GetBounds().origin(), window_size);
+    views::WindowResizeUtils::SizeRectToAspectRatio(
+        views::HitTest::kBottomRight, aspect_ratio, min_size_, max_size_,
+        &window_rect);
+    window_size.SetSize(window_rect.width(), window_rect.height());
+
+    UpdateLayerBoundsWithLetterboxing(window_size);
+  }
+
+  // Use the previous window origin location, if exists.
+  gfx::Point origin = window_bounds_.origin();
+  if (!has_been_shown_) {
     int window_diff_width = work_area.right() - window_size.width();
     int window_diff_height = work_area.bottom() - window_size.height();
 
-    // There will be a margin between the edges of the Picture-in-Picture
-    // window and the |work_area| screen by taking 2% of the average of the
-    // window dimensions.
-    int margin = (window_diff_width + window_diff_height) / 2 * 0.02;
-
+    // Keep a margin distance of 2% the average of the two window size
+    // differences, keeping the margins consistent.
+    int buffer = (window_diff_width + window_diff_height) / 2 * 0.02;
     origin =
-        gfx::Point(window_diff_width - margin, window_diff_height - margin);
+        gfx::Point(window_diff_width - buffer, window_diff_height - buffer);
   }
 
-  UpdateVideoLayerSizeWithAspectRatio(window_size);
-
   window_bounds_ = gfx::Rect(origin, window_size);
   return window_bounds_;
 }
@@ -216,8 +223,8 @@
   // background. --------------------------------------------------------------
   controls_background_view_->SetSize(GetBounds().size());
   controls_background_view_->SetPaintToLayer(ui::LAYER_SOLID_COLOR);
-  GetControlsBackgroundLayer()->SetColor(SK_ColorBLACK);
-  GetControlsBackgroundLayer()->SetOpacity(0.4f);
+  GetControlsBackgroundLayer()->SetColor(gfx::kGoogleGrey900);
+  GetControlsBackgroundLayer()->SetOpacity(0.43f);
 
   // views::View that closes the window. --------------------------------------
   close_controls_view_->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
@@ -283,7 +290,7 @@
   UpdateControlsVisibility(false);
 }
 
-void OverlayWindowViews::UpdateVideoLayerSizeWithAspectRatio(
+void OverlayWindowViews::UpdateLayerBoundsWithLetterboxing(
     gfx::Size window_size) {
   // This is the case when the window is initially created or the video surface
   // id has not been embedded.
@@ -373,6 +380,9 @@
 
   // Don't show the controls until the mouse hovers over the window.
   should_show_controls_ = false;
+
+  // If this is not the first time the window is shown, this will be a no-op.
+  has_been_shown_ = true;
 }
 
 void OverlayWindowViews::Hide() {
@@ -403,11 +413,9 @@
   if (IsVisible())
     return;
 
-  // Update the views::Widget bounds to adhere to sizing spec.
+  // Update the views::Widget bounds to adhere to sizing spec. This will also
+  // update the layout of the controls.
   SetBounds(CalculateAndUpdateWindowBounds());
-
-  // Update the layout of the controls.
-  UpdateControlsBounds();
 }
 
 void OverlayWindowViews::SetPlaybackState(PlaybackState playback_state) {
@@ -570,7 +578,7 @@
 void OverlayWindowViews::OnNativeWidgetSizeChanged(const gfx::Size& new_size) {
   // Update the view layers to scale to |new_size|.
   UpdatePlayPauseControlsSize();
-  UpdateVideoLayerSizeWithAspectRatio(new_size);
+  UpdateLayerBoundsWithLetterboxing(new_size);
 
   views::Widget::OnNativeWidgetSizeChanged(new_size);
 }
@@ -587,6 +595,12 @@
   play_pause_controls_view_->SetToggled(is_active);
 }
 
+void OverlayWindowViews::SetPictureInPictureCustomControls(
+    const std::vector<blink::PictureInPictureControlInfo>& controls) {
+  // TODO(sawtelle): Add these controls to the window. https://crbug.com/863967.
+  NOTIMPLEMENTED();
+}
+
 void OverlayWindowViews::ClickCustomControl(const std::string& control_id) {
   controller_->ClickCustomControl(control_id);
 }
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.h b/chrome/browser/ui/views/overlay/overlay_window_views.h
index a7896bd5..0b2f00f 100644
--- a/chrome/browser/ui/views/overlay/overlay_window_views.h
+++ b/chrome/browser/ui/views/overlay/overlay_window_views.h
@@ -40,6 +40,8 @@
   ui::Layer* GetWindowBackgroundLayer() override;
   ui::Layer* GetVideoLayer() override;
   gfx::Rect GetVideoBounds() override;
+  void SetPictureInPictureCustomControls(
+      const std::vector<blink::PictureInPictureControlInfo>& controls) override;
 
   // views::Widget:
   gfx::Size GetMinimumSize() const override;
@@ -82,9 +84,9 @@
   // Set up the views::Views that will be shown on the window.
   void SetUpViews();
 
-  // Update |video_bounds_| to fit within |window_bounds_| while adhering to
-  // the aspect ratio of the video, which is retrieved from |natural_size_|.
-  void UpdateVideoLayerSizeWithAspectRatio(gfx::Size window_size);
+  // Update the bounds of the layers on the window. This may introduce
+  // letterboxing.
+  void UpdateLayerBoundsWithLetterboxing(gfx::Size window_size);
 
   // Updates the controls view::Views to reflect |is_visible|.
   void UpdateControlsVisibility(bool is_visible);
@@ -113,6 +115,11 @@
   // some event handlers (e.g. focus).
   bool should_show_controls_ = false;
 
+  // Whether or not the window has been shown before. This is used to determine
+  // sizing and placement. This is different from checking whether the window
+  // components has been initialized.
+  bool has_been_shown_ = false;
+
   // The upper and lower bounds of |current_size_|. These are determined by the
   // size of the primary display work area when Picture-in-Picture is initiated.
   // TODO(apacible): Update these bounds when the display the window is on
diff --git a/chrome/browser/ui/views/profiles/profile_chooser_view.cc b/chrome/browser/ui/views/profiles/profile_chooser_view.cc
index 9a11db5..51d35fb 100644
--- a/chrome/browser/ui/views/profiles/profile_chooser_view.cc
+++ b/chrome/browser/ui/views/profiles/profile_chooser_view.cc
@@ -346,8 +346,6 @@
 
   views::Widget* widget =
       views::BubbleDialogDelegateView::CreateBubble(profile_bubble_);
-  profile_bubble_->SetAlignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE);
-  profile_bubble_->SetArrowPaintType(views::BubbleBorder::PAINT_NONE);
   widget->Show();
   base::RecordAction(base::UserMetricsAction("ProfileChooser_Show"));
   if (is_source_keyboard)
diff --git a/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller.h b/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller.h
index 56d7097..6c1c3ed 100644
--- a/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller.h
+++ b/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller.h
@@ -11,8 +11,8 @@
 #include "base/strings/string_piece.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
-#include "chrome/browser/upgrade_detector.h"
-#include "chrome/browser/upgrade_observer.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_observer.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "ui/views/widget/widget_observer.h"
 
diff --git a/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_unittest.cc b/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_unittest.cc
index 7ad1032..b8dcf693 100644
--- a/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_unittest.cc
+++ b/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_unittest.cc
@@ -12,7 +12,7 @@
 #include "base/time/tick_clock.h"
 #include "base/time/time.h"
 #include "base/values.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.cc b/chrome/browser/ui/views/toolbar/toolbar_view.cc
index 3ffa012..49a7115 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_view.cc
@@ -43,7 +43,7 @@
 #include "chrome/browser/ui/views/toolbar/toolbar_button.h"
 #include "chrome/browser/ui/views/translate/translate_bubble_view.h"
 #include "chrome/browser/ui/views/translate/translate_icon_view.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
@@ -617,7 +617,8 @@
 
   // Toolbar/content separator.
   BrowserView::Paint1pxHorizontalLine(
-      canvas, tp->GetColor(ThemeProperties::COLOR_TOOLBAR_BOTTOM_SEPARATOR),
+      canvas,
+      tp->GetColor(ThemeProperties::COLOR_TOOLBAR_CONTENT_AREA_SEPARATOR),
       GetLocalBounds(), true);
 }
 
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.h b/chrome/browser/ui/views/toolbar/toolbar_view.h
index b9c5bdac..a006a67 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_view.h
+++ b/chrome/browser/ui/views/toolbar/toolbar_view.h
@@ -18,7 +18,7 @@
 #include "chrome/browser/ui/views/location_bar/location_bar_view.h"
 #include "chrome/browser/ui/views/profiles/avatar_toolbar_button.h"
 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
-#include "chrome/browser/upgrade_observer.h"
+#include "chrome/browser/upgrade_detector/upgrade_observer.h"
 #include "components/prefs/pref_member.h"
 #include "components/translate/core/browser/translate_step.h"
 #include "components/translate/core/common/translate_errors.h"
diff --git a/chrome/browser/ui/webui/help/version_updater_basic.cc b/chrome/browser/ui/webui/help/version_updater_basic.cc
index 796d0a5..93e3f41 100644
--- a/chrome/browser/ui/webui/help/version_updater_basic.cc
+++ b/chrome/browser/ui/webui/help/version_updater_basic.cc
@@ -5,16 +5,15 @@
 #include "chrome/browser/ui/webui/help/version_updater_basic.h"
 
 #include "base/strings/string16.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 
 void VersionUpdaterBasic::CheckForUpdate(
     const StatusCallback& status_callback,
     const PromoteCallback&) {
-  if (UpgradeDetector::GetInstance()->notify_upgrade())
-    status_callback.Run(NEARLY_UPDATED, 0, false, std::string(), 0,
-                        base::string16());
-  else
-    status_callback.Run(DISABLED, 0, false, std::string(), 0, base::string16());
+  const Status status = UpgradeDetector::GetInstance()->notify_upgrade()
+                            ? NEARLY_UPDATED
+                            : DISABLED;
+  status_callback.Run(status, 0, false, std::string(), 0, base::string16());
 }
 
 VersionUpdater* VersionUpdater::Create(content::WebContents* web_contents) {
diff --git a/chrome/browser/ui/webui/settings/about_handler.cc b/chrome/browser/ui/webui/settings/about_handler.cc
index 6a9eb97..a78b76e 100644
--- a/chrome/browser/ui/webui/settings/about_handler.cc
+++ b/chrome/browser/ui/webui/settings/about_handler.cc
@@ -30,7 +30,7 @@
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/chrome_pages.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_content_client.h"
 #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/ui/webui/settings/about_handler.h b/chrome/browser/ui/webui/settings/about_handler.h
index 4c8ae08a..6395f306 100644
--- a/chrome/browser/ui/webui/settings/about_handler.h
+++ b/chrome/browser/ui/webui/settings/about_handler.h
@@ -15,7 +15,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/ui/webui/help/version_updater.h"
 #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
-#include "chrome/browser/upgrade_observer.h"
+#include "chrome/browser/upgrade_detector/upgrade_observer.h"
 #include "components/policy/core/common/policy_service.h"
 #include "content/public/browser/web_ui_message_handler.h"
 
diff --git a/chrome/browser/ui/webui/welcome_ui.cc b/chrome/browser/ui/webui/welcome_ui.cc
index 7d131cf..4bcca49 100644
--- a/chrome/browser/ui/webui/welcome_ui.cc
+++ b/chrome/browser/ui/webui/welcome_ui.cc
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "build/build_config.h"
+#include "chrome/browser/favicon/favicon_service_factory.h"
 #include "chrome/browser/signin/account_consistency_mode_manager.h"
 #include "chrome/browser/ui/webui/welcome_handler.h"
 #include "chrome/common/pref_names.h"
@@ -16,6 +17,7 @@
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/prefs/pref_service.h"
+#include "components/sync/driver/sync_service.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "net/base/url_util.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -115,6 +117,8 @@
     web_ui->AddMessageHandler(
         std::make_unique<nux_google_apps::GoogleAppsHandler>(
             profile->GetPrefs(),
+            FaviconServiceFactory::GetForProfile(
+                profile, ServiceAccessType::EXPLICIT_ACCESS),
             BookmarkModelFactory::GetForBrowserContext(browser_context)));
 
     nux_google_apps::GoogleAppsHandler::AddSources(html_source);
diff --git a/chrome/browser/upgrade_detector/OWNERS b/chrome/browser/upgrade_detector/OWNERS
new file mode 100644
index 0000000..49bfcb22e
--- /dev/null
+++ b/chrome/browser/upgrade_detector/OWNERS
@@ -0,0 +1,2 @@
+grt@chromium.org
+xiyuan@chromium.org
diff --git a/chrome/browser/upgrade_detector.cc b/chrome/browser/upgrade_detector/upgrade_detector.cc
similarity index 91%
rename from chrome/browser/upgrade_detector.cc
rename to chrome/browser/upgrade_detector/upgrade_detector.cc
index deec3bb..38f0d522 100644
--- a/chrome/browser/upgrade_detector.cc
+++ b/chrome/browser/upgrade_detector/upgrade_detector.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 
 #include "base/bind.h"
 #include "base/command_line.h"
@@ -30,8 +30,8 @@
   // be, we assume it is for testing and switch to using seconds instead of
   // hours.
   const base::CommandLine& cmd_line = *base::CommandLine::ForCurrentProcess();
-  return !cmd_line.GetSwitchValueASCII(
-      switches::kCheckForUpdateIntervalSec).empty();
+  return !cmd_line.GetSwitchValueASCII(switches::kCheckForUpdateIntervalSec)
+              .empty();
 }
 
 // static
@@ -85,8 +85,7 @@
   }
 }
 
-UpgradeDetector::~UpgradeDetector() {
-}
+UpgradeDetector::~UpgradeDetector() {}
 
 void UpgradeDetector::NotifyOutdatedInstall() {
   for (auto& observer : observer_list_)
@@ -156,21 +155,22 @@
 }
 
 void UpgradeDetector::TriggerCriticalUpdate() {
-  const base::TimeDelta idle_timer = UseTestingIntervals() ?
-      base::TimeDelta::FromSeconds(kIdleRepeatingTimerWait) :
-      base::TimeDelta::FromMinutes(kIdleRepeatingTimerWait);
+  const base::TimeDelta idle_timer =
+      UseTestingIntervals()
+          ? base::TimeDelta::FromSeconds(kIdleRepeatingTimerWait)
+          : base::TimeDelta::FromMinutes(kIdleRepeatingTimerWait);
   idle_check_timer_.Start(FROM_HERE, idle_timer, this,
                           &UpgradeDetector::CheckIdle);
 }
 
 void UpgradeDetector::CheckIdle() {
   // CalculateIdleState expects an interval in seconds.
-  int idle_time_allowed = UseTestingIntervals() ? kIdleAmount :
-                                                  kIdleAmount * 60 * 60;
+  int idle_time_allowed =
+      UseTestingIntervals() ? kIdleAmount : kIdleAmount * 60 * 60;
 
   CalculateIdleState(
-      idle_time_allowed, base::Bind(&UpgradeDetector::IdleCallback,
-                                    base::Unretained(this)));
+      idle_time_allowed,
+      base::Bind(&UpgradeDetector::IdleCallback, base::Unretained(this)));
 }
 
 void UpgradeDetector::IdleCallback(ui::IdleState state) {
diff --git a/chrome/browser/upgrade_detector.h b/chrome/browser/upgrade_detector/upgrade_detector.h
similarity index 96%
rename from chrome/browser/upgrade_detector.h
rename to chrome/browser/upgrade_detector/upgrade_detector.h
index bff30d1..b609cc1 100644
--- a/chrome/browser/upgrade_detector.h
+++ b/chrome/browser/upgrade_detector/upgrade_detector.h
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UPGRADE_DETECTOR_H_
-#define CHROME_BROWSER_UPGRADE_DETECTOR_H_
+#ifndef CHROME_BROWSER_UPGRADE_DETECTOR_UPGRADE_DETECTOR_H_
+#define CHROME_BROWSER_UPGRADE_DETECTOR_UPGRADE_DETECTOR_H_
 
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
-#include "chrome/browser/upgrade_observer.h"
+#include "chrome/browser/upgrade_detector/upgrade_observer.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "ui/base/idle/idle.h"
 #include "ui/gfx/image/image.h"
@@ -79,9 +79,7 @@
 
   // Notify this object that the user has acknowledged the critical update so we
   // don't need to complain about it for now.
-  void acknowledge_critical_update() {
-    critical_update_acknowledged_ = true;
-  }
+  void acknowledge_critical_update() { critical_update_acknowledged_ = true; }
 
   // Whether the user has acknowledged the critical update.
   bool critical_update_acknowledged() const {
@@ -274,4 +272,4 @@
   DISALLOW_COPY_AND_ASSIGN(UpgradeDetector);
 };
 
-#endif  // CHROME_BROWSER_UPGRADE_DETECTOR_H_
+#endif  // CHROME_BROWSER_UPGRADE_DETECTOR_UPGRADE_DETECTOR_H_
diff --git a/chrome/browser/chromeos/upgrade_detector_chromeos.cc b/chrome/browser/upgrade_detector/upgrade_detector_chromeos.cc
similarity index 96%
rename from chrome/browser/chromeos/upgrade_detector_chromeos.cc
rename to chrome/browser/upgrade_detector/upgrade_detector_chromeos.cc
index efd87ae..e9d52da3 100644
--- a/chrome/browser/chromeos/upgrade_detector_chromeos.cc
+++ b/chrome/browser/upgrade_detector/upgrade_detector_chromeos.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/upgrade_detector_chromeos.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector_chromeos.h"
 
 #include <stdint.h>
 
@@ -98,8 +98,7 @@
       initialized_(false),
       weak_factory_(this) {}
 
-UpgradeDetectorChromeos::~UpgradeDetectorChromeos() {
-}
+UpgradeDetectorChromeos::~UpgradeDetectorChromeos() {}
 
 void UpgradeDetectorChromeos::Init() {
   DBusThreadManager::Get()->GetUpdateEngineClient()->AddObserver(this);
@@ -151,8 +150,8 @@
     } else {
       // Determine whether powerwash is required based on the channel.
       ChannelsRequester::Begin(
-          base::Bind(&UpgradeDetectorChromeos::OnChannelsReceived,
-                     weak_factory_.GetWeakPtr()));
+          base::BindOnce(&UpgradeDetectorChromeos::OnChannelsReceived,
+                         weak_factory_.GetWeakPtr()));
     }
   } else if (status.status ==
              UpdateEngineClient::UPDATE_STATUS_NEED_PERMISSION_TO_UPDATE) {
diff --git a/chrome/browser/chromeos/upgrade_detector_chromeos.h b/chrome/browser/upgrade_detector/upgrade_detector_chromeos.h
similarity index 89%
rename from chrome/browser/chromeos/upgrade_detector_chromeos.h
rename to chrome/browser/upgrade_detector/upgrade_detector_chromeos.h
index 8e4e68d..47487d0 100644
--- a/chrome/browser/chromeos/upgrade_detector_chromeos.h
+++ b/chrome/browser/upgrade_detector/upgrade_detector_chromeos.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_UPGRADE_DETECTOR_CHROMEOS_H_
-#define CHROME_BROWSER_CHROMEOS_UPGRADE_DETECTOR_CHROMEOS_H_
+#ifndef CHROME_BROWSER_UPGRADE_DETECTOR_UPGRADE_DETECTOR_CHROMEOS_H_
+#define CHROME_BROWSER_UPGRADE_DETECTOR_UPGRADE_DETECTOR_CHROMEOS_H_
 
 #include <string>
 
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/timer/timer.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chromeos/dbus/update_engine_client.h"
 
 namespace base {
@@ -76,4 +76,4 @@
   DISALLOW_COPY_AND_ASSIGN(UpgradeDetectorChromeos);
 };
 
-#endif  // CHROME_BROWSER_CHROMEOS_UPGRADE_DETECTOR_CHROMEOS_H_
+#endif  // CHROME_BROWSER_UPGRADE_DETECTOR_UPGRADE_DETECTOR_CHROMEOS_H_
diff --git a/chrome/browser/upgrade_detector_impl.cc b/chrome/browser/upgrade_detector/upgrade_detector_impl.cc
similarity index 96%
rename from chrome/browser/upgrade_detector_impl.cc
rename to chrome/browser/upgrade_detector/upgrade_detector_impl.cc
index 369546ce..33a2d5a 100644
--- a/chrome/browser/upgrade_detector_impl.cc
+++ b/chrome/browser/upgrade_detector/upgrade_detector_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/upgrade_detector_impl.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector_impl.h"
 
 #include <stdint.h>
 
@@ -81,16 +81,16 @@
 bool SimulatingOutdated() {
   const base::CommandLine& cmd_line = *base::CommandLine::ForCurrentProcess();
   return cmd_line.HasSwitch(switches::kSimulateOutdated) ||
-      cmd_line.HasSwitch(switches::kSimulateOutdatedNoAU);
+         cmd_line.HasSwitch(switches::kSimulateOutdatedNoAU);
 }
 
 // Check if any of the testing switches was present on the command line.
 bool IsTesting() {
   const base::CommandLine& cmd_line = *base::CommandLine::ForCurrentProcess();
   return cmd_line.HasSwitch(switches::kSimulateUpgrade) ||
-      cmd_line.HasSwitch(switches::kCheckForUpdateIntervalSec) ||
-      cmd_line.HasSwitch(switches::kSimulateCriticalUpdate) ||
-      SimulatingOutdated();
+         cmd_line.HasSwitch(switches::kCheckForUpdateIntervalSec) ||
+         cmd_line.HasSwitch(switches::kSimulateCriticalUpdate) ||
+         SimulatingOutdated();
 }
 
 // How often to check for an upgrade.
@@ -201,9 +201,9 @@
       StartTimerForUpgradeCheck();
     } else {
       // Without a valid date, we simulate that we are already outdated...
-      UpgradeDetected(
-          is_auto_update_enabled_ ? UPGRADE_NEEDED_OUTDATED_INSTALL
-                                  : UPGRADE_NEEDED_OUTDATED_INSTALL_NO_AU);
+      UpgradeDetected(is_auto_update_enabled_
+                          ? UPGRADE_NEEDED_OUTDATED_INSTALL
+                          : UPGRADE_NEEDED_OUTDATED_INSTALL_NO_AU);
     }
     return;
   }
@@ -244,7 +244,7 @@
     return;
   }
 #elif defined(OS_POSIX)
-  // Always enable upgrade notifications regardless of branding.
+// Always enable upgrade notifications regardless of branding.
 #else
   return;
 #endif
@@ -422,9 +422,9 @@
   }
 
   if (network_time - build_date_ > kOutdatedBuildAge) {
-    UpgradeDetected(is_auto_update_enabled_ ?
-        UPGRADE_NEEDED_OUTDATED_INSTALL :
-        UPGRADE_NEEDED_OUTDATED_INSTALL_NO_AU);
+    UpgradeDetected(is_auto_update_enabled_
+                        ? UPGRADE_NEEDED_OUTDATED_INSTALL
+                        : UPGRADE_NEEDED_OUTDATED_INSTALL_NO_AU);
     return true;
   }
   // If we simlated an outdated install with a date, we don't want to keep
diff --git a/chrome/browser/upgrade_detector_impl.h b/chrome/browser/upgrade_detector/upgrade_detector_impl.h
similarity index 94%
rename from chrome/browser/upgrade_detector_impl.h
rename to chrome/browser/upgrade_detector/upgrade_detector_impl.h
index bd918705..998ec45 100644
--- a/chrome/browser/upgrade_detector_impl.h
+++ b/chrome/browser/upgrade_detector/upgrade_detector_impl.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UPGRADE_DETECTOR_IMPL_H_
-#define CHROME_BROWSER_UPGRADE_DETECTOR_IMPL_H_
+#ifndef CHROME_BROWSER_UPGRADE_DETECTOR_UPGRADE_DETECTOR_IMPL_H_
+#define CHROME_BROWSER_UPGRADE_DETECTOR_UPGRADE_DETECTOR_IMPL_H_
 
 #include <array>
 
@@ -15,7 +15,7 @@
 #include "base/timer/timer.h"
 #include "base/version.h"
 #include "build/build_config.h"
-#include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "components/variations/service/variations_service.h"
 
 namespace base {
@@ -24,7 +24,7 @@
 class SequencedTaskRunner;
 class TaskRunner;
 class TickClock;
-}
+}  // namespace base
 
 // This class contains the non-CrOS desktop implementation of the detector.
 class UpgradeDetectorImpl : public UpgradeDetector,
@@ -158,5 +158,4 @@
   DISALLOW_COPY_AND_ASSIGN(UpgradeDetectorImpl);
 };
 
-
-#endif  // CHROME_BROWSER_UPGRADE_DETECTOR_IMPL_H_
+#endif  // CHROME_BROWSER_UPGRADE_DETECTOR_UPGRADE_DETECTOR_IMPL_H_
diff --git a/chrome/browser/upgrade_detector_impl_unittest.cc b/chrome/browser/upgrade_detector/upgrade_detector_impl_unittest.cc
similarity index 98%
rename from chrome/browser/upgrade_detector_impl_unittest.cc
rename to chrome/browser/upgrade_detector/upgrade_detector_impl_unittest.cc
index c8d55a7..1834b398 100644
--- a/chrome/browser/upgrade_detector_impl_unittest.cc
+++ b/chrome/browser/upgrade_detector/upgrade_detector_impl_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 "chrome/browser/upgrade_detector_impl.h"
+#include "chrome/browser/upgrade_detector/upgrade_detector_impl.h"
 
 #include <initializer_list>
 #include <utility>
@@ -13,7 +13,7 @@
 #include "base/time/tick_clock.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "chrome/browser/upgrade_observer.h"
+#include "chrome/browser/upgrade_detector/upgrade_observer.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
diff --git a/chrome/browser/upgrade_observer.h b/chrome/browser/upgrade_detector/upgrade_observer.h
similarity index 88%
rename from chrome/browser/upgrade_observer.h
rename to chrome/browser/upgrade_detector/upgrade_observer.h
index 02cb6f1..f27b4ec 100644
--- a/chrome/browser/upgrade_observer.h
+++ b/chrome/browser/upgrade_detector/upgrade_observer.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UPGRADE_OBSERVER_H_
-#define CHROME_BROWSER_UPGRADE_OBSERVER_H_
+#ifndef CHROME_BROWSER_UPGRADE_DETECTOR_UPGRADE_OBSERVER_H_
+#define CHROME_BROWSER_UPGRADE_DETECTOR_UPGRADE_OBSERVER_H_
 
 #include "base/macros.h"
 
@@ -38,4 +38,4 @@
   virtual ~UpgradeObserver() {}
 };
 
-#endif  // CHROME_BROWSER_UPGRADE_OBSERVER_H_
+#endif  // CHROME_BROWSER_UPGRADE_DETECTOR_UPGRADE_OBSERVER_H_
diff --git a/chrome/browser/usb/usb_tab_helper.cc b/chrome/browser/usb/usb_tab_helper.cc
index 242970d..8414534 100644
--- a/chrome/browser/usb/usb_tab_helper.cc
+++ b/chrome/browser/usb/usb_tab_helper.cc
@@ -9,8 +9,8 @@
 
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/usb/web_usb_device_manager.h"
 #include "chrome/browser/usb/web_usb_permission_provider.h"
+#include "chrome/browser/usb/web_usb_service_impl.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/common/content_features.h"
@@ -58,15 +58,15 @@
 
 UsbTabHelper::~UsbTabHelper() {}
 
-void UsbTabHelper::CreateDeviceManager(
+void UsbTabHelper::CreateWebUsbService(
     RenderFrameHost* render_frame_host,
-    mojo::InterfaceRequest<device::mojom::UsbDeviceManager> request) {
+    mojo::InterfaceRequest<blink::mojom::WebUsbService> request) {
   if (!AllowedByFeaturePolicy(render_frame_host)) {
     mojo::ReportBadMessage(kFeaturePolicyViolation);
     return;
   }
-  WebUsbDeviceManager::Create(GetPermissionProvider(render_frame_host),
-                              std::move(request));
+  WebUsbServiceImpl::Create(GetPermissionProvider(render_frame_host),
+                            std::move(request));
 }
 
 void UsbTabHelper::CreateChooserService(
diff --git a/chrome/browser/usb/usb_tab_helper.h b/chrome/browser/usb/usb_tab_helper.h
index ff0b0790..76eb51e 100644
--- a/chrome/browser/usb/usb_tab_helper.h
+++ b/chrome/browser/usb/usb_tab_helper.h
@@ -6,22 +6,28 @@
 #define CHROME_BROWSER_USB_USB_TAB_HELPER_H_
 
 #include <map>
+#include <memory>
 
 #include "base/macros.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 
+namespace blink {
+namespace mojom {
+class WebUsbService;
+}
+}  // namespace blink
+
 namespace device {
 namespace mojom {
 class UsbChooserService;
-class UsbDeviceManager;
 }
 
 namespace usb {
 class PermissionProvider;
 }
-}
+}  // namespace device
 
 struct FrameUsbServices;
 
@@ -37,9 +43,9 @@
 
   ~UsbTabHelper() override;
 
-  void CreateDeviceManager(
+  void CreateWebUsbService(
       content::RenderFrameHost* render_frame_host,
-      mojo::InterfaceRequest<device::mojom::UsbDeviceManager> request);
+      mojo::InterfaceRequest<blink::mojom::WebUsbService> request);
 
   void CreateChooserService(
       content::RenderFrameHost* render_frame_host,
diff --git a/chrome/browser/usb/web_usb_device_manager.cc b/chrome/browser/usb/web_usb_service_impl.cc
similarity index 65%
rename from chrome/browser/usb/web_usb_device_manager.cc
rename to chrome/browser/usb/web_usb_service_impl.cc
index 52fbb91a..ba3756d 100644
--- a/chrome/browser/usb/web_usb_device_manager.cc
+++ b/chrome/browser/usb/web_usb_service_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/usb/web_usb_device_manager.h"
+#include "chrome/browser/usb/web_usb_service_impl.h"
 
 #include <utility>
 
@@ -13,17 +13,16 @@
 #include "device/usb/usb_device.h"
 
 // static
-void WebUsbDeviceManager::Create(
+void WebUsbServiceImpl::Create(
     base::WeakPtr<device::usb::PermissionProvider> permission_provider,
-    device::mojom::UsbDeviceManagerRequest request) {
-  // Bind the Blink request with WebUsbDeviceManager.
-  auto* web_usb_device_manager =
-      new WebUsbDeviceManager(std::move(permission_provider));
-  web_usb_device_manager->binding_ = mojo::MakeStrongBinding(
-      base::WrapUnique(web_usb_device_manager), std::move(request));
+    blink::mojom::WebUsbServiceRequest request) {
+  // Bind the Blink request with WebUsbServiceImpl.
+  auto* web_usb_service = new WebUsbServiceImpl(std::move(permission_provider));
+  web_usb_service->binding_ = mojo::MakeStrongBinding(
+      base::WrapUnique(web_usb_service), std::move(request));
 }
 
-WebUsbDeviceManager::WebUsbDeviceManager(
+WebUsbServiceImpl::WebUsbServiceImpl(
     base::WeakPtr<device::usb::PermissionProvider> permission_provider)
     : permission_provider_(std::move(permission_provider)),
       observer_(this),
@@ -34,10 +33,10 @@
   device::usb::DeviceManagerImpl::Create(permission_provider_,
                                          mojo::MakeRequest(&device_manager_));
   device_manager_.set_connection_error_handler(base::BindOnce(
-      &WebUsbDeviceManager::OnConnectionError, base::Unretained(this)));
+      &WebUsbServiceImpl::OnConnectionError, base::Unretained(this)));
   // Listen for add/remove device events from UsbService.
   // TODO(donna.wu@intel.com): Listen to |device_manager_| in the future.
-  // We can't set WebUsbDeviceManager as a UsbDeviceManagerClient because
+  // We can't set WebUsbServiceImpl as a UsbDeviceManagerClient because
   // the OnDeviceRemoved event will be delivered here after it is delivered
   // to UsbChooserContext, meaning that all ephemeral permission checks in
   // OnDeviceRemoved() will fail.
@@ -46,34 +45,31 @@
     observer_.Add(usb_service);
 }
 
-WebUsbDeviceManager::~WebUsbDeviceManager() = default;
+WebUsbServiceImpl::~WebUsbServiceImpl() = default;
 
-void WebUsbDeviceManager::GetDevices(
-    device::mojom::UsbEnumerationOptionsPtr options,
-    GetDevicesCallback callback) {
-  device_manager_->GetDevices(std::move(options), std::move(callback));
+void WebUsbServiceImpl::GetDevices(GetDevicesCallback callback) {
+  device_manager_->GetDevices(nullptr, std::move(callback));
 }
 
-void WebUsbDeviceManager::GetDevice(
+void WebUsbServiceImpl::GetDevice(
     const std::string& guid,
     device::mojom::UsbDeviceRequest device_request) {
   device_manager_->GetDevice(guid, std::move(device_request));
 }
 
-void WebUsbDeviceManager::SetClient(
+void WebUsbServiceImpl::SetClient(
     device::mojom::UsbDeviceManagerClientPtr client) {
   client_ = std::move(client);
 }
 
-void WebUsbDeviceManager::OnDeviceAdded(
-    scoped_refptr<device::UsbDevice> device) {
+void WebUsbServiceImpl::OnDeviceAdded(scoped_refptr<device::UsbDevice> device) {
   if (client_ && permission_provider_ &&
       permission_provider_->HasDevicePermission(device)) {
     client_->OnDeviceAdded(device::mojom::UsbDeviceInfo::From(*device));
   }
 }
 
-void WebUsbDeviceManager::OnDeviceRemoved(
+void WebUsbServiceImpl::OnDeviceRemoved(
     scoped_refptr<device::UsbDevice> device) {
   if (client_ && permission_provider_ &&
       permission_provider_->HasDevicePermission(device)) {
@@ -81,7 +77,7 @@
   }
 }
 
-void WebUsbDeviceManager::OnConnectionError() {
+void WebUsbServiceImpl::OnConnectionError() {
   device_manager_.reset();
 
   // Close the connection with blink.
@@ -89,6 +85,6 @@
   binding_->Close();
 }
 
-void WebUsbDeviceManager::WillDestroyUsbService() {
+void WebUsbServiceImpl::WillDestroyUsbService() {
   OnConnectionError();
 }
diff --git a/chrome/browser/usb/web_usb_device_manager.h b/chrome/browser/usb/web_usb_service_impl.h
similarity index 69%
rename from chrome/browser/usb/web_usb_device_manager.h
rename to chrome/browser/usb/web_usb_service_impl.h
index 2fa30b22..85fa74d 100644
--- a/chrome/browser/usb/web_usb_device_manager.h
+++ b/chrome/browser/usb/web_usb_service_impl.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_USB_WEB_USB_DEVICE_MANAGER_H_
-#define CHROME_BROWSER_USB_WEB_USB_DEVICE_MANAGER_H_
+#ifndef CHROME_BROWSER_USB_WEB_USB_SERVICE_IMPL_H_
+#define CHROME_BROWSER_USB_WEB_USB_SERVICE_IMPL_H_
 
 #include <string>
 
@@ -15,6 +15,7 @@
 #include "device/usb/public/mojom/device_manager.mojom.h"
 #include "device/usb/usb_service.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
+#include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h"
 
 namespace device {
 class UsbDevice;
@@ -23,22 +24,21 @@
 // Implements a restricted device::mojom::UsbDeviceManager interface by wrapping
 // another UsbDeviceManager instance and checking requests with the provided
 // device::usb::PermissionProvider.
-class WebUsbDeviceManager : public device::mojom::UsbDeviceManager,
-                            public device::UsbService::Observer {
+class WebUsbServiceImpl : public blink::mojom::WebUsbService,
+                          public device::UsbService::Observer {
  public:
   static void Create(
       base::WeakPtr<device::usb::PermissionProvider> permission_provider,
-      device::mojom::UsbDeviceManagerRequest request);
+      blink::mojom::WebUsbServiceRequest request);
 
-  ~WebUsbDeviceManager() override;
+  ~WebUsbServiceImpl() override;
 
  private:
-  WebUsbDeviceManager(
+  WebUsbServiceImpl(
       base::WeakPtr<device::usb::PermissionProvider> permission_provider);
 
-  // DeviceManager implementation:
-  void GetDevices(device::mojom::UsbEnumerationOptionsPtr options,
-                  GetDevicesCallback callback) override;
+  // blink::mojom::WebUsbService implementation:
+  void GetDevices(GetDevicesCallback callback) override;
   void GetDevice(const std::string& guid,
                  device::mojom::UsbDeviceRequest device_request) override;
   void SetClient(device::mojom::UsbDeviceManagerClientPtr client) override;
@@ -53,15 +53,15 @@
   base::WeakPtr<device::usb::PermissionProvider> permission_provider_;
 
   // Used to bind with Blink.
-  mojo::StrongBindingPtr<device::mojom::UsbDeviceManager> binding_;
+  mojo::StrongBindingPtr<blink::mojom::WebUsbService> binding_;
   device::mojom::UsbDeviceManagerClientPtr client_;
 
   device::mojom::UsbDeviceManagerPtr device_manager_;
   ScopedObserver<device::UsbService, device::UsbService::Observer> observer_;
 
-  base::WeakPtrFactory<WebUsbDeviceManager> weak_factory_;
+  base::WeakPtrFactory<WebUsbServiceImpl> weak_factory_;
 
-  DISALLOW_COPY_AND_ASSIGN(WebUsbDeviceManager);
+  DISALLOW_COPY_AND_ASSIGN(WebUsbServiceImpl);
 };
 
-#endif  // CHROME_BROWSER_USB_WEB_USB_DEVICE_MANAGER_H_
+#endif  // CHROME_BROWSER_USB_WEB_USB_SERVICE_IMPL_H_
diff --git a/chrome/browser/usb/web_usb_device_manager_unittest.cc b/chrome/browser/usb/web_usb_service_impl_unittest.cc
similarity index 85%
rename from chrome/browser/usb/web_usb_device_manager_unittest.cc
rename to chrome/browser/usb/web_usb_service_impl_unittest.cc
index 97e2598..f4620ee 100644
--- a/chrome/browser/usb/web_usb_device_manager_unittest.cc
+++ b/chrome/browser/usb/web_usb_service_impl_unittest.cc
@@ -2,11 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/usb/web_usb_device_manager.h"
+#include "chrome/browser/usb/web_usb_service_impl.h"
 
 #include <memory>
 #include <set>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/barrier_closure.h"
@@ -24,11 +25,11 @@
 using ::testing::_;
 using ::testing::AtMost;
 
+using blink::mojom::WebUsbServicePtr;
 using device::mojom::UsbDeviceInfo;
 using device::mojom::UsbDeviceInfoPtr;
 using device::mojom::UsbDeviceManagerClient;
 using device::mojom::UsbDeviceManagerClientPtr;
-using device::mojom::UsbDeviceManagerPtr;
 using device::MockUsbDevice;
 using device::usb::MockPermissionProvider;
 
@@ -41,17 +42,17 @@
     callback.Run();
 };
 
-class WebUsbDeviceManagerTest : public testing::Test {
+class WebUsbServiceImplTest : public testing::Test {
  public:
-  WebUsbDeviceManagerTest() = default;
-  ~WebUsbDeviceManagerTest() override = default;
+  WebUsbServiceImplTest() = default;
+  ~WebUsbServiceImplTest() override = default;
 
  protected:
-  UsbDeviceManagerPtr ConnectToDeviceManager() {
-    UsbDeviceManagerPtr manager;
-    WebUsbDeviceManager::Create(permission_provider_.GetWeakPtr(),
-                                mojo::MakeRequest(&manager));
-    return manager;
+  WebUsbServicePtr ConnectToService() {
+    WebUsbServicePtr service;
+    WebUsbServiceImpl::Create(permission_provider_.GetWeakPtr(),
+                              mojo::MakeRequest(&service));
+    return service;
   }
 
   device::MockDeviceClient device_client_;
@@ -100,7 +101,7 @@
 }  // namespace
 
 // Test requesting device enumeration updates with GetDeviceChanges.
-TEST_F(WebUsbDeviceManagerTest, NoPermissionDevice) {
+TEST_F(WebUsbServiceImplTest, NoPermissionDevice) {
   scoped_refptr<MockUsbDevice> device0 =
       new MockUsbDevice(0x1234, 0x5678, "ACME", "Frobinator", "ABCDEF");
   scoped_refptr<MockUsbDevice> device1 =
@@ -115,12 +116,12 @@
   device_client_.usb_service()->AddDevice(device0);
   device_client_.usb_service()->AddDevice(no_permission_device1);
 
-  UsbDeviceManagerPtr device_manager = ConnectToDeviceManager();
+  WebUsbServicePtr web_usb_service = ConnectToService();
   MockDeviceManagerClient mock_client;
-  device_manager->SetClient(mock_client.CreateInterfacePtrAndBind());
+  web_usb_service->SetClient(mock_client.CreateInterfacePtrAndBind());
 
   {
-    // Call GetDevices once to make sure the device manager is up and running
+    // Call GetDevices once to make sure the WebUsbService is up and running
     // and the client is set or else we could block forever waiting for calls.
     // The site has no permission to access |no_permission_device1| and
     // |no_permission_device2|, so result of GetDevices() should only contain
@@ -128,8 +129,7 @@
     std::set<std::string> guids;
     guids.insert(device0->guid());
     base::RunLoop loop;
-    device_manager->GetDevices(
-        nullptr,
+    web_usb_service->GetDevices(
         base::BindOnce(&ExpectDevicesAndThen, guids, loop.QuitClosure()));
     loop.Run();
   }
diff --git a/chrome/browser/web_applications/components/BUILD.gn b/chrome/browser/web_applications/components/BUILD.gn
index 54f5379..862cb14 100644
--- a/chrome/browser/web_applications/components/BUILD.gn
+++ b/chrome/browser/web_applications/components/BUILD.gn
@@ -8,6 +8,13 @@
     "pending_app_manager.h",
     "web_app_helpers.cc",
     "web_app_helpers.h",
+    "web_app_shortcut.cc",
+    "web_app_shortcut.h",
+    "web_app_shortcut_chromeos.cc",
+    "web_app_shortcut_mac.h",
+    "web_app_shortcut_mac.mm",
+    "web_app_shortcut_win.cc",
+    "web_app_shortcut_win.h",
 
     # TODO(nigeltao): move these two files from
     # //chrome/browser/web_applications/components to a stand-alone
@@ -19,15 +26,6 @@
     # those might be similar enough to merge.
     "web_app_icon_downloader.cc",
     "web_app_icon_downloader.h",
-    "web_app_icon_generator.cc",
-    "web_app_icon_generator.h",
-    "web_app_shortcut.cc",
-    "web_app_shortcut.h",
-    "web_app_shortcut_chromeos.cc",
-    "web_app_shortcut_mac.h",
-    "web_app_shortcut_mac.mm",
-    "web_app_shortcut_win.cc",
-    "web_app_shortcut_win.h",
   ]
 
   if (is_desktop_linux) {
@@ -51,7 +49,6 @@
   sources = [
     "web_app_helpers_unittest.cc",
     "web_app_icon_downloader_unittest.cc",
-    "web_app_icon_generator_unittest.cc",
     "web_app_shortcut_mac_unittest.mm",
     "web_app_shortcut_unittest.cc",
   ]
diff --git a/chrome/browser/web_applications/components/web_app_icon_generator.cc b/chrome/browser/web_applications/components/web_app_icon_generator.cc
deleted file mode 100644
index ff330a7b..0000000
--- a/chrome/browser/web_applications/components/web_app_icon_generator.cc
+++ /dev/null
@@ -1,221 +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 "chrome/browser/web_applications/components/web_app_icon_generator.h"
-
-#include <cctype>
-#include <string>
-#include <utility>
-
-#include "base/macros.h"
-#include "build/build_config.h"
-#include "chrome/grit/platform_locale_settings.h"
-#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
-#include "skia/ext/image_operations.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/color_analysis.h"
-#include "ui/gfx/color_utils.h"
-#include "ui/gfx/font.h"
-#include "ui/gfx/font_list.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/image/canvas_image_source.h"
-#include "ui/gfx/image/image.h"
-
-namespace web_app {
-
-namespace {
-
-// Generates a square container icon of |output_size| by drawing the given
-// |letter| into a rounded background of |color|.
-class GeneratedIconImageSource : public gfx::CanvasImageSource {
- public:
-  explicit GeneratedIconImageSource(char letter, SkColor color, int output_size)
-      : gfx::CanvasImageSource(gfx::Size(output_size, output_size), false),
-        letter_(letter),
-        color_(color),
-        output_size_(output_size) {}
-  ~GeneratedIconImageSource() override {}
-
- private:
-  // gfx::CanvasImageSource overrides:
-  void Draw(gfx::Canvas* canvas) override {
-    const uint8_t kLumaThreshold = 190;
-    const int icon_size = output_size_ * 3 / 4;
-    const int icon_inset = output_size_ / 8;
-    const size_t border_radius = output_size_ / 16;
-    const size_t font_size = output_size_ * 7 / 16;
-
-    std::string font_name =
-        l10n_util::GetStringUTF8(IDS_SANS_SERIF_FONT_FAMILY);
-#if defined(OS_CHROMEOS)
-    const std::string kChromeOSFontFamily = "Noto Sans";
-    font_name = kChromeOSFontFamily;
-#endif
-
-    // Draw a rounded rect of the given |color|.
-    cc::PaintFlags background_flags;
-    background_flags.setAntiAlias(true);
-    background_flags.setColor(color_);
-
-    gfx::Rect icon_rect(icon_inset, icon_inset, icon_size, icon_size);
-    canvas->DrawRoundRect(icon_rect, border_radius, background_flags);
-
-    // The text rect's size needs to be odd to center the text correctly.
-    gfx::Rect text_rect(icon_inset, icon_inset, icon_size + 1, icon_size + 1);
-    // Draw the letter onto the rounded rect. The letter's color depends on the
-    // luma of |color|.
-    const uint8_t luma = color_utils::GetLuma(color_);
-    canvas->DrawStringRectWithFlags(
-        base::string16(1, std::toupper(letter_)),
-        gfx::FontList(gfx::Font(font_name, font_size)),
-        (luma > kLumaThreshold) ? SK_ColorBLACK : SK_ColorWHITE, text_rect,
-        gfx::Canvas::TEXT_ALIGN_CENTER);
-  }
-
-  char letter_;
-
-  SkColor color_;
-
-  int output_size_;
-
-  DISALLOW_COPY_AND_ASSIGN(GeneratedIconImageSource);
-};
-
-// Adds a square container icon of |output_size| and 2 * |output_size| pixels
-// to |bitmaps| by drawing the given |letter| into a rounded background of
-// |color|. For each size, if an icon of the requested size already exists in
-// |bitmaps|, nothing will happen.
-void GenerateIcon(std::map<int, BitmapAndSource>* bitmaps,
-                  int output_size,
-                  SkColor color,
-                  char letter) {
-  // Do nothing if there is already an icon of |output_size|.
-  if (bitmaps->count(output_size))
-    return;
-
-  (*bitmaps)[output_size].bitmap = GenerateBitmap(output_size, color, letter);
-}
-
-void GenerateIcons(std::set<int> generate_sizes,
-                   const GURL& app_url,
-                   SkColor generated_icon_color,
-                   std::map<int, BitmapAndSource>* bitmap_map) {
-  // The letter that will be painted on the generated icon.
-  char icon_letter = ' ';
-  std::string domain_and_registry(
-      net::registry_controlled_domains::GetDomainAndRegistry(
-          app_url,
-          net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES));
-  if (!domain_and_registry.empty()) {
-    icon_letter = domain_and_registry[0];
-  } else if (app_url.has_host()) {
-    icon_letter = app_url.host_piece()[0];
-  }
-
-  // If no color has been specified, use a dark gray so it will stand out on the
-  // black shelf.
-  if (generated_icon_color == SK_ColorTRANSPARENT)
-    generated_icon_color = SK_ColorDKGRAY;
-
-  for (int size : generate_sizes) {
-    GenerateIcon(bitmap_map, size, generated_icon_color, icon_letter);
-  }
-}
-
-}  // namespace
-
-BitmapAndSource::BitmapAndSource() {}
-
-BitmapAndSource::BitmapAndSource(const GURL& source_url_p,
-                                 const SkBitmap& bitmap_p)
-    : source_url(source_url_p), bitmap(bitmap_p) {}
-
-BitmapAndSource::~BitmapAndSource() {}
-
-std::map<int, BitmapAndSource> ConstrainBitmapsToSizes(
-    const std::vector<BitmapAndSource>& bitmaps,
-    const std::set<int>& sizes) {
-  std::map<int, BitmapAndSource> output_bitmaps;
-  std::map<int, BitmapAndSource> ordered_bitmaps;
-  for (const BitmapAndSource& bitmap_and_source : bitmaps) {
-    const SkBitmap& bitmap = bitmap_and_source.bitmap;
-    DCHECK(bitmap.width() == bitmap.height());
-    ordered_bitmaps[bitmap.width()] = bitmap_and_source;
-  }
-
-  if (ordered_bitmaps.size() > 0) {
-    for (const auto& size : sizes) {
-      // Find the closest not-smaller bitmap, or failing that use the largest
-      // icon available.
-      auto bitmaps_it = ordered_bitmaps.lower_bound(size);
-      if (bitmaps_it != ordered_bitmaps.end())
-        output_bitmaps[size] = bitmaps_it->second;
-      else
-        output_bitmaps[size] = ordered_bitmaps.rbegin()->second;
-
-      // Resize the bitmap if it does not exactly match the desired size.
-      if (output_bitmaps[size].bitmap.width() != size) {
-        output_bitmaps[size].bitmap = skia::ImageOperations::Resize(
-            output_bitmaps[size].bitmap, skia::ImageOperations::RESIZE_LANCZOS3,
-            size, size);
-      }
-    }
-  }
-
-  return output_bitmaps;
-}
-
-SkBitmap GenerateBitmap(int output_size, SkColor color, char letter) {
-  gfx::ImageSkia icon_image(
-      std::make_unique<GeneratedIconImageSource>(letter, color, output_size),
-      gfx::Size(output_size, output_size));
-  SkBitmap dst;
-  if (dst.tryAllocPixels(icon_image.bitmap()->info())) {
-    icon_image.bitmap()->readPixels(dst.info(), dst.getPixels(), dst.rowBytes(),
-                                    0, 0);
-  }
-  return dst;
-}
-
-std::map<int, BitmapAndSource> ResizeIconsAndGenerateMissing(
-    const std::vector<BitmapAndSource>& icons,
-    const std::set<int>& sizes_to_generate,
-    const GURL& app_url,
-    SkColor* generated_icon_color) {
-  DCHECK(generated_icon_color);
-
-  // Resize provided icons to make sure we have versions for each size in
-  // |sizes_to_generate|.
-  std::map<int, BitmapAndSource> resized_bitmaps(
-      ConstrainBitmapsToSizes(icons, sizes_to_generate));
-
-  // Also add all provided icon sizes.
-  for (const BitmapAndSource& icon : icons) {
-    if (resized_bitmaps.find(icon.bitmap.width()) == resized_bitmaps.end())
-      resized_bitmaps.insert(std::make_pair(icon.bitmap.width(), icon));
-  }
-
-  // Determine the color that will be used for the icon's background. For this
-  // the dominant color of the first icon found is used.
-  if (resized_bitmaps.size()) {
-    color_utils::GridSampler sampler;
-    *generated_icon_color = color_utils::CalculateKMeanColorOfBitmap(
-        resized_bitmaps.begin()->second.bitmap);
-  }
-
-  // Work out what icons we need to generate here. Icons are only generated if
-  // there is no icon in the required size.
-  std::set<int> generate_sizes;
-  for (int size : sizes_to_generate) {
-    if (resized_bitmaps.find(size) == resized_bitmaps.end())
-      generate_sizes.insert(size);
-  }
-  GenerateIcons(generate_sizes, app_url, *generated_icon_color,
-                &resized_bitmaps);
-
-  return resized_bitmaps;
-}
-
-}  // namespace web_app
diff --git a/chrome/browser/web_applications/components/web_app_icon_generator.h b/chrome/browser/web_applications/components/web_app_icon_generator.h
deleted file mode 100644
index 11c8f72..0000000
--- a/chrome/browser/web_applications/components/web_app_icon_generator.h
+++ /dev/null
@@ -1,51 +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 CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_WEB_APP_ICON_GENERATOR_H_
-#define CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_WEB_APP_ICON_GENERATOR_H_
-
-#include <map>
-#include <set>
-#include <vector>
-
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "third_party/skia/include/core/SkColor.h"
-#include "url/gurl.h"
-
-namespace web_app {
-
-struct BitmapAndSource {
-  BitmapAndSource();
-  BitmapAndSource(const GURL& source_url_p, const SkBitmap& bitmap_p);
-  ~BitmapAndSource();
-
-  GURL source_url;
-  SkBitmap bitmap;
-};
-
-// This finds the closest not-smaller bitmap in |bitmaps| for each size in
-// |sizes| and resizes it to that size. This returns a map of sizes to bitmaps
-// which contains only bitmaps of a size in |sizes| and at most one bitmap of
-// each size.
-std::map<int, BitmapAndSource> ConstrainBitmapsToSizes(
-    const std::vector<BitmapAndSource>& bitmaps,
-    const std::set<int>& sizes);
-
-// Generates a square container icon of |output_size| by drawing the given
-// |letter| into a rounded background of |color|.
-SkBitmap GenerateBitmap(int output_size, SkColor color, char letter);
-
-// Resize icons to the accepted sizes, and generate any that are missing.
-// Note that |app_url| is the launch URL for the app.
-// Output: |generated_icon_color| is the color to use if an icon needs to be
-// generated for the web app.
-std::map<int, BitmapAndSource> ResizeIconsAndGenerateMissing(
-    const std::vector<BitmapAndSource>& icons,
-    const std::set<int>& sizes_to_generate,
-    const GURL& app_url,
-    SkColor* generated_icon_color);
-
-}  // namespace web_app
-
-#endif  // CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_WEB_APP_ICON_GENERATOR_H_
diff --git a/chrome/browser/web_applications/components/web_app_icon_generator_unittest.cc b/chrome/browser/web_applications/components/web_app_icon_generator_unittest.cc
deleted file mode 100644
index 04b10922..0000000
--- a/chrome/browser/web_applications/components/web_app_icon_generator_unittest.cc
+++ /dev/null
@@ -1,422 +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 "chrome/browser/web_applications/components/web_app_icon_generator.h"
-
-#include <vector>
-
-#include "base/stl_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace web_app {
-
-namespace {
-
-const char kAppIconURL1[] = "http://foo.com/1.png";
-const char kAppIconURL2[] = "http://foo.com/2.png";
-const char kAppIconURL3[] = "http://foo.com/3.png";
-
-// These sizes match extension_misc::ExtensionIcons enum.
-const int kIconSizeTiny = 16;
-const int kIconSizeSmall = 32;
-const int kIconSizeMedium = 48;
-const int kIconSizeLarge = 128;
-const int kIconSizeGigantor = 512;
-
-const int kIconSizeSmallBetweenMediumAndLarge = 63;
-const int kIconSizeLargeBetweenMediumAndLarge = 96;
-
-SkBitmap CreateSquareBitmapWithColor(int size, SkColor color) {
-  SkBitmap bitmap;
-  bitmap.allocN32Pixels(size, size);
-  bitmap.eraseColor(color);
-  return bitmap;
-}
-
-web_app::BitmapAndSource CreateSquareBitmapAndSourceWithColor(int size,
-                                                              SkColor color) {
-  return web_app::BitmapAndSource(GURL(),
-                                  CreateSquareBitmapWithColor(size, color));
-}
-
-struct IconInfo {
-  IconInfo() : width(0), height(0) {}
-  ~IconInfo() = default;
-
-  GURL url;
-  int width;
-  int height;
-  SkBitmap data;
-};
-
-IconInfo CreateIconInfoWithBitmap(int size, SkColor color) {
-  IconInfo icon_info;
-  icon_info.width = size;
-  icon_info.height = size;
-  icon_info.data = CreateSquareBitmapWithColor(size, color);
-  return icon_info;
-}
-
-std::set<int> TestSizesToGenerate() {
-  const int kIconSizesToGenerate[] = {
-      kIconSizeSmall, kIconSizeMedium, kIconSizeLarge,
-  };
-  return std::set<int>(kIconSizesToGenerate,
-                       kIconSizesToGenerate + base::size(kIconSizesToGenerate));
-}
-
-void ValidateAllIconsWithURLsArePresent(
-    const std::vector<IconInfo>& icons_to_check,
-    const std::map<int, BitmapAndSource>& size_map) {
-  EXPECT_EQ(icons_to_check.size(), size_map.size());
-
-  // Check that every icon with URL has a mapped icon.
-  for (const auto& icon : icons_to_check) {
-    if (!icon.url.is_empty()) {
-      bool found = false;
-      if (base::ContainsKey(size_map, icon.width)) {
-        const BitmapAndSource& mapped_icon = size_map.at(icon.width);
-        if (mapped_icon.source_url == icon.url &&
-            mapped_icon.bitmap.width() == icon.width) {
-          found = true;
-        }
-      }
-      EXPECT_TRUE(found);
-    }
-  }
-}
-
-std::vector<web_app::BitmapAndSource>::const_iterator
-FindLargestBitmapAndSourceVector(
-    const std::vector<web_app::BitmapAndSource>& bitmap_vector) {
-  auto result = bitmap_vector.end();
-  int largest = -1;
-  for (std::vector<web_app::BitmapAndSource>::const_iterator it =
-           bitmap_vector.begin();
-       it != bitmap_vector.end(); ++it) {
-    if (it->bitmap.width() > largest) {
-      result = it;
-    }
-  }
-  return result;
-}
-
-std::vector<web_app::BitmapAndSource>::const_iterator
-FindMatchingBitmapAndSourceVector(
-    const std::vector<web_app::BitmapAndSource>& bitmap_vector,
-    int size) {
-  for (std::vector<web_app::BitmapAndSource>::const_iterator it =
-           bitmap_vector.begin();
-       it != bitmap_vector.end(); ++it) {
-    if (it->bitmap.width() == size) {
-      return it;
-    }
-  }
-  return bitmap_vector.end();
-}
-
-std::vector<web_app::BitmapAndSource>::const_iterator
-FindEqualOrLargerBitmapAndSourceVector(
-    const std::vector<web_app::BitmapAndSource>& bitmap_vector,
-    int size) {
-  for (std::vector<web_app::BitmapAndSource>::const_iterator it =
-           bitmap_vector.begin();
-       it != bitmap_vector.end(); ++it) {
-    if (it->bitmap.width() >= size) {
-      return it;
-    }
-  }
-  return bitmap_vector.end();
-}
-
-void ValidateIconsGeneratedAndResizedCorrectly(
-    std::vector<web_app::BitmapAndSource> downloaded,
-    std::map<int, web_app::BitmapAndSource> size_map,
-    std::set<int> sizes_to_generate,
-    int expected_generated,
-    int expected_resized) {
-  GURL empty_url("");
-  int number_generated = 0;
-  int number_resized = 0;
-
-  auto icon_largest = FindLargestBitmapAndSourceVector(downloaded);
-  for (const auto& size : sizes_to_generate) {
-    auto icon_downloaded = FindMatchingBitmapAndSourceVector(downloaded, size);
-    auto icon_larger = FindEqualOrLargerBitmapAndSourceVector(downloaded, size);
-    if (icon_downloaded == downloaded.end()) {
-      auto icon_resized = size_map.find(size);
-      if (icon_largest == downloaded.end()) {
-        // There are no downloaded icons. Expect an icon to be generated.
-        EXPECT_NE(size_map.end(), icon_resized);
-        EXPECT_EQ(size, icon_resized->second.bitmap.width());
-        EXPECT_EQ(size, icon_resized->second.bitmap.height());
-        EXPECT_EQ(size, icon_resized->second.bitmap.height());
-        EXPECT_EQ(empty_url, icon_resized->second.source_url);
-        ++number_generated;
-      } else {
-        // If there is a larger downloaded icon, it should be resized. Otherwise
-        // the largest downloaded icon should be resized.
-        auto icon_to_resize = icon_largest;
-        if (icon_larger != downloaded.end())
-          icon_to_resize = icon_larger;
-        EXPECT_NE(size_map.end(), icon_resized);
-        EXPECT_EQ(size, icon_resized->second.bitmap.width());
-        EXPECT_EQ(size, icon_resized->second.bitmap.height());
-        EXPECT_EQ(size, icon_resized->second.bitmap.height());
-        EXPECT_EQ(icon_to_resize->source_url, icon_resized->second.source_url);
-        ++number_resized;
-      }
-    } else {
-      // There is an icon of exactly this size downloaded. Expect no icon to be
-      // generated, and the existing downloaded icon to be used.
-      auto icon_resized = size_map.find(size);
-      EXPECT_NE(size_map.end(), icon_resized);
-      EXPECT_EQ(size, icon_resized->second.bitmap.width());
-      EXPECT_EQ(size, icon_resized->second.bitmap.height());
-      EXPECT_EQ(size, icon_downloaded->bitmap.width());
-      EXPECT_EQ(size, icon_downloaded->bitmap.height());
-      EXPECT_EQ(icon_downloaded->source_url, icon_resized->second.source_url);
-    }
-  }
-  EXPECT_EQ(expected_generated, number_generated);
-  EXPECT_EQ(expected_resized, number_resized);
-}
-
-void ValidateBitmapSizeAndColor(SkBitmap bitmap, int size, SkColor color) {
-  // Obtain pixel lock to access pixels.
-  EXPECT_EQ(color, bitmap.getColor(0, 0));
-  EXPECT_EQ(size, bitmap.width());
-  EXPECT_EQ(size, bitmap.height());
-}
-
-void TestIconGeneration(int icon_size,
-                        int expected_generated,
-                        int expected_resized) {
-  std::vector<BitmapAndSource> downloaded;
-
-  // Add an icon with a URL and bitmap. 'Download' it.
-  IconInfo icon_info = CreateIconInfoWithBitmap(icon_size, SK_ColorRED);
-  icon_info.url = GURL(kAppIconURL1);
-  downloaded.push_back(BitmapAndSource(icon_info.url, icon_info.data));
-
-  // Now run the resizing/generation and validation.
-  SkColor generated_icon_color;
-  std::map<int, web_app::BitmapAndSource> size_map =
-      ResizeIconsAndGenerateMissing(downloaded, TestSizesToGenerate(), GURL(),
-                                    &generated_icon_color);
-
-  ValidateIconsGeneratedAndResizedCorrectly(
-      downloaded, size_map, TestSizesToGenerate(), expected_generated,
-      expected_resized);
-}
-
-}  // namespace
-
-TEST(WebAppIconGeneratorTest, ConstrainBitmapsToSizes) {
-  std::set<int> desired_sizes;
-  desired_sizes.insert(16);
-  desired_sizes.insert(32);
-  desired_sizes.insert(48);
-  desired_sizes.insert(96);
-  desired_sizes.insert(128);
-  desired_sizes.insert(256);
-
-  {
-    std::vector<web_app::BitmapAndSource> bitmaps;
-    bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(16, SK_ColorRED));
-    bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(32, SK_ColorGREEN));
-    bitmaps.push_back(
-        CreateSquareBitmapAndSourceWithColor(144, SK_ColorYELLOW));
-
-    std::map<int, web_app::BitmapAndSource> results(
-        ConstrainBitmapsToSizes(bitmaps, desired_sizes));
-
-    EXPECT_EQ(6u, results.size());
-    ValidateBitmapSizeAndColor(results[16].bitmap, 16, SK_ColorRED);
-    ValidateBitmapSizeAndColor(results[32].bitmap, 32, SK_ColorGREEN);
-    ValidateBitmapSizeAndColor(results[48].bitmap, 48, SK_ColorYELLOW);
-    ValidateBitmapSizeAndColor(results[96].bitmap, 96, SK_ColorYELLOW);
-    ValidateBitmapSizeAndColor(results[128].bitmap, 128, SK_ColorYELLOW);
-    ValidateBitmapSizeAndColor(results[256].bitmap, 256, SK_ColorYELLOW);
-  }
-  {
-    std::vector<web_app::BitmapAndSource> bitmaps;
-    bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(512, SK_ColorRED));
-    bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(18, SK_ColorGREEN));
-    bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(33, SK_ColorBLUE));
-    bitmaps.push_back(CreateSquareBitmapAndSourceWithColor(17, SK_ColorYELLOW));
-
-    std::map<int, web_app::BitmapAndSource> results(
-        ConstrainBitmapsToSizes(bitmaps, desired_sizes));
-
-    EXPECT_EQ(6u, results.size());
-    ValidateBitmapSizeAndColor(results[16].bitmap, 16, SK_ColorYELLOW);
-    ValidateBitmapSizeAndColor(results[32].bitmap, 32, SK_ColorBLUE);
-    ValidateBitmapSizeAndColor(results[48].bitmap, 48, SK_ColorRED);
-    ValidateBitmapSizeAndColor(results[96].bitmap, 96, SK_ColorRED);
-    ValidateBitmapSizeAndColor(results[128].bitmap, 128, SK_ColorRED);
-    ValidateBitmapSizeAndColor(results[256].bitmap, 256, SK_ColorRED);
-  }
-}
-
-TEST(WebAppIconGeneratorTest, LinkedAppIconsAreNotChanged) {
-  std::vector<IconInfo> icons_info;
-
-  IconInfo icon_info;
-  icon_info.url = GURL(kAppIconURL3);
-
-  icon_info.width = kIconSizeMedium;
-  icons_info.push_back(icon_info);
-
-  icon_info.width = kIconSizeSmall;
-  icons_info.push_back(icon_info);
-
-  icon_info.width = kIconSizeLarge;
-  icons_info.push_back(icon_info);
-
-  // 'Download' one of the icons without a size or bitmap.
-  std::vector<BitmapAndSource> downloaded;
-  downloaded.push_back(BitmapAndSource(
-      GURL(kAppIconURL3),
-      CreateSquareBitmapWithColor(kIconSizeLarge, SK_ColorBLACK)));
-
-  const auto& sizes = TestSizesToGenerate();
-
-  // Now run the resizing and generation into a new web icons info.
-  SkColor generated_icon_color;
-  std::map<int, web_app::BitmapAndSource> size_map =
-      ResizeIconsAndGenerateMissing(downloaded, sizes, GURL(),
-                                    &generated_icon_color);
-  EXPECT_EQ(sizes.size(), size_map.size());
-
-  // Now check that the linked app icons (i.e. those with URLs) are matching.
-  ValidateAllIconsWithURLsArePresent(icons_info, size_map);
-}
-
-TEST(WebAppIconGeneratorTest, IconsResizedFromOddSizes) {
-  std::vector<BitmapAndSource> downloaded;
-
-  // Add three icons with a URL and bitmap. 'Download' each of them.
-  IconInfo icon_info = CreateIconInfoWithBitmap(kIconSizeSmall, SK_ColorRED);
-  icon_info.url = GURL(kAppIconURL1);
-  downloaded.push_back(web_app::BitmapAndSource(icon_info.url, icon_info.data));
-
-  icon_info = CreateIconInfoWithBitmap(kIconSizeSmallBetweenMediumAndLarge,
-                                       SK_ColorRED);
-  icon_info.url = GURL(kAppIconURL2);
-  downloaded.push_back(web_app::BitmapAndSource(icon_info.url, icon_info.data));
-
-  icon_info = CreateIconInfoWithBitmap(kIconSizeLargeBetweenMediumAndLarge,
-                                       SK_ColorRED);
-  icon_info.url = GURL(kAppIconURL3);
-  downloaded.push_back(web_app::BitmapAndSource(icon_info.url, icon_info.data));
-
-  // Now run the resizing and generation.
-  SkColor generated_icon_color;
-  std::map<int, web_app::BitmapAndSource> size_map =
-      ResizeIconsAndGenerateMissing(downloaded, TestSizesToGenerate(), GURL(),
-                                    &generated_icon_color);
-
-  // No icons should be generated. The LARGE and MEDIUM sizes should be resized.
-  ValidateIconsGeneratedAndResizedCorrectly(downloaded, size_map,
-                                            TestSizesToGenerate(), 0, 2);
-}
-
-TEST(WebAppIconGeneratorTest, IconsResizedFromLarger) {
-  std::vector<web_app::BitmapAndSource> downloaded;
-
-  // Add three icons with a URL and bitmap. 'Download' two of them and pretend
-  // the third failed to download.
-  IconInfo icon_info = CreateIconInfoWithBitmap(kIconSizeSmall, SK_ColorRED);
-  icon_info.url = GURL(kAppIconURL1);
-  downloaded.push_back(web_app::BitmapAndSource(icon_info.url, icon_info.data));
-
-  icon_info = CreateIconInfoWithBitmap(kIconSizeLarge, SK_ColorBLUE);
-  icon_info.url = GURL(kAppIconURL2);
-
-  icon_info = CreateIconInfoWithBitmap(kIconSizeGigantor, SK_ColorBLACK);
-  icon_info.url = GURL(kAppIconURL3);
-  downloaded.push_back(web_app::BitmapAndSource(icon_info.url, icon_info.data));
-
-  // Now run the resizing and generation.
-  SkColor generated_icon_color;
-  std::map<int, web_app::BitmapAndSource> size_map =
-      ResizeIconsAndGenerateMissing(downloaded, TestSizesToGenerate(), GURL(),
-                                    &generated_icon_color);
-
-  // Expect icon for MEDIUM and LARGE to be resized from the gigantor icon
-  // as it was not downloaded.
-  ValidateIconsGeneratedAndResizedCorrectly(downloaded, size_map,
-                                            TestSizesToGenerate(), 0, 2);
-}
-
-TEST(WebAppIconGeneratorTest, AllIconsGeneratedWhenNotDownloaded) {
-  std::vector<web_app::BitmapAndSource> downloaded;
-
-  // Add three icons with a URL and bitmap. 'Download' none of them.
-  IconInfo icon_info = CreateIconInfoWithBitmap(kIconSizeSmall, SK_ColorRED);
-  icon_info.url = GURL(kAppIconURL1);
-
-  icon_info = CreateIconInfoWithBitmap(kIconSizeLarge, SK_ColorBLUE);
-  icon_info.url = GURL(kAppIconURL2);
-
-  icon_info = CreateIconInfoWithBitmap(kIconSizeGigantor, SK_ColorBLACK);
-  icon_info.url = GURL(kAppIconURL3);
-
-  // Now run the resizing and generation.
-  SkColor generated_icon_color;
-  std::map<int, web_app::BitmapAndSource> size_map =
-      ResizeIconsAndGenerateMissing(downloaded, TestSizesToGenerate(), GURL(),
-                                    &generated_icon_color);
-
-  // Expect all icons to be generated.
-  ValidateIconsGeneratedAndResizedCorrectly(downloaded, size_map,
-                                            TestSizesToGenerate(), 3, 0);
-}
-
-TEST(WebAppIconGeneratorTest, IconResizedFromLargerAndSmaller) {
-  std::vector<web_app::BitmapAndSource> downloaded;
-
-  // Pretend the huge icon wasn't downloaded but two smaller ones were.
-  IconInfo icon_info = CreateIconInfoWithBitmap(kIconSizeTiny, SK_ColorRED);
-  icon_info.url = GURL(kAppIconURL1);
-  downloaded.push_back(web_app::BitmapAndSource(icon_info.url, icon_info.data));
-
-  icon_info = CreateIconInfoWithBitmap(kIconSizeMedium, SK_ColorBLUE);
-  icon_info.url = GURL(kAppIconURL2);
-  downloaded.push_back(web_app::BitmapAndSource(icon_info.url, icon_info.data));
-
-  icon_info = CreateIconInfoWithBitmap(kIconSizeGigantor, SK_ColorBLACK);
-  icon_info.url = GURL(kAppIconURL3);
-
-  // Now run the resizing and generation.
-  SkColor generated_icon_color;
-  std::map<int, web_app::BitmapAndSource> size_map =
-      ResizeIconsAndGenerateMissing(downloaded, TestSizesToGenerate(), GURL(),
-                                    &generated_icon_color);
-
-  // Expect no icons to be generated, but the LARGE and SMALL icons to be
-  // resized from the MEDIUM icon.
-  ValidateIconsGeneratedAndResizedCorrectly(downloaded, size_map,
-                                            TestSizesToGenerate(), 0, 2);
-
-  // Verify specifically that the LARGE icons was resized from the medium icon.
-  const auto it = size_map.find(kIconSizeLarge);
-  EXPECT_NE(size_map.end(), it);
-  EXPECT_EQ(GURL(kAppIconURL2), it->second.source_url);
-}
-
-TEST(WebAppIconGeneratorTest, IconsResizedWhenOnlyATinyOneIsProvided) {
-  // When only a tiny icon is downloaded (smaller than the three desired
-  // sizes), 3 icons should be resized.
-  TestIconGeneration(kIconSizeTiny, 0, 3);
-}
-
-TEST(WebAppIconGeneratorTest, IconsResizedWhenOnlyAGigantorOneIsProvided) {
-  // When an enormous icon is provided, each desired icon size should be resized
-  // from it, and no icons should be generated.
-  TestIconGeneration(kIconSizeGigantor, 0, 3);
-}
-
-}  // namespace web_app
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_data_retriever_unittest.cc b/chrome/browser/web_applications/extensions/bookmark_app_data_retriever_unittest.cc
index 0a9fa2bd..dd6ac7db 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_data_retriever_unittest.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_data_retriever_unittest.cc
@@ -58,9 +58,8 @@
         mojo::AssociatedInterfaceRequest<ChromeRenderFrame>(std::move(handle)));
   }
 
-  void GetWebApplicationInfo(
-      const GetWebApplicationInfoCallback& callback) override {
-    callback.Run(web_app_info_);
+  void GetWebApplicationInfo(GetWebApplicationInfoCallback callback) override {
+    std::move(callback).Run(web_app_info_);
   }
 
  private:
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index 5b92cf79..a90c730b 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -719,9 +719,6 @@
   ]
 
   component_deps = [ "//content/public/common" ]
-
-  # TODO(crbug.com/714018): Convert the implementation to use OnceCallback.
-  use_once_callback = false
 }
 
 mojom("search_mojom") {
diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json
index 1d8101b..0c2892a0 100644
--- a/chrome/common/extensions/api/_permission_features.json
+++ b/chrome/common/extensions/api/_permission_features.json
@@ -157,7 +157,9 @@
       "0136FCB13DB29FD5CD442F56E59E53B61F1DF96F",  // http://crbug.com/642141
       "9834387FDA1F66A1B5CA06CB442137B556F12F2A",  // http://crbug.com/772346
       "930F7D9989A5FBCDCCD7D85BB5C3B7006C24D91D",  // http://crbug.com/782139
-      "A9A9FC0228ADF541F0334F22BEFB8F9C245B21D7"   // http://crbug.com/839189
+      "A9A9FC0228ADF541F0334F22BEFB8F9C245B21D7",  // http://crbug.com/839189
+      "46578A13607D38F1DC8E280C4F499FB0A2F9565C",  // http://crbug.com/841089
+      "898FB5A39687D210766B8998BA4530B99C9E6586"   // http://crbug.com/841089
     ]
   },
   "clipboardRead": {
diff --git a/chrome/common/extensions/api/autotest_private.idl b/chrome/common/extensions/api/autotest_private.idl
index 6f59d017..27dc544 100644
--- a/chrome/common/extensions/api/autotest_private.idl
+++ b/chrome/common/extensions/api/autotest_private.idl
@@ -162,5 +162,12 @@
     // |enabled|: if set, enable the Play Store.
     // |callback|: Called when the operation has completed.
     static void setPlayStoreEnabled(boolean enabled, VoidCallback callback);
+
+    // Run the crostini installer GUI to install the default crostini
+    // vm / container and create sshfs mount.  The installer launches the
+    // crostini terminal app on completion.  The installer expects that
+    // crostini is not already installed.
+    // |callback|: Called when the operation has completed.
+    static void runCrostiniInstaller(VoidCallback callback);
   };
 };
diff --git a/chrome/common/extensions/api/windows.json b/chrome/common/extensions/api/windows.json
index 89603fc..6d2adadc 100644
--- a/chrome/common/extensions/api/windows.json
+++ b/chrome/common/extensions/api/windows.json
@@ -279,7 +279,7 @@
               "top": {"type": "integer", "optional": true, "description": "The offset from the top edge of the screen to move the window to in pixels. This value is ignored for panels."},
               "width": {"type": "integer", "minimum": 0, "optional": true, "description": "The width to resize the window to in pixels. This value is ignored for panels."},
               "height": {"type": "integer", "minimum": 0, "optional": true, "description": "The height to resize the window to in pixels. This value is ignored for panels."},
-              "focused": {"type": "boolean", "optional": true, "description": "If true, brings the window to the front. If false, brings the next window in the z-order to the front."},
+              "focused": {"type": "boolean", "optional": true, "description": "If true, brings the window to the front and cannot be combined with the state 'minimized'. If false, brings the next window in the z-order to the front and cannot be combined with the state 'fullscreen' or 'maximized'."},
               "drawAttention": {"type": "boolean", "optional": true, "description": "If true, causes the window to be displayed in a manner that draws the user's attention to the window, without changing the focused window. The effect lasts until the user changes focus to the window. This option has no effect if the window already has focus. Set to false to cancel a previous draw attention request."},
               "state": {
                 "$ref": "WindowState",
diff --git a/chrome/common/google_url_loader_throttle.cc b/chrome/common/google_url_loader_throttle.cc
index 9855d649..6d431da5 100644
--- a/chrome/common/google_url_loader_throttle.cc
+++ b/chrome/common/google_url_loader_throttle.cc
@@ -7,6 +7,10 @@
 #include "chrome/common/net/safe_search_util.h"
 #include "components/variations/net/variations_http_headers.h"
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+#include "extensions/common/extension_urls.h"
+#endif
+
 GoogleURLLoaderThrottle::GoogleURLLoaderThrottle(
     bool is_off_the_record,
     bool force_safe_search,
@@ -64,3 +68,23 @@
   if (!variations::ShouldAppendVariationHeaders(redirect_info.new_url))
     to_be_removed_headers->push_back(variations::kClientDataHeader);
 }
+
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+void GoogleURLLoaderThrottle::WillProcessResponse(
+    const GURL& response_url,
+    network::ResourceResponseHead* response_head,
+    bool* defer) {
+  // Built-in additional protection for the chrome web store origin.
+  GURL webstore_url(extension_urls::GetWebstoreLaunchURL());
+  if (response_url.SchemeIsHTTPOrHTTPS() &&
+      response_url.DomainIs(webstore_url.host_piece())) {
+    if (response_head && response_head->headers &&
+        !response_head->headers->HasHeaderValue("x-frame-options", "deny") &&
+        !response_head->headers->HasHeaderValue("x-frame-options",
+                                                "sameorigin")) {
+      response_head->headers->RemoveHeader("x-frame-options");
+      response_head->headers->AddHeader("x-frame-options: sameorigin");
+    }
+  }
+}
+#endif
diff --git a/chrome/common/google_url_loader_throttle.h b/chrome/common/google_url_loader_throttle.h
index 2765148..6a618b3 100644
--- a/chrome/common/google_url_loader_throttle.h
+++ b/chrome/common/google_url_loader_throttle.h
@@ -6,6 +6,7 @@
 #define CHROME_COMMON_GOOGLE_URL_LOADER_THROTTLE_H_
 
 #include "content/public/common/url_loader_throttle.h"
+#include "extensions/buildflags/buildflags.h"
 
 // This class changes requests for Google-specific features (e.g. adding &
 // removing Varitaions headers, Safe Search & Restricted YouTube & restricting
@@ -31,6 +32,11 @@
       const network::ResourceResponseHead& response_head,
       bool* defer,
       std::vector<std::string>* to_be_removed_headers) override;
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+  void WillProcessResponse(const GURL& response_url,
+                           network::ResourceResponseHead* response_head,
+                           bool* defer) override;
+#endif
 
   bool is_off_the_record_;
   bool force_safe_search_;
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index a9e69e7..e91fc60 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -1925,6 +1925,10 @@
 // Whether camera-produced media files have been consolidated to one place.
 const char kCameraMediaConsolidated[] = "camera_media_consolidated";
 
+// Boolean that indicates whether users can continue reading a web page when
+// they switch from phones or tablets to Chromebook.
+const char kAppListContinueReadingEnabled[] =
+    "app_list.continue_reading_enabled";
 #endif  // defined(OS_CHROMEOS)
 
 // Whether there is a Flash version installed that supports clearing LSO data.
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 052a5b58..87fc43c 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -744,6 +744,7 @@
 extern const char kShelfChromeIconIndex[];
 extern const char kPinnedLauncherApps[];
 extern const char kPolicyPinnedLauncherApps[];
+extern const char kAppListContinueReadingEnabled[];
 #endif  // defined(OS_CHROMEOS)
 
 #if defined(OS_WIN)
diff --git a/chrome/common/prerender_url_loader_throttle.cc b/chrome/common/prerender_url_loader_throttle.cc
index 1d52887..8da43fe6 100644
--- a/chrome/common/prerender_url_loader_throttle.cc
+++ b/chrome/common/prerender_url_loader_throttle.cc
@@ -182,7 +182,7 @@
 
 void PrerenderURLLoaderThrottle::WillProcessResponse(
     const GURL& response_url,
-    const network::ResourceResponseHead& response_head,
+    network::ResourceResponseHead* response_head,
     bool* defer) {
   if (mode_ != PREFETCH_ONLY)
     return;
@@ -190,7 +190,7 @@
   bool is_main_resource = content::IsResourceTypeFrame(resource_type_);
   RecordPrefetchResponseReceived(histogram_prefix_, is_main_resource,
                                  true /* is_redirect */,
-                                 IsNoStoreResponse(response_head));
+                                 IsNoStoreResponse(*response_head));
   RecordPrefetchRedirectCount(histogram_prefix_, is_main_resource,
                               redirect_count_);
 }
diff --git a/chrome/common/prerender_url_loader_throttle.h b/chrome/common/prerender_url_loader_throttle.h
index 59e5a05..d0399afd 100644
--- a/chrome/common/prerender_url_loader_throttle.h
+++ b/chrome/common/prerender_url_loader_throttle.h
@@ -52,7 +52,7 @@
       bool* defer,
       std::vector<std::string>* to_be_removed_headers) override;
   void WillProcessResponse(const GURL& response_url,
-                           const network::ResourceResponseHead& response_head,
+                           network::ResourceResponseHead* response_head,
                            bool* defer) override;
 
   void OnTimedOut();
diff --git a/chrome/renderer/chrome_render_frame_observer.cc b/chrome/renderer/chrome_render_frame_observer.cc
index 3bf67bbe..950acac 100644
--- a/chrome/renderer/chrome_render_frame_observer.cc
+++ b/chrome/renderer/chrome_render_frame_observer.cc
@@ -223,7 +223,7 @@
     int32_t thumbnail_min_area_pixels,
     const gfx::Size& thumbnail_max_size_pixels,
     chrome::mojom::ImageFormat image_format,
-    const RequestThumbnailForContextNodeCallback& callback) {
+    RequestThumbnailForContextNodeCallback callback) {
   WebNode context_node = render_frame()->GetWebFrame()->ContextMenuNode();
   SkBitmap thumbnail;
   gfx::Size original_size;
@@ -261,7 +261,7 @@
         thumbnail_data.swap(data);
       break;
   }
-  callback.Run(thumbnail_data, original_size);
+  std::move(callback).Run(thumbnail_data, original_size);
 }
 
 void ChromeRenderFrameObserver::OnPrintNodeUnderContextMenu() {
@@ -274,7 +274,7 @@
 }
 
 void ChromeRenderFrameObserver::GetWebApplicationInfo(
-    const GetWebApplicationInfoCallback& callback) {
+    GetWebApplicationInfoCallback callback) {
   WebLocalFrame* frame = render_frame()->GetWebFrame();
 
   WebApplicationInfo web_app_info;
diff --git a/chrome/renderer/chrome_render_frame_observer.h b/chrome/renderer/chrome_render_frame_observer.h
index ff71b55b..fbeef58 100644
--- a/chrome/renderer/chrome_render_frame_observer.h
+++ b/chrome/renderer/chrome_render_frame_observer.h
@@ -79,11 +79,10 @@
       int32_t thumbnail_min_area_pixels,
       const gfx::Size& thumbnail_max_size_pixels,
       chrome::mojom::ImageFormat image_format,
-      const RequestThumbnailForContextNodeCallback& callback) override;
+      RequestThumbnailForContextNodeCallback callback) override;
   void RequestReloadImageForContextNode() override;
   void SetClientSidePhishingDetection(bool enable_phishing_detection) override;
-  void GetWebApplicationInfo(
-      const GetWebApplicationInfoCallback& callback) override;
+  void GetWebApplicationInfo(GetWebApplicationInfoCallback callback) override;
 #if defined(OS_ANDROID)
   void UpdateBrowserControlsState(content::BrowserControlsState constraints,
                                   content::BrowserControlsState current,
diff --git a/chrome/renderer/extensions/automation_ax_tree_wrapper.cc b/chrome/renderer/extensions/automation_ax_tree_wrapper.cc
index 976b0430..140b564a 100644
--- a/chrome/renderer/extensions/automation_ax_tree_wrapper.cc
+++ b/chrome/renderer/extensions/automation_ax_tree_wrapper.cc
@@ -202,6 +202,7 @@
   for (const auto& update : event_bundle.updates) {
     set_event_from(update.event_from);
     deleted_node_ids_.clear();
+    did_send_tree_change_during_unserialization_ = false;
 
     if (!tree_.Unserialize(update))
       return false;
@@ -209,7 +210,7 @@
     if (is_active_profile) {
       owner_->SendNodesRemovedEvent(&tree_, deleted_node_ids_);
 
-      if (update.nodes.size()) {
+      if (update.nodes.size() && did_send_tree_change_during_unserialization_) {
         ui::AXNode* target = tree_.GetFromId(update.nodes[0].id);
         if (target) {
           owner_->SendTreeChangeEvent(
@@ -268,8 +269,8 @@
 void AutomationAXTreeWrapper::OnNodeWillBeDeleted(ui::AXTree* tree,
                                                   ui::AXNode* node) {
   AXEventGenerator::OnNodeWillBeDeleted(tree, node);
-  owner_->SendTreeChangeEvent(api::automation::TREE_CHANGE_TYPE_NODEREMOVED,
-                              tree, node);
+  did_send_tree_change_during_unserialization_ |= owner_->SendTreeChangeEvent(
+      api::automation::TREE_CHANGE_TYPE_NODEREMOVED, tree, node);
   deleted_node_ids_.push_back(node->id());
 }
 
@@ -283,16 +284,19 @@
     ui::AXNode* node = change.node;
     switch (change.type) {
       case NODE_CREATED:
-        owner_->SendTreeChangeEvent(
-            api::automation::TREE_CHANGE_TYPE_NODECREATED, tree, node);
+        did_send_tree_change_during_unserialization_ |=
+            owner_->SendTreeChangeEvent(
+                api::automation::TREE_CHANGE_TYPE_NODECREATED, tree, node);
         break;
       case SUBTREE_CREATED:
-        owner_->SendTreeChangeEvent(
-            api::automation::TREE_CHANGE_TYPE_SUBTREECREATED, tree, node);
+        did_send_tree_change_during_unserialization_ |=
+            owner_->SendTreeChangeEvent(
+                api::automation::TREE_CHANGE_TYPE_SUBTREECREATED, tree, node);
         break;
       case NODE_CHANGED:
-        owner_->SendTreeChangeEvent(
-            api::automation::TREE_CHANGE_TYPE_NODECHANGED, tree, node);
+        did_send_tree_change_during_unserialization_ |=
+            owner_->SendTreeChangeEvent(
+                api::automation::TREE_CHANGE_TYPE_NODECHANGED, tree, node);
         break;
       // Unhandled.
       case NODE_REPARENTED:
@@ -302,8 +306,9 @@
   }
 
   for (int id : text_changed_node_ids_) {
-    owner_->SendTreeChangeEvent(api::automation::TREE_CHANGE_TYPE_TEXTCHANGED,
-                                tree, tree->GetFromId(id));
+    did_send_tree_change_during_unserialization_ |= owner_->SendTreeChangeEvent(
+        api::automation::TREE_CHANGE_TYPE_TEXTCHANGED, tree,
+        tree->GetFromId(id));
   }
   text_changed_node_ids_.clear();
 }
diff --git a/chrome/renderer/extensions/automation_ax_tree_wrapper.h b/chrome/renderer/extensions/automation_ax_tree_wrapper.h
index 48aff13..594d8bbe 100644
--- a/chrome/renderer/extensions/automation_ax_tree_wrapper.h
+++ b/chrome/renderer/extensions/automation_ax_tree_wrapper.h
@@ -61,6 +61,10 @@
   std::vector<int> deleted_node_ids_;
   std::vector<int> text_changed_node_ids_;
 
+  // Tracks whether a tree change event was sent during unserialization. Tree
+  // changes outside of unserialization do not get reflected here. The value is
+  // reset after unserialization.
+  bool did_send_tree_change_during_unserialization_ = false;
   DISALLOW_COPY_AND_ASSIGN(AutomationAXTreeWrapper);
 };
 
diff --git a/chrome/renderer/extensions/automation_internal_custom_bindings.cc b/chrome/renderer/extensions/automation_internal_custom_bindings.cc
index 1bb7be4..e420f10 100644
--- a/chrome/renderer/extensions/automation_internal_custom_bindings.cc
+++ b/chrome/renderer/extensions/automation_internal_custom_bindings.cc
@@ -1668,13 +1668,13 @@
                     params.new_location.transform.get());
 }
 
-void AutomationInternalCustomBindings::SendTreeChangeEvent(
+bool AutomationInternalCustomBindings::SendTreeChangeEvent(
     api::automation::TreeChangeType change_type,
     ui::AXTree* tree,
     ui::AXNode* node) {
   // Don't send tree change events when it's not the active profile.
   if (!is_active_profile_)
-    return;
+    return false;
 
   // Notify custom bindings when there's an unloaded tree; js will enable the
   // renderer and wait for it to load.
@@ -1692,7 +1692,8 @@
        api::automation::TREE_CHANGE_OBSERVER_FILTER_LIVEREGIONTREECHANGES)) {
     if (node->data().HasStringAttribute(
             ax::mojom::StringAttribute::kContainerLiveStatus) ||
-        node->data().role == ax::mojom::Role::kAlert) {
+        node->data().role == ax::mojom::Role::kAlert ||
+        change_type == api::automation::TREE_CHANGE_TYPE_SUBTREEUPDATEEND) {
       has_filter = true;
     }
   }
@@ -1709,14 +1710,14 @@
     has_filter = true;
 
   if (!has_filter)
-    return;
+    return false;
 
   auto iter = axtree_to_tree_wrapper_map_.find(tree);
   if (iter == axtree_to_tree_wrapper_map_.end())
-    return;
+    return false;
 
   int tree_id = iter->second->tree_id();
-
+  bool did_send_event = false;
   for (const auto& observer : tree_change_observers_) {
     switch (observer.filter) {
       case api::automation::TREE_CHANGE_OBSERVER_FILTER_NOTREECHANGES:
@@ -1725,7 +1726,8 @@
       case api::automation::TREE_CHANGE_OBSERVER_FILTER_LIVEREGIONTREECHANGES:
         if (!node->data().HasStringAttribute(
                 ax::mojom::StringAttribute::kContainerLiveStatus) &&
-            node->data().role != ax::mojom::Role::kAlert) {
+            node->data().role != ax::mojom::Role::kAlert &&
+            change_type != api::automation::TREE_CHANGE_TYPE_SUBTREEUPDATEEND) {
           continue;
         }
         break;
@@ -1738,6 +1740,7 @@
         break;
     }
 
+    did_send_event = true;
     base::ListValue args;
     args.AppendInteger(observer.id);
     args.AppendInteger(tree_id);
@@ -1746,6 +1749,8 @@
     bindings_system_->DispatchEventInContext("automationInternal.onTreeChange",
                                              &args, nullptr, context());
   }
+
+  return did_send_event;
 }
 
 void AutomationInternalCustomBindings::SendAutomationEvent(
diff --git a/chrome/renderer/extensions/automation_internal_custom_bindings.h b/chrome/renderer/extensions/automation_internal_custom_bindings.h
index cd6cb3a..565a862a 100644
--- a/chrome/renderer/extensions/automation_internal_custom_bindings.h
+++ b/chrome/renderer/extensions/automation_internal_custom_bindings.h
@@ -77,7 +77,7 @@
   float GetDeviceScaleFactor() const;
 
   void SendNodesRemovedEvent(ui::AXTree* tree, const std::vector<int>& ids);
-  void SendTreeChangeEvent(api::automation::TreeChangeType change_type,
+  bool SendTreeChangeEvent(api::automation::TreeChangeType change_type,
                            ui::AXTree* tree,
                            ui::AXNode* node);
   void SendAutomationEvent(int tree_id,
diff --git a/chrome/renderer/net/OWNERS b/chrome/renderer/net/OWNERS
index 5630b3b..c657e6b8 100644
--- a/chrome/renderer/net/OWNERS
+++ b/chrome/renderer/net/OWNERS
@@ -1,6 +1,10 @@
-# Preferred reviewer.
+# Preferred net owner.
 mmenke@chromium.org
 
+# Offline owners.
+chili@chromium.org
+jianli@chromium.org
+
 file://net/OWNERS
 
 # COMPONENT: Internals>Network
diff --git a/chrome/renderer/resources/extensions/automation_custom_bindings.js b/chrome/renderer/resources/extensions/automation_custom_bindings.js
index 9bf972b..8e37de8 100644
--- a/chrome/renderer/resources/extensions/automation_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/automation_custom_bindings.js
@@ -238,7 +238,7 @@
     observer({target: node, type: changeType});
   } catch (e) {
     exceptionHandler.handle('Error in tree change observer for ' +
-        treeChange.type, e);
+        changeType, e);
   }
 });
 
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 34ab935..e5e3fa7 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3193,7 +3193,7 @@
       "../browser/usb/usb_chooser_context_unittest.cc",
       "../browser/usb/usb_chooser_controller_unittest.cc",
       "../browser/usb/web_usb_detector_unittest.cc",
-      "../browser/usb/web_usb_device_manager_unittest.cc",
+      "../browser/usb/web_usb_service_impl_unittest.cc",
 
       # The importer code is not used on Android.
       "../common/importer/firefox_importer_utils_unittest.cc",
@@ -4377,7 +4377,7 @@
       "../browser/ui/webui/signin/signin_create_profile_handler_unittest.cc",
       "../browser/ui/webui/signin/signin_error_handler_unittest.cc",
       "../browser/ui/webui/signin/sync_confirmation_handler_unittest.cc",
-      "../browser/upgrade_detector_impl_unittest.cc",
+      "../browser/upgrade_detector/upgrade_detector_impl_unittest.cc",
     ]
   }
   if (toolkit_views) {
@@ -5013,6 +5013,7 @@
         "../browser/chromeos/login/lock/screen_locker_browsertest.cc",
         "../browser/chromeos/login/lock/screen_locker_tester.cc",
         "../browser/chromeos/login/lock/screen_locker_tester.h",
+        "../browser/chromeos/login/login_auth_recorder_browsertest.cc",
         "../browser/chromeos/login/login_browsertest.cc",
         "../browser/chromeos/login/login_manager_test.cc",
         "../browser/chromeos/login/login_manager_test.h",
diff --git a/chrome/test/chromedriver/BUILD.gn b/chrome/test/chromedriver/BUILD.gn
index 9e503444..cb16c26 100644
--- a/chrome/test/chromedriver/BUILD.gn
+++ b/chrome/test/chromedriver/BUILD.gn
@@ -198,6 +198,7 @@
   inputs = [
     "cpp_source.py",
     "VERSION",
+    "//chrome/VERSION",
 
     # We don't actually use LASTCHANGE as an input file. It is updated
     # whenever a different Git revision is checked out, at which point
@@ -210,8 +211,10 @@
   ]
 
   args = [
-    "--version-file",
+    "--chromedriver-version-file",
     rebase_path("VERSION", root_build_dir),
+    "--chrome-version-file",
+    rebase_path("//chrome/VERSION", root_build_dir),
     "--directory",
     rebase_path(target_gen_dir, root_build_dir),
   ]
diff --git a/chrome/test/chromedriver/embed_version_in_cpp.py b/chrome/test/chromedriver/embed_version_in_cpp.py
index 5caf77243..e2c1d9e 100755
--- a/chrome/test/chromedriver/embed_version_in_cpp.py
+++ b/chrome/test/chromedriver/embed_version_in_cpp.py
@@ -3,7 +3,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-"""Embeds Chrome user data files in C++ code."""
+"""Embeds version string in C++ code for ChromeDriver."""
 
 import optparse
 import os
@@ -17,27 +17,91 @@
 import lastchange
 
 
+def get_release_version(chrome_version_file, version_info):
+  """Return version string appropriate for a release branch.
+
+  Args:
+    chrome_version_file: name of Chrome's version file, e.g., chrome/VERSION.
+    version_info: VersionInfo object returned from lastchange.FetchVersionInfo.
+  """
+
+  # Release branch revision has the format
+  # '26c10db8bff36a8b6fc073c0f38b1e9493cabb04-refs/branch-heads/3515@{#5}'.
+  match = re.match('[0-9a-fA-F]+-refs/branch-heads/\d+@{#\d+}',
+                   version_info.revision)
+  if not match:
+    # revision is not the expected format, probably not in a release branch.
+    return None
+
+  # Parse Chrome version file, which should have four lines of key=value,
+  # giving the major, minor, build, and patch number.
+  values = {}
+  for line in open(chrome_version_file, 'r').readlines():
+    key, val = line.rstrip('\r\n').split('=', 1)
+    values[key] = val
+
+  # Result is based on Chrome version number, e.g.,
+  # '70.0.3516.0 (26c10db8bff36a8b6fc073c0f38b1e9493cabb04)'.
+  return '%s.%s.%s.%s (%s)' % (
+      values['MAJOR'], values['MINOR'], values['BUILD'], values['PATCH'],
+      version_info.revision_id)
+
+
+def get_master_version(chromedriver_version, version_info):
+  """Return version string appropriate for the master branch.
+
+  Args:
+    chromedriver_version: ChromeDriver version, e.g., '2.41'.
+    version_info: VersionInfo object returned from lastchange.FetchVersionInfo.
+  """
+
+  # Master branch revision has the format
+  # 'cc009559c91323445dec7e2f545298bf10726eaf-refs/heads/master@{#581331}'.
+  # We need to grab the commit position (e.g., '581331') near the end.
+  match = re.match('[0-9a-fA-F]+-refs/heads/master@{#(\d+)}',
+                   version_info.revision)
+
+  if not match:
+    # revision is not the expected format, probably not in the master branch.
+    return None
+
+  # result is based on legacy style ChromeDriver version number, e.g.,
+  # '2.41.581331 (cc009559c91323445dec7e2f545298bf10726eaf)'.
+  commit_position = match.group(1)
+  return '%s.%s (%s)' % (
+      chromedriver_version, commit_position, version_info.revision_id)
+
+
 def main():
   parser = optparse.OptionParser()
-  parser.add_option('', '--version-file')
+  parser.add_option('', '--chromedriver-version-file')
+  parser.add_option('', '--chrome-version-file')
   parser.add_option(
       '', '--directory', type='string', default='.',
       help='Path to directory where the cc/h  file should be created')
   options, _ = parser.parse_args()
 
-  version = open(options.version_file, 'r').read().strip()
-  revision = lastchange.FetchVersionInfo(None).revision
+  chromedriver_version = open(
+      options.chromedriver_version_file, 'r').read().strip()
 
-  if revision:
-    match = re.match('([0-9a-fA-F]+)(-refs/heads/master@{#(\d+)})?', revision)
-    if match:
-      git_hash = match.group(1)
-      commit_position = match.group(3)
-      if commit_position:
-        version += '.' + commit_position
-      version += ' (%s)' % git_hash
-    else:
-      version += ' (%s)' % revision
+  # Get a VersionInfo object corresponding to the Git commit we are at.
+  # On success, version_info.revision_id is a 40-digit Git hash,
+  # and version_info.revision is a longer string with more information.
+  # On failure, version_info is None.
+  version_info = lastchange.FetchGitRevision(None, None)
+
+  if version_info:
+    version = get_release_version(options.chrome_version_file, version_info)
+
+    if not version:
+      version = get_master_version(chromedriver_version, version_info)
+
+    if not version:
+      # Not in a known branch, but has Git revision.
+      version = '%s (%s)' % (chromedriver_version, version_info.revision_id)
+  else:
+    # Git command failed for some reason. Just use ChromeDriver version string.
+    version = chromedriver_version
 
   global_string_map = {
       'kChromeDriverVersion': version
diff --git a/chrome/test/data/extensions/api_test/automation/tests/tabs/tree_change.js b/chrome/test/data/extensions/api_test/automation/tests/tabs/tree_change.js
index af4107c..0a0a7672 100644
--- a/chrome/test/data/extensions/api_test/automation/tests/tabs/tree_change.js
+++ b/chrome/test/data/extensions/api_test/automation/tests/tabs/tree_change.js
@@ -31,7 +31,12 @@
         "liveRegionTreeChanges",
         function(change) {
       if (change.target.name == 'Dead') {
-        chrome.test.fail();
+        // The internal bindings will notify us of a subtreeUpdateEnd if there
+        // was a live region within the updates sent during unserialization. The
+        // target in this case is picked by simply choosing the first target in
+        // all tree changes, which could have been anything.
+        if (change.type != 'subtreeUpdateEnd')
+          chrome.test.fail();
       }
       if (change.target.name == 'Live') {
         chrome.test.succeed();
diff --git a/chrome/test/data/extensions/api_test/autotest_private/test.js b/chrome/test/data/extensions/api_test/autotest_private/test.js
index d0f72c3f..6758ea20 100644
--- a/chrome/test/data/extensions/api_test/autotest_private/test.js
+++ b/chrome/test/data/extensions/api_test/autotest_private/test.js
@@ -130,6 +130,10 @@
       chrome.test.succeed();
     });
   },
+  function runCrostiniInstaller() {
+    chrome.autotestPrivate.runCrostiniInstaller(chrome.test.callbackFail(
+        'Crostini is not available for the current user'));
+  },
   function getPrinterList() {
     chrome.autotestPrivate.getPrinterList(function(){
       chrome.test.succeed();
diff --git a/chrome/test/data/extensions/good2_update_manifest.xml b/chrome/test/data/extensions/good2_update_manifest.xml
index 95bf08b..f4c4a4f 100644
--- a/chrome/test/data/extensions/good2_update_manifest.xml
+++ b/chrome/test/data/extensions/good2_update_manifest.xml
@@ -5,7 +5,7 @@
 -->
 <gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
   <app appid='ldnnhddmnhbkjipkidpdiheffobcpfmf'>
-    <updatecheck codebase='http://mock.http/extensions/good2.crx'
+    <updatecheck codebase='http://update.extension/extensions/good2.crx'
                  version='1.0.0.1' />
    </app>
 </gupdate>
diff --git a/chrome/test/data/extensions/good_v1_update_manifest.xml b/chrome/test/data/extensions/good_v1_update_manifest.xml
index f53830b..454ee20 100644
--- a/chrome/test/data/extensions/good_v1_update_manifest.xml
+++ b/chrome/test/data/extensions/good_v1_update_manifest.xml
@@ -5,7 +5,7 @@
 -->
 <gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
   <app appid='ldnnhddmnhbkjipkidpdiheffobcpfmf'>
-    <updatecheck codebase='http://mock.http/extensions/good_v1.crx'
+    <updatecheck codebase='http://update.extension/extensions/good_v1.crx'
                  version='1.0.0.0' />
    </app>
 </gupdate>
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index fe8477c1..68aca22 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -3208,6 +3208,14 @@
     ]
   },
 
+  "PowerSmartDimEnabled": {
+    "os": ["chromeos"],
+    "test_policy": { "PowerSmartDimEnabled": false },
+    "pref_mappings": [
+      { "pref": "power.smart_dim_enabled" }
+    ]
+  },
+
   "----- Chrome OS device policies ---------------------------------------": {},
 
   "DevicePolicyRefreshRate": {
diff --git a/chrome/test/data/webui/settings/a11y/passwords_a11y_test.js b/chrome/test/data/webui/settings/a11y/passwords_a11y_test.js
index af0a362..6801a33 100644
--- a/chrome/test/data/webui/settings/a11y/passwords_a11y_test.js
+++ b/chrome/test/data/webui/settings/a11y/passwords_a11y_test.js
@@ -25,7 +25,11 @@
   ]),
 };
 
-AccessibilityTest.define('SettingsA11yManagePasswords', {
+// Disabled for flake. https://crbug.com/872575. The only way I could find to
+// disable the test was to *not* call AccessibilityTest.define(), so this is
+// commented out.
+// AccessibilityTest.define('SettingsA11yManagePasswords', {
+DISABLED_SettingsA11yManagePasswords = {
   /** @override */
   name: 'MANAGE_PASSWORDS',
   /** @type {PasswordManager} */
@@ -104,4 +108,4 @@
 
   /** @override */
   violationFilter: SettingsAccessibilityTest.violationFilter,
-});
+} /*)*/;
diff --git a/chrome/test/data/webui/settings/people_page_sync_page_test.js b/chrome/test/data/webui/settings/people_page_sync_page_test.js
index 1a8260f0..41440ce8 100644
--- a/chrome/test/data/webui/settings/people_page_sync_page_test.js
+++ b/chrome/test/data/webui/settings/people_page_sync_page_test.js
@@ -54,9 +54,26 @@
         typedUrlsEnforced: false,
         typedUrlsRegistered: true,
         typedUrlsSynced: true,
+        userEventsEnforced: false,
+        userEventsRegistered: true,
+        userEventsSynced: true,
       };
     }
 
+    function openDatatypeConfigurationWithUnifiedConsent(prefs) {
+      syncPage.unifiedConsentEnabled = true;
+      cr.webUIListenerCallback('sync-prefs-changed', prefs);
+
+      Polymer.dom.flush();
+
+      const syncAllDataTypesControl = syncPage.$.syncAllDataTypesControl;
+      assertFalse(syncAllDataTypesControl.disabled);
+      assertTrue(syncAllDataTypesControl.checked);
+
+      // Uncheck the Sync All control.
+      syncAllDataTypesControl.click();
+    }
+
     setup(function() {
       browserProxy = new TestSyncBrowserProxy();
       settings.SyncBrowserProxyImpl.instance_ = browserProxy;
@@ -457,6 +474,66 @@
       assertTrue(syncPage.$.encryptionRadioGroupContainer.hidden);
     });
 
+    test('UserEvents_UnifiedConsent_Encrypted', function() {
+      const prefs = getSyncAllPrefs();
+      prefs.encryptAllData = true;
+      openDatatypeConfigurationWithUnifiedConsent(prefs);
+
+      assertTrue(prefs.userEventsSynced);
+      // History.
+      historyToggle = syncPage.$$('#historyToggle');
+      assertFalse(historyToggle.disabled);
+      assertTrue(historyToggle.checked);
+      // User events.
+      userEventsToggle = syncPage.$$('#userEventsToggle');
+      assertTrue(userEventsToggle.disabled);
+      assertFalse(userEventsToggle.checked);
+      resetSyncMessageBox = syncPage.$$('#reset-sync-message-box-user-events');
+      assertFalse(resetSyncMessageBox.hidden);
+    });
+
+    test('UserEvents_UnifiedConsent_NotEncrypted', function() {
+      const prefs = getSyncAllPrefs();
+      openDatatypeConfigurationWithUnifiedConsent(prefs);
+
+      assertTrue(prefs.userEventsSynced);
+      // Check history toggle.
+      historyToggle = syncPage.$$('#historyToggle');
+      assertFalse(historyToggle.disabled);
+      assertTrue(historyToggle.checked);
+      // Check user events toggle.
+      userEventsToggle = syncPage.$$('#userEventsToggle');
+      assertFalse(userEventsToggle.disabled);
+      assertTrue(userEventsToggle.checked);
+      resetSyncMessageBox = syncPage.$$('#reset-sync-message-box-user-events');
+      assertTrue(resetSyncMessageBox.hidden);
+
+      // Toggling history also toggles user events.
+      // Turn history off.
+      historyToggle.click();
+      cr.webUIListenerCallback('sync-prefs-changed', prefs);
+      assertFalse(historyToggle.checked);
+      assertTrue(userEventsToggle.disabled);
+      assertFalse(userEventsToggle.checked);
+      assertTrue(resetSyncMessageBox.hidden);
+      assertTrue(prefs.userEventsSynced);
+      // Turn history on.
+      historyToggle.click();
+      cr.webUIListenerCallback('sync-prefs-changed', prefs);
+      assertTrue(historyToggle.checked);
+      assertFalse(userEventsToggle.disabled);
+      assertTrue(userEventsToggle.checked);
+      assertTrue(prefs.userEventsSynced);
+
+      // Toggling user events also toggles the sync preference.
+      userEventsToggle.click();
+      cr.webUIListenerCallback('sync-prefs-changed', prefs);
+      assertFalse(userEventsToggle.disabled);
+      assertFalse(userEventsToggle.checked);
+      assertFalse(prefs.userEventsSynced);
+      assertTrue(resetSyncMessageBox.hidden);
+    });
+
     test(
         'ExistingPassphraseSubmitButtonDisabledWhenExistingPassphraseEmpty',
         function() {
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn
index 9a00f9c..6e648ff 100644
--- a/chromecast/browser/BUILD.gn
+++ b/chromecast/browser/BUILD.gn
@@ -290,7 +290,9 @@
         "accessibility/accessibility_manager.cc",
         "accessibility/accessibility_manager.h",
         "accessibility/accessibility_sound_delegate.h",
-        "accessibility/accessibility_sound_delegate_stub.h",
+        "accessibility/accessibility_sound_player.h",
+        "accessibility/accessibility_sound_proxy.h",
+        "accessibility/accessibility_sound_proxy.cc",
         "accessibility/touch_exploration_controller.cc",
         "accessibility/touch_exploration_controller.h",
         "accessibility/touch_exploration_manager.cc",
diff --git a/chromecast/browser/accessibility/accessibility_manager.cc b/chromecast/browser/accessibility/accessibility_manager.cc
index 94de9913..d46a252 100644
--- a/chromecast/browser/accessibility/accessibility_manager.cc
+++ b/chromecast/browser/accessibility/accessibility_manager.cc
@@ -15,7 +15,8 @@
 
 AccessibilityManager::AccessibilityManager(
     aura::WindowTreeHost* window_tree_host)
-    : window_tree_host_(window_tree_host) {
+    : window_tree_host_(window_tree_host),
+      accessibility_sound_proxy_(std::make_unique<AccessibilitySoundPlayer>()) {
   DCHECK(window_tree_host);
   aura::Window* root_window = window_tree_host->window()->GetRootWindow();
   wm::ActivationClient* activation_client =
@@ -26,7 +27,8 @@
       std::make_unique<AccessibilityFocusRingController>(root_window);
   touch_exploration_manager_ = std::make_unique<TouchExplorationManager>(
       root_window, activation_client,
-      accessibility_focus_ring_controller_.get());
+      accessibility_focus_ring_controller_.get(),
+      &accessibility_sound_proxy_);
   triple_tap_detector_ = std::make_unique<TripleTapDetector>(root_window, this);
   magnification_controller_ =
       std::make_unique<PartialMagnificationController>(root_window);
@@ -69,10 +71,14 @@
   accessibility_focus_ring_controller_->HideHighlights();
 }
 
-void AccessibilityManager::EnableTouchExploration(bool enable) {
+void AccessibilityManager::SetScreenReader(bool enable) {
   touch_exploration_manager_->Enable(enable);
 }
 
+void AccessibilityManager::EnableTouchExploration(bool enable) {
+  SetScreenReader(enable);
+}
+
 void AccessibilityManager::SetTouchAccessibilityAnchorPoint(
     const gfx::Point& anchor_point) {
   touch_exploration_manager_->SetTouchAccessibilityAnchorPoint(anchor_point);
@@ -96,10 +102,9 @@
       !magnification_controller_->IsEnabled());
 }
 
-void AccessibilityManager::SetAccessibilitySoundDelegate(
-    std::unique_ptr<AccessibilitySoundDelegate> delegate) {
-  touch_exploration_manager_->SetAccessibilitySoundDelegate(
-      std::move(delegate));
+void AccessibilityManager::SetAccessibilitySoundPlayer(
+    std::unique_ptr<AccessibilitySoundPlayer> player) {
+  accessibility_sound_proxy_.ResetPlayer(std::move(player));
 }
 
 }  // namespace shell
diff --git a/chromecast/browser/accessibility/accessibility_manager.h b/chromecast/browser/accessibility/accessibility_manager.h
index f644fea..ad1de84 100644
--- a/chromecast/browser/accessibility/accessibility_manager.h
+++ b/chromecast/browser/accessibility/accessibility_manager.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <vector>
 
+#include "chromecast/browser/accessibility/accessibility_sound_proxy.h"
 #include "chromecast/browser/accessibility/touch_exploration_manager.h"
 #include "chromecast/graphics/accessibility/accessibility_focus_ring_controller.h"
 #include "chromecast/graphics/gestures/triple_tap_detector.h"
@@ -55,7 +56,11 @@
   // Hides highlight on screen.
   void HideHighlights();
 
-  // Enable or disable touch exploration.
+  // Enable or disable screen reader support, including touch exploration.
+  void SetScreenReader(bool enable);
+
+  // TODO(kpschoedel): remove once AccessibilityServiceImpl::SetScreenReader()
+  // changes to call SetScreenReader() here.
   void EnableTouchExploration(bool enable);
 
   // Update the touch exploration controller so that synthesized
@@ -74,18 +79,28 @@
   // TripleTapDetectorDelegate implementation
   void OnTripleTap(const gfx::Point& tap_location) override;
 
+  // Sets the player for earcons.
+  void SetAccessibilitySoundPlayer(
+      std::unique_ptr<AccessibilitySoundPlayer> player);
+
   // Sets the delegate for earcons.
+  // TODO(kpschoedel) remove when caller has changed.
   void SetAccessibilitySoundDelegate(
-      std::unique_ptr<AccessibilitySoundDelegate> delegate);
+      std::unique_ptr<AccessibilitySoundPlayer> player) {
+    SetAccessibilitySoundPlayer(std::move(player));
+  }
 
  private:
+  aura::WindowTreeHost* window_tree_host_;
+
   std::unique_ptr<FocusRingController> focus_ring_controller_;
   std::unique_ptr<AccessibilityFocusRingController>
       accessibility_focus_ring_controller_;
-  aura::WindowTreeHost* window_tree_host_;
   std::unique_ptr<TouchExplorationManager> touch_exploration_manager_;
   std::unique_ptr<TripleTapDetector> triple_tap_detector_;
   std::unique_ptr<MagnificationController> magnification_controller_;
+
+  AccessibilitySoundProxy accessibility_sound_proxy_;
 };
 
 }  // namespace shell
diff --git a/chromecast/browser/accessibility/accessibility_sound_delegate.h b/chromecast/browser/accessibility/accessibility_sound_delegate.h
index 13db069..cf63312a 100644
--- a/chromecast/browser/accessibility/accessibility_sound_delegate.h
+++ b/chromecast/browser/accessibility/accessibility_sound_delegate.h
@@ -2,23 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// TODO(kpschoedel) remove this file when dependencies have changed.
+
 #ifndef CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_DELEGATE_H_
 #define CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_DELEGATE_H_
 
+#include "chromecast/browser/accessibility/accessibility_sound_player.h"
+
 namespace chromecast {
 namespace shell {
 
-// Provides audio feedback for TouchExplorationController.
-
-class AccessibilitySoundDelegate {
- public:
-  AccessibilitySoundDelegate() {}
-  virtual ~AccessibilitySoundDelegate() {}
-  virtual void PlayPassthroughEarcon() = 0;
-  virtual void PlayEnterScreenEarcon() = 0;
-  virtual void PlayExitScreenEarcon() = 0;
-  virtual void PlayTouchTypeEarcon() = 0;
-};
+using AccessibilitySoundDelegate = AccessibilitySoundPlayer;
 
 }  // namespace shell
 }  // namespace chromecast
diff --git a/chromecast/browser/accessibility/accessibility_sound_delegate_stub.h b/chromecast/browser/accessibility/accessibility_sound_delegate_stub.h
deleted file mode 100644
index 89b843ce..0000000
--- a/chromecast/browser/accessibility/accessibility_sound_delegate_stub.h
+++ /dev/null
@@ -1,26 +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 CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_DELEGATE_STUB_H_
-#define CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_DELEGATE_STUB_H_
-
-#include "chromecast/browser/accessibility/accessibility_sound_delegate.h"
-
-namespace chromecast {
-namespace shell {
-
-class AccessibilitySoundDelegateStub : public AccessibilitySoundDelegate {
- public:
-  AccessibilitySoundDelegateStub() = default;
-  ~AccessibilitySoundDelegateStub() override = default;
-  void PlayPassthroughEarcon() override {}
-  void PlayEnterScreenEarcon() override {}
-  void PlayExitScreenEarcon() override {}
-  void PlayTouchTypeEarcon() override {}
-};
-
-}  // namespace shell
-}  // namespace chromecast
-
-#endif  // CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_DELEGATE_STUB_H_
diff --git a/chromecast/browser/accessibility/accessibility_sound_player.h b/chromecast/browser/accessibility/accessibility_sound_player.h
new file mode 100644
index 0000000..b9711ac
--- /dev/null
+++ b/chromecast/browser/accessibility/accessibility_sound_player.h
@@ -0,0 +1,26 @@
+// 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 CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_PLAYER_H_
+#define CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_PLAYER_H_
+
+namespace chromecast {
+namespace shell {
+
+// Provides audio feedback in screen reader mode.
+class AccessibilitySoundPlayer {
+ public:
+  AccessibilitySoundPlayer() {}
+  virtual ~AccessibilitySoundPlayer() {}
+  virtual void PlayPassthroughEarcon() {}
+  virtual void PlayPassthroughEndEarcon() {}
+  virtual void PlayEnterScreenEarcon() {}
+  virtual void PlayExitScreenEarcon() {}
+  virtual void PlayTouchTypeEarcon() {}
+};
+
+}  // namespace shell
+}  // namespace chromecast
+
+#endif  // CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_PLAYER_H_
diff --git a/chromecast/browser/accessibility/accessibility_sound_proxy.cc b/chromecast/browser/accessibility/accessibility_sound_proxy.cc
new file mode 100644
index 0000000..cc29cd3
--- /dev/null
+++ b/chromecast/browser/accessibility/accessibility_sound_proxy.cc
@@ -0,0 +1,42 @@
+// 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 "chromecast/browser/accessibility/accessibility_sound_proxy.h"
+
+namespace chromecast {
+namespace shell {
+
+AccessibilitySoundProxy::AccessibilitySoundProxy(
+    std::unique_ptr<AccessibilitySoundPlayer> player)
+    : player_(std::move(player)) {}
+
+AccessibilitySoundProxy::~AccessibilitySoundProxy() {}
+
+void AccessibilitySoundProxy::ResetPlayer(
+    std::unique_ptr<AccessibilitySoundPlayer> player) {
+  player_ = std::move(player);
+}
+
+void AccessibilitySoundProxy::PlayPassthroughEarcon() {
+  player_->PlayPassthroughEarcon();
+}
+
+void AccessibilitySoundProxy::PlayPassthroughEndEarcon() {
+  player_->PlayPassthroughEndEarcon();
+}
+
+void AccessibilitySoundProxy::PlayEnterScreenEarcon() {
+  player_->PlayEnterScreenEarcon();
+}
+
+void AccessibilitySoundProxy::PlayExitScreenEarcon() {
+  player_->PlayExitScreenEarcon();
+}
+
+void AccessibilitySoundProxy::PlayTouchTypeEarcon() {
+  player_->PlayTouchTypeEarcon();
+}
+
+}  // namespace shell
+}  // namespace chromecast
diff --git a/chromecast/browser/accessibility/accessibility_sound_proxy.h b/chromecast/browser/accessibility/accessibility_sound_proxy.h
new file mode 100644
index 0000000..17374db
--- /dev/null
+++ b/chromecast/browser/accessibility/accessibility_sound_proxy.h
@@ -0,0 +1,37 @@
+// 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 CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_PROXY_H_
+#define CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_PROXY_H_
+
+#include <memory>
+
+#include "chromecast/browser/accessibility/accessibility_sound_player.h"
+
+namespace chromecast {
+namespace shell {
+
+// Provides audio feedback in screen reader mode.
+class AccessibilitySoundProxy : public AccessibilitySoundPlayer {
+ public:
+  AccessibilitySoundProxy(std::unique_ptr<AccessibilitySoundPlayer> player);
+  ~AccessibilitySoundProxy() override;
+
+  void ResetPlayer(std::unique_ptr<AccessibilitySoundPlayer> player);
+
+  // AccessibilitySoundPlayer overrides:
+  void PlayPassthroughEarcon() override;
+  void PlayPassthroughEndEarcon() override;
+  void PlayEnterScreenEarcon() override;
+  void PlayExitScreenEarcon() override;
+  void PlayTouchTypeEarcon() override;
+
+ private:
+  std::unique_ptr<AccessibilitySoundPlayer> player_;
+};
+
+}  // namespace shell
+}  // namespace chromecast
+
+#endif  // CHROMECAST_BROWSER_ACCESSIBILITY_ACCESSIBILITY_SOUND_PROXY_H_
diff --git a/chromecast/browser/accessibility/touch_exploration_controller.cc b/chromecast/browser/accessibility/touch_exploration_controller.cc
index fdc8cb6e..ecc2223 100644
--- a/chromecast/browser/accessibility/touch_exploration_controller.cc
+++ b/chromecast/browser/accessibility/touch_exploration_controller.cc
@@ -41,10 +41,10 @@
 TouchExplorationController::TouchExplorationController(
     aura::Window* root_window,
     TouchExplorationControllerDelegate* delegate,
-    AccessibilitySoundDelegate* accessibility_sound_delegate)
+    AccessibilitySoundPlayer* accessibility_sound_player)
     : root_window_(root_window),
       delegate_(delegate),
-      accessibility_sound_delegate_(accessibility_sound_delegate),
+      accessibility_sound_player_(accessibility_sound_player),
       state_(NO_FINGERS_DOWN),
       anchor_point_state_(ANCHOR_POINT_NONE),
       gesture_provider_(new ui::GestureProviderAura(this, this)),
@@ -187,7 +187,7 @@
       VLOG(1) << "Leaving screen";
 
     // Indicates to the user that they are leaving the screen.
-    accessibility_sound_delegate_->PlayExitScreenEarcon();
+    accessibility_sound_player_->PlayExitScreenEarcon();
 
     if (current_touch_ids_.size() == 0) {
       SET_STATE(NO_FINGERS_DOWN);
@@ -301,7 +301,7 @@
     // handle it.
     int edge = FindEdgesWithinInset(event.location(), kLeavingScreenEdge);
     if (edge != NO_EDGE) {
-      accessibility_sound_delegate_->PlayEnterScreenEarcon();
+      accessibility_sound_player_->PlayEnterScreenEarcon();
       SET_STATE(EDGE_PASSTHROUGH);
       return ui::EVENT_REWRITE_CONTINUE;
     }
@@ -542,6 +542,7 @@
     if (type == ui::ET_TOUCH_MOVED && in_a_bottom_corner)
       return ui::EVENT_REWRITE_DISCARD;
 
+    accessibility_sound_player_->PlayPassthroughEndEarcon();
     if (current_touch_ids_.size() == 0) {
       SET_STATE(NO_FINGERS_DOWN);
       return ui::EVENT_REWRITE_DISCARD;
@@ -705,7 +706,7 @@
   if (lift_activation_bounds_.Contains(anchor_location.x(),
                                        anchor_location.y()) &&
       lift_activation_bounds_.Contains(location)) {
-    accessibility_sound_delegate_->PlayTouchTypeEarcon();
+    accessibility_sound_player_->PlayTouchTypeEarcon();
     SendSimulatedTap();
   }
 }
@@ -843,7 +844,7 @@
 
   if (sound_timer_.IsRunning())
     sound_timer_.Stop();
-  accessibility_sound_delegate_->PlayPassthroughEarcon();
+  accessibility_sound_player_->PlayPassthroughEarcon();
   SET_STATE(CORNER_PASSTHROUGH);
   return;
 }
diff --git a/chromecast/browser/accessibility/touch_exploration_controller.h b/chromecast/browser/accessibility/touch_exploration_controller.h
index d385cb3..cebfcbc5 100644
--- a/chromecast/browser/accessibility/touch_exploration_controller.h
+++ b/chromecast/browser/accessibility/touch_exploration_controller.h
@@ -12,7 +12,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/timer/timer.h"
 #include "base/values.h"
-#include "chromecast/browser/accessibility/accessibility_sound_delegate.h"
+#include "chromecast/browser/accessibility/accessibility_sound_player.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/events/event.h"
 #include "ui/events/event_rewriter.h"
@@ -164,7 +164,7 @@
   TouchExplorationController(
       aura::Window* root_window,
       TouchExplorationControllerDelegate* delegate,
-      AccessibilitySoundDelegate* accessibility_sound_delegate);
+      AccessibilitySoundPlayer* accessibility_sound_player);
   ~TouchExplorationController() override;
 
   // Make synthesized touch events are anchored at this point. This is
@@ -434,7 +434,7 @@
   TouchExplorationControllerDelegate* delegate_;
 
   // Handles earcons. Not owned.
-  AccessibilitySoundDelegate* accessibility_sound_delegate_;
+  AccessibilitySoundPlayer* accessibility_sound_player_;
 
   // A set of touch ids for fingers currently touching the screen.
   std::vector<int> current_touch_ids_;
diff --git a/chromecast/browser/accessibility/touch_exploration_controller_unittest.cc b/chromecast/browser/accessibility/touch_exploration_controller_unittest.cc
index 7b1e23b..84f71d9 100644
--- a/chromecast/browser/accessibility/touch_exploration_controller_unittest.cc
+++ b/chromecast/browser/accessibility/touch_exploration_controller_unittest.cc
@@ -91,10 +91,10 @@
   ax::mojom::Gesture last_gesture_ = ax::mojom::Gesture::kNone;
 };
 
-class MockAccessibilitySoundDelegate : public AccessibilitySoundDelegate {
+class MockAccessibilitySoundPlayer : public AccessibilitySoundPlayer {
  public:
-  MockAccessibilitySoundDelegate() {}
-  ~MockAccessibilitySoundDelegate() override {}
+  MockAccessibilitySoundPlayer() {}
+  ~MockAccessibilitySoundPlayer() override {}
 
   void PlayPassthroughEarcon() override { ++num_times_passthrough_played_; }
   void PlayExitScreenEarcon() override { ++num_times_exit_screen_played_; }
@@ -318,7 +318,7 @@
     } else if (on && !touch_exploration_controller_.get()) {
       touch_exploration_controller_.reset(
           new TouchExplorationControllerTestApi(new TouchExplorationController(
-              root_window(), &delegate_, &accessibility_sound_delegate_)));
+              root_window(), &delegate_, &accessibility_sound_player_)));
       touch_exploration_controller_->InstallRewriter(root_window());
       cursor_client()->ShowCursor();
       cursor_client()->DisableMouseEvents();
@@ -337,7 +337,7 @@
   // Checks that Corner Passthrough is working. Assumes that corner is the
   // bottom left corner or the bottom right corner.
   void AssertCornerPassthroughWorking(gfx::Point corner) {
-    ASSERT_EQ(0U, accessibility_sound_delegate_.NumPassthroughSounds());
+    ASSERT_EQ(0U, accessibility_sound_player_.NumPassthroughSounds());
 
     ui::TouchEvent first_press(
         ui::ET_TOUCH_PRESSED, corner, Now(),
@@ -355,7 +355,7 @@
     ui::TouchEvent passthrough_press(
         ui::ET_TOUCH_PRESSED, passthrough, Now(),
         ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 1));
-    ASSERT_EQ(1U, accessibility_sound_delegate_.NumPassthroughSounds());
+    ASSERT_EQ(1U, accessibility_sound_player_.NumPassthroughSounds());
     generator_->Dispatch(&passthrough_press);
     generator_->ReleaseTouchId(1);
     generator_->PressTouchId(1);
@@ -433,7 +433,7 @@
   ui::GestureDetector::Config gesture_detector_config_;
   base::SimpleTestTickClock simulated_clock_;
   MockTouchExplorationControllerDelegate delegate_;
-  MockAccessibilitySoundDelegate accessibility_sound_delegate_;
+  MockAccessibilitySoundPlayer accessibility_sound_player_;
 
  private:
   EventCapturer event_capturer_;
@@ -1788,9 +1788,9 @@
         ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 1));
 
     generator_->Dispatch(&touch_event);
-    ASSERT_EQ(1U, accessibility_sound_delegate_.NumEnterScreenSounds());
+    ASSERT_EQ(1U, accessibility_sound_player_.NumEnterScreenSounds());
     generator_->ReleaseTouchId(1);
-    accessibility_sound_delegate_.ResetCountersToZero();
+    accessibility_sound_player_.ResetCountersToZero();
   }
 }
 
@@ -1830,8 +1830,8 @@
     generator_->MoveTouch(initial_press);
     generator_->MoveTouch(*point);
     generator_->ReleaseTouch();
-    ASSERT_EQ(1U, accessibility_sound_delegate_.NumExitScreenSounds());
-    accessibility_sound_delegate_.ResetCountersToZero();
+    ASSERT_EQ(1U, accessibility_sound_player_.NumExitScreenSounds());
+    accessibility_sound_player_.ResetCountersToZero();
   }
 }
 
diff --git a/chromecast/browser/accessibility/touch_exploration_manager.cc b/chromecast/browser/accessibility/touch_exploration_manager.cc
index 9c80eca..c3996ad 100644
--- a/chromecast/browser/accessibility/touch_exploration_manager.cc
+++ b/chromecast/browser/accessibility/touch_exploration_manager.cc
@@ -7,7 +7,6 @@
 
 #include "chromecast/browser/accessibility/touch_exploration_manager.h"
 
-#include "chromecast/browser/accessibility/accessibility_sound_delegate_stub.h"
 #include "chromecast/browser/cast_browser_context.h"
 #include "chromecast/browser/cast_browser_process.h"
 #include "chromecast/common/extensions_api/accessibility_private.h"
@@ -24,13 +23,13 @@
 TouchExplorationManager::TouchExplorationManager(
     aura::Window* root_window,
     wm::ActivationClient* activation_client,
-    AccessibilityFocusRingController* accessibility_focus_ring_controller)
+    AccessibilityFocusRingController* accessibility_focus_ring_controller,
+    AccessibilitySoundPlayer* accessibility_sound_player)
     : touch_exploration_enabled_(false),
       root_window_(root_window),
       activation_client_(activation_client),
       accessibility_focus_ring_controller_(accessibility_focus_ring_controller),
-      accessibility_sound_delegate_(
-          std::make_unique<AccessibilitySoundDelegateStub>()) {
+      accessibility_sound_player_(accessibility_sound_player) {
   DCHECK(root_window);
   root_window->GetHost()->GetEventSource()->AddEventRewriter(this);
   UpdateTouchExplorationState();
@@ -109,7 +108,7 @@
     if (!touch_exploration_controller_.get()) {
       touch_exploration_controller_ =
           std::make_unique<TouchExplorationController>(root_window_, this,
-              accessibility_sound_delegate_.get());
+              accessibility_sound_player_);
     }
     if (pass_through_surface) {
       const display::Display display =
@@ -129,11 +128,5 @@
   }
 }
 
-void TouchExplorationManager::SetAccessibilitySoundDelegate(
-    std::unique_ptr<AccessibilitySoundDelegate> delegate) {
-  accessibility_sound_delegate_ = std::move(delegate);
-}
-
-
 }  // namespace shell
 }  // namespace chromecast
diff --git a/chromecast/browser/accessibility/touch_exploration_manager.h b/chromecast/browser/accessibility/touch_exploration_manager.h
index 172aed7b..31f5c5b 100644
--- a/chromecast/browser/accessibility/touch_exploration_manager.h
+++ b/chromecast/browser/accessibility/touch_exploration_manager.h
@@ -8,7 +8,7 @@
 #ifndef CHROMECAST_BROWSER_ACCESSIBILITY_TOUCH_EXPLORATION_MANAGER_H_
 #define CHROMECAST_BROWSER_ACCESSIBILITY_TOUCH_EXPLORATION_MANAGER_H_
 
-#include "chromecast/browser/accessibility/accessibility_sound_delegate.h"
+#include "chromecast/browser/accessibility/accessibility_sound_player.h"
 #include "chromecast/browser/accessibility/touch_exploration_controller.h"
 #include "chromecast/graphics/accessibility/accessibility_focus_ring_controller.h"
 #include "ui/events/event_rewriter.h"
@@ -28,7 +28,8 @@
   TouchExplorationManager(
       aura::Window* root_window,
       wm::ActivationClient* activation_client,
-      AccessibilityFocusRingController* accessibility_focus_ring_controller);
+      AccessibilityFocusRingController* accessibility_focus_ring_controller,
+      AccessibilitySoundPlayer* accessibility_sound_player);
   ~TouchExplorationManager() override;
 
   // Enable or disable touch exploration.
@@ -56,10 +57,6 @@
   // events are anchored at this point.
   void SetTouchAccessibilityAnchorPoint(const gfx::Point& anchor_point);
 
-  // Sets the delegate for earcons.
-  void SetAccessibilitySoundDelegate(
-      std::unique_ptr<AccessibilitySoundDelegate> delegate);
-
  private:
   void UpdateTouchExplorationState();
 
@@ -70,7 +67,7 @@
   aura::Window* root_window_;
   wm::ActivationClient* activation_client_;
   AccessibilityFocusRingController* accessibility_focus_ring_controller_;
-  std::unique_ptr<AccessibilitySoundDelegate> accessibility_sound_delegate_;
+  AccessibilitySoundPlayer* accessibility_sound_player_;
 
   DISALLOW_COPY_AND_ASSIGN(TouchExplorationManager);
 };
diff --git a/chromecast/browser/cast_browser_main_parts.cc b/chromecast/browser/cast_browser_main_parts.cc
index 8b574e9f..0cdddb1e 100644
--- a/chromecast/browser/cast_browser_main_parts.cc
+++ b/chromecast/browser/cast_browser_main_parts.cc
@@ -230,8 +230,8 @@
 #if !defined(OS_ANDROID)
     // GPU shader disk cache disabling is largely to conserve disk space.
     {switches::kDisableGpuShaderDiskCache, ""},
-    // Enable audio focus by default (even on non-Android platforms).
-    {switches::kEnableAudioFocus, ""},
+    // Enable media sessions by default (even on non-Android platforms).
+    {switches::kEnableInternalMediaSession, ""},
 #endif
 #if BUILDFLAG(IS_CAST_AUDIO_ONLY)
     {switches::kDisableGpu, ""},
diff --git a/chromeos/network/managed_network_configuration_handler_impl.cc b/chromeos/network/managed_network_configuration_handler_impl.cc
index 079b266..85217d9 100644
--- a/chromeos/network/managed_network_configuration_handler_impl.cc
+++ b/chromeos/network/managed_network_configuration_handler_impl.cc
@@ -329,10 +329,11 @@
 
   // Validate the ONC dictionary. We are liberal and ignore unknown field
   // names. User settings are only partial ONC, thus we ignore missing fields.
-  onc::Validator validator(false,  // Ignore unknown fields.
-                           false,  // Ignore invalid recommended field names.
-                           false,  // Ignore missing fields.
-                           false);  // This ONC does not come from policy.
+  onc::Validator validator(false,   // Ignore unknown fields.
+                           false,   // Ignore invalid recommended field names.
+                           false,   // Ignore missing fields.
+                           false,   // This ONC does not come from policy.
+                           false);  // Don't log warnings.
 
   onc::Validator::Result validation_result;
   std::unique_ptr<base::DictionaryValue> validated_user_settings =
@@ -405,7 +406,8 @@
   onc::Validator validator(false,   // Ignore unknown fields.
                            false,   // Ignore invalid recommended field names.
                            false,   // Ignore missing fields.
-                           false);  // This ONC does not come from policy.
+                           false,   // This ONC does not come from policy.
+                           false);  // Don't log warnings.
 
   onc::Validator::Result validation_result;
   std::unique_ptr<base::DictionaryValue> validated_properties =
diff --git a/chromeos/network/managed_network_configuration_handler_unittest.cc b/chromeos/network/managed_network_configuration_handler_unittest.cc
index d33f6ad..576b9858 100644
--- a/chromeos/network/managed_network_configuration_handler_unittest.cc
+++ b/chromeos/network/managed_network_configuration_handler_unittest.cc
@@ -156,10 +156,11 @@
                               base::Value::Type::LIST);
     if (found_network_configs) {
       for (const auto& network_config : found_network_configs->GetList()) {
-        onc::Validator validator(true,   // error_on_unknown_field
-                                 true,   // error_on_wrong_recommended
-                                 false,  // error_on_missing_field
-                                 true);  // managed_onc
+        onc::Validator validator(true,    // error_on_unknown_field
+                                 true,    // error_on_wrong_recommended
+                                 false,   // error_on_missing_field
+                                 true,    // managed_onc
+                                 false);  // log_warnings
         validator.SetOncSource(onc_source);
         onc::Validator::Result validation_result;
         std::unique_ptr<base::DictionaryValue> validated_network_config =
diff --git a/chromeos/network/onc/onc_utils.cc b/chromeos/network/onc/onc_utils.cc
index 26259ea..df75587 100644
--- a/chromeos/network/onc/onc_utils.cc
+++ b/chromeos/network/onc/onc_utils.cc
@@ -936,7 +936,8 @@
   Validator validator(false,  // Ignore unknown fields.
                       false,  // Ignore invalid recommended field names.
                       true,   // Fail on missing fields.
-                      from_policy);
+                      from_policy,
+                      true);  // Log warnings.
   validator.SetOncSource(onc_source);
 
   Validator::Result validation_result;
diff --git a/chromeos/network/onc/onc_validator.cc b/chromeos/network/onc/onc_validator.cc
index 94e4ca0..1045a6a 100644
--- a/chromeos/network/onc/onc_validator.cc
+++ b/chromeos/network/onc/onc_validator.cc
@@ -49,11 +49,13 @@
 Validator::Validator(bool error_on_unknown_field,
                      bool error_on_wrong_recommended,
                      bool error_on_missing_field,
-                     bool managed_onc)
+                     bool managed_onc,
+                     bool log_warnings)
     : error_on_unknown_field_(error_on_unknown_field),
       error_on_wrong_recommended_(error_on_wrong_recommended),
       error_on_missing_field_(error_on_missing_field),
       managed_onc_(managed_onc),
+      log_warnings_(log_warnings),
       onc_source_(::onc::ONC_SOURCE_NONE) {}
 
 Validator::~Validator() = default;
@@ -64,14 +66,13 @@
     Result* result) {
   CHECK(object_signature);
   *result = VALID;
-  error_or_warning_found_ = false;
   bool error = false;
   std::unique_ptr<base::Value> result_value =
       MapValue(*object_signature, onc_object, &error);
   if (error) {
     *result = INVALID;
     result_value.reset();
-  } else if (error_or_warning_found_) {
+  } else if (!validation_issues_.empty()) {
     *result = VALID_WITH_WARNINGS;
   }
   // The return value should be NULL if, and only if, |result| equals INVALID.
@@ -84,12 +85,12 @@
     const base::Value& onc_value,
     bool* error) {
   if (onc_value.type() != signature.onc_type) {
-    LOG(ERROR) << MessageHeader() << "Found value '" << onc_value
-               << "' of type '" << base::Value::GetTypeName(onc_value.type())
-               << "', but type '"
-               << base::Value::GetTypeName(signature.onc_type)
-               << "' is required.";
-    error_or_warning_found_ = *error = true;
+    *error = true;
+    std::ostringstream msg;
+    msg << "Found value of type '" << base::Value::GetTypeName(onc_value.type())
+        << "', but type '" << base::Value::GetTypeName(signature.onc_type)
+        << "' is required.";
+    AddValidationIssue(true /* is_error */, msg.str());
     return std::unique_ptr<base::Value>();
   }
 
@@ -152,8 +153,8 @@
   if (valid)
     return repaired;
 
-  DCHECK(error_or_warning_found_);
-  error_or_warning_found_ = *error = true;
+  DCHECK(!validation_issues_.empty());
+  *error = true;
   return std::unique_ptr<base::DictionaryValue>();
 }
 
@@ -172,13 +173,10 @@
   path_.pop_back();
 
   if (current_field_unknown) {
-    error_or_warning_found_ = *found_unknown_field = true;
-    std::string message = MessageHeader() + "Field name '" + field_name +
-        "' is unknown.";
-    if (error_on_unknown_field_)
-      LOG(ERROR) << message;
-    else
-      LOG(WARNING) << message;
+    *found_unknown_field = true;
+    std::ostringstream msg;
+    msg << "Field name '" << field_name << "' is unknown.";
+    AddValidationIssue(error_on_unknown_field_, msg.str());
   }
 
   return result;
@@ -207,12 +205,19 @@
     const OncValueSignature& signature,
     const base::Value& onc_value,
     bool* error) {
-  std::string str = base::IntToString(index);
-  path_.push_back(str);
+  std::string index_as_string = base::IntToString(index);
+  path_.push_back(index_as_string);
   std::unique_ptr<base::Value> result =
       Mapper::MapEntry(index, signature, onc_value, error);
-  DCHECK_EQ(str, path_.back());
+  DCHECK_EQ(index_as_string, path_.back());
   path_.pop_back();
+  if (!result.get() && (&signature == &kNetworkConfigurationSignature ||
+                        &signature == &kCertificateSignature)) {
+    std::ostringstream msg;
+    msg << "Entry at index '" << index_as_string
+        << "' has been removed because it contained errors.";
+    AddValidationIssue(false /* is_error */, msg.str());
+  }
   return result;
 }
 
@@ -252,10 +257,10 @@
   DCHECK(recommended_list);  // The types of field values are already verified.
 
   if (!managed_onc_) {
-    error_or_warning_found_ = true;
-    LOG(WARNING) << MessageHeader() << "Found the field '"
-                 << ::onc::kRecommended
-                 << "' in an unmanaged ONC. Removing it.";
+    std::ostringstream msg;
+    msg << "Found the field '" << ::onc::kRecommended
+        << "' in an unmanaged ONC";
+    AddValidationIssue(false /* is_error */, msg.str());
     return true;
   }
 
@@ -282,17 +287,14 @@
     }
 
     if (found_error) {
-      error_or_warning_found_ = true;
       path_.push_back(::onc::kRecommended);
-      std::string message = MessageHeader() + "The " + error_cause +
-          " field '" + field_name + "' cannot be recommended.";
+      std::ostringstream msg;
+      msg << "The " << error_cause << " field '" << field_name
+          << "' cannot be recommended.";
+      AddValidationIssue(error_on_wrong_recommended_, msg.str());
       path_.pop_back();
-      if (error_on_wrong_recommended_) {
-        LOG(ERROR) << message;
+      if (error_on_wrong_recommended_)
         return false;
-      }
-
-      LOG(WARNING) << message;
       continue;
     }
 
@@ -340,8 +342,9 @@
                                  const std::string& field_name) {
   if (result->HasKey(field_name)) {
     if (onc_source_ != ::onc::ONC_SOURCE_DEVICE_POLICY) {
-      error_or_warning_found_ = true;
-      LOG(ERROR) << field_name << " only allowed in device policy.";
+      std::ostringstream msg;
+      msg << "Field '" << field_name << "' is only allowed in a device policy.";
+      AddValidationIssue(true /* is_error */, msg.str());
       return false;
     }
   }
@@ -354,11 +357,11 @@
     if (field_value == it)
       return true;
   }
-  error_or_warning_found_ = true;
-  const std::string valid_values_str =
-      "[" + JoinStringRange(valid_values, ", ") + "]";
-  LOG(ERROR) << MessageHeader() << "Found value '" << field_value
-             << "', but expected one of the values " << valid_values_str;
+
+  std::ostringstream msg;
+  msg << "Found value '" << field_value << "', but expected one of the values ["
+      << JoinStringRange(valid_values, ", ") << "]";
+  AddValidationIssue(true /* is_error */, msg.str());
   return false;
 }
 
@@ -385,12 +388,14 @@
       (lower_bound <= actual_value && actual_value <= upper_bound)) {
     return false;
   }
-  error_or_warning_found_ = true;
+
   path_.push_back(field_name);
-  LOG(ERROR) << MessageHeader() << "Found value '" << actual_value
-             << "', but expected a value in the range [" << lower_bound
-             << ", " << upper_bound << "] (boundaries inclusive)";
+  std::ostringstream msg;
+  msg << "Found value '" << actual_value
+      << "', but expected a value in the range [" << lower_bound << ", "
+      << upper_bound << "] (boundaries inclusive)";
   path_.pop_back();
+  AddValidationIssue(true /* is_error */, msg.str());
   return true;
 }
 
@@ -413,11 +418,24 @@
     return false;
   }
 
-  error_or_warning_found_ = true;
   path_.push_back(field_name);
-  LOG(ERROR) << MessageHeader() << "Found an empty string, but expected a "
-             << "non-empty string.";
+  std::ostringstream msg;
+  msg << "Found an empty string, but expected a non-empty string.";
   path_.pop_back();
+  AddValidationIssue(true /* is_error */, msg.str());
+  return true;
+}
+
+bool Validator::OnlyOneFieldSet(const base::DictionaryValue& object,
+                                const std::string& field_name1,
+                                const std::string& field_name2) {
+  if (object.HasKey(field_name1) && object.HasKey(field_name2)) {
+    std::ostringstream msg;
+    msg << "At most one of '" << field_name1 << "' and '" << field_name2
+        << "' can be set.";
+    AddValidationIssue(true /* is_error */, msg.str());
+    return false;
+  }
   return true;
 }
 
@@ -445,22 +463,25 @@
 }
 
 bool Validator::ValidateSSIDAndHexSSID(base::DictionaryValue* object) {
+  const std::string kInvalidLength = "Invalid length";
+
   // Check SSID validity.
   std::string ssid_string;
   if (object->GetStringWithoutPathExpansion(::onc::wifi::kSSID, &ssid_string) &&
       (ssid_string.size() <= 0 ||
        ssid_string.size() > kMaximumSSIDLengthInBytes)) {
-    error_or_warning_found_ = true;
-    const std::string msg =
-        MessageHeader() + ::onc::wifi::kSSID + " has an invalid length.";
+    path_.push_back(::onc::wifi::kSSID);
+    std::ostringstream msg;
+    msg << kInvalidLength;
+    path_.pop_back();
     // If the HexSSID field is present, ignore errors in SSID because these
     // might be caused by the usage of a non-UTF-8 encoding when the SSID
     // field was automatically added (see FillInHexSSIDField).
     if (!object->HasKey(::onc::wifi::kHexSSID)) {
-      LOG(ERROR) << msg;
+      AddValidationIssue(true /* is_error */, msg.str());
       return false;
     }
-    LOG(WARNING) << msg;
+    AddValidationIssue(false /* is_error */, msg.str());
   }
 
   // Check HexSSID validity.
@@ -469,17 +490,20 @@
                                             &hex_ssid_string)) {
     std::vector<uint8_t> decoded_ssid;
     if (!base::HexStringToBytes(hex_ssid_string, &decoded_ssid)) {
-      LOG(ERROR) << MessageHeader() << "Field " << ::onc::wifi::kHexSSID
-                 << " is not a valid hex representation: \"" << hex_ssid_string
-                 << "\"";
-      error_or_warning_found_ = true;
+      path_.push_back(::onc::wifi::kHexSSID);
+      std::ostringstream msg;
+      msg << "Not a valid hex representation: '" << hex_ssid_string << "'";
+      path_.pop_back();
+      AddValidationIssue(true /* is_error */, msg.str());
       return false;
     }
     if (decoded_ssid.size() <= 0 ||
         decoded_ssid.size() > kMaximumSSIDLengthInBytes) {
-      LOG(ERROR) << MessageHeader() << ::onc::wifi::kHexSSID
-                 << " has an invalid length.";
-      error_or_warning_found_ = true;
+      path_.push_back(::onc::wifi::kHexSSID);
+      std::ostringstream msg;
+      msg << kInvalidLength;
+      path_.pop_back();
+      AddValidationIssue(true /* is_error */, msg.str());
       return false;
     }
 
@@ -490,11 +514,12 @@
       std::string decoded_ssid_string(
           reinterpret_cast<const char*>(&decoded_ssid[0]), decoded_ssid.size());
       if (ssid_string != decoded_ssid_string) {
-        LOG(WARNING) << MessageHeader() << "Fields " << ::onc::wifi::kSSID
-                     << " and " << ::onc::wifi::kHexSSID
-                     << " contain inconsistent values. Removing "
-                     << ::onc::wifi::kSSID << ".";
-        error_or_warning_found_ = true;
+        path_.push_back(::onc::wifi::kSSID);
+        std::ostringstream msg;
+        msg << "Fields '" << ::onc::wifi::kSSID << "' and '"
+            << ::onc::wifi::kHexSSID << "' contain inconsistent values.";
+        path_.pop_back();
+        AddValidationIssue(false /* is_error */, msg.str());
         object->RemoveWithoutPathExpansion(::onc::wifi::kSSID, nullptr);
       }
     }
@@ -506,25 +531,24 @@
                              const std::string& field_name) {
   if (dict.HasKey(field_name))
     return true;
-  std::string message = MessageHeader() + "The required field '" + field_name +
-      "' is missing.";
-  if (error_on_missing_field_) {
-    error_or_warning_found_ = true;
-    LOG(ERROR) << message;
-  } else {
-    VLOG(1) << message;
-  }
+
+  std::ostringstream msg;
+  msg << "The required field '" << field_name << "' is missing.";
+  AddValidationIssue(error_on_missing_field_, msg.str());
   return false;
 }
 
 bool Validator::CheckGuidIsUniqueAndAddToSet(const base::DictionaryValue& dict,
                                              const std::string& key_guid,
-                                             std::set<std::string> *guids) {
+                                             std::set<std::string>* guids) {
   std::string guid;
   if (dict.GetStringWithoutPathExpansion(key_guid, &guid)) {
     if (guids->count(guid) != 0) {
-      error_or_warning_found_ = true;
-      LOG(ERROR) << MessageHeader() << "Found a duplicate GUID " << guid << ".";
+      path_.push_back(key_guid);
+      std::ostringstream msg;
+      msg << "Found a duplicate GUID '" << guid << "'.";
+      path_.pop_back();
+      AddValidationIssue(true /* is_error */, msg.str());
       return false;
     }
     guids->insert(guid);
@@ -536,9 +560,10 @@
     const base::DictionaryValue& onc_object) {
   if (onc_source_ == ::onc::ONC_SOURCE_USER_IMPORT &&
       onc_object.HasKey(::onc::toplevel_config::kGlobalNetworkConfiguration)) {
-    error_or_warning_found_ = true;
-    LOG(ERROR) << MessageHeader() << "GlobalNetworkConfiguration is prohibited "
-               << "in ONC user imports";
+    std::ostringstream msg;
+    msg << "Field '" << ::onc::toplevel_config::kGlobalNetworkConfiguration
+        << "' is prohibited in ONC user imports";
+    AddValidationIssue(true /* is_error */, msg.str());
     return true;
   }
   return false;
@@ -609,9 +634,10 @@
     if (onc_source_ == ::onc::ONC_SOURCE_DEVICE_POLICY && !type.empty() &&
         type != ::onc::network_type::kWiFi &&
         type != ::onc::network_type::kEthernet) {
-      error_or_warning_found_ = true;
-      LOG(ERROR) << MessageHeader() << "Networks of type '"
-                 << type << "' are prohibited in ONC device policies.";
+      std::ostringstream msg;
+      msg << "Networks of type '" << type
+          << "' are prohibited in ONC device policies.";
+      AddValidationIssue(true /* is_error */, msg.str());
       return false;
     }
 
@@ -751,12 +777,8 @@
     return false;
   }
 
-  if (result->HasKey(kServerCARefs) && result->HasKey(kServerCARef)) {
-    error_or_warning_found_ = true;
-    LOG(ERROR) << MessageHeader() << "At most one of " << kServerCARefs
-               << " and " << kServerCARef << " can be set.";
+  if (!OnlyOneFieldSet(*result, kServerCARefs, kServerCARef))
     return false;
-  }
 
   if (!ValidateClientCertFields(false,  // don't allow ClientCertType None
                                 result)) {
@@ -773,19 +795,16 @@
         RequireField(*result, ::onc::client_cert::kClientCertType);
     if (!has_server_ca_cert) {
       all_required_exist = false;
-      error_or_warning_found_ = true;
-      std::string message = MessageHeader() + "The required field '" +
-                            kServerCARefs + "' is missing.";
-      if (error_on_missing_field_)
-        LOG(ERROR) << message;
-      else
-        LOG(WARNING) << message;
+      std::ostringstream msg;
+      msg << "The required field '" << kServerCARefs << "' is missing.";
+      AddValidationIssue(error_on_missing_field_, msg.str());
     }
   } else if (has_server_ca_cert) {
-    error_or_warning_found_ = true;
-    LOG(ERROR) << MessageHeader() << kServerCARefs << " (or " << kServerCARef
-               << ") can only be set if " << kAuthenticationType
-               << " is set to " << kCert << ".";
+    std::ostringstream msg;
+    msg << "Field '" << kServerCARefs << "' (or '" << kServerCARef
+        << "') can only be set if '" << kAuthenticationType << "' is set to '"
+        << kCert << "'.";
+    AddValidationIssue(true /* is_error */, msg.str());
     return false;
   }
 
@@ -852,12 +871,8 @@
     }
   }
 
-  if (result->HasKey(kServerCARefs) && result->HasKey(kServerCARef)) {
-    error_or_warning_found_ = true;
-    LOG(ERROR) << MessageHeader() << "At most one of " << kServerCARefs
-               << " and " << kServerCARef << " can be set.";
+  if (!OnlyOneFieldSet(*result, kServerCARefs, kServerCARef))
     return false;
-  }
 
   if (!ValidateClientCertFields(true /* allow ClientCertType None */, result))
     return false;
@@ -903,15 +918,11 @@
   bool all_required_exist = true;
   if (!result->HasKey(kSubject) && !result->HasKey(kIssuer) &&
       !result->HasKey(kIssuerCARef)) {
-    error_or_warning_found_ = true;
     all_required_exist = false;
-    std::string message = MessageHeader() + "None of the fields '" + kSubject +
-        "', '" + kIssuer + "', and '" + kIssuerCARef +
-        "' is present, but at least one is required.";
-    if (error_on_missing_field_)
-      LOG(ERROR) << message;
-    else
-      LOG(WARNING) << message;
+    std::ostringstream msg;
+    msg << "None of the fields '" << kSubject << "', '" << kIssuer << "', and '"
+        << kIssuerCARef << "' is present, but at least one is required.";
+    AddValidationIssue(error_on_missing_field_, msg.str());
   }
 
   return !error_on_missing_field_ || all_required_exist;
@@ -988,12 +999,8 @@
     return false;
   }
 
-  if (result->HasKey(kServerCARefs) && result->HasKey(kServerCARef)) {
-    error_or_warning_found_ = true;
-    LOG(ERROR) << MessageHeader() << "At most one of " << kServerCARefs
-               << " and " << kServerCARef << " can be set.";
+  if (!OnlyOneFieldSet(*result, kServerCARefs, kServerCARef))
     return false;
-  }
 
   if (!ValidateClientCertFields(true /* allow ClientCertType None */, result))
     return false;
@@ -1023,9 +1030,11 @@
   bool remove = false;
   result->GetBooleanWithoutPathExpansion(::onc::kRemove, &remove);
   if (remove) {
-    error_or_warning_found_ = true;
-    LOG(ERROR) << MessageHeader()
-               << "Removal of certificates is not supported.";
+    path_.push_back(::onc::kRemove);
+    std::ostringstream msg;
+    msg << "Removal of certificates is not supported.";
+    path_.pop_back();
+    AddValidationIssue(true /* is_error */, msg.str());
     return false;
   }
 
@@ -1042,43 +1051,33 @@
 bool Validator::ValidateTether(base::DictionaryValue* result) {
   using namespace ::onc::tether;
 
-  int battery_percentage;
-  if (!result->GetIntegerWithoutPathExpansion(kBatteryPercentage,
-                                              &battery_percentage) ||
-      battery_percentage < 0 || battery_percentage > 100) {
-    // Battery percentage must be present and within [0, 100].
-    error_or_warning_found_ = true;
-    return false;
-  }
-
-  int signal_strength;
-  if (!result->GetIntegerWithoutPathExpansion(kSignalStrength,
-                                              &signal_strength) ||
-      signal_strength < 0 || signal_strength > 100) {
-    // Signal strength must be present and within [0, 100].
-    error_or_warning_found_ = true;
-    return false;
-  }
-
-  std::string carrier = GetStringFromDict(*result, kCarrier);
-  if (carrier.empty()) {
-    // Carrier must be a non-empty string.
-    error_or_warning_found_ = true;
+  if (FieldExistsAndIsNotInRange(*result, kBatteryPercentage, 0, 100) ||
+      FieldExistsAndIsNotInRange(*result, kSignalStrength, 0, 100) ||
+      FieldExistsAndIsEmpty(*result, kCarrier)) {
     return false;
   }
 
   bool all_required_exist = RequireField(*result, kHasConnectedToHost);
-  if (!all_required_exist) {
-    error_or_warning_found_ = true;
-  }
+  all_required_exist &= RequireField(*result, kBatteryPercentage);
+  all_required_exist &= RequireField(*result, kSignalStrength);
+  all_required_exist &= RequireField(*result, kCarrier);
 
   return !error_on_missing_field_ || all_required_exist;
 }
 
-std::string Validator::MessageHeader() {
-  std::string path = path_.empty() ? "toplevel" : base::JoinString(path_, ".");
-  std::string message = "At " + path + ": ";
-  return message;
+void Validator::AddValidationIssue(bool is_error,
+                                   const std::string& debug_info) {
+  std::ostringstream msg;
+  msg << (is_error ? "ERROR: " : "WARNING: ") << debug_info << " (at "
+      << (path_.empty() ? "toplevel" : base::JoinString(path_, ".")) << ")";
+  std::string message = msg.str();
+
+  if (is_error)
+    LOG(ERROR) << message;
+  else if (log_warnings_)
+    LOG(WARNING) << message;
+
+  validation_issues_.push_back({is_error, message});
 }
 
 }  // namespace onc
diff --git a/chromeos/network/onc/onc_validator.h b/chromeos/network/onc/onc_validator.h
index cb457e1b..cfcccb5 100644
--- a/chromeos/network/onc/onc_validator.h
+++ b/chromeos/network/onc/onc_validator.h
@@ -64,11 +64,22 @@
     INVALID
   };
 
+  struct ValidationIssue {
+    // If true, the ONC value does not adhere to the specification and may be
+    // rejected.
+    bool is_error;
+
+    // Detailed description containing the error/warning type and specific
+    // location (path).
+    std::string message;
+  };
+
   // See the class comment.
   Validator(bool error_on_unknown_field,
             bool error_on_wrong_recommended,
             bool error_on_missing_field,
-            bool managed_onc);
+            bool managed_onc,
+            bool log_warnings);
 
   ~Validator() override;
 
@@ -99,6 +110,12 @@
       const base::Value& onc_object,
       Result* result);
 
+  // Returns the list of validation results that occured within validation
+  // initiated by the last call to |ValidateAndRepairObject|.
+  const std::vector<ValidationIssue>& validation_issues() const {
+    return validation_issues_;
+  }
+
  private:
   // Overridden from Mapper:
   // Compare |onc_value|s type with |onc_type| and validate/repair according to
@@ -193,6 +210,10 @@
   bool FieldExistsAndIsEmpty(const base::DictionaryValue& object,
                              const std::string& field_name);
 
+  bool OnlyOneFieldSet(const base::DictionaryValue& object,
+                       const std::string& field_name1,
+                       const std::string& field_name2);
+
   bool ListFieldContainsValidValues(
       const base::DictionaryValue& object,
       const std::string& field_name,
@@ -201,8 +222,7 @@
   bool ValidateSSIDAndHexSSID(base::DictionaryValue* object);
 
   // Returns true if |key| is a key of |dict|. Otherwise, returns false and,
-  // depending on |error_on_missing_field_|, logs a message and sets
-  // |error_or_warning_found_|.
+  // depending on |error_on_missing_field_| raises an error or a warning.
   bool RequireField(const base::DictionaryValue& dict, const std::string& key);
 
   // Returns true if the GUID is unique or if the GUID is not a string
@@ -216,12 +236,13 @@
   bool IsGlobalNetworkConfigInUserImport(
       const base::DictionaryValue& onc_object);
 
-  std::string MessageHeader();
+  void AddValidationIssue(bool is_error, const std::string& debug_info);
 
   const bool error_on_unknown_field_;
   const bool error_on_wrong_recommended_;
   const bool error_on_missing_field_;
   const bool managed_onc_;
+  const bool log_warnings_;
 
   ::onc::ONCSource onc_source_;
 
@@ -237,9 +258,9 @@
   // duplicate GUIDs.
   std::set<std::string> certificate_guids_;
 
-  // Tracks if an error or warning occurred within validation initiated by
+  // List of all validation issues that occured within validation initiated by
   // function ValidateAndRepairObject.
-  bool error_or_warning_found_;
+  std::vector<ValidationIssue> validation_issues_;
 
   DISALLOW_COPY_AND_ASSIGN(Validator);
 };
diff --git a/chromeos/network/onc/onc_validator_unittest.cc b/chromeos/network/onc/onc_validator_unittest.cc
index 8432e48..675cedb4 100644
--- a/chromeos/network/onc/onc_validator_unittest.cc
+++ b/chromeos/network/onc/onc_validator_unittest.cc
@@ -35,10 +35,20 @@
     std::unique_ptr<Validator> validator;
     if (strict) {
       // Create a strict validator that complains about every error.
-      validator.reset(new Validator(true, true, true, managed_onc));
+      validator =
+          std::make_unique<Validator>(true,  // error_on_unknown_field
+                                      true,  // error_on_wrong_recommended
+                                      true,  // error_on_missing_field,
+                                      managed_onc,  // managed_onc
+                                      true);        // log_warnings
     } else {
       // Create a liberal validator that ignores or repairs non-critical errors.
-      validator.reset(new Validator(false, false, false, managed_onc));
+      validator =
+          std::make_unique<Validator>(false,  // error_on_unknown_field
+                                      false,  // error_on_wrong_recommended
+                                      false,  // error_on_missing_field,
+                                      managed_onc,  // managed_onc
+                                      true);        // log_warnings
     }
     validator->SetOncSource(onc_source);
     original_object_ = base::DictionaryValue::From(std::move(onc_object));
@@ -252,13 +262,6 @@
   return RepairParams(strict_repaired, liberal_repaired, false);
 }
 
-// |strict_repaired| is a string to identify the object that is expected as the
-// validation result. They may either be used
-// as filenames or as dictionary keys.
-RepairParams ExpectStrictNotValid(const std::string& strict_repaired) {
-  return RepairParams(strict_repaired, std::string(), true);
-}
-
 ::std::ostream& operator<<(::std::ostream& os, const RepairParams& rp) {
   if (rp.expect_liberal_valid) {
     os << "(" << rp.location_of_strict_repaired << ", liberal is valid)";
@@ -338,39 +341,55 @@
 //                      "invalid_settings_with_repairs.json". That nested
 //                      dictionary is the expected result from liberal
 //                      validation).
-//
-// If liberal valiation is expected to return VALID and strict validation is
-// expected to be not valid:
-//  ExpectStrictNotValid(string: A fieldname in the dictionary from the file
-//                        "invalid_settings_with_repairs.json". That nested
-//                        dictionary is the expected result from strict
-//                        validation).
 
-// Strict validator returns INVALID. Liberal validator returns VALID.
+// Strict validator returns INVALID. Liberal validator returns
+// VALID_WITH_WARNINGS (unrepaired).
 INSTANTIATE_TEST_CASE_P(
-    StrictInvalidLiberalValid,
+    StrictInvalidLiberalValidWithWarnings,
     ONCValidatorTestRepairable,
     ::testing::Values(
         std::make_pair(OncParams("network-missing-required",
                                  &kNetworkConfigurationSignature,
                                  false),
-                       ExpectStrictNotValid("")),
+                       ExpectBothNotValid("", "network-missing-required")),
         std::make_pair(OncParams("network-missing-required-type",
                                  &kNetworkConfigurationSignature,
                                  false),
-                       ExpectStrictNotValid("")),
+                       ExpectBothNotValid("", "network-missing-required-type")),
         std::make_pair(OncParams("managed-network-missing-required",
                                  &kNetworkConfigurationSignature,
                                  true),
-                       ExpectStrictNotValid("")),
+                       ExpectBothNotValid("",
+                                          "managed-network-missing-required")),
         std::make_pair(OncParams("openvpn-missing-verify-x509-name",
                                  &kNetworkConfigurationSignature,
                                  false),
-                       ExpectStrictNotValid("")),
-        std::make_pair(OncParams("third-party-vpn-missing-extension-id",
-                                 &kNetworkConfigurationSignature,
-                                 false),
-                       ExpectStrictNotValid(""))));
+                       ExpectBothNotValid("",
+                                          "openvpn-missing-verify-x509-name")),
+        std::make_pair(
+            OncParams("third-party-vpn-missing-extension-id",
+                      &kNetworkConfigurationSignature,
+                      false),
+            ExpectBothNotValid("", "third-party-vpn-missing-extension-id")),
+        std::make_pair(OncParams("tether-missing-battery-percentage",
+                                 &kNetworkWithStateSignature,
+                                 true),
+                       ExpectBothNotValid("",
+                                          "tether-missing-battery-percentage")),
+        std::make_pair(OncParams("tether-missing-carrier",
+                                 &kNetworkWithStateSignature,
+                                 true),
+                       ExpectBothNotValid("", "tether-missing-carrier")),
+        std::make_pair(
+            OncParams("tether-missing-has-connected-to-host",
+                      &kNetworkWithStateSignature,
+                      true),
+            ExpectBothNotValid("", "tether-missing-has-connected-to-host")),
+        std::make_pair(OncParams("tether-missing-signal-strength",
+                                 &kNetworkWithStateSignature,
+                                 true),
+                       ExpectBothNotValid("",
+                                          "tether-missing-signal-strength"))));
 
 // Strict validator returns INVALID. Liberal validator repairs.
 INSTANTIATE_TEST_CASE_P(
@@ -544,10 +563,6 @@
                                  &kNetworkConfigurationSignature,
                                  false),
                        ExpectBothNotValid("", "")),
-        std::make_pair(OncParams("tether-missing-battery-percentage",
-                                 &kNetworkWithStateSignature,
-                                 true),
-                       ExpectBothNotValid("", "")),
         std::make_pair(OncParams("tether-negative-battery",
                                  &kNetworkWithStateSignature,
                                  true),
@@ -556,18 +571,6 @@
                                  &kNetworkWithStateSignature,
                                  true),
                        ExpectBothNotValid("", "")),
-        std::make_pair(OncParams("tether-missing-carrier",
-                                 &kNetworkWithStateSignature,
-                                 true),
-                       ExpectBothNotValid("", "")),
-        std::make_pair(OncParams("tether-missing-has-connected-to-host",
-                                 &kNetworkWithStateSignature,
-                                 true),
-                       ExpectBothNotValid("", "")),
-        std::make_pair(OncParams("tether-missing-signal-strength",
-                                 &kNetworkWithStateSignature,
-                                 true),
-                       ExpectBothNotValid("", "")),
         std::make_pair(OncParams("tether-negative-signal-strength",
                                  &kNetworkWithStateSignature,
                                  true),
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc
index bd9b46f..af25db38 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.cc
+++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -37,8 +37,11 @@
 namespace chromeos {
 namespace assistant {
 
-const char kWiFiDeviceSettingId[] = "WIFI";
-const char kBluetoothDeviceSettingId[] = "BLUETOOTH";
+constexpr char kWiFiDeviceSettingId[] = "WIFI";
+constexpr char kBluetoothDeviceSettingId[] = "BLUETOOTH";
+constexpr char kVolumeLevelDeviceSettingId[] = "VOLUME_LEVEL";
+
+constexpr float kDefaultVolumeStep = 0.1f;
 
 AssistantManagerServiceImpl::AssistantManagerServiceImpl(
     service_manager::Connector* connector,
@@ -409,6 +412,11 @@
           weak_factory_.GetWeakPtr(), speech_level));
 }
 
+void LogUnsupportedChange(api::client_op::ModifySettingArgs args) {
+  LOG(ERROR) << "Unsupported change operation: " << args.change()
+             << " for setting " << args.setting_id();
+}
+
 void HandleOnOffChange(api::client_op::ModifySettingArgs modify_setting_args,
                        std::function<void(bool)> on_off_handler) {
   switch (modify_setting_args.change()) {
@@ -419,16 +427,79 @@
       on_off_handler(false);
       return;
 
+    // Currently there are no use-cases for toggling.  This could change in the
+    // future.
     case api::client_op::ModifySettingArgs_Change_TOGGLE:
+      break;
+
+    case api::client_op::ModifySettingArgs_Change_SET:
     case api::client_op::ModifySettingArgs_Change_INCREASE:
     case api::client_op::ModifySettingArgs_Change_DECREASE:
-    case api::client_op::ModifySettingArgs_Change_SET:
     case api::client_op::ModifySettingArgs_Change_UNSPECIFIED:
+      // This shouldn't happen.
       break;
   }
-  DLOG(ERROR) << "Unsupported change operation: "
-              << modify_setting_args.change() << " for setting "
-              << modify_setting_args.setting_id();
+  LogUnsupportedChange(modify_setting_args);
+}
+
+void HandleValueChange(
+    api::client_op::ModifySettingArgs modify_setting_args,
+    std::function<void(double, api::client_op::ModifySettingArgs_Unit)>
+        set_value_handler,
+    std::function<void(bool, double, api::client_op::ModifySettingArgs_Unit)>
+        incr_decr_handler) {
+  switch (modify_setting_args.change()) {
+    case api::client_op::ModifySettingArgs_Change_SET:
+      set_value_handler(modify_setting_args.numeric_value(),
+                        modify_setting_args.unit());
+      return;
+
+    case api::client_op::ModifySettingArgs_Change_INCREASE:
+      incr_decr_handler(true, modify_setting_args.numeric_value(),
+                        modify_setting_args.unit());
+      return;
+
+    case api::client_op::ModifySettingArgs_Change_DECREASE:
+      incr_decr_handler(false, modify_setting_args.numeric_value(),
+                        modify_setting_args.unit());
+      return;
+
+    case api::client_op::ModifySettingArgs_Change_ON:
+    case api::client_op::ModifySettingArgs_Change_OFF:
+    case api::client_op::ModifySettingArgs_Change_TOGGLE:
+    case api::client_op::ModifySettingArgs_Change_UNSPECIFIED:
+      // This shouldn't happen.
+      break;
+  }
+  LogUnsupportedChange(modify_setting_args);
+}
+
+// Helper function that converts a volume value sent from the server, either
+// absolute or a delta, from a given unit (e.g., STEP), to a percentage.
+double ConvertVolumeValueToPercent(double value,
+                                   api::client_op::ModifySettingArgs_Unit unit,
+                                   double default_value) {
+  switch (unit) {
+    case api::client_op::ModifySettingArgs_Unit_RANGE:
+      // "set volume to 20%".
+      return value;
+    case api::client_op::ModifySettingArgs_Unit_STEP:
+      // "set volume to 20".  Treat the step as a percentage.
+      return value / 100.0f;
+
+    // Currently, factor (e.g., 'double the volume') and decibel units aren't
+    // handled by the backend.  This could change in the future.
+    case api::client_op::ModifySettingArgs_Unit_FACTOR:
+    case api::client_op::ModifySettingArgs_Unit_DECIBEL:
+      break;
+
+    case api::client_op::ModifySettingArgs_Unit_NATIVE:
+    case api::client_op::ModifySettingArgs_Unit_UNKNOWN_UNIT:
+      // This shouldn't happen.
+      break;
+  }
+  LOG(ERROR) << "Unsupported volume unit: " << unit;
+  return default_value;
 }
 
 void AssistantManagerServiceImpl::OnModifySettingsAction(
@@ -448,6 +519,34 @@
       this->service_->device_actions()->SetBluetoothEnabled(enabled);
     });
   }
+
+  if (modify_setting_args.setting_id() == kVolumeLevelDeviceSettingId) {
+    assistant_client::VolumeControl& volume_control =
+        this->platform_api_.GetAudioOutputProvider().GetVolumeControl();
+
+    HandleValueChange(
+        modify_setting_args,
+        [&volume_control](double value,
+                          api::client_op::ModifySettingArgs_Unit unit) {
+          // For unsupported units, set the volume to the current volume, for
+          // visual feedback.
+          float new_volume = ConvertVolumeValueToPercent(
+              value, unit, volume_control.GetSystemVolume());
+          volume_control.SetSystemVolume(new_volume, true);
+        },
+        [&volume_control](bool incr, double value,
+                          api::client_op::ModifySettingArgs_Unit unit) {
+          float volume = volume_control.GetSystemVolume();
+          float step = kDefaultVolumeStep;
+          if (value != 0.0f) {
+            // For unsupported units, use the default step percentage.
+            step = ConvertVolumeValueToPercent(value, unit, step);
+          }
+          float new_volume = incr ? std::min(volume + step, 1.0f)
+                                  : std::max(volume - step, 0.0f);
+          volume_control.SetSystemVolume(new_volume, true);
+        });
+  }
 }
 
 ActionModule::Result AssistantManagerServiceImpl::HandleModifySettingClientOp(
@@ -464,7 +563,8 @@
     const std::string& setting_id) {
   DVLOG(2) << "IsSettingSupported=" << setting_id;
   return (setting_id == kWiFiDeviceSettingId ||
-          setting_id == kBluetoothDeviceSettingId);
+          setting_id == kBluetoothDeviceSettingId ||
+          setting_id == kVolumeLevelDeviceSettingId);
 }
 
 bool AssistantManagerServiceImpl::SupportsModifySettings() {
diff --git a/chromeos/services/assistant/platform/audio_output_provider_impl.cc b/chromeos/services/assistant/platform/audio_output_provider_impl.cc
index 2e5fba90..1562d2d 100644
--- a/chromeos/services/assistant/platform/audio_output_provider_impl.cc
+++ b/chromeos/services/assistant/platform/audio_output_provider_impl.cc
@@ -16,22 +16,22 @@
 
 constexpr int kNumberOfBuffersPerSec = 10;
 
-int32_t GetBytesPerFrame(const assistant_client::OutputStreamFormat& format) {
-  int bytes = 0;
+int32_t GetBytesPerSample(const assistant_client::OutputStreamFormat& format) {
   switch (format.encoding) {
     case assistant_client::OutputStreamEncoding::STREAM_PCM_S16:
-      bytes = 2;
-      break;
+      return 2;
     case assistant_client::OutputStreamEncoding::STREAM_PCM_S32:
     case assistant_client::OutputStreamEncoding::STREAM_PCM_F32:
-      bytes = 4;
-      break;
+      return 4;
     default:
-      NOTREACHED();
       break;
   }
-  DCHECK(bytes);
-  return bytes * format.pcm_num_channels;
+  NOTREACHED();
+  return 1;
+}
+
+int32_t GetBytesPerFrame(const assistant_client::OutputStreamFormat& format) {
+  return GetBytesPerSample(format) * format.pcm_num_channels;
 }
 
 int32_t GetBufferSizeInBytesFromBufferFormat(
@@ -73,8 +73,9 @@
     const assistant_client::OutputStreamFormat& output_format,
     int num_bytes) {
   int bytes_per_frame = GetBytesPerFrame(output_format);
+  int bytes_per_sample = GetBytesPerSample(output_format);
   int frames = num_bytes / bytes_per_frame;
-  fifo->Push(data.data(), frames, bytes_per_frame);
+  fifo->Push(data.data(), frames, bytes_per_sample);
 }
 
 class AudioOutputImpl : public assistant_client::AudioOutput {
@@ -278,7 +279,23 @@
     // very beginning.
     return 0;
   }
-  audio_fifo_->Consume()->CopyTo(dest);
+
+  int available_frames = audio_fifo_->GetAvailableFrames();
+  if (available_frames < dest->frames()) {
+    // audio_fifo_->Consume() returns a whole audio bus. In our case,
+    // bus->frames() == dest->frames(). If there aren't enough frames to fill
+    // the bus, the rest of it would be garbage data. In such case,
+    // audio_fifo_->GetAvailableFrames() < dest->frames(). We use
+    // bus->CopyPartialFrames() to only copy the valid frames and zero out
+    // the rest to avoid playing the garbage.
+    const media::AudioBus* bus = audio_fifo_->Consume();
+
+    DCHECK(available_frames <= bus->frames());
+
+    bus->CopyPartialFramesTo(0, available_frames, 0, dest);
+  } else {
+    audio_fifo_->Consume()->CopyTo(dest);
+  }
   ScheduleFillLocked(base::TimeTicks::Now());
   return dest->frames();
 }
diff --git a/chromeos/test/data/network/invalid_settings_with_repairs.json b/chromeos/test/data/network/invalid_settings_with_repairs.json
index f2f2540..fc11558 100644
--- a/chromeos/test/data/network/invalid_settings_with_repairs.json
+++ b/chromeos/test/data/network/invalid_settings_with_repairs.json
@@ -426,7 +426,7 @@
       "Tether": {
         "BatteryPercentage": 85,
         "Carrier": "Project Fi",
-        "SignalStrength": 101
+        "SignalStrength": 75
       }
     },
     "tether-missing-signal-strength": {
diff --git a/components/autofill/content/browser/BUILD.gn b/components/autofill/content/browser/BUILD.gn
index 877af89..0d8a0b4 100644
--- a/components/autofill/content/browser/BUILD.gn
+++ b/components/autofill/content/browser/BUILD.gn
@@ -2,9 +2,10 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/jumbo.gni")
 import("//third_party/protobuf/proto_library.gni")
 
-static_library("browser") {
+jumbo_static_library("browser") {
   sources = [
     "content_autofill_driver.cc",
     "content_autofill_driver.h",
diff --git a/components/autofill/content/renderer/BUILD.gn b/components/autofill/content/renderer/BUILD.gn
index 21feadfe..d9cc886 100644
--- a/components/autofill/content/renderer/BUILD.gn
+++ b/components/autofill/content/renderer/BUILD.gn
@@ -2,7 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-static_library("renderer") {
+import("//build/config/jumbo.gni")
+
+jumbo_static_library("renderer") {
   sources = [
     "autofill_agent.cc",
     "autofill_agent.h",
@@ -63,7 +65,7 @@
   configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
 }
 
-static_library("test_support") {
+jumbo_static_library("test_support") {
   testonly = true
   sources = [
     "test_password_autofill_agent.cc",
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc
index 3542d614..759abc4 100644
--- a/components/autofill/content/renderer/autofill_agent.cc
+++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -194,6 +194,9 @@
 }
 
 void AutofillAgent::DidChangeScrollOffset() {
+  if (element_.IsNull())
+    return;
+
   if (!focus_requires_scroll_) {
     // Post a task here since scroll offset may change during layout.
     // (https://crbug.com/804886)
@@ -210,7 +213,7 @@
 
 void AutofillAgent::DidChangeScrollOffsetImpl(
     const WebFormControlElement& element) {
-  if (element != element_ || focus_requires_scroll_ ||
+  if (element != element_ || element_.IsNull() || focus_requires_scroll_ ||
       !is_popup_possibly_visible_ || !element_.Focused())
     return;
 
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 0dc8d8c..a25bbb94 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -3,9 +3,10 @@
 # found in the LICENSE file.
 
 import("//build/config/chrome_build.gni")
+import("//build/config/jumbo.gni")
 import("//testing/libfuzzer/fuzzer_test.gni")
 
-static_library("browser") {
+jumbo_static_library("browser") {
   sources = [
     "address.cc",
     "address.h",
@@ -294,7 +295,7 @@
   configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
 }
 
-static_library("test_support") {
+jumbo_static_library("test_support") {
   testonly = true
   sources = [
     "autofill_test_utils.cc",
diff --git a/components/autofill/core/common/BUILD.gn b/components/autofill/core/common/BUILD.gn
index 46cc8538..3470d0b4 100644
--- a/components/autofill/core/common/BUILD.gn
+++ b/components/autofill/core/common/BUILD.gn
@@ -1,8 +1,9 @@
 # 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.
+import("//build/config/jumbo.gni")
 
-static_library("common") {
+jumbo_static_library("common") {
   sources = [
     "autofill_clock.cc",
     "autofill_clock.h",
diff --git a/components/cast_channel/cast_message_handler.cc b/components/cast_channel/cast_message_handler.cc
index c74f08c2..5f4815db 100644
--- a/components/cast_channel/cast_message_handler.cc
+++ b/components/cast_channel/cast_message_handler.cc
@@ -237,14 +237,11 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DVLOG(2) << __func__ << ", channel_id: " << socket.id()
            << ", message: " << CastMessageToString(message);
-
-  // TODO(crbug.com/698940): Support Observers for both kinds of messages.
   if (IsCastInternalNamespace(message.namespace_())) {
     HandleCastInternalMessage(socket, message);
   } else {
     DVLOG(2) << "Got app message from cast channel with namespace: "
              << message.namespace_();
-
     for (auto& observer : observers_)
       observer.OnAppMessage(socket.id(), message);
   }
@@ -252,7 +249,7 @@
 
 void CastMessageHandler::HandleCastInternalMessage(const CastSocket& socket,
                                                    const CastMessage& message) {
-  // TODO(crbug.com/698940): Handle other messages (VIRTUAL_CONNECT_CLOSE).
+  // TODO(https://crbug.com/809249): Parse message with data_decoder service.
   std::unique_ptr<base::DictionaryValue> payload =
       GetDictionaryFromCastMessage(message);
   if (!payload)
@@ -271,6 +268,13 @@
     return;
   }
 
+  if (type == CastMessageType::kCloseConnection) {
+    // Source / destination is flipped.
+    virtual_connections_.erase(VirtualConnection(
+        socket.id(), message.destination_id(), message.source_id()));
+    return;
+  }
+
   InternalMessage internal_message(type, std::move(*payload));
   for (auto& observer : observers_)
     observer.OnInternalMessage(socket.id(), internal_message);
diff --git a/components/cast_channel/cast_message_handler_unittest.cc b/components/cast_channel/cast_message_handler_unittest.cc
index 601f284..149cb75 100644
--- a/components/cast_channel/cast_message_handler_unittest.cc
+++ b/components/cast_channel/cast_message_handler_unittest.cc
@@ -22,6 +22,8 @@
 constexpr char kTestUserAgentString[] =
     "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) "
     "Chrome/66.0.3331.0 Safari/537.36";
+constexpr char kSourceId[] = "sourceId";
+constexpr char kDestinationId[] = "destinationId";
 
 std::string GetMessageType(const CastMessage& message) {
   std::unique_ptr<base::Value> dict = GetDictionaryFromCastMessage(message);
@@ -209,13 +211,34 @@
   EXPECT_CALL(*cast_socket_.mock_transport(), SendMessage(_, _, _))
       .WillOnce(SaveArg<0>(&virtual_connection_request));
 
-  handler_.EnsureConnection(cast_socket_.id(), "sourceId", "destinationId");
+  handler_.EnsureConnection(cast_socket_.id(), kSourceId, kDestinationId);
   EXPECT_EQ(CastMessageType::kConnect,
             ParseMessageType(virtual_connection_request));
 
   // No-op because connection is already created the first time.
   EXPECT_CALL(*cast_socket_.mock_transport(), SendMessage(_, _, _)).Times(0);
-  handler_.EnsureConnection(cast_socket_.id(), "sourceId", "destinationId");
+  handler_.EnsureConnection(cast_socket_.id(), kSourceId, kDestinationId);
+}
+
+TEST_F(CastMessageHandlerTest, CloseConnectionFromReceiver) {
+  CastMessage virtual_connection_request;
+  EXPECT_CALL(*cast_socket_.mock_transport(), SendMessage(_, _, _));
+  handler_.EnsureConnection(cast_socket_.id(), kSourceId, kDestinationId);
+
+  CastMessage response;
+  response.set_namespace_("urn:x-cast:com.google.cast.tp.connection");
+  response.set_source_id(kDestinationId);
+  response.set_destination_id(kSourceId);
+  response.set_payload_type(
+      CastMessage::PayloadType::CastMessage_PayloadType_STRING);
+  response.set_payload_utf8(R"({
+      "type": "CLOSE"
+  })");
+  OnMessage(response);
+
+  // Re-open virtual connection should cause message to be sent.
+  EXPECT_CALL(*cast_socket_.mock_transport(), SendMessage(_, _, _));
+  handler_.EnsureConnection(cast_socket_.id(), kSourceId, kDestinationId);
 }
 
 TEST_F(CastMessageHandlerTest, LaunchSession) {
@@ -291,7 +314,7 @@
   base::Value body(base::Value::Type::DICTIONARY);
   body.SetKey("foo", base::Value("bar"));
   CastMessage message =
-      CreateCastMessage("namespace", body, "sourceId", "destinationId");
+      CreateCastMessage("namespace", body, kSourceId, kDestinationId);
   handler_.SendAppMessage(cast_socket_.id(), message);
 
   EXPECT_EQ(CastMessageType::kConnect,
diff --git a/components/cast_channel/cast_message_util.cc b/components/cast_channel/cast_message_util.cc
index 790c73c..da25c15b 100644
--- a/components/cast_channel/cast_message_util.cc
+++ b/components/cast_channel/cast_message_util.cc
@@ -39,6 +39,7 @@
 constexpr char kKeepAlivePongType[] = "PONG";
 constexpr char kGetAppAvailabilityRequestType[] = "GET_APP_AVAILABILITY";
 constexpr char kConnectionRequestType[] = "CONNECT";
+constexpr char kCloseConnectionRequestType[] = "CLOSE";
 constexpr char kBroadcastRequestType[] = "APPLICATION_BROADCAST";
 constexpr char kLaunchRequestType[] = "LAUNCH";
 constexpr char kStopRequestType[] = "STOP";
@@ -144,6 +145,8 @@
       return kGetAppAvailabilityRequestType;
     case CastMessageType::kConnect:
       return kConnectionRequestType;
+    case CastMessageType::kCloseConnection:
+      return kCloseConnectionRequestType;
     case CastMessageType::kBroadcast:
       return kBroadcastRequestType;
     case CastMessageType::kLaunch:
@@ -170,6 +173,8 @@
     return CastMessageType::kGetAppAvailability;
   if (type == kConnectionRequestType)
     return CastMessageType::kConnect;
+  if (type == kCloseConnectionRequestType)
+    return CastMessageType::kCloseConnection;
   if (type == kBroadcastRequestType)
     return CastMessageType::kBroadcast;
   if (type == kLaunchRequestType)
diff --git a/components/cast_channel/cast_message_util.h b/components/cast_channel/cast_message_util.h
index c854352..b9afe35 100644
--- a/components/cast_channel/cast_message_util.h
+++ b/components/cast_channel/cast_message_util.h
@@ -24,10 +24,11 @@
   kPing,
   kPong,
   kGetAppAvailability,
-  kConnect,    // Virtual connection request
-  kBroadcast,  // Application broadcast / precache
-  kLaunch,     // Session launch request
-  kStop,       // Session stop request
+  kConnect,          // Virtual connection request
+  kCloseConnection,  // Close virtual connection
+  kBroadcast,        // Application broadcast / precache
+  kLaunch,           // Session launch request
+  kStop,             // Session stop request
   kReceiverStatus,
   kLaunchError,
   kOther  // Add new types above |kOther|.
diff --git a/components/download/internal/common/download_db_cache.cc b/components/download/internal/common/download_db_cache.cc
index 84d50b4..784a381 100644
--- a/components/download/internal/common/download_db_cache.cc
+++ b/components/download/internal/common/download_db_cache.cc
@@ -186,7 +186,8 @@
 }
 
 void DownloadDBCache::UpdateDownloadDB() {
-  DCHECK(!updated_guids_.empty());
+  if (updated_guids_.empty())
+    return;
 
   std::vector<DownloadDBEntry> entries;
   for (auto guid : updated_guids_) {
diff --git a/components/download/internal/common/download_db_cache_unittest.cc b/components/download/internal/common/download_db_cache_unittest.cc
index 44a6108..f656586d 100644
--- a/components/download/internal/common/download_db_cache_unittest.cc
+++ b/components/download/internal/common/download_db_cache_unittest.cc
@@ -286,6 +286,38 @@
   ASSERT_EQ(guid2, loaded_entries[0].GetGuid());
 }
 
+// Test that removing an entry during the middle of modifying it should work.
+TEST_F(DownloadDBCacheTest, RemoveWhileModifyExistingEntry) {
+  PrepopulateSampleEntries();
+  CreateDBCache();
+  std::vector<DownloadDBEntry> loaded_entries;
+  db_cache_->Initialize(
+      std::vector<DownloadEntry>(),
+      base::BindOnce(&DownloadDBCacheTest::InitCallback, base::Unretained(this),
+                     &loaded_entries));
+  db_->InitCallback(true);
+  db_->LoadCallback(true);
+  ASSERT_EQ(loaded_entries.size(), 2u);
+
+  loaded_entries[0].download_info->id = 100;
+  db_cache_->AddOrReplaceEntry(loaded_entries[0]);
+
+  ASSERT_EQ(task_runner_->GetPendingTaskCount(), 1u);
+  ASSERT_GT(task_runner_->NextPendingTaskDelay(), base::TimeDelta());
+  db_cache_->RemoveEntry(loaded_entries[0].GetGuid());
+  task_runner_->FastForwardUntilNoTasksRemain();
+
+  DownloadDBEntry remaining = loaded_entries[1];
+  loaded_entries.clear();
+  DownloadDB* download_db = GetDownloadDB();
+  download_db->LoadEntries(base::BindOnce(&DownloadDBCacheTest::InitCallback,
+                                          base::Unretained(this),
+                                          &loaded_entries));
+  db_->LoadCallback(true);
+  ASSERT_EQ(loaded_entries.size(), 1u);
+  ASSERT_EQ(remaining, loaded_entries[0]);
+}
+
 // Tests that Migrating a DownloadEntry from InProgressCache should store
 // a DownloadDBEntry in the DownloadDB.
 TEST_F(DownloadDBCacheTest, MigrateFromInProgressCache) {
diff --git a/components/exo/client_controlled_shell_surface.cc b/components/exo/client_controlled_shell_surface.cc
index 2fb5c58..9570ef5 100644
--- a/components/exo/client_controlled_shell_surface.cc
+++ b/components/exo/client_controlled_shell_surface.cc
@@ -4,6 +4,7 @@
 
 #include "components/exo/client_controlled_shell_surface.h"
 
+#include <map>
 #include <utility>
 
 #include "ash/frame/caption_buttons/caption_button_model.h"
@@ -33,9 +34,11 @@
 #include "base/trace_event/trace_event_argument.h"
 #include "components/exo/surface.h"
 #include "components/exo/wm_helper.h"
+#include "services/ui/public/interfaces/window_tree_constants.mojom.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
+#include "ui/aura/window_observer.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/class_property.h"
 #include "ui/compositor/compositor_lock.h"
@@ -232,6 +235,53 @@
   DISALLOW_COPY_AND_ASSIGN(CaptionButtonModel);
 };
 
+// EventTargetingBlocker blocks the event targeting by settnig NONE targeting
+// policy to the window subtrees. It resets to the origial policy upon deletion.
+class EventTargetingBlocker : aura::WindowObserver {
+ public:
+  EventTargetingBlocker() = default;
+
+  ~EventTargetingBlocker() override {
+    if (window_)
+      Unregister(window_);
+  }
+
+  void Block(aura::Window* window) {
+    window_ = window;
+    Register(window);
+  }
+
+ private:
+  void Register(aura::Window* window) {
+    window->AddObserver(this);
+    auto policy = window->event_targeting_policy();
+    window->SetEventTargetingPolicy(ui::mojom::EventTargetingPolicy::NONE);
+    policy_map_.emplace(window, policy);
+    for (auto* child : window->children())
+      Register(child);
+  }
+
+  void Unregister(aura::Window* window) {
+    window->RemoveObserver(this);
+    DCHECK(policy_map_.find(window) != policy_map_.end());
+    window->SetEventTargetingPolicy(policy_map_[window]);
+    for (auto* child : window->children())
+      Unregister(child);
+  }
+
+  void OnWindowDestroying(aura::Window* window) override {
+    auto it = policy_map_.find(window);
+    DCHECK(it != policy_map_.end());
+    policy_map_.erase(it);
+    window->RemoveObserver(this);
+  }
+
+  std::map<aura::Window*, ui::mojom::EventTargetingPolicy> policy_map_;
+  aura::Window* window_ = nullptr;
+
+  DISALLOW_COPY_AND_ASSIGN(EventTargetingBlocker);
+};
+
 }  // namespace
 
 class ClientControlledShellSurface::ScopedSetBoundsLocally {
@@ -273,9 +323,7 @@
 }
 
 ClientControlledShellSurface::~ClientControlledShellSurface() {
-  if (wide_frame_)
-    wide_frame_->Close();
-
+  wide_frame_.reset();
   display::Screen::GetScreen()->RemoveObserver(this);
 }
 
@@ -610,8 +658,20 @@
 }
 
 void ClientControlledShellSurface::OnSetFrame(SurfaceFrameType type) {
+  // TODO(oshima): We shouldn't send the synthesized motion event when just
+  // changing the frame type. The better solution would be to keep the window
+  // position regardless of the frame state, but that won't be available until
+  // next arc version.
+  // This is a stopgap solution not to generate the event until it is resolved.
+  EventTargetingBlocker blocker;
+  bool suppress_mouse_event = frame_type_ != type && widget_;
+  if (suppress_mouse_event)
+    blocker.Block(widget_->GetNativeWindow());
   ShellSurfaceBase::OnSetFrame(type);
   UpdateAutoHideFrame();
+
+  if (suppress_mouse_event)
+    UpdateSurfaceBounds();
 }
 
 void ClientControlledShellSurface::OnSetFrameColors(SkColor active_color,
@@ -855,7 +915,7 @@
 // ClientControlledShellSurface, private:
 
 void ClientControlledShellSurface::UpdateFrame() {
-  if (!widget_ || !GetFrameView()->visible())
+  if (!widget_)
     return;
   gfx::Rect work_area =
       display::Screen::GetScreen()
@@ -866,19 +926,18 @@
   if (window_state->IsMaximizedOrFullscreenOrPinned() &&
       work_area.width() != geometry().width()) {
     if (!wide_frame_) {
-      wide_frame_ = ash::WideFrameView::Create(widget_);
+      wide_frame_ = std::make_unique<ash::WideFrameView>(widget_);
       immersive_fullscreen_controller_->SetEnabled(
           ash::ImmersiveFullscreenController::WINDOW_TYPE_OTHER, false);
       wide_frame_->Init(immersive_fullscreen_controller_.get());
-      wide_frame_->Show();
+      wide_frame_->GetWidget()->Show();
       UpdateCaptionButtonModel();
     }
   } else {
     if (wide_frame_) {
-      wide_frame_->Close();
-      wide_frame_ = nullptr;
       immersive_fullscreen_controller_->SetEnabled(
           ash::ImmersiveFullscreenController::WINDOW_TYPE_OTHER, false);
+      wide_frame_.reset();
       GetFrameView()->InitImmersiveFullscreenControllerForView(
           immersive_fullscreen_controller_.get());
       UpdateCaptionButtonModel();
diff --git a/components/exo/client_controlled_shell_surface.h b/components/exo/client_controlled_shell_surface.h
index d144774..8294e32 100644
--- a/components/exo/client_controlled_shell_surface.h
+++ b/components/exo/client_controlled_shell_surface.h
@@ -224,7 +224,7 @@
   static void SetClientControlledStateDelegateFactoryForTest(
       const DelegateFactoryCallback& callback);
 
-  ash::WideFrameView* wide_frame_for_test() { return wide_frame_; }
+  ash::WideFrameView* wide_frame_for_test() { return wide_frame_.get(); }
 
  private:
   class ScopedSetBoundsLocally;
@@ -292,7 +292,7 @@
   std::unique_ptr<ash::ImmersiveFullscreenController>
       immersive_fullscreen_controller_;
 
-  ash::WideFrameView* wide_frame_ = nullptr;
+  std::unique_ptr<ash::WideFrameView> wide_frame_;
 
   std::unique_ptr<ui::CompositorLock> orientation_compositor_lock_;
 
diff --git a/components/exo/client_controlled_shell_surface_unittest.cc b/components/exo/client_controlled_shell_surface_unittest.cc
index 22e15df..84b4370 100644
--- a/components/exo/client_controlled_shell_surface_unittest.cc
+++ b/components/exo/client_controlled_shell_surface_unittest.cc
@@ -550,6 +550,18 @@
   EXPECT_EQ(client_bounds, widget->GetWindowBoundsInScreen());
   EXPECT_EQ(client_bounds,
             frame_view->GetClientBoundsForWindowBounds(client_bounds));
+
+  // Test NONE -> AUTOHIDE -> NONE
+  shell_surface->SetMaximized();
+  shell_surface->SetGeometry(fullscreen_bounds);
+  surface->SetFrame(SurfaceFrameType::AUTOHIDE);
+  surface->Commit();
+  EXPECT_TRUE(frame_view->visible());
+  EXPECT_TRUE(frame_view->GetHeaderView()->in_immersive_mode());
+  surface->SetFrame(SurfaceFrameType::NONE);
+  surface->Commit();
+  EXPECT_FALSE(frame_view->visible());
+  EXPECT_FALSE(frame_view->GetHeaderView()->in_immersive_mode());
 }
 
 namespace {
@@ -596,7 +608,7 @@
   base::RunLoop().RunUntilIdle();
   auto* env = aura::Env::GetInstance();
   gfx::Rect cropped_fullscreen_bounds(0, 0, 800, 400);
-  env->SetLastMouseLocation(gfx::Point(100, 100));
+  env->SetLastMouseLocation(gfx::Point(100, 30));
   TestEventHandler handler;
   env->AddPreTargetHandler(&handler);
   surface->SetFrame(SurfaceFrameType::AUTOHIDE);
@@ -1478,12 +1490,22 @@
   ASSERT_TRUE(wide_frame);
   EXPECT_FALSE(wide_frame->header_view()->in_immersive_mode());
 
-  // Set AutoHide mode.
+  // Test AUTOHIDE -> NORMAL
   surface->SetFrame(SurfaceFrameType::AUTOHIDE);
+  surface->Commit();
   EXPECT_TRUE(wide_frame->header_view()->in_immersive_mode());
 
-  // Exit AutoHide mode.
   surface->SetFrame(SurfaceFrameType::NORMAL);
+  surface->Commit();
+  EXPECT_FALSE(wide_frame->header_view()->in_immersive_mode());
+
+  // Test AUTOHIDE -> NONE
+  surface->SetFrame(SurfaceFrameType::AUTOHIDE);
+  surface->Commit();
+  EXPECT_TRUE(wide_frame->header_view()->in_immersive_mode());
+
+  surface->SetFrame(SurfaceFrameType::NONE);
+  surface->Commit();
   EXPECT_FALSE(wide_frame->header_view()->in_immersive_mode());
 
   // Unmaximize it and the frame should be normal.
diff --git a/components/metrics/call_stack_profile_builder.cc b/components/metrics/call_stack_profile_builder.cc
index f308c93..ff2d6af 100644
--- a/components/metrics/call_stack_profile_builder.cc
+++ b/components/metrics/call_stack_profile_builder.cc
@@ -60,8 +60,7 @@
 
   // Dedup modules and convert InternalFrames to Frames.
   for (const auto& internal_frame : internal_frames) {
-    const StackSamplingProfiler::InternalModule& module(
-        internal_frame.internal_module);
+    const base::ModuleCache::Module& module(internal_frame.internal_module);
     if (!module.is_valid) {
       sample_.frames.emplace_back(internal_frame.instruction_pointer,
                                   base::kUnknownModuleIndex);
diff --git a/components/metrics/call_stack_profile_builder_unittest.cc b/components/metrics/call_stack_profile_builder_unittest.cc
index 93ff7cc..e3922b2 100644
--- a/components/metrics/call_stack_profile_builder_unittest.cc
+++ b/components/metrics/call_stack_profile_builder_unittest.cc
@@ -11,7 +11,7 @@
 
 using StackSamplingProfiler = base::StackSamplingProfiler;
 using InternalFrame = StackSamplingProfiler::InternalFrame;
-using InternalModule = StackSamplingProfiler::InternalModule;
+using Module = base::ModuleCache::Module;
 using CallStackProfile = StackSamplingProfiler::CallStackProfile;
 
 namespace metrics {
@@ -55,10 +55,10 @@
   auto profile_builder = std::make_unique<CallStackProfileBuilder>(
       Bind(&SaveProfile, Unretained(&profile)));
 
-  InternalModule module1 = {0xccccdddd, "1",
-                            base::FilePath(FILE_PATH_LITERAL("file_path_1"))};
-  InternalModule module2 = {0xccddccdd, "2",
-                            base::FilePath(FILE_PATH_LITERAL("file_path_2"))};
+  Module module1 = {0xccccdddd, "1",
+                    base::FilePath(FILE_PATH_LITERAL("file_path_1"))};
+  Module module2 = {0xccddccdd, "2",
+                    base::FilePath(FILE_PATH_LITERAL("file_path_2"))};
   InternalFrame frame1 = {0xaaaabbbb, module1};
   InternalFrame frame2 = {0xaabbaabb, module2};
 
@@ -81,10 +81,10 @@
   auto profile_builder = std::make_unique<CallStackProfileBuilder>(
       Bind(&SaveProfile, Unretained(&profile)));
 
-  InternalModule module1 = {0xccccdddd, "1",
-                            base::FilePath(FILE_PATH_LITERAL("file_path_1"))};
-  InternalModule module2 = {0xccddccdd, "2",
-                            base::FilePath(FILE_PATH_LITERAL("file_path_2"))};
+  Module module1 = {0xccccdddd, "1",
+                    base::FilePath(FILE_PATH_LITERAL("file_path_1"))};
+  Module module2 = {0xccddccdd, "2",
+                    base::FilePath(FILE_PATH_LITERAL("file_path_2"))};
   InternalFrame frame1 = {0xaaaabbbb, module1};
   InternalFrame frame2 = {0xaabbaabb, module2};
 
@@ -108,9 +108,9 @@
   auto profile_builder = std::make_unique<CallStackProfileBuilder>(
       Bind(&SaveProfile, Unretained(&profile)));
 
-  InternalModule module1;
-  InternalModule module2 = {0xccddccdd, "2",
-                            base::FilePath(FILE_PATH_LITERAL("file_path_2"))};
+  Module module1;
+  Module module2 = {0xccddccdd, "2",
+                    base::FilePath(FILE_PATH_LITERAL("file_path_2"))};
   InternalFrame frame1 = {0xaaaabbbb, module1};
   InternalFrame frame2 = {0xaabbaabb, module2};
 
@@ -135,10 +135,10 @@
   auto profile_builder = std::make_unique<CallStackProfileBuilder>(
       Bind(&SaveProfile, Unretained(&profile)));
 
-  InternalModule module1 = {0xccccdddd, "1",
-                            base::FilePath(FILE_PATH_LITERAL("file_path_1"))};
-  InternalModule module2 = {0xccccdddd, "2",
-                            base::FilePath(FILE_PATH_LITERAL("file_path_2"))};
+  Module module1 = {0xccccdddd, "1",
+                    base::FilePath(FILE_PATH_LITERAL("file_path_1"))};
+  Module module2 = {0xccccdddd, "2",
+                    base::FilePath(FILE_PATH_LITERAL("file_path_2"))};
   InternalFrame frame1 = {0xaaaabbbb, module1};
   InternalFrame frame2 = {0xaabbaabb, module2};
 
diff --git a/components/minidump_uploader/BUILD.gn b/components/minidump_uploader/BUILD.gn
index 628bbc6..7e94a994 100644
--- a/components/minidump_uploader/BUILD.gn
+++ b/components/minidump_uploader/BUILD.gn
@@ -4,6 +4,28 @@
 
 import("//build/config/android/rules.gni")
 
+generate_jni("minidump_uploader_jni_headers") {
+  sources = [
+    "android/java/src/org/chromium/components/minidump_uploader/CrashReportMimeWriter.java",
+  ]
+  jni_package = "components/minidump_uploader"
+}
+
+static_library("minidump_uploader") {
+  sources = [
+    "rewrite_minidumps_as_mimes.cc",
+  ]
+
+  deps = [
+    ":minidump_uploader_jni_headers",
+    "//base",
+    "//third_party/crashpad/crashpad/client",
+    "//third_party/crashpad/crashpad/handler",
+    "//third_party/crashpad/crashpad/snapshot",
+    "//third_party/crashpad/crashpad/util",
+  ]
+}
+
 android_library("minidump_uploader_java") {
   deps = [
     "//base:base_java",
@@ -12,6 +34,7 @@
 
   java_files = [
     "android/java/src/org/chromium/components/minidump_uploader/CrashFileManager.java",
+    "android/java/src/org/chromium/components/minidump_uploader/CrashReportMimeWriter.java",
     "android/java/src/org/chromium/components/minidump_uploader/MinidumpUploadCallable.java",
     "android/java/src/org/chromium/components/minidump_uploader/MinidumpUploadJobService.java",
     "android/java/src/org/chromium/components/minidump_uploader/MinidumpUploader.java",
diff --git a/components/minidump_uploader/DEPS b/components/minidump_uploader/DEPS
index 9c9556e9..fb4880ea 100644
--- a/components/minidump_uploader/DEPS
+++ b/components/minidump_uploader/DEPS
@@ -1 +1,4 @@
-include_rules = []
+include_rules = [
+  "+jni",
+  "+third_party/crashpad",
+]
diff --git a/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/CrashFileManager.java b/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/CrashFileManager.java
index 5208f55..5ac81f2 100644
--- a/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/CrashFileManager.java
+++ b/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/CrashFileManager.java
@@ -57,6 +57,8 @@
      */
     public static final String CRASH_DUMP_DIR = "Crash Reports";
 
+    private static final String CRASHPAD_DIR = "Crashpad";
+
     // This should mirror the C++ CrashUploadList::kReporterLogFilename variable.
     @VisibleForTesting
     public static final String CRASH_DUMP_LOGFILE = "uploads.log";
@@ -336,6 +338,28 @@
     }
 
     /**
+     * Imports minidumps from Crashpad's database to the Crash Reports directory, converting them to
+     * MIME files.
+     **/
+    private void importCrashpadMinidumps() {
+        File crashpadDir = getCrashpadDirectory();
+        if (crashpadDir.exists() && ensureCrashDirExists()) {
+            File crashDir = getCrashDirectory();
+            CrashReportMimeWriter.rewriteMinidumpsAsMIMEs(crashpadDir, crashDir);
+        }
+    }
+
+    /**
+     * Returns the most recent minidump without a logcat for a given pid, or null if no such
+     * minidump exists.
+     */
+    public File getMinidumpSansLogcatForPid(int pid) {
+        File[] foundFiles = listCrashFiles(
+            Pattern.compile("\\.dmp" + Integer.toString(pid) + "\\z"));
+        return foundFiles.length > 0 ? foundFiles[0] : null;
+    }
+
+    /**
      * Returns all minidump files that definitely do not have logcat output, sorted by modification
      * time stamp. Note: This method does not provide an "if and only if" test: it may return omit
      * some files that lack logcat output, if logcat output has been intentionally skipped for those
@@ -452,6 +476,10 @@
         return new File(mCacheDir, CRASH_DUMP_DIR);
     }
 
+    private File getCrashpadDirectory() {
+        return new File(mCacheDir, CRASHPAD_DIR);
+    }
+
     public File createNewTempFile(String name) throws IOException {
         File f = new File(getCrashDirectory(), name);
         if (f.exists()) {
diff --git a/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/CrashReportMimeWriter.java b/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/CrashReportMimeWriter.java
new file mode 100644
index 0000000..4ba197f
--- /dev/null
+++ b/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/CrashReportMimeWriter.java
@@ -0,0 +1,30 @@
+// 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.
+
+package org.chromium.components.minidump_uploader;
+
+import org.chromium.base.annotations.JNINamespace;
+
+import java.io.File;
+
+/**
+ * Rewrites minidumps into MIME messages for uploading.
+ */
+@JNINamespace("minidump_uploader")
+public class CrashReportMimeWriter {
+    private static final String TAG = "CrashReportMimeWriter";
+
+    /*
+     * Rewrites minidumps as MIME multipart messages, extracting embedded Crashpad annotations to
+     * include as form data, and including the original minidump as a file attachment.
+     *
+     * @param srcDir A directory containing a crashpad::CrashReportDatabase.
+     * @param destDir The directory in which to write the MIME files.
+     */
+    public static void rewriteMinidumpsAsMIMEs(File srcDir, File destDir) {
+        nativeRewriteMinidumpsAsMIMEs(srcDir.getAbsolutePath(), destDir.getAbsolutePath());
+    }
+
+    private static native void nativeRewriteMinidumpsAsMIMEs(String srcDir, String destDir);
+}
diff --git a/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/CrashFileManagerTest.java b/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/CrashFileManagerTest.java
index 74c6bf0..a3b49ab 100644
--- a/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/CrashFileManagerTest.java
+++ b/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/CrashFileManagerTest.java
@@ -36,6 +36,7 @@
     public CrashTestRule mTestRule = new CrashTestRule();
 
     private static final int TEST_PID = 23;
+    private static final int TEST_PID2 = 24;
 
     private long mInitialModificationTimestamp;
     private long mModificationTimestamp;
@@ -49,6 +50,7 @@
 
     private File mDmpSansLogcatFile1;
     private File mDmpSansLogcatFile2;
+    private File mDmpSansLogcatFileForPid2;
 
     private File mDmpFile1;
     private File mDmpFile2;
@@ -96,6 +98,11 @@
         mDmpSansLogcatFile2.setLastModified(mModificationTimestamp);
         mModificationTimestamp += 1000;
 
+        mDmpSansLogcatFileForPid2 = new File(mTestRule.getCrashDir(), "321_cba.dmp" + TEST_PID2);
+        mDmpSansLogcatFileForPid2.createNewFile();
+        mDmpSansLogcatFileForPid2.setLastModified(mModificationTimestamp);
+        mModificationTimestamp += 1000;
+
         mDmpFile1 = new File(mTestRule.getCrashDir(), "123_abc.dmp.try0");
         mDmpFile1.createNewFile();
         mDmpFile1.setLastModified(mModificationTimestamp);
@@ -193,8 +200,8 @@
         CrashFileManager crashFileManager = new CrashFileManager(mTestRule.getCacheDir());
         File[] expectedFiles = new File[] {mLogfile, mUpFile2, mUpFile1, mMultiDigitMaxTriesFile,
                 mOneBelowMultiDigitMaxTriesFile, mMaxTriesFile, mOneBelowMaxTriesFile, mDmpFile2,
-                mDmpFile1, mDmpSansLogcatFile2, mDmpSansLogcatFile1, mTmpFile3, mTmpFile2,
-                mTmpFile1};
+                mDmpFile1, mDmpSansLogcatFileForPid2, mDmpSansLogcatFile2, mDmpSansLogcatFile1,
+                mTmpFile3, mTmpFile2, mTmpFile1};
         File[] actualFiles = crashFileManager.listCrashFiles(null);
         Assert.assertNotNull(actualFiles);
         assertArrayEquals(
@@ -266,9 +273,21 @@
     @Test
     @SmallTest
     @Feature({"Android-AppBase"})
+    public void testGetMinidumpSansLogcatForPid() {
+        CrashFileManager crashFileManager = new CrashFileManager(mTestRule.getCacheDir());
+        File expectedFile = mDmpSansLogcatFileForPid2;
+        File actualFile = crashFileManager.getMinidumpSansLogcatForPid(TEST_PID2);
+        Assert.assertNotNull(actualFile);
+        Assert.assertEquals(expectedFile, actualFile);
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"Android-AppBase"})
     public void testGetMinidumpsSansLogcat() {
         CrashFileManager crashFileManager = new CrashFileManager(mTestRule.getCacheDir());
-        File[] expectedFiles = new File[] {mDmpSansLogcatFile2, mDmpSansLogcatFile1};
+        File[] expectedFiles =
+                new File[] {mDmpSansLogcatFileForPid2, mDmpSansLogcatFile2, mDmpSansLogcatFile1};
         File[] actualFiles = crashFileManager.getMinidumpsSansLogcat();
         Assert.assertNotNull(actualFiles);
         assertArrayEquals("Failed to get the correct minidump files in directory", expectedFiles,
diff --git a/components/minidump_uploader/rewrite_minidumps_as_mimes.cc b/components/minidump_uploader/rewrite_minidumps_as_mimes.cc
new file mode 100644
index 0000000..0b364dc
--- /dev/null
+++ b/components/minidump_uploader/rewrite_minidumps_as_mimes.cc
@@ -0,0 +1,144 @@
+// 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 <utility>
+
+#include "base/android/jni_string.h"
+#include "base/strings/stringprintf.h"
+#include "jni/CrashReportMimeWriter_jni.h"
+#include "third_party/crashpad/crashpad/client/crash_report_database.h"
+#include "third_party/crashpad/crashpad/handler/minidump_to_upload_parameters.h"
+#include "third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump.h"
+#include "third_party/crashpad/crashpad/util/file/file_writer.h"
+#include "third_party/crashpad/crashpad/util/net/http_body.h"
+#include "third_party/crashpad/crashpad/util/net/http_multipart_builder.h"
+
+namespace minidump_uploader {
+
+namespace {
+
+bool MimeifyReport(const crashpad::CrashReportDatabase::UploadReport* report,
+                   const base::FilePath& dest_dir) {
+  crashpad::FileReader* reader = report->Reader();
+  crashpad::FileOffset start_offset = reader->SeekGet();
+  if (start_offset < 0) {
+    return false;
+  }
+
+  // Ignore any errors that might occur when attempting to interpret the
+  // minidump file. This may result in its being uploaded with few or no
+  // parameters, but as long as there’s a dump file, the server can decide what
+  // to do with it.
+  std::map<std::string, std::string> parameters;
+  crashpad::ProcessSnapshotMinidump minidump_process_snapshot;
+  if (minidump_process_snapshot.Initialize(reader)) {
+    parameters =
+        BreakpadHTTPFormParametersFromMinidump(&minidump_process_snapshot);
+  }
+
+  if (!reader->SeekSet(start_offset)) {
+    return false;
+  }
+
+  crashpad::HTTPMultipartBuilder http_multipart_builder;
+
+  static constexpr char kMinidumpKey[] = "upload_file_minidump";
+
+  for (const auto& kv : parameters) {
+    if (kv.first == kMinidumpKey) {
+      LOG(WARNING) << "reserved key " << kv.first << ", discarding value "
+                   << kv.second;
+    } else {
+      http_multipart_builder.SetFormData(kv.first, kv.second);
+    }
+  }
+
+  http_multipart_builder.SetFileAttachment(kMinidumpKey,
+                                           report->uuid.ToString() + ".dmp",
+                                           reader, "application/octet-stream");
+
+  std::unique_ptr<crashpad::HTTPBodyStream> body =
+      http_multipart_builder.GetBodyStream();
+  crashpad::FileWriter writer;
+  if (!writer.Open(dest_dir.Append(base::StringPrintf(
+                       "%s.dmp%d", report->uuid.ToString().c_str(),
+                       minidump_process_snapshot.ProcessID())),
+                   crashpad::FileWriteMode::kCreateOrFail,
+                   crashpad::FilePermissions::kOwnerOnly)) {
+    return false;
+  }
+
+  uint8_t buffer[4096];
+  crashpad::FileOperationResult bytes_read;
+  while ((bytes_read = body->GetBytesBuffer(buffer, sizeof(buffer))) > 0) {
+    writer.Write(buffer, bytes_read);
+  }
+  return bytes_read == 0;
+}
+
+}  // namespace
+
+void RewriteMinidumpsAsMIMEs(const base::FilePath& src_dir,
+                             const base::FilePath& dest_dir) {
+  std::unique_ptr<crashpad::CrashReportDatabase> db =
+      crashpad::CrashReportDatabase::InitializeWithoutCreating(src_dir);
+  if (!db) {
+    return;
+  }
+
+  std::vector<crashpad::CrashReportDatabase::Report> reports;
+  if (db->GetPendingReports(&reports) !=
+      crashpad::CrashReportDatabase::kNoError) {
+    return;
+  }
+
+  for (const auto& report : reports) {
+    std::unique_ptr<const crashpad::CrashReportDatabase::UploadReport>
+        upload_report;
+    switch (db->GetReportForUploading(report.uuid,
+                                      &upload_report,
+                                      /* report_metrics= */ false)) {
+      case crashpad::CrashReportDatabase::kBusyError:
+      case crashpad::CrashReportDatabase::kReportNotFound:
+        continue;
+
+      case crashpad::CrashReportDatabase::kNoError:
+        if (MimeifyReport(upload_report.get(), dest_dir)) {
+          db->RecordUploadComplete(std::move(upload_report), std::string());
+        } else {
+          crashpad::Metrics::CrashUploadSkipped(
+              crashpad::Metrics::CrashSkippedReason::kPrepareForUploadFailed);
+          upload_report.reset();
+        }
+        db->DeleteReport(report.uuid);
+        continue;
+
+      case crashpad::CrashReportDatabase::kFileSystemError:
+      case crashpad::CrashReportDatabase::kDatabaseError:
+        crashpad::Metrics::CrashUploadSkipped(
+            crashpad::Metrics::CrashSkippedReason::kDatabaseError);
+        db->DeleteReport(report.uuid);
+        continue;
+
+      case crashpad::CrashReportDatabase::kCannotRequestUpload:
+        NOTREACHED();
+        db->DeleteReport(report.uuid);
+        continue;
+    }
+  }
+}
+
+static void JNI_CrashReportMimeWriter_RewriteMinidumpsAsMIMEs(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jclass>& jcaller,
+    const base::android::JavaParamRef<jstring>& j_src_dir,
+    const base::android::JavaParamRef<jstring>& j_dest_dir) {
+  std::string src_dir, dest_dir;
+  base::android::ConvertJavaStringToUTF8(env, j_src_dir, &src_dir);
+  base::android::ConvertJavaStringToUTF8(env, j_dest_dir, &dest_dir);
+
+  RewriteMinidumpsAsMIMEs(base::FilePath(src_dir), base::FilePath(dest_dir));
+}
+
+}  // namespace minidump_uploader
diff --git a/components/neterror/OWNERS b/components/neterror/OWNERS
index 9df4a03..74669b39 100644
--- a/components/neterror/OWNERS
+++ b/components/neterror/OWNERS
@@ -1,4 +1,8 @@
 mmenke@chromium.org
 edwardjung@chromium.org
 
+# Offline owners.
+chili@chromium.org
+jianli@chromium.org
+
 # COMPONENT: Internals>Network
diff --git a/components/network_session_configurator/browser/network_session_configurator.cc b/components/network_session_configurator/browser/network_session_configurator.cc
index 078e281..e48098a 100644
--- a/components/network_session_configurator/browser/network_session_configurator.cc
+++ b/components/network_session_configurator/browser/network_session_configurator.cc
@@ -283,6 +283,13 @@
       "true");
 }
 
+bool ShouldQuicGoawayOnPathDegrading(
+    const VariationParameters& quic_trial_params) {
+  return base::LowerCaseEqualsASCII(
+      GetVariationParam(quic_trial_params, "go_away_on_path_degrading"),
+      "true");
+}
+
 int GetQuicMaxTimeOnNonDefaultNetworkSeconds(
     const VariationParameters& quic_trial_params) {
   int value;
@@ -422,6 +429,8 @@
         ShouldQuicMigrateSessionsOnNetworkChangeV2(quic_trial_params);
     params->quic_migrate_sessions_early_v2 =
         ShouldQuicMigrateSessionsEarlyV2(quic_trial_params);
+    params->quic_go_away_on_path_degrading =
+        ShouldQuicGoawayOnPathDegrading(quic_trial_params);
     int max_time_on_non_default_network_seconds =
         GetQuicMaxTimeOnNonDefaultNetworkSeconds(quic_trial_params);
     if (max_time_on_non_default_network_seconds > 0) {
diff --git a/components/network_session_configurator/browser/network_session_configurator_unittest.cc b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
index c078375..5c64b30 100644
--- a/components/network_session_configurator/browser/network_session_configurator_unittest.cc
+++ b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
@@ -117,6 +117,7 @@
   EXPECT_FALSE(params_.quic_estimate_initial_rtt);
   EXPECT_FALSE(params_.quic_migrate_sessions_on_network_change_v2);
   EXPECT_FALSE(params_.quic_migrate_sessions_early_v2);
+  EXPECT_FALSE(params_.quic_go_away_on_path_degrading);
   EXPECT_FALSE(params_.quic_allow_server_migration);
   EXPECT_TRUE(params_.quic_host_whitelist.empty());
 
@@ -346,6 +347,18 @@
 }
 
 TEST_F(NetworkSessionConfiguratorTest,
+       QuicGoawayOnPathDegradingFromFieldTrialParams) {
+  std::map<std::string, std::string> field_trial_params;
+  field_trial_params["go_away_on_path_degrading"] = "true";
+  variations::AssociateVariationParams("QUIC", "Enabled", field_trial_params);
+  base::FieldTrialList::CreateFieldTrial("QUIC", "Enabled");
+
+  ParseFieldTrials();
+
+  EXPECT_TRUE(params_.quic_go_away_on_path_degrading);
+}
+
+TEST_F(NetworkSessionConfiguratorTest,
        QuicMaxTimeOnNonDefaultNetworkFromFieldTrialParams) {
   std::map<std::string, std::string> field_trial_params;
   field_trial_params["max_time_on_non_default_network_seconds"] = "10";
diff --git a/components/nux_google_apps/BUILD.gn b/components/nux_google_apps/BUILD.gn
index d9187c1..833a110 100644
--- a/components/nux_google_apps/BUILD.gn
+++ b/components/nux_google_apps/BUILD.gn
@@ -22,6 +22,7 @@
     deps = [
       "//components/bookmarks/browser",
       "//components/bookmarks/common",
+      "//components/favicon/core",
       "//components/pref_registry",
       "//components/prefs",
       "//components/resources",
diff --git a/components/nux_google_apps/DEPS b/components/nux_google_apps/DEPS
index c3d7d1a..168b969 100644
--- a/components/nux_google_apps/DEPS
+++ b/components/nux_google_apps/DEPS
@@ -3,6 +3,8 @@
   "+components/grit",
   "+components/prefs",
   "+components/nux",
+  "+components/favicon",
   "+components/strings/grit/components_strings.h",
   "+content/public/browser",
+  "+ui/base",
 ]
diff --git a/components/nux_google_apps/google_apps_handler.cc b/components/nux_google_apps/google_apps_handler.cc
index 85016c6d..282ccfa 100644
--- a/components/nux_google_apps/google_apps_handler.cc
+++ b/components/nux_google_apps/google_apps_handler.cc
@@ -11,6 +11,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/common/bookmark_pref_names.h"
+#include "components/favicon/core/favicon_service.h"
 #include "components/grit/components_resources.h"
 #include "components/grit/components_scaled_resources.h"
 #include "components/nux/show_promo_delegate.h"
@@ -20,6 +21,7 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
+#include "ui/base/resource/resource_bundle.h"
 
 namespace nux_google_apps {
 
@@ -51,14 +53,26 @@
     "https://news.google.com", "https://chrome.google.com/webstore",
 };
 
+constexpr const int kGoogleAppIconSize = 48;  // Pixels.
+constexpr const int kGoogleAppIcons[] = {
+    IDR_NUX_GOOGLE_APPS_GMAIL_1X, IDR_NUX_GOOGLE_APPS_YOUTUBE_1X,
+    IDR_NUX_GOOGLE_APPS_MAPS_1X,  IDR_NUX_GOOGLE_APPS_TRANSLATE_1X,
+    IDR_NUX_GOOGLE_APPS_NEWS_1X,  IDR_NUX_GOOGLE_APPS_CHROME_STORE_1X,
+};
+
 static_assert(base::size(kGoogleAppNames) == base::size(kGoogleAppUrls),
               "names and urls must match");
 static_assert(base::size(kGoogleAppNames) == (size_t)GoogleApps::kCount,
               "names and histograms must match");
+static_assert(base::size(kGoogleAppNames) == base::size(kGoogleAppIcons),
+              "names and icons must match");
 
 GoogleAppsHandler::GoogleAppsHandler(PrefService* prefs,
+                                     favicon::FaviconService* favicon_service,
                                      bookmarks::BookmarkModel* bookmark_model)
-    : prefs_(prefs), bookmark_model_(bookmark_model) {}
+    : prefs_(prefs),
+      favicon_service_(favicon_service),
+      bookmark_model_(bookmark_model) {}
 
 GoogleAppsHandler::~GoogleAppsHandler() {}
 
@@ -90,9 +104,19 @@
       UMA_HISTOGRAM_ENUMERATION(
           "FirstRun.NewUserExperience.GoogleAppsSelection", (GoogleApps)i,
           GoogleApps::kCount);
-      bookmark_model_->AddURL(
-          bookmark_model_->bookmark_bar_node(), bookmarkIndex++,
-          base::ASCIIToUTF16(kGoogleAppNames[i]), GURL(kGoogleAppUrls[i]));
+      GURL app_url = GURL(kGoogleAppUrls[i]);
+      bookmark_model_->AddURL(bookmark_model_->bookmark_bar_node(),
+                              bookmarkIndex++,
+                              base::ASCIIToUTF16(kGoogleAppNames[i]), app_url);
+
+      // Preload the favicon cache with Chrome-bundled images. Otherwise, the
+      // pre-populated bookmarks don't have favicons and look bad. Favicons are
+      // updated automatically when a user visits a site.
+      favicon_service_->MergeFavicon(
+          app_url, app_url, favicon_base::IconType::kFavicon,
+          ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
+              kGoogleAppIcons[i]),
+          gfx::Size(kGoogleAppIconSize, kGoogleAppIconSize));
     }
   }
 
diff --git a/components/nux_google_apps/google_apps_handler.h b/components/nux_google_apps/google_apps_handler.h
index c9c6ecef..4901740 100644
--- a/components/nux_google_apps/google_apps_handler.h
+++ b/components/nux_google_apps/google_apps_handler.h
@@ -19,6 +19,10 @@
 class WebUIDataSource;
 }  // namespace content
 
+namespace favicon {
+class FaviconService;
+}  // namespace favicon
+
 namespace nux_google_apps {
 
 extern const char* kGoogleAppsInteractionHistogram;
@@ -35,6 +39,7 @@
 class GoogleAppsHandler : public content::WebUIMessageHandler {
  public:
   GoogleAppsHandler(PrefService* prefs,
+                    favicon::FaviconService* favicon_service,
                     bookmarks::BookmarkModel* bookmark_model);
   ~GoogleAppsHandler() override;
 
@@ -53,6 +58,9 @@
   PrefService* prefs_;
 
   // Weak reference.
+  favicon::FaviconService* favicon_service_;
+
+  // Weak reference.
   bookmarks::BookmarkModel* bookmark_model_;
 
   DISALLOW_COPY_AND_ASSIGN(GoogleAppsHandler);
diff --git a/components/offline_items_collection/core/BUILD.gn b/components/offline_items_collection/core/BUILD.gn
index ad8419c..5654c49 100644
--- a/components/offline_items_collection/core/BUILD.gn
+++ b/components/offline_items_collection/core/BUILD.gn
@@ -10,6 +10,7 @@
 static_library("core") {
   sources = [
     "fail_state.h",
+    "launch_location.h",
     "offline_content_aggregator.cc",
     "offline_content_aggregator.h",
     "offline_content_provider.h",
@@ -109,6 +110,7 @@
 
     sources = [
       "fail_state.h",
+      "launch_location.h",
       "offline_item.h",
       "offline_item_filter.h",
       "offline_item_state.h",
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java
index e71dc41d..591c5cc6 100644
--- a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java
+++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java
@@ -38,9 +38,9 @@
 
     // OfflineContentProvider implementation.
     @Override
-    public void openItem(ContentId id) {
+    public void openItem(@LaunchLocation int location, ContentId id) {
         if (mNativeOfflineContentAggregatorBridge == 0) return;
-        nativeOpenItem(mNativeOfflineContentAggregatorBridge, id.namespace, id.id);
+        nativeOpenItem(mNativeOfflineContentAggregatorBridge, location, id.namespace, id.id);
     }
 
     @Override
@@ -163,8 +163,8 @@
     }
 
     // Methods called to C++ via JNI.
-    private native void nativeOpenItem(
-            long nativeOfflineContentAggregatorBridge, String nameSpace, String id);
+    private native void nativeOpenItem(long nativeOfflineContentAggregatorBridge,
+            @LaunchLocation int location, String nameSpace, String id);
     private native void nativeRemoveItem(
             long nativeOfflineContentAggregatorBridge, String nameSpace, String id);
     private native void nativeCancelDownload(
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java
index 30d711c..ecb37124 100644
--- a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java
+++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java
@@ -29,7 +29,7 @@
     }
 
     /** See OfflineContentProvider::OpenItem(...). */
-    void openItem(ContentId id);
+    void openItem(@LaunchLocation int location, ContentId id);
 
     /** See OfflineContentProvider::RemoveItem(...). */
     void removeItem(ContentId id);
diff --git a/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc b/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc
index 6c9e7129..cf2cb03 100644
--- a/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc
+++ b/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc
@@ -122,10 +122,12 @@
 void OfflineContentAggregatorBridge::OpenItem(
     JNIEnv* env,
     const JavaParamRef<jobject>& jobj,
+    jint launch_location,
     const JavaParamRef<jstring>& j_namespace,
     const JavaParamRef<jstring>& j_id) {
-  provider_->OpenItem(JNI_OfflineContentAggregatorBridge_CreateContentId(
-      env, j_namespace, j_id));
+  provider_->OpenItem(static_cast<LaunchLocation>(launch_location),
+                      JNI_OfflineContentAggregatorBridge_CreateContentId(
+                          env, j_namespace, j_id));
 }
 
 void OfflineContentAggregatorBridge::RemoveItem(
diff --git a/components/offline_items_collection/core/android/offline_content_aggregator_bridge.h b/components/offline_items_collection/core/android/offline_content_aggregator_bridge.h
index 862cc018..28ea95e 100644
--- a/components/offline_items_collection/core/android/offline_content_aggregator_bridge.h
+++ b/components/offline_items_collection/core/android/offline_content_aggregator_bridge.h
@@ -39,6 +39,7 @@
   // Methods called from Java via JNI.
   void OpenItem(JNIEnv* env,
                 const base::android::JavaParamRef<jobject>& jobj,
+                jint launch_location,
                 const base::android::JavaParamRef<jstring>& j_namespace,
                 const base::android::JavaParamRef<jstring>& j_id);
   void RemoveItem(JNIEnv* env,
diff --git a/components/offline_items_collection/core/launch_location.h b/components/offline_items_collection/core/launch_location.h
new file mode 100644
index 0000000..d204d61
--- /dev/null
+++ b/components/offline_items_collection/core/launch_location.h
@@ -0,0 +1,28 @@
+// 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_OFFLINE_ITEMS_COLLECTION_CORE_LAUNCH_LOCATION_H_
+#define COMPONENTS_OFFLINE_ITEMS_COLLECTION_CORE_LAUNCH_LOCATION_H_
+
+#include <iosfwd>
+
+namespace offline_items_collection {
+
+// Indicates where the item is being launched.
+// A Java counterpart will be generated for this enum.
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.offline_items_collection
+enum class LaunchLocation {
+  // From Download home.
+  DOWNLOAD_HOME,
+  // Due to clicking a download complete notification.
+  NOTIFICATION,
+  // Due to clicking "Open" link in the download progress bar.
+  PROGRESS_BAR,
+  // Due to clicking a suggested item in NTP.
+  SUGGESTION,
+};
+
+}  // namespace offline_items_collection
+
+#endif  // COMPONENTS_OFFLINE_ITEMS_COLLECTION_CORE_LAUNCH_LOCATION_H_
diff --git a/components/offline_items_collection/core/offline_content_aggregator.cc b/components/offline_items_collection/core/offline_content_aggregator.cc
index 09e2b811..4a33ab9 100644
--- a/components/offline_items_collection/core/offline_content_aggregator.cc
+++ b/components/offline_items_collection/core/offline_content_aggregator.cc
@@ -64,14 +64,15 @@
   }
 }
 
-void OfflineContentAggregator::OpenItem(const ContentId& id) {
+void OfflineContentAggregator::OpenItem(LaunchLocation location,
+                                        const ContentId& id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = providers_.find(id.name_space);
 
   if (it == providers_.end())
     return;
 
-  it->second->OpenItem(id);
+  it->second->OpenItem(location, id);
 }
 
 void OfflineContentAggregator::RemoveItem(const ContentId& id) {
diff --git a/components/offline_items_collection/core/offline_content_aggregator.h b/components/offline_items_collection/core/offline_content_aggregator.h
index 0ae4163..46b6864 100644
--- a/components/offline_items_collection/core/offline_content_aggregator.h
+++ b/components/offline_items_collection/core/offline_content_aggregator.h
@@ -57,7 +57,7 @@
   void UnregisterProvider(const std::string& name_space);
 
   // OfflineContentProvider implementation.
-  void OpenItem(const ContentId& id) override;
+  void OpenItem(LaunchLocation location, const ContentId& id) override;
   void RemoveItem(const ContentId& id) override;
   void CancelDownload(const ContentId& id) override;
   void PauseDownload(const ContentId& id) override;
diff --git a/components/offline_items_collection/core/offline_content_aggregator_unittest.cc b/components/offline_items_collection/core/offline_content_aggregator_unittest.cc
index 0e64a2c1..56cfcfc 100644
--- a/components/offline_items_collection/core/offline_content_aggregator_unittest.cc
+++ b/components/offline_items_collection/core/offline_content_aggregator_unittest.cc
@@ -61,8 +61,8 @@
       : ScopedMockOfflineContentProvider(name_space, aggregator) {}
   ~OpenItemRemovalOfflineContentProvider() override {}
 
-  void OpenItem(const ContentId& id) override {
-    ScopedMockOfflineContentProvider::OpenItem(id);
+  void OpenItem(LaunchLocation location, const ContentId& id) override {
+    ScopedMockOfflineContentProvider::OpenItem(location, id);
     Unregister();
   }
 };
@@ -175,8 +175,8 @@
   testing::InSequence sequence;
   ContentId id1("1", "A");
   ContentId id2("2", "B");
-  EXPECT_CALL(provider1, OpenItem(id1)).Times(1);
-  EXPECT_CALL(provider2, OpenItem(id2)).Times(1);
+  EXPECT_CALL(provider1, OpenItem(LaunchLocation::DOWNLOAD_HOME, id1)).Times(1);
+  EXPECT_CALL(provider2, OpenItem(LaunchLocation::NOTIFICATION, id2)).Times(1);
   EXPECT_CALL(provider1, RemoveItem(id1)).Times(1);
   EXPECT_CALL(provider2, RemoveItem(id2)).Times(1);
   EXPECT_CALL(provider1, CancelDownload(id1)).Times(1);
@@ -189,8 +189,8 @@
   EXPECT_CALL(provider2, GetVisualsForItem(id2, _)).Times(1);
   EXPECT_CALL(provider1, GetShareInfoForItem(id1, _)).Times(1);
   EXPECT_CALL(provider2, GetShareInfoForItem(id2, _)).Times(1);
-  aggregator_.OpenItem(id1);
-  aggregator_.OpenItem(id2);
+  aggregator_.OpenItem(LaunchLocation::DOWNLOAD_HOME, id1);
+  aggregator_.OpenItem(LaunchLocation::NOTIFICATION, id2);
   aggregator_.RemoveItem(id1);
   aggregator_.RemoveItem(id2);
   aggregator_.CancelDownload(id1);
@@ -216,14 +216,14 @@
   testing::InSequence sequence;
   EXPECT_CALL(provider1, PauseDownload(id1)).Times(1);
   EXPECT_CALL(provider1, ResumeDownload(id1, true)).Times(1);
-  EXPECT_CALL(provider1, OpenItem(id1)).Times(1);
-  EXPECT_CALL(provider2, OpenItem(id2)).Times(1);
+  EXPECT_CALL(provider1, OpenItem(LaunchLocation::DOWNLOAD_HOME, id1)).Times(1);
+  EXPECT_CALL(provider2, OpenItem(LaunchLocation::NOTIFICATION, id2)).Times(1);
   EXPECT_CALL(provider2, RemoveItem(id3)).Times(1);
 
   aggregator_.PauseDownload(id1);
   aggregator_.ResumeDownload(id1, true);
-  aggregator_.OpenItem(id1);
-  aggregator_.OpenItem(id2);
+  aggregator_.OpenItem(LaunchLocation::DOWNLOAD_HOME, id1);
+  aggregator_.OpenItem(LaunchLocation::NOTIFICATION, id2);
   aggregator_.RemoveItem(id3);
 }
 
@@ -298,11 +298,11 @@
   ContentId id1("1", "A");
   ContentId id2("1", "B");
 
-  EXPECT_CALL(provider1, OpenItem(id1)).Times(1);
+  EXPECT_CALL(provider1, OpenItem(LaunchLocation::DOWNLOAD_HOME, id1)).Times(1);
   EXPECT_CALL(provider1, RemoveItem(id2)).Times(0);
 
-  aggregator_.OpenItem(id1);
-  aggregator_.OpenItem(id2);
+  aggregator_.OpenItem(LaunchLocation::DOWNLOAD_HOME, id1);
+  aggregator_.OpenItem(LaunchLocation::NOTIFICATION, id2);
   aggregator_.RemoveItem(id2);
 }
 
diff --git a/components/offline_items_collection/core/offline_content_provider.h b/components/offline_items_collection/core/offline_content_provider.h
index e86b9ca..d8280473 100644
--- a/components/offline_items_collection/core/offline_content_provider.h
+++ b/components/offline_items_collection/core/offline_content_provider.h
@@ -11,6 +11,7 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/optional.h"
+#include "components/offline_items_collection/core/launch_location.h"
 #include "url/gurl.h"
 
 namespace offline_items_collection {
@@ -65,8 +66,9 @@
     virtual ~Observer() = default;
   };
 
-  // Called to trigger opening an OfflineItem represented by |id|.
-  virtual void OpenItem(const ContentId& id) = 0;
+  // Called to trigger opening an OfflineItem represented by |id|. |location|
+  // denotes where it is opened and is used for logging purpose.
+  virtual void OpenItem(LaunchLocation location, const ContentId& id) = 0;
 
   // Called to trigger removal of an OfflineItem represented by |id|.
   virtual void RemoveItem(const ContentId& id) = 0;
diff --git a/components/offline_items_collection/core/test_support/mock_offline_content_provider.h b/components/offline_items_collection/core/test_support/mock_offline_content_provider.h
index a6279fc..e9e2f9ef 100644
--- a/components/offline_items_collection/core/test_support/mock_offline_content_provider.h
+++ b/components/offline_items_collection/core/test_support/mock_offline_content_provider.h
@@ -36,7 +36,7 @@
   void NotifyOnItemUpdated(const OfflineItem& item);
 
   // OfflineContentProvider implementation.
-  MOCK_METHOD1(OpenItem, void(const ContentId&));
+  MOCK_METHOD2(OpenItem, void(LaunchLocation, const ContentId&));
   MOCK_METHOD1(RemoveItem, void(const ContentId&));
   MOCK_METHOD1(CancelDownload, void(const ContentId&));
   MOCK_METHOD1(PauseDownload, void(const ContentId&));
diff --git a/components/offline_items_collection/core/throttled_offline_content_provider.cc b/components/offline_items_collection/core/throttled_offline_content_provider.cc
index 4064d68..d44d8a25 100644
--- a/components/offline_items_collection/core/throttled_offline_content_provider.cc
+++ b/components/offline_items_collection/core/throttled_offline_content_provider.cc
@@ -38,8 +38,9 @@
   wrapped_provider_->RemoveObserver(this);
 }
 
-void ThrottledOfflineContentProvider::OpenItem(const ContentId& id) {
-  wrapped_provider_->OpenItem(id);
+void ThrottledOfflineContentProvider::OpenItem(LaunchLocation location,
+                                               const ContentId& id) {
+  wrapped_provider_->OpenItem(location, id);
   FlushUpdates();
 }
 
diff --git a/components/offline_items_collection/core/throttled_offline_content_provider.h b/components/offline_items_collection/core/throttled_offline_content_provider.h
index 69fe5e5..a74b7be 100644
--- a/components/offline_items_collection/core/throttled_offline_content_provider.h
+++ b/components/offline_items_collection/core/throttled_offline_content_provider.h
@@ -33,7 +33,7 @@
   // Taking actions on the OfflineContentProvider will flush any queued updates
   // immediately after performing the action. This is to make sure item updates
   // in response to the update are immediately reflected back to the caller.
-  void OpenItem(const ContentId& id) override;
+  void OpenItem(LaunchLocation location, const ContentId& id) override;
   void RemoveItem(const ContentId& id) override;
   void CancelDownload(const ContentId& id) override;
   void PauseDownload(const ContentId& id) override;
diff --git a/components/offline_items_collection/core/throttled_offline_content_provider_unittest.cc b/components/offline_items_collection/core/throttled_offline_content_provider_unittest.cc
index d228b17d..e8cca8c0 100644
--- a/components/offline_items_collection/core/throttled_offline_content_provider_unittest.cc
+++ b/components/offline_items_collection/core/throttled_offline_content_provider_unittest.cc
@@ -92,14 +92,14 @@
   items.push_back(item);
 
   testing::InSequence sequence;
-  EXPECT_CALL(wrapped_provider_, OpenItem(id));
+  EXPECT_CALL(wrapped_provider_, OpenItem(LaunchLocation::DOWNLOAD_HOME, id));
   EXPECT_CALL(wrapped_provider_, RemoveItem(id));
   EXPECT_CALL(wrapped_provider_, CancelDownload(id));
   EXPECT_CALL(wrapped_provider_, PauseDownload(id));
   EXPECT_CALL(wrapped_provider_, ResumeDownload(id, true));
   EXPECT_CALL(wrapped_provider_, GetVisualsForItem(id, _));
   wrapped_provider_.SetItems(items);
-  provider_.OpenItem(id);
+  provider_.OpenItem(LaunchLocation::DOWNLOAD_HOME, id);
   provider_.RemoveItem(id);
   provider_.CancelDownload(id);
   provider_.PauseDownload(id);
@@ -327,7 +327,7 @@
                             base::Unretained(&wrapped_provider_));
 
   // Set up reentrancy calls back into the provider.
-  EXPECT_CALL(wrapped_provider_, OpenItem(_))
+  EXPECT_CALL(wrapped_provider_, OpenItem(_, _))
       .WillRepeatedly(
           InvokeWithoutArgs(CallbackToFunctor(base::Bind(updater, item2))));
   EXPECT_CALL(wrapped_provider_, RemoveItem(_))
@@ -348,7 +348,7 @@
     EXPECT_CALL(observer, OnItemUpdated(item2)).Times(1);
     provider_.set_last_update_time(base::TimeTicks::Now());
     wrapped_provider_.NotifyOnItemUpdated(item1);
-    provider_.OpenItem(id1);
+    provider_.OpenItem(LaunchLocation::DOWNLOAD_HOME, id1);
   }
 
   {
diff --git a/components/offline_pages/core/downloads/download_ui_adapter.cc b/components/offline_pages/core/downloads/download_ui_adapter.cc
index 6915ed00..bdbdb99 100644
--- a/components/offline_pages/core/downloads/download_ui_adapter.cc
+++ b/components/offline_pages/core/downloads/download_ui_adapter.cc
@@ -362,13 +362,14 @@
       FROM_HERE, base::BindOnce(std::move(callback), offline_item));
 }
 
-void DownloadUIAdapter::OpenItem(const ContentId& id) {
-  model_->GetPageByGuid(id.id,
-                        base::BindOnce(&DownloadUIAdapter::OnPageGetForOpenItem,
-                                       weak_ptr_factory_.GetWeakPtr()));
+void DownloadUIAdapter::OpenItem(LaunchLocation location, const ContentId& id) {
+  model_->GetPageByGuid(
+      id.id, base::BindOnce(&DownloadUIAdapter::OnPageGetForOpenItem,
+                            weak_ptr_factory_.GetWeakPtr(), location));
 }
 
-void DownloadUIAdapter::OnPageGetForOpenItem(const OfflinePageItem* page) {
+void DownloadUIAdapter::OnPageGetForOpenItem(LaunchLocation location,
+                                             const OfflinePageItem* page) {
   if (!page)
     return;
 
@@ -376,7 +377,7 @@
       model_->GetPolicyController()->IsSuggested(page->client_id.name_space);
   OfflineItem item =
       OfflineItemConversions::CreateOfflineItem(*page, is_suggested);
-  delegate_->OpenItem(item, page->offline_id);
+  delegate_->OpenItem(item, page->offline_id, location);
 }
 
 void DownloadUIAdapter::RemoveItem(const ContentId& id) {
diff --git a/components/offline_pages/core/downloads/download_ui_adapter.h b/components/offline_pages/core/downloads/download_ui_adapter.h
index c9c48cb1..30b65890 100644
--- a/components/offline_pages/core/downloads/download_ui_adapter.h
+++ b/components/offline_pages/core/downloads/download_ui_adapter.h
@@ -21,6 +21,7 @@
 #include "url/gurl.h"
 
 using ContentId = offline_items_collection::ContentId;
+using LaunchLocation = offline_items_collection::LaunchLocation;
 using OfflineItem = offline_items_collection::OfflineItem;
 using OfflineContentProvider = offline_items_collection::OfflineContentProvider;
 using OfflineContentAggregator =
@@ -57,7 +58,9 @@
     virtual void SetUIAdapter(DownloadUIAdapter* ui_adapter) = 0;
 
     // Opens an offline item.
-    virtual void OpenItem(const OfflineItem& item, int64_t offline_id) = 0;
+    virtual void OpenItem(const OfflineItem& item,
+                          int64_t offline_id,
+                          LaunchLocation launch_location) = 0;
 
     // Suppresses the download complete notification
     // depending on flags and origin.
@@ -80,7 +83,7 @@
       OfflinePageModel* model);
 
   // OfflineContentProvider implementation.
-  void OpenItem(const ContentId& id) override;
+  void OpenItem(LaunchLocation location, const ContentId& id) override;
   void RemoveItem(const ContentId& id) override;
   void CancelDownload(const ContentId& id) override;
   void PauseDownload(const ContentId& id) override;
@@ -151,7 +154,8 @@
       OfflineContentProvider::SingleItemCallback callback,
       std::vector<std::unique_ptr<SavePageRequest>> requests);
 
-  void OnPageGetForOpenItem(const OfflinePageItem* page);
+  void OnPageGetForOpenItem(LaunchLocation location,
+                            const OfflinePageItem* page);
   void OnPageGetForThumbnailAdded(const OfflinePageItem* page);
 
   void OnDeletePagesDone(DeletePageResult result);
diff --git a/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc b/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc
index 97204fe..3cd8c0b 100644
--- a/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc
+++ b/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc
@@ -84,7 +84,9 @@
   // DownloadUIAdapter::Delegate
   bool IsVisibleInUI(const ClientId& client_id) override { return is_visible; }
   void SetUIAdapter(DownloadUIAdapter* ui_adapter) override {}
-  void OpenItem(const OfflineItem& item, int64_t offline_id) override {}
+  void OpenItem(const OfflineItem& item,
+                int64_t offline_id,
+                LaunchLocation launch_location) override {}
   bool MaybeSuppressNotification(const std::string& origin,
                                  const ClientId& item) override {
     return maybe_suppress_notification_;
diff --git a/components/offline_pages/core/prefetch/store/prefetch_store_schema.cc b/components/offline_pages/core/prefetch/store/prefetch_store_schema.cc
index dad3afb..d58053e 100644
--- a/components/offline_pages/core/prefetch/store/prefetch_store_schema.cc
+++ b/components/offline_pages/core/prefetch/store/prefetch_store_schema.cc
@@ -119,7 +119,7 @@
 int MigrateFromVersion1To2(sql::Database* db, sql::MetaTable* meta_table) {
   const int target_version = 2;
   const int target_compatible_version = 1;
-  const char kVersion1ToVersion2MigrationSql[] =
+  static const char kVersion1ToVersion2MigrationSql[] =
       // Rename the existing items table.
       "ALTER TABLE prefetch_items RENAME TO prefetch_items_old; "
       // Creates the new items table.
diff --git a/components/offline_pages/core/request_header/offline_page_header.cc b/components/offline_pages/core/request_header/offline_page_header.cc
index 6e671fa..31cba409 100644
--- a/components/offline_pages/core/request_header/offline_page_header.cc
+++ b/components/offline_pages/core/request_header/offline_page_header.cc
@@ -16,6 +16,8 @@
 const char kOfflinePageHeaderReasonValueFromDownload[] = "download";
 const char kOfflinePageHeaderReasonValueReload[] = "reload";
 const char kOfflinePageHeaderReasonValueFromNotification[] = "notification";
+const char kOfflinePageHeadeReasonValueFromProgressBar[] = "progress_bar";
+const char kOfflinePageHeadeReasonValueFromSuggestion[] = "suggestion";
 const char kOfflinePageHeaderReasonFileUrlIntent[] = "file_url_intent";
 const char kOfflinePageHeaderReasonContentUrlIntent[] = "content_url_intent";
 const char kOfflinePageHeaderPersistKey[] = "persist";
@@ -64,6 +66,10 @@
         *reason = OfflinePageHeader::Reason::FILE_URL_INTENT;
       else if (lower_value == kOfflinePageHeaderReasonContentUrlIntent)
         *reason = OfflinePageHeader::Reason::CONTENT_URL_INTENT;
+      else if (lower_value == kOfflinePageHeadeReasonValueFromProgressBar)
+        *reason = OfflinePageHeader::Reason::PROGRESS_BAR;
+      else if (lower_value == kOfflinePageHeadeReasonValueFromSuggestion)
+        *reason = OfflinePageHeader::Reason::SUGGESTION;
       else
         return false;
     } else if (key == kOfflinePageHeaderIDKey) {
@@ -98,6 +104,10 @@
       return kOfflinePageHeaderReasonFileUrlIntent;
     case OfflinePageHeader::Reason::CONTENT_URL_INTENT:
       return kOfflinePageHeaderReasonContentUrlIntent;
+    case OfflinePageHeader::Reason::PROGRESS_BAR:
+      return kOfflinePageHeadeReasonValueFromProgressBar;
+    case OfflinePageHeader::Reason::SUGGESTION:
+      return kOfflinePageHeadeReasonValueFromSuggestion;
     default:
       NOTREACHED();
       return "";
@@ -125,13 +135,21 @@
 OfflinePageHeader::~OfflinePageHeader() {}
 
 std::string OfflinePageHeader::GetCompleteHeaderString() const {
+  std::string key = GetHeaderKeyString();
+  if (key.empty())
+    return std::string();
+  return key + ": " + GetHeaderValueString();
+}
+
+std::string OfflinePageHeader::GetHeaderKeyString() const {
+  return reason == Reason::NONE ? std::string() : kOfflinePageHeader;
+}
+
+std::string OfflinePageHeader::GetHeaderValueString() const {
   if (reason == Reason::NONE)
     return std::string();
 
-  std::string value(kOfflinePageHeader);
-  value += ": ";
-
-  value += kOfflinePageHeaderPersistKey;
+  std::string value(kOfflinePageHeaderPersistKey);
   value += "=";
   value += need_to_persist ? "1" : "0";
 
diff --git a/components/offline_pages/core/request_header/offline_page_header.h b/components/offline_pages/core/request_header/offline_page_header.h
index c69a545..13deea6 100644
--- a/components/offline_pages/core/request_header/offline_page_header.h
+++ b/components/offline_pages/core/request_header/offline_page_header.h
@@ -43,6 +43,15 @@
 // The offline page may be loaded when a content URL intent to view MHTML
 // content is received by Chrome (Android only).
 extern const char kOfflinePageHeaderReasonValueFromContentUrlIntent[];
+// The offline page should be loaded because the user clicks the notification
+// about a downloaded page.
+extern const char kOfflinePageHeaderReasonValueFromNotification[];
+// The offline page should be loaded because the user clicks Open link in
+// the progress bar.
+extern const char kOfflinePageHeadeReasonValueFromProgressBar[];
+// The offline page should be loaded because the user clicks an offlined
+// suggested item.
+extern const char kOfflinePageHeadeReasonValueFromSuggestion[];
 
 // The name used in name-value pair of kOfflinePageHeader to denote the offline
 // ID of the offline page to load.
@@ -63,7 +72,9 @@
     RELOAD,
     NOTIFICATION,
     FILE_URL_INTENT,
-    CONTENT_URL_INTENT
+    CONTENT_URL_INTENT,
+    PROGRESS_BAR,
+    SUGGESTION,
   };
 
   OfflinePageHeader();
@@ -78,6 +89,14 @@
   // passed to set extra request header.
   std::string GetCompleteHeaderString() const;
 
+  // Returns the key string used for extra request header. Empty string is
+  // returned if this struct is empty.
+  std::string GetHeaderKeyString() const;
+
+  // Returns the valye string used for extra request header. Empty string is
+  // returned if this struct is empty.
+  std::string GetHeaderValueString() const;
+
   void Clear();
 
   // Set if failed to parse a request header value string. For testing only.
diff --git a/components/offline_pages/core/request_header/offline_page_header_unittest.cc b/components/offline_pages/core/request_header/offline_page_header_unittest.cc
index f6e147f..faf28fb 100644
--- a/components/offline_pages/core/request_header/offline_page_header_unittest.cc
+++ b/components/offline_pages/core/request_header/offline_page_header_unittest.cc
@@ -169,6 +169,13 @@
   EXPECT_EQ(GURL("content://foo/Bar Test"), intent_url);
 }
 
+TEST_F(OfflinePageHeaderTest, ToEmptyString) {
+  OfflinePageHeader header;
+  EXPECT_EQ("", header.GetCompleteHeaderString());
+  EXPECT_EQ("", header.GetHeaderKeyString());
+  EXPECT_EQ("", header.GetHeaderValueString());
+}
+
 TEST_F(OfflinePageHeaderTest, ToString) {
   OfflinePageHeader header;
   header.need_to_persist = true;
@@ -180,6 +187,10 @@
       "intent_url=" +
           Base64EncodeString("content://foo/Bar \"\'\\Test"),
       header.GetCompleteHeaderString());
+  EXPECT_EQ("X-Chrome-offline", header.GetHeaderKeyString());
+  EXPECT_EQ("persist=1 reason=download id=a1b2 intent_url=" +
+                Base64EncodeString("content://foo/Bar \"\'\\Test"),
+            header.GetHeaderValueString());
 }
 
 }  // namespace offline_pages
diff --git a/components/omnibox/browser/search_provider.cc b/components/omnibox/browser/search_provider.cc
index 501f846..d8223a82 100644
--- a/components/omnibox/browser/search_provider.cc
+++ b/components/omnibox/browser/search_provider.cc
@@ -662,14 +662,10 @@
   int num_matches = kMaxMatches * 5;
   const TemplateURL* default_url = providers_.GetDefaultProviderURL();
   if (default_url) {
-    const base::TimeTicks start_time = base::TimeTicks::Now();
     url_db->GetMostRecentKeywordSearchTerms(default_url->id(),
                                             input_.text(),
                                             num_matches,
                                             &raw_default_history_results_);
-    UMA_HISTOGRAM_TIMES(
-        "Omnibox.SearchProvider.GetMostRecentKeywordTermsDefaultProviderTime",
-        base::TimeTicks::Now() - start_time);
   }
   const TemplateURL* keyword_url = providers_.GetKeywordProviderURL();
   if (keyword_url) {
@@ -969,7 +965,6 @@
 void SearchProvider::ConvertResultsToAutocompleteMatches() {
   // Convert all the results to matches and add them to a map, so we can keep
   // the most relevant match for each result.
-  base::TimeTicks start_time(base::TimeTicks::Now());
   MatchMap map;
   int did_not_accept_keyword_suggestion =
       keyword_results_.suggest_results.empty() ?
@@ -1129,8 +1124,6 @@
 
     matches_.push_back(*i);
   }
-  UMA_HISTOGRAM_TIMES("Omnibox.SearchProvider.ConvertResultsTime",
-                      base::TimeTicks::Now() - start_time);
 }
 
 void SearchProvider::RemoveExtraAnswers(ACMatches* matches) {
diff --git a/components/omnibox/browser/shortcuts_backend.cc b/components/omnibox/browser/shortcuts_backend.cc
index 911931d9..9c84edb4 100644
--- a/components/omnibox/browser/shortcuts_backend.cc
+++ b/components/omnibox/browser/shortcuts_backend.cc
@@ -236,6 +236,9 @@
   temp_shortcuts_map_->swap(shortcuts_map_);
   temp_shortcuts_map_.reset(nullptr);
   temp_guid_map_.reset(nullptr);
+  // This histogram is expired but the code was intentionally left behind so
+  // it can be easily re-enabled when launching Shortcuts provider on Android
+  // or iOS.
   UMA_HISTOGRAM_COUNTS_10000("ShortcutsProvider.DatabaseSize",
                              shortcuts_map_.size());
   current_state_ = INITIALIZED;
diff --git a/components/password_manager/content/browser/BUILD.gn b/components/password_manager/content/browser/BUILD.gn
index 1ca8e569..5b093c1d 100644
--- a/components/password_manager/content/browser/BUILD.gn
+++ b/components/password_manager/content/browser/BUILD.gn
@@ -2,7 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-static_library("browser") {
+import("//build/config/jumbo.gni")
+
+jumbo_static_library("browser") {
   sources = [
     "bad_message.cc",
     "bad_message.h",
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn
index 7ebff07..78e400a 100644
--- a/components/password_manager/core/browser/BUILD.gn
+++ b/components/password_manager/core/browser/BUILD.gn
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/jumbo.gni")
 import("//testing/libfuzzer/fuzzer_test.gni")
 import("//third_party/protobuf/proto_library.gni")
 
@@ -12,7 +13,7 @@
 # TODO(crbug.com/706392): Fix password reuse detection for Android.
 password_reuse_detection_support = !is_android && !is_ios
 
-static_library("browser") {
+jumbo_static_library("browser") {
   sources = [
     "android_affiliation/affiliated_match_helper.cc",
     "android_affiliation/affiliated_match_helper.h",
@@ -234,7 +235,7 @@
   ]
 }
 
-static_library("password_hash_data") {
+jumbo_static_library("password_hash_data") {
   sources = [
     "password_hash_data.cc",
     "password_hash_data.h",
@@ -260,7 +261,7 @@
   ]
 }
 
-static_library("test_support") {
+jumbo_static_library("test_support") {
   testonly = true
   sources = [
     "android_affiliation/fake_affiliation_api.cc",
diff --git a/components/password_manager/core/common/BUILD.gn b/components/password_manager/core/common/BUILD.gn
index 7046d614..598c083 100644
--- a/components/password_manager/core/common/BUILD.gn
+++ b/components/password_manager/core/common/BUILD.gn
@@ -3,8 +3,9 @@
 # found in the LICENSE file.
 
 import("//build/buildflag_header.gni")
+import("//build/config/jumbo.gni")
 
-static_library("common") {
+jumbo_static_library("common") {
   sources = [
     "credential_manager_types.cc",
     "credential_manager_types.h",
diff --git a/components/password_manager/sync/browser/BUILD.gn b/components/password_manager/sync/browser/BUILD.gn
index 63dbed4..8778b598 100644
--- a/components/password_manager/sync/browser/BUILD.gn
+++ b/components/password_manager/sync/browser/BUILD.gn
@@ -2,7 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-static_library("browser") {
+import("//build/config/jumbo.gni")
+
+jumbo_static_library("browser") {
   sources = [
     "password_data_type_controller.cc",
     "password_data_type_controller.h",
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 513639dd..b2cfd51 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -545,6 +545,7 @@
         'WaitForInitialUserActivity',
         'PowerManagementIdleSettings',
         'ScreenLockDelays',
+        'PowerSmartDimEnabled',
       ],
     },
     {
@@ -12646,6 +12647,24 @@
       These logs may be associated, by means of a session ID, with other logs collected by the Google service itself; this is intended to make debugging easier.
       ''',
     },
+    {
+      'name': 'PowerSmartDimEnabled',
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'supported_on': ['chrome_os:70-'],
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': False,
+      },
+      'example_value': False,
+      'id': 465,
+      'caption': '''Enable smart dim model to extend the time until the screen is dimmed''',
+      'tags': [],
+      'desc': '''Specifies whether a smart dim model is allowed to extend the time until the screen is dimmed.
+
+      When the screen is about to be dimmed, the smart dim model evaluates if dimming the screen should be deferred. If the smart dim model defers dimming the screen, it effectively extends the time until the screen is dimmed. In this case, the screen off, screen lock and idle delays get adjusted to maintain the same distances from the screen dim delay as originally configured.
+      If this policy is set to True or left not set, the smart dim model will be enabled and allowed to extend the time until the screen is dimmed. If this policy is set to False, the smart dim model will not influence screen dimming.''',
+    },
   ],
 
   'messages': {
@@ -12787,5 +12806,5 @@
   },
   'placeholders': [],
   'deleted_policy_ids': [412],
-  'highest_id_currently_used': 464
+  'highest_id_currently_used': 465
 }
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb
index 5fbd951..6ab3c086a 100644
--- a/components/policy/resources/policy_templates_am.xtb
+++ b/components/policy/resources/policy_templates_am.xtb
@@ -270,6 +270,7 @@
       ወደ ሐሰት ከተዋቀረ መለኪያዎች እና የምርመራ ውሂብን ሪፖርት ማድረግ ይሰናከላል።
 
       ካልተዋቀረ መለኪያዎች እና የምርመራ ውሂብን ሪፖርት ማድረግ በማይተዳደሩ መሣሪያዎች ላይ የሚሰናከል ሲሆን በሚተዳደሩ መሣሪያዎች ላይ ይነቃል።</translation>
+<translation id="1920046221095339924">በመሣሪያ ላይ የሚተዳደር ክፍለ-ጊዜን ይፍቀዱ</translation>
 <translation id="1929709556673267855">ከመሣሪያዎች ጋር ለተሳሰሩ የድርጅት ማተሚያዎች ውቅረቶችን ያቀርባል።
 
       ይህ መመሪያ ለ<ph name="PRODUCT_OS_NAME" /> መሣሪያዎች የማተሚያ ውቅረቶችን እንዲያቀርቡ ያስችልዎታል። ቅርጸቱ ከNativePrinters መዝገበ-ቃላቱ ጋር ተመሳሳይ ሲሆን፣ ለማተሚያ የሚያስፈልግ በተፈቀደላቸው ወይም በተከለከሉ ዝርዝር ውስጥ ለማካተት ተጨማሪ የሚያስፈልግ የ«id» ወይም «guid» መስክ አለው።
@@ -303,6 +304,7 @@
 
       ይህን ቅንብር ከነቃ ወይም እሴት ከሌለው ተጠቃሚው በዩአይ ውስጥ ለአድራሻ ራስ-ሙላን መቆጣጠር ይችላል።</translation>
 <translation id="1960840544413786116">የsubjectAlternativeName ቅጥያ በሚጎድላቸው የአካባቢያዊ እምነት መልሕቆች የተሰጡ የእውቅና ማረጋገጫዎች የሚታመኑ ወይም የማይታመኑ እንደሆኑ</translation>
+<translation id="1962273523772270623">የWebRTC ክስተት ምዝግብ ማስታወሻዎችን ከGoogle አገልግሎቶች መሰብሰብን ይፍቀዱ</translation>
 <translation id="1964634611280150550">ማንነት የማያሳውቅ ሁነታ ተሰናክሏል</translation>
 <translation id="1964802606569741174">ይህ መመሪያ በAndroid YouTube መተግበሪያው ላይ ምንም ተጽዕኖ የለውም። በYouTube ላይ የጥንቃቄ ሁነታ ተፈጻሚ የሚሆን ከሆነ የAndroid YouTube መተግበሪያ መጫን መከልከል አለበት።</translation>
 <translation id="1969212217917526199">የርቀት መዳረሻ አስተናጋጁ እርማት ግንቦች ላይ ያሉ መመሪያዎችን ይሽራል።
@@ -1993,6 +1995,11 @@
       ይህ መመሪያ እንዳልተዋቀረ ከተተወ ወይም ዝርዝሩ ባዶ ከሆነ ሁሉ ሙሉ ምስርቶች በ<ph name="PRODUCT_NAME" /> ውስጥ ተደራሽ ይሆናሉ።</translation>
 <translation id="6652197835259177259">በአካባቢያዊ የሚቀናበሩ የተጠቃሚ ቅንብሮች</translation>
 <translation id="6658245400435704251">መሣሪያው የዝማኔ ውርዱን ዝማኔው ከአገልጋዩ ከተገፋበት የመጀመሪያ ጊዜ ጀምሮ በዘፈቀደ ማዘግየት የሚችልባቸው የሰከንዶች ብዛት ይገልጻል። መሣሪያው የዚህ ጊዜ ክፍል በግድግዳ ሰዓት መልኩ ሊጠብቅ እና የተቀረውን ደግሞ በዝማኔ ፍለጋዎች ብዛት መልኩ ሊጠብቅ ይችላል። በማንኛውም አጋጣሚ መሣሪያው አንድን ዝማኔ እስከዘለዓለም እየጠበቀ እንዳይቀረቀር ብተናው ከፍ ቢል በተወሰነ የጊዜ መጠን ታስሯል።</translation>
+<translation id="6665599130599311250">ይህ መመሪያ ወደ ሐሰት ከተዋቀረ ወይም እንዳልተዋቀረ ከተተወ የሚተዳደር የእንግዳ ክፍለ-ጊዜ እንደ በhttps://support.google.com/chrome/a/answer/3017014 - መደበኛው «ይፋዊ ክፍለ-ጊዜ» - ሰነዳ እንደተቀመጠለ ይሆናል።
+
+      ይህ መመሪያ ወደ እውነት ከተዋቀረ የሚተዳደር የእንግዳ ክፍለ-ጊዜ በመደበኛ «ይፋዊ ክፍለ-ጊዜዎች» ላይ የተቀመጡ አብዛኛዎቹን ገደቦች የሚያነሳ «የሚተዳደር ክፍለ-ጊዜ» ባህሪን ይይዛል።
+
+      ይህ መመሪያ ከተዋቀረ ተጠቃሚው ሊቀይረው ወይም ሊሽረው አይችልም።</translation>
 <translation id="6665670272107384733">ተጠቃሚው ፈጣን መክፈትን ለመጠቀም በምን ያህል ተደጋጋሚነት የይለፍ ቃል ማስገባት እንዳለበት ያቀናብሩ</translation>
 <translation id="6681229465468164801">ተጠቃሚው የዩኤስቢ መሣሪያ መዳረሻ እንዲሰጣቸው እንዳይጠይቁ የታገዱ ጣቢያዎችን የሚገልጹ የዩአርኤል ስርዓተ-ጥለቶች ዝርዝርን እንዲያቀናብሩ ያስችልዎታል።
 
@@ -2151,6 +2158,17 @@
 <translation id="6943577887654905793">የMac/Linux ምርጫ ስም፦</translation>
 <translation id="69525503251220566">ለነባሪው የፍለጋ አቅራቢ በምስል የመፈለግ ባህሪይን የሚያቀርብ መለኪያ።</translation>
 <translation id="6956272732789158625">ማንኛውም ጣቢያ ቁልፍ ማመንጨትን እንዳይጠቀም ይከልክሉ</translation>
+<translation id="6982028490425791294">
+      መመሪያው ወደ እውነት ከተዋቀረ <ph name="PRODUCT_NAME" /> የWebRTC ክስተት ምዝግብ ማስታወሻዎችን ከGoogle አገልግሎቶች (ለምሳሌ፦ Google Meet) እንዲሰበስብና እነዚህን ምዝግብ ማስታወሻዎች ወደ Google እንዲሰቅል ይፈቀድለታል።
+
+      መመሪያው ወደ ሐሰት ከተዋቀረ ወይም እንዳልተዋቀረ ከተተወ <ph name="PRODUCT_NAME" /> እንዲህ ያሉ ምዝግብ ማስታወሻዎችን መሰብሰብም ሆነ መስቀል አይችልም።
+
+      እነዚህ ምዝግብ ማስታወሻዎች እንደ የተላኩ እና የተቀበሏቸው የRTP ጥቅሎች ጊዜ እና መጠን፣ በአውታረ መረቡ ላይ ያለ የጭንቅንቅ ግብረመልስ እና የኦዲዮና ቪዲዮ ክፈፎች ጊዜ እና ጥራት ዲበ ውሂብ ያለ መረጃን ይይዛሉ። ይህ መረጃ እንደ የመተላለፊያ ይዘት አገማመት ችግሮች ወዘተ ያሉ በChrome ውስጥ ባሉ የኦዲዮ ወይም የቪዲዮ ጥሪዎች ላይ ችግሮችን ማረም ላይ አጋዥ ነው። ምዝግብ ማስታወሻዎቹ ከጥሪው የመጡ የኦዲዮ ወይም ቪዲዮ ይዘቶች አይይዙም።
+
+      ይህ የውሂብ ስብስብ እንደ Google Hangouts ወይም Google Meet ባሉ የGoogle የድር አገልግሎቶች ብቻ ናቸው ሊቀሰቀስ የሚችለው።
+
+      እነዚህ የምዝግብ ማስታወሻዎች በክፍለ-ጊዜ መታወቂያ አማካኝነት በGoogle አገልግሎቱ ራሱ ከተሰበሰቡ ሌሎች ምዝግብ ማስታወሻዎች ጋር ሊዛመዱ ይችላሉ፤ ይህ ማረምን ለማቅለል የታሰበ ነው።
+      </translation>
 <translation id="6994082778848658360">የሰሌዳ ላይ ደህንነቱ የተጠበቀ የአባል ሃርድዌር ከዚህ ባህሪ ጋር ተኳሃኝ ከሆነ እንዴት ለሁለተኛ ደረጃ ማረጋገጥ ሥራ ላይ ሊውል እንደሚችል ይገልጻል። የማሽን ማብሪያ አዝራሩ ተጠቃሚው በአካል ያለ ከሆነ ለማወቅ ሥራ ላይ ይውላል። 
 
       «ተሰናክሏል» ከተመረጠ ምንም ሁለተኛ ደረጃ አይቀርብም።
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb
index 2b3e09a7..d02e218 100644
--- a/components/policy/resources/policy_templates_ar.xtb
+++ b/components/policy/resources/policy_templates_ar.xtb
@@ -271,6 +271,7 @@
       وإذا تم تعيين السياسة على الوضع "false"، سيتم إيقاف إعداد هذه التقارير.
 
       وفي حال عدم ضبط السياسة، سيتم إيقاف هذه الميزة على الأجهزة غير المُدارة وتفعيلها على الأجهزة المُدارة.</translation>
+<translation id="1920046221095339924">السماح بالجلسة المُدارة على الجهاز</translation>
 <translation id="1929709556673267855">‏توفِّر السياسة عمليات تهيئة لطابعات المؤسسة المرتبطة بالأجهزة وتسمح بتوفير عمليات تهيئة الطابعات لأجهزة <ph name="PRODUCT_OS_NAME" /> أيضًا. ويتطابق التنسيق مع تنسيق معجم NativePrinters، لكن أضيف حقل "id" أو "guid" إلزامي لكل طابعة لتحديد ما إذا سيتم إضافتها إلى القوائم البيضاء أو القوائم السوداء.
 
       ويجب ألّا يتجاوز حجم الملف 5 ميغابايت وأن يكون مُشفرًا بترميز جافا سكريبت (JSON). ومن المُقدَّر أن يتم تشفير ملف يتضمّن نحو 21 ألف طابعة كملف بحجم 5 ميغابايت. ويتم استخدام تجزئة التشفير للتحقُّق من سلامة التنزيل.
@@ -302,6 +303,7 @@
 
       في حال تفعيل هذا الإعداد أو عدم تعيين قيمة له، سيتمكن المستخدم من التحكّم في ميزة "الملء التلقائي" للعناوين في واجهة المستخدم.</translation>
 <translation id="1960840544413786116">‏لتحديد ما إذا كان يتم السماح بالشهادات التي أصدرتها كيانات الثقة المحلية أم لا، والتي لا تتضمن الإضافة subjectAlternativeName</translation>
+<translation id="1962273523772270623">‏السماح بمجموعة من سجلّات أحداث WebRTC من خدمات Google</translation>
 <translation id="1964634611280150550">تم إيقاف وضع التصفح المتخفي</translation>
 <translation id="1964802606569741174">‏لا تؤثر هذه السياسة على تطبيق YouTube لنظام التشغيل Android. إذا كان وضع الأمان في YouTube في حاجة إلى أن يتم فرضه، ينبغي ألا يتم السماح بتثبيت تطبيق YouTube لنظام التشغيل Android.</translation>
 <translation id="1969212217917526199">‏تلغي السياسات الواردة في إصدارات تصحيح الأخطاء لمضيف الوصول البعيد.
@@ -515,9 +517,9 @@
       تمت إزالة هذا الإعداد من <ph name="PRODUCT_NAME" /> 29 والإصدارات الأحدث.</translation>
 <translation id="2433412232489478893">‏تتحكّم هذه السياسة في ما إذا كان يُسمح للمستخدم بميزة "خوادم مشاركة الملفات على الشبكة" لـ <ph name="PRODUCT_NAME" /> أم لا.
 
-      في حال عدم تهيئة هذه السياسة أو ضبطها على "True"، سيتمكّن المستخدمون من استخدام ميزة "خوادم مشاركة الملفات على الشبكة".
+      في حال عدم تهيئة هذه السياسة أو ضبطها على "True"، سيتمكّن المستخدمون من الاستفادة من ميزة "خوادم مشاركة الملفات على الشبكة".
 
-      وفي حال ضبط هذه السياسة على "False"، لن يتمكّن المستخدمون من استخدام ميزة "خوادم مشاركة الملفات على الشبكة".</translation>
+      وفي حال ضبط هذه السياسة على "False"، لن يتمكّن المستخدمون من الاستفادة من ميزة "خوادم مشاركة الملفات على الشبكة".</translation>
 <translation id="2438609638493026652">‏تُفعّل هذه السياسة الإبلاغ عن الأحداث المهمة أثناء تثبيت تطبيق Android على Google. لا يتم تسجيل الأحداث إلا على التطبيقات التي تم تشغيل التثبيت التابع لها عبر السياسة.
 
       في حال تعيين السياسة على "true"، سيتم تسجيل الأحداث.
@@ -1884,6 +1886,11 @@
       إذا تم ترك هذه السياسة بدون تعيين أو كانت القائمة فارغة، فسيكون الوصول متاحًا لجميع الأنظمة في <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">إعدادات حسابات المستخدمين التي تخضع لإدارة محلية</translation>
 <translation id="6658245400435704251">لتحديد عدد الثواني التي يجوز للجهاز بعد انقضائها تأخير تنزيل أحد التحديثات بشكل عشوائي بدءًا من وقت نشر التحديث أول مرة من الخادم. وربما ينتظر الجهاز بعض هذا الوقت باعتباره ضمن الوقت المستغرق حتى الاكتمال والجزء المتبقي من الوقت باعتباره ضمن بعض عمليات البحث عن التحديثات. على أيّ حال، فإن التشتيت يكون أكبر من أو يساوي مقدارًا ثابتًا من الوقت ولذلك فإن الجهاز لا يتوقف أبدًا لانتظار تنزيل أحد التحديثات باستمرار.</translation>
+<translation id="6665599130599311250">‏في حال ضبط هذه السياسة على "false" أو تركها بدون ضبط، سيكون سلوك جلسة الضيف المُدارة كما لو أنه موّثقٌ في https://support.google.com/chrome/a/answer/3017014 - "الجلسة العامة" القياسية.
+
+......في حال ضبط هذه السياسة على "true"، ستتبع جلسة الضيف المُدارة سلوك "الجلسة المُدارة"، ما يؤدي إلى رفع العديد من القيود السارية على "الجلسات العامة" المنتظمة.
+
+......في حال ضبط هذه السياسة، لا يمكن للمستخدم تغييرها أو إلغاؤها.</translation>
 <translation id="6665670272107384733">تحديد المهلة لطلب إدخال كلمة المرور من جديد لاستخدام ميزة "إلغاء القفل السريع".</translation>
 <translation id="6681229465468164801">‏تسمح لك السياسة بإعداد قائمة بأنماط عناوين URL تُحدّد المواقع الممنوعة من أن تطلب من المستخدم منحها إمكانية الوصول إلى جهاز USB.
           إذا تُركت هذه السياسة بدون تعيين، سيتم استخدام القيمة التلقائية العامة لجميع المواقع إما من السياسة 'DefaultCookiesSetting' إذا كان قد تم تعيينها أو من التهيئة الشخصية للمستخدم.
@@ -2040,6 +2047,17 @@
 <translation id="6943577887654905793">‏اسم تفضيل نظام التشغيل Mac/Linux:</translation>
 <translation id="69525503251220566">معلمة توفر ميزة البحث بحسب الصورة لموفر خدمة البحث التلقائية</translation>
 <translation id="6956272732789158625">عدم السماح لأي موقع باستخدام إنشاء مفتاح</translation>
+<translation id="6982028490425791294">‏
+      في حال ضبط هذه السياسة على "true"، سيتم السماح للمنتج <ph name="PRODUCT_NAME" /> بتجميع سجلّات أحداث WebRTC من خدمات Google (مثل Google Meet) وتحميل هذه السجلّات إلى Google.
+
+.....في حال ضبط هذه السياسة على "false" أو عدم ضبطها، لا يجوز للمنتج <ph name="PRODUCT_NAME" /> تجميع هذه السجلّات أو تحميلها.
+
+.....تحتوي هذه السجلّات على معلومات، مثل وقت حزم RTP المُرسلة والمُستلمة وحجمها والتعليقات حول التكدس على الشبكة والبيانات الوصفية حول وقت إطارات الفيديو والصوت وجودتها. وهذه المعلومات مفيدة عند تصحيح الأخطاء المتعلقة بالمكالمات الصوتية أو مكالمات الفيديو في Chrome، مثل مشاكل تقدير معدّل نقل البيانات، وغير ذلك. ولا تتضمن هذه السجلّات محتوى الفيديو أو الصوت من المكالمة.
+
+.....لا يمكن تشغيل مجموعة البيانات هذه إلا من خلال خدمات الويب في Google، مثل Google Hangouts أو Google Meet.
+
+....قد ترتبط هذه السجلّات بسجلّات أخرى تم تجميعها عن طريق خدمة Google نفسها من خلال رقم تعريف الجلسة. والهدف من ذلك تسهيل عملية تصحيح الأخطاء.
+      </translation>
 <translation id="6994082778848658360">‏تحدِّد كيفية استخدام أجهزة العنصر الآمن المُدمجة لتوفير عامل المصادقة الثاني إذا كان متوافقًا مع هذه الميزة. يتم استخدام زر تشغيل الجهاز للكشف عن الوجود الفعلي للمستخدم.
 
       إذا تم تحديد "غير مفعّل"، فلن يتم توفير عامل ثانٍ.
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb
index 2024667..df7cd64 100644
--- a/components/policy/resources/policy_templates_bg.xtb
+++ b/components/policy/resources/policy_templates_bg.xtb
@@ -260,6 +260,7 @@
 При false тази функция ще бъде деактивирана.
 
 Ако правилото не е конфигурирано, съобщаването на показатели и диагностични данни ще бъде деактивирано за неуправляваните устройства и активирано за управляваните.</translation>
+<translation id="1920046221095339924">Разрешаване на управлявана сесия на устройството</translation>
 <translation id="1929709556673267855">Осигурява конфигурации за корпоративни принтери, свързани с устройствата.
 
 Това правило ви дава възможност да предоставите конфигурации за принтери за устройствата с <ph name="PRODUCT_OS_NAME" />. Форматът е същият като при речника NativePrinters, като за поставяне в белия или черния списък се изисква по едно допълнително поле id или guid на принтер.
@@ -293,6 +294,7 @@
 
 В случай че настройката е активирана или няма стойност, потребителят ще може да контролира функцията за автоматично попълване на адреси в ПИ.</translation>
 <translation id="1960840544413786116">Допускане на сертификати без разширение subjectAlternativeName, издадени от локални надеждни източници</translation>
+<translation id="1962273523772270623">Разрешаване на събиране на регистри на събитията за WebRTC от услугите на Google</translation>
 <translation id="1964634611280150550">Режим „инкогнито“ е деактивиран</translation>
 <translation id="1964802606569741174">Правилото няма ефект върху приложението YouTube за Android. Ако безопасният режим на YouTube трябва да е активиран принудително, инсталирането на това приложение трябва да е забранено.</translation>
 <translation id="1969212217917526199">Отменя правилата за версиите на хоста за отдалечен достъп, предназначени за отстраняване на грешки.
@@ -1916,6 +1918,11 @@
       Ако правилото не е зададено или списъкът е празен, в <ph name="PRODUCT_NAME" /> ще има достъп до всички схеми.</translation>
 <translation id="6652197835259177259">Настройки за локално управлявани потребители</translation>
 <translation id="6658245400435704251">Посочва до колко секунди устройството може произволно да забави изтеглянето на актуализация от момента на първото й изпращане към сървъра. То може да изчака част от времето от гледна точка на необходимия период за извършване на цялата операция, а останалата част – спрямо броя проверки за актуализации. Във всички случаи разпределянето е обвързано с горната граница на постоянен период от време, така че устройството никога да не блокира в непрекъснато изчакване на изтеглянето на актуализация.</translation>
+<translation id="6665599130599311250">Ако това правило е false или не е зададено, управляваната сесия като гост ще се държи като стандартна обществена сесия, както е документирано в https://support.google.com/chrome/a/answer/3017014.
+
+      Ако за правилото е зададено true, управляваната сесия като гост ще има поведение на управлявана сесия, което премахва много от ограниченията на обичайните обществени сесии.
+
+      Ако правилото е зададено, потребителят няма да може да го променя или заменя.</translation>
 <translation id="6665670272107384733">Задаване колко често потребителят трябва да въвежда паролата, за да използва функцията за бързо отключване</translation>
 <translation id="6681229465468164801">Позволява да зададете списък с образци на URL адреси, посочващи сайтовете, на които не е разрешено да искат от потребителя достъп до USB устройство.
 
@@ -2079,6 +2086,17 @@
 <translation id="6943577887654905793">Име на предпочитанието за Mac/Linux:</translation>
 <translation id="69525503251220566">Параметър, предоставящ за основната търсеща машина функция за търсене по изображение</translation>
 <translation id="6956272732789158625">Забраняване на сайтовете да генерират ключове</translation>
+<translation id="6982028490425791294">
+      Ако това правило е true, на <ph name="PRODUCT_NAME" /> се разрешава да събира регистри на събитията за WebRTC от услугите на Google (напр. Google Meet) и да ги качва в Google.
+
+      Ако правилото е false или не е зададено, <ph name="PRODUCT_NAME" /> не може да събира и качва такива регистри.
+
+      Тези регистри съдържат информация като часа и размера на изпратените и получените RTP пакети, обратна връзка за претоварване в мрежата, както и метаданни за времената и качеството на аудио- и видеокадрите. Тази информация е от полза при отстраняването на проблеми с гласовите или видеообажданията в Chrome, като например при оценката на пропускателната способност и т.н. Регистрите не включват аудио- или видеосъдържание от обажданията.
+
+      Това събиране на данни може да бъде задействано само от уеб услугите на Google, като Google Hangouts или Google Meet.
+
+      Посредством идентификационен номер на сесията тези регистри може да бъдат свързани с други регистрационни файлове, събирани от самата услуга на Google. Това се прави с цел улесняване на отстраняването на грешки.
+      </translation>
 <translation id="6994082778848658360">Посочва как вграденият защитен хардуерен елемент може да се използва за осигуряване на второ ниво на удостоверяване на самоличността, ако е съвместим с тази функция. Бутонът за захранване на машината служи за установяване на физическото присъствие на потребителя.
 
 Ако настройката е деактивирана, няма да се използва второ ниво на удостоверяване.
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb
index 5608c654b..d98c062 100644
--- a/components/policy/resources/policy_templates_bn.xtb
+++ b/components/policy/resources/policy_templates_bn.xtb
@@ -1765,7 +1765,7 @@
 <translation id="5208240613060747912">বিজ্ঞপ্তিগুলি প্রদর্শনের জন্য অনুমোদিত এমন সাইটগুলি নির্দিষ্ট করে এমন url ধরণগুলির একটি তালিকা আপনাকে সেট করার অনুমতি দেয়৷
 
 যদি এই নীতিটি বামে সেট না করে ছেড়ে যাওয়া হয়, তাহলে গ্লোবাল ডিফল্ট মান সব সাইটগুলির জন্য ব্যবহার করা হবে যদি 'ডিফল্ট বিজ্ঞপ্তি সেটিং' নীতি সেট করা হয় তা থেকে, নয়তো ব্যবহারকারীদের ব্যক্তিগত কনফিগারেশান থেকে৷</translation>
-<translation id="5219844027738217407">Android অ্যাপ্লিকেশানগুলির জন্য, এই নীতিটি কেবলমাত্র মাইক্রোফোনকে প্রভাবিত করে। এই নীতিটি সত্যতে সেট করা থাকলে, কোনো ব্যতিক্রম ছাড়াই সব Android অ্যাপ্লিকেশানগুলির জন্য মাইক্রোফোন নিঃশব্দ করা থাকে।</translation>
+<translation id="5219844027738217407">Android অ্যাপ্লিকেশানগুলির জন্য, এই নীতিটি কেবলমাত্র মাইক্রোফোনকে প্রভাবিত করে। এই নীতিটি সত্যতে সেট করা থাকলে, কোনো ব্যতিক্রম ছাড়াই সব Android অ্যাপ্লিকেশানগুলির জন্য মাইক্রোফোন মিউট করা থাকে।</translation>
 <translation id="523505283826916779">অ্যাক্সেসযোগ্যতার সেটিংস</translation>
 <translation id="5235958368503433463"><ph name="PRODUCT_NAME" />-এ ডিফল্ট হোম পেজের ধরণ কনফিগার করতে দেয় এবং ব্যবহারকারীদের হোম পেজের পছন্দগুলি পরিবর্তনে বাধা দেয়। হোম পেজটি আপনার নির্ধারিত একটি ইউআরএল অথবা নতুন ট্যাব পৃষ্ঠায় সেট করা যায়।
 
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb
index ea9cea9..65cc723 100644
--- a/components/policy/resources/policy_templates_ca.xtb
+++ b/components/policy/resources/policy_templates_ca.xtb
@@ -259,6 +259,7 @@
       Si s'estableix en "false", es desactivaran els informes de mètriques i de dades de diagnòstic.
 
       Si no es configura, els informes de mètriques i de dades de diagnòstic es desactivaran als dispositius no gestionats i s'activaran als dispositius gestionats.</translation>
+<translation id="1920046221095339924">Permet sessions gestionades al dispositiu</translation>
 <translation id="1929709556673267855">Proporciona configuracions per a les impressores d'empresa vinculades a dispositius.
 
       Aquesta política et permet proporcionar configuracions d'impressores als dispositius <ph name="PRODUCT_OS_NAME" />. El format és el mateix que el del diccionari NativePrinters, amb un camp addicional "id" o "guid" obligatori a cada impressora per afegir-les a la llista blanca o negra.
@@ -292,6 +293,7 @@
 
       Si s'activa aquesta opció de configuració o no s'hi estableix cap valor, l'usuari podrà controlar el funcionament d'Emplenament automàtic per a les adreces a la IU.</translation>
 <translation id="1960840544413786116">Si es permeten certificats emesos per ancoratges de confiança locals que no tinguin l'extensió subjectAlternativeName</translation>
+<translation id="1962273523772270623">Permet la col·lecció de registres d'esdeveniments WebRTC dels serveis de Google</translation>
 <translation id="1964634611280150550">Mode d'incògnit desactivat</translation>
 <translation id="1964802606569741174">Aquesta política no té cap efecte a l'aplicació YouTube per a Android. Per forçar l'ús del mode de seguretat de YouTube, s'ha de denegar la instal·lació d'aquesta aplicació.</translation>
 <translation id="1969212217917526199">Substitueix les polítiques de compilacions de depuració de l'amfitrió d'accés remot.
@@ -1904,6 +1906,11 @@
       Si no s'estableix aquesta política o la llista és buida, es podrà accedir a tots els esquemes a <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Configuració dels usuaris gestionats localment</translation>
 <translation id="6658245400435704251">Especifica el nombre de segons fins a què un dispositiu pot retardar aleatòriament la baixada d'una actualització des del moment en què l'actualització es transmet per primera vegada des del servidor. El dispositiu pot esperar una part d'aquest temps en termes de rellotge i la part restant en termes de nombre de comprovacions d'actualitzacions. En qualsevol cas, la dispersió tendeix cap amunt a una quantitat constant de temps, de manera que un dispositiu mai no es quedi encallat mentre espera que es baixi una actualització.</translation>
+<translation id="6665599130599311250">Si aquesta política s'estableix en "false" o es deixa sense establir, la sessió de convidat gestionada funcionarà com es descriu a la pàgina https://support.google.com/chrome/a/answer/3017014, és a dir, com una sessió pública estàndard.
+
+      Si aquesta política s'estableix en "true" o es deixa sense establir, la sessió de convidat gestionada funcionarà com una sessió gestionada i se suprimiran moltes de les restriccions de les sessions públiques normals.
+
+      Si aquesta política s'estableix, l'usuari no la podrà canviar ni substituir.</translation>
 <translation id="6665670272107384733">Defineix amb quina freqüència l'usuari ha d'introduir la contrasenya per utilitzar el desbloqueig ràpid</translation>
 <translation id="6681229465468164801">Permet definir una llista de patrons d'URL que especifiquin llocs web que no poden demanar a l'usuari que els concedeixi accés a un dispositiu USB.
 
@@ -2060,6 +2067,17 @@
 <translation id="6943577887654905793">Nom de la preferència de Mac/Linux:</translation>
 <translation id="69525503251220566">Paràmetre que proporciona la funció de cerca per imatge per al proveïdor de cerca predeterminat</translation>
 <translation id="6956272732789158625">No permetis que cap lloc utilitzi la generació de claus</translation>
+<translation id="6982028490425791294">
+      Si aquesta política s'estableix en "true", <ph name="PRODUCT_NAME" /> pot col·leccionar registres d'esdeveniments WebRTC dels serveis de Google (p. ex. Google Meet) i pujar-los a Google.
+
+      Si aquesta política s'estableix en "false" o es deixa sense establir, és possible que <ph name="PRODUCT_NAME" /> no col·leccioni ni pengi aquests registres.
+
+      Aquests registres contenen informació com ara l'hora i la mida dels paquets RTP rebuts i enviats, comentaris sobre la congestió de la xarxa, i metadades sobre l'hora i la qualitat dels marcs d'àudio i de vídeo. Aquesta informació resulta útil per depurar problemes de les trucades d'àudio o videotrucades de Chrome, com ara els problemes d'estimació de l'amplada de banda. Aquests registres no inclouen contingut d'àudio ni vídeo de les trucades.
+
+      Aquesta col·lecció de dades només la poden activar els serveis web de Google, com ara Google Hangouts i Google Meet.
+
+      Aquests registres es poden associar, mitjançant un ID de sessió, a altres registres col·leccionats pel servei de Google per tal de facilitar la depuració.
+      </translation>
 <translation id="6994082778848658360">Especifica de quina manera es pot utilitzar el maquinari de l'element de seguretat integrat per proporcionar una autenticació de dos factors si és compatible amb aquesta funció. El botó d'engegada de l'ordinador s'utilitza per detectar la presència física de l'usuari.
 
       Si se selecciona Desactivat, no es proporciona un segon factor.
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb
index 2d6f269..fe3296ae 100644
--- a/components/policy/resources/policy_templates_cs.xtb
+++ b/components/policy/resources/policy_templates_cs.xtb
@@ -257,6 +257,7 @@
       Pokud je tato zásada nastavena na hodnotu false, bude hlášení metrik a diagnostických dat zakázáno.
 
       Pokud tato zásada není nakonfigurována, bude hlášení metrik a diagnostických dat na nespravovaných zařízeních zakázáno a na spravovaných zařízeních bude povoleno.</translation>
+<translation id="1920046221095339924">Povolit v zařízení spravovanou relaci</translation>
 <translation id="1929709556673267855">Poskytuje konfigurace pro podnikové tiskárny svázané se zařízeními.
 
 Tato zásada umožňuje poskytnout zařízením <ph name="PRODUCT_OS_NAME" /> konfigurace tiskáren. Má stejný formát jako slovník NativePrinters, ale obsahuje navíc povinné pole „id“ nebo „guid“ pro každou tiskárnu, která má být zařazena na seznam povolených nebo zakázaných.
@@ -290,6 +291,7 @@
 
       Pokud je toto nastavení zapnuto nebo nemá žádnou hodnotu, uživatel bude moci automatické vyplňování adres ovládat v uživatelském rozhraní.</translation>
 <translation id="1960840544413786116">Udává, zda mají být povoleny certifikáty vydané místními kotvami vztahu důvěryhodnosti bez rozšíření subjectAlternativeName.</translation>
+<translation id="1962273523772270623">Povolit shromažďování protokolů událostí WebRTC ze služeb Google</translation>
 <translation id="1964634611280150550">Anonymní režim zakázán</translation>
 <translation id="1964802606569741174">Tato zásada nemá vliv na aplikaci YouTube pro Android. Chcete-li na YouTube vynutit bezpečný režim, měli byste instalaci aplikace YouTube pro Android zakázat.</translation>
 <translation id="1969212217917526199">Přepíše zásady u ladicích sestavení hostitele vzdáleného připojení.
@@ -1959,6 +1961,11 @@
 Pokud bude tato zásada ponechána nenastavená nebo bude seznam prázdný, bude v prohlížeči <ph name="PRODUCT_NAME" /> možné používat všechna schémata.</translation>
 <translation id="6652197835259177259">Nastavení místně spravovaných uživatelů</translation>
 <translation id="6658245400435704251">Určí počet sekund, o který může zařízení náhodně zdržet stahování aktualizace od doby, kdy byla poprvé zveřejněna na serveru. Zařízení může čekat určitý čas a pokusit se o určitý počet kontrol aktualizací. Zpoždění je však v každém případě omezeno neměnným maximálním časovým limitem tak, aby zařízení nečekalo na stažení aktualizace donekonečna.</translation>
+<translation id="6665599130599311250">Pokud je tato zásada nastavena na hodnotu false nebo není nastavena, spravovaná relace hosta se bude chovat podle dokumentace na stránce https://support.google.com/chrome/a/answer/3017014 (jako standardní veřejná relace).
+
+      Pokud je tato zásada nastavena na hodnotu true, bude se spravovaná relace hosta chovat jako spravovaná relace, což znamená, že se na ni nebudou vztahovat některá omezení, která se vztahují na běžné veřejné relace.
+
+      Pokud je tato zásada nastavena, uživatel ji nemůže změnit ani přepsat.</translation>
 <translation id="6665670272107384733">Nastavit, jak často musí uživatel zadat heslo, pokud chce používat rychlé odemknutí</translation>
 <translation id="6681229465468164801">Umožňuje nastavit seznam vzorů adres URL webů, které uživatele nesmějí žádat o přístup k zařízení USB.
 
@@ -2114,6 +2121,17 @@
 <translation id="6943577887654905793">Název nastavení v systémech Mac/Linux:</translation>
 <translation id="69525503251220566">Parametr poskytující funkci vyhledávání podle obrázku pro výchozího poskytovatele vyhledávání</translation>
 <translation id="6956272732789158625">Nepovolit žádnému webu generovat klíče</translation>
+<translation id="6982028490425791294">
+      Je-li tato zásada nastavena na hodnotu true, má <ph name="PRODUCT_NAME" /> povoleno shromažďovat protokoly událostí WebRTC ze služeb Google (např. Google Meet) a nahrávat je do Googlu.
+
+      Pokud je tato zásada nastavená na hodnotu false nebo je ponechána nenastavená, prohlížeč <ph name="PRODUCT_NAME" /> takové protokoly shromažďovat ani nahrávat nesmí.
+
+      Tyto protokoly obsahují informace, jako je čas, velikost odeslaných a přijatých paketů RTP, zpětná vazba ohledně zahlcení sítě a metadata ohledně času a kvality snímků zvuku a videa. Tyto informace jsou užitečné k ladění problémů se zvukovými hovory a videohovory v Chromu, jako jsou problémy s odhadem rychlosti připojení apod. Protokoly neobsahují zvukový ani obrazový obsah z hovoru.
+
+      Toto shromažďování dat mohou spustit pouze webové služby Googlu, například Google Hangouts nebo Google Meet.
+
+      Kvůli snazšímu ladění tyto protokoly mohou být prostřednictvím ID relace přidruženy k jiným protokolům shromažďovaným samotnou službou Google.
+      </translation>
 <translation id="6994082778848658360">Udává, jak lze integrovaný bezpečnostní hardwarový prvek používat k dvoufaktorovému ověření, pokud je s touto funkcí kompatibilní. Ke zjištění fyzické přítomnosti uživatele se používá vypínač počítače.
 
       Pokud je vybrána možnost Deaktivováno, druhý faktor není k dispozici.
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb
index c43dc725..bda1805 100644
--- a/components/policy/resources/policy_templates_da.xtb
+++ b/components/policy/resources/policy_templates_da.xtb
@@ -267,6 +267,7 @@
       Hvis den er angivet som falsk, deaktiveres rapportering af metrics og diagnosticeringsdata.
 
       Hvis den ikke konfigureres, deaktiveres rapportering af metrics og diagnosticeringsdata på ikke-administrerede enheder, mens det aktiveres på administrerede enheder.</translation>
+<translation id="1920046221095339924">Tillad administreret session på enheden</translation>
 <translation id="1929709556673267855">Angiver konfigurationer af virksomhedsprintere, der er knyttet til enheder.
 
       Denne politik giver dig mulighed for at angive printerkonfigurationer for <ph name="PRODUCT_OS_NAME" />-enheder.  Formatet er det samme som for NativePrinters-ordbogen, men for hver printer er der et yderligere påkrævet felt for "id" eller "guid" til hvidlister og sortlister.
@@ -300,6 +301,7 @@
 
       Hvis denne indstilling er aktiveret eller ikke har nogen værdi, kan brugeren administrere den overordnede AutoFyld-funktion for adresser i brugerfladen.</translation>
 <translation id="1960840544413786116">Hvorvidt der skal gives tilladelse til certifikater, som er udstedt af lokale tillidsankre og mangler udvidelsen subjectAlternativeName</translation>
+<translation id="1962273523772270623">Tillad indsamling af WebRTC-hændelseslogfiler fra Google-tjenester</translation>
 <translation id="1964634611280150550">Inkognitotilstand er deaktiveret</translation>
 <translation id="1964802606569741174">Denne politik påvirker ikke YouTube-appen til Android. Hvis Beskyttet tilstand på YouTube skal håndhæves, skal installation af YouTube-appen til Android ikke tillades.</translation>
 <translation id="1969212217917526199">Tilsidesætter politikker i fejlfindingsbuilds for hosten for fjernadgang.
@@ -1925,6 +1927,11 @@
       Hvis denne politik ikke indstilles, eller hvis listen er tom, vil alle skemaer være tilgængelige i <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Indstillinger for lokalt administrerede brugere</translation>
 <translation id="6658245400435704251">Angiver det antal sekunder, som en enhed på en tilfældig måde maksimalt kan forsinke en download af en opdatering fra det tidspunkt, hvor opdateringen først blev sendt ud til serveren. Enheden kan afsætte en del af denne tid i form af faktisk ventetid og den igangværende tid i form af det antal af opdateringer, der skal kontrolleres. Uanset hvad, er spredningen bundet af en øvre grænse til en konstant mængde af tid, således at en enhed aldrig kommer til at sidde fast og til evig tid vente på, at en opdatering downloades.</translation>
+<translation id="6665599130599311250">Hvis politikken er angivet som falsk eller ikke er angivet, reagerer administrerede gæstesessioner som beskrevet på https://support.google.com/chrome/a/answer/3017014 – standarden for "Offentlig session".
+
+      Hvis politikken er angivet som sand, har administrerede gæstesessioner samme adfærd som "Administreret session", hvilket fjerner mange af de begrænsninger, der gælder for "Offentlige sessioner".
+
+      Hvis politikken er konfigureret, kan den ikke ændres eller tilsidesættes af brugeren.</translation>
 <translation id="6665670272107384733">Konfigurer, hvor ofte brugeren skal indtaste adgangskoden for at bruge hurtig oplåsning.</translation>
 <translation id="6681229465468164801">Giver dig mulighed for at angive en liste med webadressemønstre, der angiver websites, som ikke må anmode brugeren om adgang til en USB-enhed.
 
@@ -2082,6 +2089,17 @@
 <translation id="6943577887654905793">Præferencenavn for Mac/Linux:</translation>
 <translation id="69525503251220566">Parameter, der leverer funktion til billedsøgning i standardsøgemaskinen</translation>
 <translation id="6956272732789158625">Tillad ikke, at websites anvender nøglegenerering</translation>
+<translation id="6982028490425791294">
+      Hvis politikken er angivet som sand, har <ph name="PRODUCT_NAME" /> tilladelse til at indsamle WebRTC-hændelseslogfiler fra Google-tjenester (f.eks. Google Meet) og uploade de pågældende logfiler til Google.
+
+      Hvis politikken er angivet som falsk eller ikke er angivet, må <ph name="PRODUCT_NAME" /> ikke indsamle eller uploade sådanne logfiler.
+
+      Disse logfiler indeholder visse oplysninger, bl.a. tidspunkt for og størrelsen på sendte og modtagne RTP-pakker, feedback om belastning af netværket samt metadata om varigheden og kvaliteten af lyd- og videorammer. Disse oplysninger er nyttige i forbindelse med fejretning af problemer med lyd- og videoopkald i Chrome, f.eks. problemer med vurdering af båndbredde. Logfilerne omfatter ikke lyd- eller videoindhold fra opkald.
+
+      Denne dataindsamling kan kun aktiveres af Google-webtjenester såsom Google Hangouts eller Google Meet.
+
+      Disse logfiler kan ved hjælp af et sessions-id knyttes til andre logfiler, der er indsamlet af selve Google-tjenesten. Dette kan gøre fejlretningen nemmere.
+      </translation>
 <translation id="6994082778848658360">Angiver, hvordan det sikre element, der er indbygget i hardwaren, kan bruges til at levere godkendelse med sekundær faktor, hvis det er kompatibelt med denne funktion. Maskinens afbryderknap bruges til at fastslå brugerens fysiske tilstedeværelse.
 
       Hvis "Deaktiveret" er valgt, leveres der ingen sekundær faktor.
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index c61527a76..6268ad03 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -260,6 +260,7 @@
       Ist die Richtlinie auf "false" festgelegt, ist das Senden solcher Berichte deaktiviert.
 
       Ist die Richtlinie nicht konfiguriert, ist das Senden solcher Berichte auf nicht verwalteten Geräten deaktiviert und auf verwalteten Geräten aktiviert.</translation>
+<translation id="1920046221095339924">Verwaltete Sitzung auf Gerät zulassen</translation>
 <translation id="1929709556673267855">Stellt Konfigurationen für gerätegebundene Unternehmensdrucker bereit.
 
       Mit dieser Richtlinie können Druckerkonfigurationen für <ph name="PRODUCT_OS_NAME" />-Geräte bereitgestellt werden. Das Format entspricht dem des "NativePrinters"-Wörterbuchs, erfordert jedoch zusätzlich ein "id"- oder "guid"-Feld pro Drucker für die White- oder Blacklist.
@@ -293,6 +294,7 @@
 
       Falls diese Einstellung aktiviert ist oder keinen Wert hat, kann der Nutzer die AutoFill-Funktion in der UI für Adressen steuern.</translation>
 <translation id="1960840544413786116">Genehmigung von Zertifikaten, die von lokalen Vertrauensankern ausgestellt werden, bei denen die "subjectAlternativeName"-Erweiterung fehlt</translation>
+<translation id="1962273523772270623">Speichern von WebRTC-Ereignisprotokollen von Google-Diensten zulassen</translation>
 <translation id="1964634611280150550">Inkognitomodus deaktiviert</translation>
 <translation id="1964802606569741174">Diese Richtlinie hat keine Auswirkungen auf die Android YouTube App. Wenn der Sicherheitsmodus in YouTube erzwungen werden soll, darf das Installieren der Android YouTube App nicht zugelassen werden.</translation>
 <translation id="1969212217917526199">Überschreibt Richtlinien auf Fehlerbehebungs-Builds des Hosts für den Remotezugriff
@@ -505,11 +507,11 @@
       Wird diese Einstellung nicht konfiguriert, können die Nutzer entscheiden, ob sie die Funktion verwenden möchten.
 
       Diese Einstellung ist ab <ph name="PRODUCT_NAME" />-Version 29 nicht mehr vorhanden.</translation>
-<translation id="2433412232489478893">Mit dieser Richtlinie wird gesteuert, ob die Netzwerkfreigabe-Funktion für <ph name="PRODUCT_NAME" /> für einen Nutzer zulässig ist.
+<translation id="2433412232489478893">Mit dieser Richtlinie wird gesteuert, ob die Funktion "Netzwerkfreigaben" für <ph name="PRODUCT_NAME" /> von Nutzern verwendet werden kann.
 
-      Wenn diese Richtlinie nicht konfiguriert oder auf "true" gesetzt ist, können Nutzer Netzwerkfreigaben verwenden.
+      Wenn diese Richtlinie nicht konfiguriert oder auf "true" eingestellt ist, können Nutzer die Funktion "Netzwerkfreigaben" verwenden.
 
-      Ist diese Richtlinie auf "false" eingestellt, so stehen Nutzern keine Netzwerkfreigaben zur Verfügung.</translation>
+      Wenn diese Richtlinie auf "false" eingestellt, können Nutzer die Funktion "Netzwerkfreigaben" nicht verwenden.</translation>
 <translation id="2438609638493026652">Aktiviert die Meldung von wichtigen Ereignissen an Google während der Installation von Android-Apps. Ereignisse werden nur für Apps erfasst, deren Installation über die Richtlinie ausgelöst wurde.
 
       Wenn die Richtlinie auf "true" festgelegt ist, werden Ereignisse protokolliert.
@@ -1144,7 +1146,7 @@
       Wenn diese Richtlinie nicht festgelegt wird, ist die anonymisierte URL-Datenerfassung aktiviert, aber der Nutzer kann diese Einstellung ändern.</translation>
 <translation id="4250680216510889253">Nein</translation>
 <translation id="4261820385751181068">Sprache der Anmeldeseite</translation>
-<translation id="4264607809747169568">Steuert Netzwerkfreigaben für Chrome OS-Verfügbarkeit</translation>
+<translation id="4264607809747169568">Steuert die Verfügbarkeit von Netzwerkfreigaben unter Chrome OS</translation>
 <translation id="427220754384423013">Gibt die Drucker an, die ein Nutzer verwenden kann.
 
       Diese Richtlinie wird nur verwendet, wenn <ph name="PRINTERS_WHITELIST" /> für <ph name="BULK_PRINTERS_ACCESS_MODE" /> ausgewählt wurde.
@@ -1547,13 +1549,13 @@
       Der Wert sollte in Millisekunden angegeben werden.</translation>
 <translation id="5511702823008968136">Lesezeichenleiste aktivieren</translation>
 <translation id="5512418063782665071">Startseiten-URL</translation>
-<translation id="551639594034811656">Durch diese Richtlinie wird eine Liste mit Prozentwerten festgelegt, die angeben, welcher Anteil der <ph name="PRODUCT_OS_NAME" />-Geräte in der OE pro Tag aktualisiert werden, nachdem das Update entdeckt wurde. Der Abstand zwischen Entdeckungszeitpunkt und Veröffentlichungszeitpunkt hängt davon ab, wann das Gerät nach Updates sucht.
+<translation id="551639594034811656">Durch diese Richtlinie wird eine Liste mit Prozentwerten festgelegt, die angeben, welcher Anteil der <ph name="PRODUCT_OS_NAME" />-Geräte in der OE pro Tag aktualisiert wird, nachdem das Update zum ersten Mal entdeckt wurde. Der Abstand zwischen Entdeckungszeitpunkt und Veröffentlichungszeitpunkt hängt davon ab, wann das Gerät nach Updates sucht.
 
-      Jedes Paar der Form (Tag, Prozentwert) gibt an, welcher Anteil der Geräte nach dieser Anzahl von Tagen, seit das Update entdeckt wurde, aktualisiert worden sein muss. Wenn zum Beispiel die Paare [(4, 40), (10, 70), (15, 100)] festgelegt wurden, sollten vier Tage, nachdem das Updates entdeckt wurde, 40 % der Geräte aktualisiert worden sein. Nach zehn Tagen sollte das Update für 70 % erfolgt sein und so weiter.
+      Jedes Paar der Form (Tag, Prozentwert) gibt an, welcher Anteil der Geräte nach dieser Anzahl von Tagen seit Entdeckung des Updates aktualisiert worden sein muss. Wenn zum Beispiel die Paare [(4, 40), (10, 70), (15, 100)] festgelegt wurden, sollten vier Tage, nachdem das Updates entdeckt wurde, 40 % der Geräte aktualisiert worden sein. Nach zehn Tagen sollte das Update für 70 % erfolgt sein und so weiter.
 
       Wenn für diese Richtlinie ein Wert festgelegt ist, folgen Updates dieser Richtlinie und ignorieren die Richtlinie "<ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />".
 
-      Falls diese Liste leer ist, erfolgt kein Staging und Updates werden gemäß anderen Geräterichtlinien angewendet.
+      Wenn diese Liste leer ist, erfolgt kein Staging und Updates werden gemäß anderen Geräterichtlinien angewendet.
 
       Diese Richtlinie gilt nicht für Kanalwechsel.</translation>
 <translation id="5523812257194833591">Hiermit geben Sie die öffentliche Sitzung an, in der ein Nutzer nach einer bestimmten Zeitspanne automatisch angemeldet wird.
@@ -1911,6 +1913,11 @@
       Wenn diese Richtlinie nicht konfiguriert wird oder die Liste leer ist, sind alle Schemata in <ph name="PRODUCT_NAME" /> zugänglich.</translation>
 <translation id="6652197835259177259">Einstellungen für lokal verwaltete Nutzer</translation>
 <translation id="6658245400435704251">Legt die Anzahl von Sekunden fest, die eine Verzögerung ab dem Übertragungszeitpunkt an den Server maximal betragen darf, wenn ein Gerät ein Update herunterlädt. Die Verzögerungszeit setzt sich aus der Istzeit und der auf die Anzahl der Überprüfungen auf Updates verwendeten Zeit zusammen. Die obere Grenze für den Streufaktor bildet ein konstanter Zeitraum, sodass ein Gerät nur eine begrenzte Zeit lang auf den Download eines Updates wartet.</translation>
+<translation id="6665599130599311250">Wenn diese Richtlinie auf "false" gesetzt oder nicht festgelegt ist, verhalten sich verwaltete Gastsitzungen wie unter https://support.google.com/chrome/a/answer/3017014 beschrieben. Dieses Verhalten entspricht einer standardmäßigen öffentlichen Sitzung.
+
+      Ist die Richtlinie auf "true" gesetzt, verhält sich die verwaltete Gastsitzung wie eine verwaltete Sitzung, bei der viele der Einschränkungen aufgehoben sind, die bei regulären öffentlichen Sitzungen gelten.
+
+      Sollte die Richtlinie festgelegt sein, kann sie vom Nutzer nicht geändert oder überschrieben werden.</translation>
 <translation id="6665670272107384733">Festlegen, wie oft der Nutzer das Passwort eingeben muss, um das schnelle Entsperren zu verwenden</translation>
 <translation id="6681229465468164801">Ermöglicht Ihnen die Erstellung einer Liste mit URL-Mustern. Den angegebenen Websites ist es nicht gestattet, Zugriff auf ein USB-Gerät anzufordern.
 
@@ -2076,6 +2083,17 @@
 <translation id="6943577887654905793">Bevorzugter Mac-/Linux-Name:</translation>
 <translation id="69525503251220566">Parameter für Funktion zur bildgesteuerten Suche für Standardsuchanbieter</translation>
 <translation id="6956272732789158625">Schlüsselgenerierung für keine Website zulassen</translation>
+<translation id="6982028490425791294">
+      Wenn diese Richtlinie auf "true" gesetzt ist, darf <ph name="PRODUCT_NAME" /> WebRTC-Ereignisprotokolle von Google-Diensten (z. B. Google Meet) speichern und die Protokolle bei Google hochladen.
+
+      Ist die Richtlinie auf "false" gesetzt oder nicht festgelegt, darf <ph name="PRODUCT_NAME" /> solche Protokolle nicht speichern oder hochladen.
+
+      Diese Protokolle enthalten z. B. Informationen dazu, wann RTP-Pakete gesendet und empfangen wurden und welche Größe sie haben, außerdem Feedback zur Auslastung des Netzwerks und Metadaten zur Länge und Qualität von Audio- und Videoframes. Diese Informationen können beim Lösen von Problemen mit Audio- und Videoanrufen in Chrome hilfreich sein, etwa wenn die Bandbreite nicht geschätzt werden kann. Die Protokolle enthalten keine Audio- oder Videoinhalte aus dem Anruf.
+
+      Das Erfassen dieser Daten kann nur von den Google-Webdiensten ausgelöst werden, etwa Google Hangouts oder Google Meet.
+
+      Diese Protokolle können anhand einer Sitzungs-ID mit anderen Protokollen verknüpft sein, die vom Google-Dienst selbst erstellt wurden. Dies dient dazu, Fehler leichter beheben zu können.
+      </translation>
 <translation id="6994082778848658360">Hiermit wird angegeben, wie die integrierte Secure Element-Hardware zur Zwei-Faktor-Authentifizierung verwendet werden kann, wenn sie mit dieser Funktion kompatibel ist. Mithilfe der Ein-/Aus-Taste des Geräts wird die Anwesenheit des Nutzers ermittelt.
 
       Wenn "Deaktiviert" ausgewählt ist, steht kein zweiter Authentifizierungsfaktor zur Verfügung.
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb
index cc17a61..a009bd9 100644
--- a/components/policy/resources/policy_templates_el.xtb
+++ b/components/policy/resources/policy_templates_el.xtb
@@ -269,6 +269,7 @@
 <translation id="1888871729456797026">Το διακριτικό εγγραφής της πολιτικής cloud σε υπολογιστή</translation>
 <translation id="1897365952389968758">Να επιτρέπεται σε όλους τους ιστότοπους η εκτέλεση JavaScript</translation>
 <translation id="1906888171268104594">Ελέγχει εάν επιστρέφονται στην Google αναφορές μετρήσεων χρήσης και διαγνωστικών δεδομένων, συμπεριλαμβανομένων αναφορών σφαλμάτων. Το <ph name="PRODUCT_OS_NAME" />, εάν έχει οριστεί ως αληθές, θα αναφέρει μετρήσεις χρήσης και διαγνωστικά δεδομένα. Εάν έχει οριστεί ως ψευδές, οι αναφορές μετρήσεων και διαγνωστικών δεδομένων θα απενεργοποιηθούν. Εάν δεν έχει διαμορφωθεί, οι αναφορές μετρήσεων και διαγνωστικών δεδομένων θα απενεργοποιηθούν σε μη διαχειριζόμενες συσκευές και θα ενεργοποιηθούν σε διαχειριζόμενες συσκευές.</translation>
+<translation id="1920046221095339924">Να επιτρέπεται η διαχειριζόμενη περίοδος σύνδεσης στη συσκευή</translation>
 <translation id="1929709556673267855">Παρέχει διαμορφώσεις στους εταιρικούς εκτυπωτές που συνδέονται με τις συσκευές.
 
       Αυτή η πολιτική σάς δίνει τη δυνατότητα να παρέχετε διαμορφώσεις εκτυπωτών σε συσκευές <ph name="PRODUCT_OS_NAME" />.  Η μορφή είναι η ίδια με αυτήν στο λεξικό NativePrinters, με ένα επιπλέον υποχρεωτικό πεδίο "id" ή "guid" για κάθε εκτυπωτή ώστε να είναι δυνατή η τοποθέτησή τους σε λίστα επιτρεπόμενων ή μαύρη λίστα.
@@ -302,6 +303,7 @@
 
       Εάν αυτή η ρύθμιση ενεργοποιηθεί ή δεν έχει τιμή, ο χρήστης θα έχει τη δυνατότητα να ελέγξει την Αυτόματη Συμπλήρωση για διευθύνσεις στη διεπαφή χρήστη.</translation>
 <translation id="1960840544413786116">Εάν θα επιτρέπονται τα πιστοποιητικά που εκδίδονται από τοπικά σημεία αγκύρωσης εμπιστοσύνης από τα οποία λείπει η επέκταση subjectAlternativeName</translation>
+<translation id="1962273523772270623">Να επιτρέπεται η συλλογή αρχείων καταγραφής συμβάντων WebRTC από υπηρεσίες Google</translation>
 <translation id="1964634611280150550">Η κατάσταση ανώνυμης περιήγησης απενεργοποιήθηκε</translation>
 <translation id="1964802606569741174">Αυτή η πολιτική δεν επηρεάζει την εφαρμογή Android YouTube. Εάν πρέπει να επιβληθεί η Ασφαλής λειτουργία στο YouTube, η εγκατάσταση της εφαρμογής Android YouTube δεν θα πρέπει να επιτρέπεται.</translation>
 <translation id="1969212217917526199">Παρακάμπτει πολιτικές σε εκδόσεις εντοπισμού σφαλμάτων του κεντρικού υπολογιστή απομακρυσμένης πρόσβασης.
@@ -1994,6 +1996,11 @@
       Αν δεν ρυθμιστεί αυτή η πολιτική ή αν η λίστα είναι κενή, όλα τα σχέδια θα είναι προσβάσιμα στο <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Ρυθμίσεις χρηστών τοπικής διαχείρισης</translation>
 <translation id="6658245400435704251">Καθορίζει τον αριθμό των δευτερολέπτων μέχρι το διάστημα των οποίων ενδέχεται να καθυστερήσει τυχαία η λήψη μιας ενημέρωσης από μια συσκευή, από τη στιγμή που η ενημέρωση προωθήθηκε για πρώτη φορά στον διακομιστή. Η συσκευή ενδέχεται να διαθέσει κάποιο τμήμα του χρόνου ως χρόνο παρέλευσης και τον υπόλοιπο χρόνο σε μορφή αριθμού ελέγχων ενημερώσεων. Σε κάθε περίπτωση, η διασπορά οριοθετείται στο μέγιστο όριο σε ένα σταθερό χρονικό διάστημα, έτσι ώστε να μην καθυστερήσει η λήψη μιας ενημέρωσης.</translation>
+<translation id="6665599130599311250">Εάν αυτή η πολιτική οριστεί ως "ψευδής" ή δεν οριστεί, η διαχειριζόμενη περίοδος σύνδεσης επισκέπτη θα συμπεριφέρεται σύμφωνα με την τεκμηρίωση στη διεύθυνση https://support.google.com/chrome/a/answer/3017014 σχετικά με την τυπική "δημόσια περίοδο σύνδεσης".
+
+      Εάν αυτή η πολιτική οριστεί ως "αληθής", η διαχειριζόμενη περίοδος σύνδεσης θα συμπεριφέρεται ως "Διαχειριζόμενη περίοδος σύνδεσης", αίροντας πολλούς από τους περιορισμούς που ισχύουν για τυπικές "Δημόσιες περιόδους σύνδεσης".
+
+      Εάν οριστεί αυτή η πολιτική, ο χρήστης δεν θα μπορεί να την αλλάξει ή να την παρακάμψει.</translation>
 <translation id="6665670272107384733">Ορίζει τη συχνότητα με την οποία κάποιος χρήστης θα πρέπει να εισάγει τον κωδικό πρόσβασης για να χρησιμοποιεί το γρήγορο ξεκλείδωμα.</translation>
 <translation id="6681229465468164801">Σας επιτρέπει να ορίσετε μια λίστα μοτίβων URL που καθορίζουν ιστοτόπους στους οποίους δεν επιτρέπεται να ζητήσουν από έναν χρήστη να τους παραχωρήσει πρόσβαση σε μια συσκευή USB.
 
@@ -2159,6 +2166,17 @@
 <translation id="6943577887654905793">Όνομα προτίμησης Mac/Linux:</translation>
 <translation id="69525503251220566">Παράμετρος που παρέχει τη λειτουργία αναζήτησης βάσει εικόνας για τον προεπιλεγμένο πάροχο αναζήτησης</translation>
 <translation id="6956272732789158625">Να μην επιτρέπεται σε κανέναν ιστότοπο να χρησιμοποιεί τη δημιουργία κλειδιού</translation>
+<translation id="6982028490425791294">
+      Εάν η πολιτική οριστεί ως "αληθής", επιτρέπεται στο <ph name="PRODUCT_NAME" /> η συλλογή αρχείων καταγραφής συμβάντων WebRTC από υπηρεσίες Google (π.χ. το Google Meet) και η μεταφόρτωση αυτών των αρχείων καταγραφής στο Google.
+
+      Εάν η πολιτική οριστεί ως "ψευδής" ή δεν οριστεί, το <ph name="PRODUCT_NAME" /> δεν θα μπορεί να συλλέγει ή να ανεβάζει αρχεία καταγραφής αυτού του τύπου.
+
+      Αυτά τα αρχεία καταγραφής περιέχουν πληροφορίες όπως την ώρα και το μέγεθος των πακέτων RTP που έχουν σταλεί και ληφθεί, σχόλια σχετικά με τη συμφόρηση του δικτύου και μεταδεδομένα σχετικά με την ώρα και την ποιότητα των πλαισίων βίντεο και ήχου. Αυτές οι πληροφορίες είναι χρήσιμες κατά τον εντοπισμό και τη διόρθωση προβλημάτων ηχητικών κλήσεων και βιντεοκλήσεων στο Chrome, όπως προβλημάτων σχετικά με εκτιμήσεις εύρους ζώνης, κ.λπ. Τα αρχεία καταγραφής δεν περιέχουν περιεχόμενα βίντεο ή ήχου από την κλήση.
+
+      Αυτή η συλλογή δεδομένων μπορεί να ενεργοποιηθεί μόνο από τις υπηρεσίες ιστού της Google, όπως το Google Hangouts ή το Google Meet.
+
+      Αυτά τα αρχεία καταγραφής μπορεί να συσχετίζονται μέσω αναγνωριστικού περιόδου σύνδεσης με άλλα αρχεία καταγραφής που συλλέγονται από την ίδια την υπηρεσία Google. Αυτό έχει ως στόχο τη διευκόλυνση του εντοπισμού και της διόρθωσης σφαλμάτων.
+      </translation>
 <translation id="6994082778848658360">Καθορίζει τον τρόπο με τον οποίο ο ενσωματωμένος εξοπλισμός ασφαλούς στοιχείου μπορεί να χρησιμοποιηθεί για την παροχή ελέγχου ταυτότητας δευτερεύοντα παράγοντα εάν είναι συμβατός με αυτήν τη λειτουργία. Το κουμπί λειτουργίας της συσκευής χρησιμοποιείται για τον εντοπισμό της φυσικής παρουσίας του χρήστη.
 
       Εάν οριστεί η επιλογή "Απενεργοποιημένο", δεν παρέχεται κανένας δευτερεύων παράγοντας.
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb
index e7a490bf..6b8b078e 100644
--- a/components/policy/resources/policy_templates_en-GB.xtb
+++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -275,6 +275,7 @@
       If set to false, metrics and diagnostic data reporting will be disabled.
 
       If not configured, metrics and diagnostic data reporting will be disabled on unmanaged devices, and enabled on managed devices.</translation>
+<translation id="1920046221095339924">Allow managed session on device</translation>
 <translation id="1929709556673267855">Provides configurations for enterprise printers bound to devices.
 
       This policy allows you to provide printer configurations to <ph name="PRODUCT_OS_NAME" /> devices.  The format is the same as the NativePrinters dictionary, with an additional required 'id' or 'guid' field per printer for whitelisting or blacklisting.
@@ -308,6 +309,7 @@
 
       If this setting is enabled or has no value, the user will be able to control AutoFill for addresses in the UI.</translation>
 <translation id="1960840544413786116">Whether to allow certificates issued by local trust anchors that are missing the subjectAlternativeName extension</translation>
+<translation id="1962273523772270623">Allow collection of WebRTC event logs from Google services</translation>
 <translation id="1964634611280150550">Incognito mode disabled.</translation>
 <translation id="1964802606569741174">This policy has no effect on the Android YouTube app. If Safety Mode on YouTube should be enforced, installation of the Android YouTube app should be disallowed.</translation>
 <translation id="1969212217917526199">Overrides policies on Debug builds of the remote access host.
@@ -2005,6 +2007,11 @@
       If this policy is left not set or the list is empty all schemes will be accessible in <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Locally managed users settings</translation>
 <translation id="6658245400435704251">Specifies the number of seconds up to which a device may randomly delay its download of an update from the time the update was first pushed out to the server. The device may wait a portion of this time in terms of wall-clock-time and the remaining portion in terms of the number of update checks. In any case, the scatter is upper bounded to a constant amount of time so that a device does not ever get stuck waiting to download an update forever.</translation>
+<translation id="6665599130599311250">If this policy is set to false or left unset, managed guest session will behave as documented in https://support.google.com/chrome/a/answer/3017014 - the standard 'Public Session'.
+
+      If this policy is set to true, managed guest session will take on 'Managed Session' behaviour, which lifts many of the restrictions that are in place for regular 'Public Sessions'.
+
+      If this policy is set, the user cannot change or override it.</translation>
 <translation id="6665670272107384733">Set how often user has to enter password to use quick unlock</translation>
 <translation id="6681229465468164801">Allows you to set a list of url patterns that specify sites which are prevented from asking the user to grant them access to a USB device.
 
@@ -2171,6 +2178,17 @@
 <translation id="6943577887654905793">Mac/Linux preference name:</translation>
 <translation id="69525503251220566">Parameter providing search-by-image feature for the default search provider</translation>
 <translation id="6956272732789158625">Do not allow any site to use key generation</translation>
+<translation id="6982028490425791294">
+      If the policy is set to true, <ph name="PRODUCT_NAME" /> is allowed to collect WebRTC event logs from Google services (e.g. Google Meet), and upload those logs to Google.
+
+      If the policy is set to false, or is unset, <ph name="PRODUCT_NAME" /> may not collect nor upload such logs.
+
+      These logs contain information, such as the time and size of sent and received RTP packets, feedback about congestion on the network and metadata about time and quality of audio and video frames. This information is helpful when debugging issues with audio or video calls in Chrome, such as bandwidth estimation issues, etc. The logs do not contain audio or video contents from the call.
+
+      This data collection can only be triggered by Google's web services, such as Google Hangouts or Google Meet.
+
+      These logs may be associated, by means of a session ID, with other logs collected by the Google service itself; this is intended to make debugging easier.
+      </translation>
 <translation id="6994082778848658360">Specifies how the on-board secure element hardware can be used to provide a second-factor authentication if it is compatible with this feature. The machine power button is used to detect the user physical presence.
 
       If 'Disabled' is selected, no second factor is provided.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index 856ebf8..987228e 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -1147,7 +1147,7 @@
       Si no se establece, se habilitará la recopilación, y el usuario podrá cambiarla.</translation>
 <translation id="4250680216510889253">No</translation>
 <translation id="4261820385751181068">Configuración regional de la pantalla de acceso del dispositivo</translation>
-<translation id="4264607809747169568">Controlar la disponibilidad de "Network File Shares" para el Sistema operativo Chrome</translation>
+<translation id="4264607809747169568">Controla la disponibilidad de "Network File Shares" para el Sistema operativo Chrome</translation>
 <translation id="427220754384423013">Especifica las impresoras que puede utilizar el usuario.
 
       Esta política solo se usa si se elige <ph name="PRINTERS_WHITELIST" /> para <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1548,7 +1548,7 @@
 <translation id="551639594034811656">Esta política define una lista de porcentajes que determinará la fracción de dispositivos <ph name="PRODUCT_OS_NAME" /> en la UO que se actualizará por día a partir del momento en que se descubre la actualización (posterior a la publicación, conforme a lo que tarde el dispositivo en buscar actualizaciones).
       Cada par (día, porcentaje) contiene el porcentaje de la flota que se debe actualizar en una cantidad dada de días a partir del descubrimiento de la actualización. Por ejemplo, si tenemos los pares [(4, 40), (10, 70), (15, 100)], el 40% de la flota debe haberse actualizado 4 días después de descubrir la actualización. El 70% debe actualizarse después de 10 días, y así sucesivamente.
 
-      Si hay un valor definido para esta política, las actualizaciones ignorarán la política <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> y, en su lugar, seguirán esta.
+      Si se define valor para esta política, las actualizaciones ignorarán la política <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> y, en su lugar, seguirán esta.
 
       Si esta lista está vacía, no se definirán etapas y se aplicarán las actualizaciones conforme a otras políticas de dispositivo.
 
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 9aa73c9..691c07bd 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -270,6 +270,7 @@
       Si se le asigna el valor "False", se inhabilitará el envío de informes sobre métricas y datos de diagnóstico.
 
       Si no se configura, se inhabilitarán los informes sobre métricas y datos de diagnóstico en los dispositivos no administrados y se habilitará en los dispositivos administrados.</translation>
+<translation id="1920046221095339924">Permitir sesión gestionada en el dispositivo</translation>
 <translation id="1929709556673267855">Proporciona opciones de configuración de impresoras de empresa vinculadas con los dispositivos.
 
       Esta política permite proporcionar opciones de configuración de impresoras a los dispositivos <ph name="PRODUCT_OS_NAME" />. El formato es el mismo que el del diccionario NativePrinters, con un campo "id" o "guid" obligatorio por impresora para crear una lista blanca o negra.
@@ -303,6 +304,7 @@
 
       Si habilitas esta opción o no estableces ningún valor, el usuario podrá controlar la función Autocompletar para datos de la dirección en la UI.</translation>
 <translation id="1960840544413786116">Si se permiten los certificados emitidos por los anclajes de confianza locales que no tienen la extensión subjectAlternativeName</translation>
+<translation id="1962273523772270623">Permitir la recogida de registros de eventos WebRTC de servicios de Google</translation>
 <translation id="1964634611280150550">Modo de incógnito inhabilitado</translation>
 <translation id="1964802606569741174">Esta política no influye en la aplicación YouTube para Android. Si se debe aplicar el modo seguro en YouTube, deberás inhabilitar la descarga de la aplicación YouTube para Android.</translation>
 <translation id="1969212217917526199">Anula las políticas de compilaciones de depuración del host de acceso remoto.
@@ -2007,6 +2009,11 @@
       Si no se establece esta política o la lista está vacía, se podrá acceder a todos los esquemas en <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Configuración de usuarios administrados de forma local</translation>
 <translation id="6658245400435704251">Especifica el número de segundos hasta los que un dispositivo puede retrasar aleatoriamente la descarga de una actualización desde el momento en el que esta se envío al servidor por primera vez. El dispositivo puede dedicar una parte de este tiempo al propio proceso de actualización y el resto a realizar las comprobaciones necesarias. En cualquier caso, el límite superior de la dispersión es un periodo de tiempo constante, para que el dispositivo no se quede bloqueado mientras descarga una actualización.</translation>
+<translation id="6665599130599311250">Si se le asigna el valor "False" a esta política o no se le asigna ningún valor, la sesión de invitado gestionada funcionará como se describe en la página https://support.google.com/chrome/a/answer/3017014, es decir, como una "sesión pública" estándar.
+
+      Si se le asigna el valor "True" a esta política, la sesión de invitado gestionada funcionará como una "sesión gestionada" y se eliminarán muchas de las restricciones de las "sesiones públicas" normales.
+
+      Si se le asigna un valor a esta política, el usuario no puede cambiarlo ni anularlo.</translation>
 <translation id="6665670272107384733">Definir la frecuencia con la que el usuario debe introducir la contraseña para utilizar el desbloqueo rápido</translation>
 <translation id="6681229465468164801">Permite configurar una lista de patrones de URL que especifican los sitios web que no pueden solicitar al usuario acceso a un dispositivo USB.
 
@@ -2173,6 +2180,17 @@
 <translation id="6943577887654905793">Nombre de preferencia en Mac/Linux:</translation>
 <translation id="69525503251220566">Parámetro que proporciona una función de búsqueda por imagen para el proveedor de búsquedas predeterminado</translation>
 <translation id="6956272732789158625">No permitir que los sitios web utilicen la generación de claves</translation>
+<translation id="6982028490425791294">
+      Si se le asigna el valor "True" a esta política", <ph name="PRODUCT_NAME" /> puede recoger registros de eventos WebRTC de los servicios de Google (p. ej., Google Meet) y subirlos a Google.
+
+      Si se le asigna el valor "False" a esta política o no se le asigna ningún valor, <ph name="PRODUCT_NAME" /> no podrá recoger ni subir estos registros.
+
+      Estos registros contienen información como la hora y el tamaño de los paquetes RTP recibidos, comentarios sobre la congestión de la red y metadatos sobre la hora y la calidad de los marcos de vídeo y audio. Esta información resulta útil para depurar problemas de las llamadas de audio o videollamadas de Chrome, como problemas de estimación del ancho de banda. Los registros no incluyen contenido de audio ni vídeo de las llamadas.
+
+      Esta recogida de datos solo la pueden activar los servicios web de Google, como Hangouts o Google Meet.
+
+      Estos registros se pueden asociar, mediante un ID de sesión, a otros registros recogidos por el servicio de Google para facilitar la depuración.
+      </translation>
 <translation id="6994082778848658360">Especifica cómo se puede utilizar el hardware del elemento seguro integrado para proporcionar una autenticación de dos factores si es compatible con esta función. El botón de encendido del ordenador se utiliza para detectar la presencia física del usuario.
 
       Si se inhabilita esta opción, no se proporciona ninguna autenticación de dos factores.
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb
index 29c9492..db1198e 100644
--- a/components/policy/resources/policy_templates_et.xtb
+++ b/components/policy/resources/policy_templates_et.xtb
@@ -275,6 +275,7 @@
       Kui reegli väärtuseks on määratud Väär, siis on mõõdikute teabe ja diagnostikaandmete edastamine keelatud.
 
       Kui reegel on seadistamata, siis on mõõdikute teabe ja diagnostikaandmete edastamine haldamata seadmetes keelatud ja hallatud seadmetes lubatud.</translation>
+<translation id="1920046221095339924">Seadmes hallatud seansi lubamine</translation>
 <translation id="1929709556673267855">Määrab seadistused seadmetega seotud ettevõtte printeritele.
 
       See reegel võimaldab teil määrata printeri seadistused operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> seadmetele. Vorming on sama, mis sõnastikul NativePrinters, kus lubatute või keelatute loendisse lisamiseks on printeri puhul vajalik lisaväli „id” või „guid”.
@@ -308,6 +309,7 @@
 
       Selle seade lubamisel või määramata jätmisel saab kasutaja kasutajaliideses aadresside automaattäite funktsiooni juhtida.</translation>
 <translation id="1960840544413786116">Kas lubada kohalike usaldusvõtmete väljastatud sertifikaadid, millel puudub laiend subjectAlternativeName?</translation>
+<translation id="1962273523772270623">Google'i teenustest WebRTC sündmuselogide kogumise lubamine</translation>
 <translation id="1964634611280150550">Inkognito režiim on keelatud</translation>
 <translation id="1964802606569741174">See reegel ei mõjuta Androidi YouTube'i rakendust. Kui ohutusrežiim on sisse lülitatud, tuleks YouTube jõustada ja Androidi YouTube'i rakenduse installimine keelata.</translation>
 <translation id="1969212217917526199">Alistab kaugjuurdepääsu hosti silumisjärkude reeglid.
@@ -1994,6 +1996,11 @@
       Kui jätate reegli määramata või loendi tühjaks, on kõik skeemid teenuses <ph name="PRODUCT_NAME" /> juurdepääsetavad.</translation>
 <translation id="6652197835259177259">Kohalikult hallatud kasutajaseaded</translation>
 <translation id="6658245400435704251">Määrab sekundite arvu pärast värskenduse serverist väljalaskmist, mille jooksul võib seade värskenduse allalaadimist juhuslikult viivitada. Seade võib oodata osa ajast reaalajas ja ülejäänud aja sõltuvalt värskenduste otsimiste arvust. Igal juhul on hajutatuse ülempiir seotud ajalise konstandiga, et seade ei jääks värskenduse allalaadimist igaveseks ootama.</translation>
+<translation id="6665599130599311250">Kui reegli väärtuseks määratakse Väär või jäetakse see määramata, käitub hallatud külastajaseanss aadressil https://support.google.com/chrome/a/answer/3017014 kirjeldatud moel – standardse avaliku seansina.
+
+      Kui reegli väärtuseks määratakse Tõene, käituvad hallatud külastajaseansid hallatud seanssidena, mille puhul puuduvad paljud piirangud, mis kehtivad tavapäraste avalike seansside puhul.
+
+      Kui reegel määratakse, ei saa kasutaja seda muuta ega alistada.</translation>
 <translation id="6665670272107384733">Kiire avamise puhul parooli sisestamise sageduse määramine</translation>
 <translation id="6681229465468164801">Võimaldab määrata URL-i mustrite loendi, mis määrab saidid, millel ei ole lubatud küsida kasutajalt luba USB-seadmele juurdepääsemiseks.
 
@@ -2161,6 +2168,17 @@
 <translation id="6943577887654905793">Maci/Linuxi eelistuse nimi:</translation>
 <translation id="69525503251220566">Parameeter otsingu vaikepakkujale pildi järgi otsimise funktsiooni pakkumiseks</translation>
 <translation id="6956272732789158625">Ära luba ühelgi saidil võtmeid luua</translation>
+<translation id="6982028490425791294">
+      Kui reegel on seatud väärtusele Tõene, võib <ph name="PRODUCT_NAME" /> koguda Google'i teenustest (nt Google Meet) WebRTC sündmuselogisid ja need Google'i serveritesse üles laadida.
+
+      Kui reegel on seatud väärtusele Väär või seadistamata, ei tohi <ph name="PRODUCT_NAME" /> logisid koguda ega üles laadida.
+
+      Need logid sisaldavad näiteks saadetud ja vastuvõetud RTP-pakettide kellaaja ja suuruse teavet, tagasisidet võrgu ummistuste kohta ja metaandmeid heli- ja videokaardite aja ja kvaliteedi kohta. See teave on kasulik Chrome'i hääl- või videokõnedega seotud probleemide, nt ribalaiuse prognoosimise probleemide jms silumisel. Logid ei sisalda kõne hääl- ega videosisu.
+
+      Andmete kogumise saavad käivitada ainult Google'i veebiteenused, nt as Google Hangouts või Google Meet.
+
+      Logid võidakse seansi ID alusel seostada muude logidega, mida Google'i teenus kogub. Selle eesmärk on hõlbustada silumist.
+      </translation>
 <translation id="6994082778848658360">Määrab, kuidas kasutada sisseehitatud turvalist elementi kahe teguriga autentimise funktsiooni pakkumiseks, kui element ühildub selle funktsiooniga. Kasutaja füüsilise kohaloleku tuvastamiseks kasutatakse seadme toitenuppu.
 
       Kui valite väärtuse „Keelatud”, ei pakuta kahe teguriga autentimist.
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb
index 2322d63..5c76d26f 100644
--- a/components/policy/resources/policy_templates_fa.xtb
+++ b/components/policy/resources/policy_templates_fa.xtb
@@ -263,6 +263,7 @@
       اگر روی نادرست تنظیم شود، گزارش‌دهی معیارها و داده‌های تشخیص عیب غیرفعال خواهد شد.
 
       اگر پیکربندی نشود، گزارش‌دهی معیارها و داده‌های تشخیص عیب در دستگاه‌های مدیریت‌نشده غیرفعال و در دستگاه‌های مدیریت‌شده فعال خواهد شد.</translation>
+<translation id="1920046221095339924">اجازه به جلسه مدیریت‌شده در دستگاه</translation>
 <translation id="1929709556673267855">‏پیکربندی‌هایی برای چاپگرهای شرکتی متصل به دستگاه‌ها ارائه می‌کند.
 
       این خط‌مشی به شما امکان می‌دهد پیکربندی‌های چاپگر را برای دستگاه‌های <ph name="PRODUCT_OS_NAME" /> فراهم کنید. قالب مثل واژه‌نامه NativePrinters است، با فیلد اضافی «id» یا «guid» به‌ازای هر چاپگر که برای قرار دادن آن در فهرست مجاز یا غیرمجاز ضروری است.
@@ -296,6 +297,7 @@
 
       اگر این تنظیم فعال شود یا مقداری نداشته باشد، کاربر می‌تواند ویژگی «تکمیل خودکار» را در رابط کاربری کنترل کند.</translation>
 <translation id="1960840544413786116">‏مشخص می‌کند گواهینامه‌های صادرشده توسط اتصالات مورد اعتماد محلی فاقد افزونه subjectAlternativeName مجاز باشند یا نه</translation>
+<translation id="1962273523772270623">‏اجازه به جمع‌آوری گزارش‌های وقایع WebRTC از سرویس‌های Google</translation>
 <translation id="1964634611280150550">حالت ناشناس غیرفعال شد</translation>
 <translation id="1964802606569741174">‏این خط‌مشی بر برنامه Android YouTube تأثیری ندارد. اگر حالت ایمن در YouTube باید اجرا شود، نباید به نصب برنامه Android YouTube اجازه داده شود.</translation>
 <translation id="1969212217917526199">‏خط‌مشی‌های مربوط به ساخت‌های Debug میزبان دسترسی ازراه‌دور را لغو می‌کند.
@@ -1906,6 +1908,11 @@
       چنانچه این خط‌مشی تنظیم تشده باشد یا فهرست خالی باشد، دسترسی به همه طرح‌ها در <ph name="PRODUCT_NAME" /> امکان‌پذیر خواهد بود.</translation>
 <translation id="6652197835259177259">تنظیمات کاربران مدیریت شده به صورت محلی</translation>
 <translation id="6658245400435704251">تعداد ثانیه‌هایی را مشخص می‌کند که دستگاه می‌تواند حداکثر تا آن زمان به‌طور تصادفی بارگیری به‌روزرسانی خود را به تأخیر بیندازد این زمان از وقتی اندازه گیری می‌شود که ابتدا به‌روزرسانی به سرور ارسال شده است. دستگاه می‌تواند مقداری از این زمان را به‌عنوان زمان شروع تا پایان کار و بقیه را به‌عنوان تعداد بررسی‌ها برای به‌روزرسانی منتظر باشد. در هر حال پراکندگی به مقدار ثابتی از زمان بستگی دارد به این ترتیب که دستگاه هزگز برای بارگیری به‌روزرسانی همیشه به انتظار نمی‌ماند.</translation>
+<translation id="6665599130599311250">‏اگر این خط‌مشی روی نادرست تنظیم شود یا تنظیم‌نشده رها شود، جلسه مهمان مدیریت‌شده به‌نحوی که در https://support.google.com/chrome/a/answer/3017014 - «جلسه عمومی» استاندارد - مستند‌شده است، رفتار می‌کند.
+
+      اگر این خط‌مشی روی درست تنظیم شود، جلسه مهمان مدیریت‌شده مطابق با «جلسه مدیریت‌شده» رفتار می‌کند، که بسیاری از محدودیت‌های درنظر گرفته‌شده در «جلسه‌های عمومی» معمول بر آن اعمال نمی‌شود.
+
+      اگر این خط‌مشی تنظیم شود، کاربر نمی‌تواند آن را تغییر دهد یا لغو کند.</translation>
 <translation id="6665670272107384733">تنظیم اینکه کاربر برای استفاده از باز کردن سریع قفل، چند وقت یک‌بار باید گذرواژه وارد کند</translation>
 <translation id="6681229465468164801">‏به شما امکان می‌دهد فهرستی از الگوهای نشانی وب تنظیم کنید که سایت‌هایی را مشخص می‌کند که نمی‌توانند از کاربر بخواهند به آن‌ها اجازه دهد به دستگاه USB دسترسی داشته باشند.
 
@@ -2069,6 +2076,17 @@
 <translation id="6943577887654905793">‏نام تنظیمات Mac/Linux:</translation>
 <translation id="69525503251220566">پارامتر قابلیت جستجو به وسیله تصویر را برای ارائه‌دهنده جستجوی پیش‌فرض ارائه می‌دهد</translation>
 <translation id="6956272732789158625">اجازه ندادن به هیچ سایتی برای استفاده از تولید کلید</translation>
+<translation id="6982028490425791294">‏
+      اگر این خط‌مشی روی درست تنظیم شود، <ph name="PRODUCT_NAME" /> اجازه می‌یابد گزارش‌های وقایع WebRTC را از سرویس‌های Google (مثل Google Meet) جمع‌آوری کند و آن‌ها را در Google بارگذاری کند.
+
+      اگر این خط‌مشی روی نادرست تنظیم شود یا تنظیم‌نشده رها شود، ممکن است <ph name="PRODUCT_NAME" /> این گزارش‌ها را نه جمع‌آوری کند و نه بارگذاری کند.
+
+      این گزارش‌ها حاوی اطلاعاتی مثل زمان ارسال و دریافت بسته‌های RTP و اندازه آن‌ها، بازخورد درباره شلوغی شبکه، و فراداده مربوط به زمان و کیفیت قاب‌های صوتی و تصویری است. این اطلاعات برای اشکال‌زدایی از تماس‌های صوتی و ویدیویی در Chrome، ازجمله مشکلات مربوط به ارزیابی پهنای باند و غیره، مفید‌اند. محتواهای صوتی و تصویریِ تماس‌ها در این گزارش‌ها نمی‌آیند. 
+
+      فقط سرویس‌های وب Google، مثل Google Hangouts یا Google Meet، می‌تواند این جمع‌آوری داده‌ها را راه‌اندازی کند.
+
+      ممکن است این گزارش‌ها، ازطریق شناسه جلسه، با سایر گزارش‌هایی که خود سرویس Google جمع‌آوری کرده است، مرتبط شود. هدف از این کار تسهیل اشکال‌زدایی است.
+      </translation>
 <translation id="6994082778848658360">‏مشخص می‌کند سخت‌افزار داخلی عنصر امن چگونه می‌تواند برای ارائه تأیید هویت با دو فاکتور (در صورت سازگار بودن با این قابلیت) استفاده شود. دکمه روشن/خاموش دستگاه برای تشخیص حضور فیزیکی کاربر استفاده می‌شود.
 
       اگر «غیرفعال» انتخاب شود، هیچ فاکتور دومی ارائه نمی‌شود.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 27f33e49..88e3ebf 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -277,6 +277,7 @@
       Si elle est définie sur "false", les rapports sur les statistiques et les données de diagnostic ne sont pas envoyés.
 
       Si cette règle n'est pas configurée, les rapports sur les statistiques et les données de diagnostic ne sont pas envoyés sur les appareils non gérés, mais sont transmis sur les appareils gérés.</translation>
+<translation id="1920046221095339924">Autoriser une session gérée sur l'appareil</translation>
 <translation id="1929709556673267855">Fournit les configurations des imprimantes d'entreprise associées à des appareils.
 
       Cette règle vous permet de communiquer les configurations des imprimantes aux appareils <ph name="PRODUCT_OS_NAME" />. Le format est le même que celui du dictionnaire NativePrinters, à l'exception d'un champ supplémentaire obligatoire "id" ou "guid" pour chaque imprimante permettant de l'ajouter sur liste blanche ou liste noire.
@@ -310,6 +311,7 @@
 
       Si ce paramètre est activé ou vide, l'utilisateur peut contrôler la saisie automatique pour les adresses dans l'interface utilisateur.</translation>
 <translation id="1960840544413786116">Autoriser ou non les certificats émis par les ancres d'approbation locales qui ne comportent pas l'extension subjectAlternativeName</translation>
+<translation id="1962273523772270623">Autoriser la collecte des journaux d'événements WebRTC à partir des services Google</translation>
 <translation id="1964634611280150550">Mode navigation privée désactivé</translation>
 <translation id="1964802606569741174">Cette règle n'a aucun effet sur l'application YouTube pour Android. Vous ne devez pas autoriser son installation si le mode sécurisé de YouTube doit être appliqué.</translation>
 <translation id="1969212217917526199">Remplace des règles sur les versions de débogage de l'hôte d'accès à distance.
@@ -2018,6 +2020,11 @@
       Si vous ne définissez pas cette règle ou si la liste est vide, tous les schémas sont accessibles dans <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Paramètres des utilisateurs gérés en local</translation>
 <translation id="6658245400435704251">Indique le nombre maximal de secondes pendant lesquelles un appareil peut retarder de façon aléatoire le téléchargement d'une mise à jour à partir du moment où celle-ci est disponible sur le serveur. L'appareil peut attendre pendant une certaine partie de ce temps en termes de temps de l'horloge et pendant la partie restante en termes de nombre de recherches de mise à jour. Dans tous les cas, le facteur de dispersion est limité à une quantité de temps constante, de sorte qu'un appareil ne reste jamais bloqué dans l'attente d'une mise à jour.</translation>
+<translation id="6665599130599311250">Si cette règle est définie sur "False" ou n'est pas définie, la session en mode Invité gérée se comportera comme une session publique standard, tel que cela est expliqué dans l'article https://support.google.com/chrome/a/answer/3017014.
+
+      Si cette règle est définie sur "True", la session en mode Invité gérée se comportera comme une session gérée, et de nombreuses restrictions appliquées aux sessions publiques normales seront ainsi levées.
+
+      Si cette règle est configurée, l'utilisateur ne pourra pas la modifier ni l'ignorer.</translation>
 <translation id="6665670272107384733">Définir la fréquence à laquelle l'utilisateur doit saisir le mot de passe pour utiliser le déverrouillage rapide</translation>
 <translation id="6681229465468164801">Cette règle permet de définir une liste de formats d'URL spécifiant les sites non autorisés à demander à l'utilisateur l'accès à un périphérique USB.
 
@@ -2185,6 +2192,17 @@
 <translation id="6943577887654905793">Nom de préférence Mac/Linux :</translation>
 <translation id="69525503251220566">Paramètre qui active la fonctionnalité de recherche par image pour le moteur de recherche par défaut</translation>
 <translation id="6956272732789158625">Interdire à tous les sites d'utiliser la génération de clé</translation>
+<translation id="6982028490425791294">
+      Si la règle est définie sur "True", <ph name="PRODUCT_NAME" /> est autorisé à collecter les journaux d'événements WebRTC à partir des services Google (Google Meet, par exemple) et à les transférer vers Google.
+
+      Si la règle est définie sur "False" ou n'est pas définie, <ph name="PRODUCT_NAME" /> ne peut pas collecter ces journaux ni les transférer.
+
+      Ces journaux contiennent des informations telles que l'horodatage et la taille des paquets RTP envoyés et reçus, des commentaires sur la congestion du réseau, et des métadonnées relatives à l'horodatage et à la qualité des trames vidéo et audio. Ces informations sont utiles lors du débogage de problèmes d'appels audio ou vidéo dans Chrome, comme des problèmes d'estimation de la bande passante, etc. Les journaux n'incluent aucun contenu audio ou vidéo des appels.
+
+      Cette collecte de données ne peut être déclenchée que par des services Web de Google, tels que Google Hangouts ou Google Meet.
+
+      Ces journaux peuvent être associés à d'autres journaux collectés par le service Google proprement dit à l'aide d'un ID de session dans le but de faciliter le débogage.
+      </translation>
 <translation id="6994082778848658360">Indique comment le matériel sécurisé intégré peut être utilisé pour l'authentification à deux facteurs, s'il est compatible avec cette fonctionnalité. Le bouton Marche/Arrêt de l'appareil est utilisé pour détecter la présence de l'utilisateur.
 
       Si vous sélectionnez "Désactivé" ou si vous ne définissez pas cette règle, aucun deuxième facteur n'est fourni.
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb
index e9dbaee..535b1b2 100644
--- a/components/policy/resources/policy_templates_hi.xtb
+++ b/components/policy/resources/policy_templates_hi.xtb
@@ -276,6 +276,7 @@
       अगर गलत पर सेट होती है, तो मेट्रिक और निदान के डेटा की रिपोर्ट करने की सुविधा बंद होगी.
 
       अगर कॉन्फ़िगर नहीं की हुई होती है, तो प्रबंधित नहीं किए गए डिवाइस पर मेट्रिक और निदान डेटा रिपोर्ट करने की सुविधा बंद होगी और प्रबंधित डिवाइस पर चालू होगी.</translation>
+<translation id="1920046221095339924">डिवाइस पर प्रबंधित सत्र की अनुमति देती है</translation>
 <translation id="1929709556673267855">डिवाइस से जुड़े एंटरप्राइज़ प्रिंटर के लिए कॉन्फ़िगरेशन उपलब्ध कराती है.
 
       यह नीति आपको <ph name="PRODUCT_OS_NAME" /> डिवाइसों के लिए प्रिंटर कॉन्फ़िगरेशन उपलब्ध कराने देती है. इसका फ़ॉर्मैट NativePrinters शब्दकोश की तरह ही होता है, जिसमें श्वेतसूची में डालने या काली सूची में डालने के लिए हर प्रिंटर के लिए "id" या "guid" फ़ील्ड की अलग से ज़रूरत होती है.
@@ -308,6 +309,7 @@
 
       अगर यह सेटिंग चालू होती है या इसका कोई मान न दिया गया हो, तो उपयोगकर्ता यूज़र इंटरफ़ेस (यूआई) में पते की जानकारी के लिए 'अपने आप भरने की सुविधा (ऑटो फ़िल)' को नियंत्रित कर पाएगा.</translation>
 <translation id="1960840544413786116">स्थानीय विश्वसनीय एंकरों की ओर से जारी किए जाने वाले ऐसे प्रमाणपत्रों को अनुमति दें या नहीं जिनमें subjectAlternativeName एक्सटेंशन मौजूद नहीं है</translation>
+<translation id="1962273523772270623">'Google सेवाओं' से 'WebRTC इवेंट लॉग' इकट्ठे करने देती है</translation>
 <translation id="1964634611280150550">गुप्त मोड अक्षम किया गया</translation>
 <translation id="1964802606569741174">इस नीति का Android YouTube ऐप्लिकेशन पर कोई प्रभाव नहीं पड़ता. यदि YouTube पर सुरक्षा मोड लागू किया जाना चाहिए, तो Android YouTube ऐप्लिकेशन के इंस्टॉलेशन की अनुमति नहीं दी जानी चाहिए.</translation>
 <translation id="1969212217917526199">दूरस्‍थ ऐक्‍सेस होस्‍ट की डीबग बिल्‍ड पर पॉलिसी को ओवरराइड करें.
@@ -524,11 +526,11 @@
       अगर यह सेटिंग सेट किए बिना छोड़ दी जाती है तो, उपयोगकर्ता इस फ़ंक्शन का उपयोग करने या न करने का फ़ैसला कर सकते हैं.
 
       <ph name="PRODUCT_NAME" /> के 29 और उसके बाद वाले वर्शन से यह सेटिंग हटा दी गई है.</translation>
-<translation id="2433412232489478893">यह नीति नियंत्रित करती है कि क्या किसी उपयोगकर्ता के लिए <ph name="PRODUCT_NAME" /> की नेटवर्क फ़ाइल शेयर सुविधा की अनुमति है या नहीं.
+<translation id="2433412232489478893">यह नीति नियंत्रित करती है कि किसी उपयोगकर्ता के लिए <ph name="PRODUCT_NAME" /> की नेटवर्क फ़ाइल शेयर करने की सुविधा की अनुमति है या नहीं.
 
-      जब यह नीति कॉन्फ़िगर नहीं होती या सही पर सेट की जाती है, तो उपयोगकर्ता नेटवर्क फ़ाइल शेयर का इस्तेमाल कर पाएंगे.
+      जब यह नीति कॉन्फ़िगर नहीं होती या सही पर सेट की जाती है, तो उपयोगकर्ता नेटवर्क फ़ाइल शेयर करने की सुविधा का इस्तेमाल कर पाएंगे.
 
-      जब यह नीति गलत पर सेट होती है, तो उपयोगकर्ता नेटवर्क फ़ाइल शेयर का इस्तेमाल नहीं कर पाएंगे.</translation>
+      जब यह नीति गलत पर सेट होती है, तो उपयोगकर्ता नेटवर्क फ़ाइल शेयर करने की सुविधा का इस्तेमाल नहीं कर पाएंगे.</translation>
 <translation id="2438609638493026652">Android ऐप्लिकेशन इंस्टॉल करते समय होने वाले खास इवेंट के बारे में Google को रिपोर्ट करती है. सिर्फ़ उन्हीं ऐप्लिकेशन के इवेंट कैप्चर किए जाते हैं जिनके इंस्टॉलेशन को नीति के ज़रिए शुरू हुआ था.
 
       अगर नीति सही पर सेट हो, तो इवेंट लॉग किए जाएंगे.
@@ -610,7 +612,7 @@
 <translation id="2598508021807251719">उन स्थान-भाषाओं को कॉन्फ़िगर करती है जिनमें <ph name="PRODUCT_OS_NAME" /> दिखाया जा सकता है.
 
       अगर यह नीति सेट हो, तो उपयोगकर्ता <ph name="PRODUCT_OS_NAME" /> को सिर्फ़ इस नीति में बताई गई स्थान-भाषाओं में से किसी एक में दिखाए जाने के लिए कॉन्फ़िगर कर सकता है. अगर यह नीति सेट नहीं हो या किसी खाली सूची पर सेट हो, तो <ph name="PRODUCT_OS_NAME" /> को काम करने वाली सभी यूज़र इंटरफ़ेस (यूआई) स्थान-भाषाओं में दिखाया जा सकता है. अगर यह नीति गलत मानों वाली किसी सूची पर सेट हो, तो सभी गलत मानों को अनदेखा कर दिया जाएगा. अगर किसी उपयोगकर्ता ने <ph name="PRODUCT_OS_NAME" /> को पहले किसी ऐसी भाषा में दिखाए जाने के लिए कॉन्फ़िगर किया है जिसे यह नीति मंज़ूरी नहीं देती है, तो दिखाई जाने वाली स्थान-भाषा अगली बार उपयोगकर्ता के साइन इन करने पर मंज़ूरी दी गई स्थान-भाषा में बदल जाएगी. अगर उपयोगकर्ता ने पसंदीदा स्थान-भाषाएं कॉन्फ़िगर की थीं और पसंदीदा स्थान-भाषाओं में से किसी एक को इस नीति ने मंज़ूरी दी है, तो <ph name="PRODUCT_OS_NAME" /> इस स्थान-भाषा में बदल जाएगा. अगर ऐसा नहीं होता है, तो <ph name="PRODUCT_OS_NAME" /> इस नीति के बताए गए पहले सही मान में बदल जाएगा या अगर इस नीति में सिर्फ़ गलत प्रविष्टियां ही हों तो, वह किसी वैकल्पिक स्थान-भाषा (फ़िलहाल en-US) में बदल जाएगा.</translation>
-<translation id="2604182581880595781">नेटवर्क फ़ाइल शेयर से जुड़ी नीतियां कॉन्फ़िगर करें.</translation>
+<translation id="2604182581880595781">नेटवर्क फ़ाइल शेयर करने की सुविधा से जुड़ी नीतियां कॉन्फ़िगर करें.</translation>
 <translation id="2623014935069176671">'उपयोगकर्ता की शुरुआती गतिविधि' का इंतज़ार करें</translation>
 <translation id="262740370354162807"><ph name="CLOUD_PRINT_NAME" /> पर दस्‍तावेज़ों का सबमिशन सक्षम करती है</translation>
 <translation id="2627554163382448569">एंटरप्राइज़ प्रिंटर के लिए कॉन्फ़िगरेशन उपलब्ध कराती है.
@@ -697,7 +699,7 @@
 <translation id="2823870601012066791"><ph name="PRODUCT_OS_NAME" /> क्लाइंट के लिए Windows रजिस्ट्री का स्थान:</translation>
 <translation id="2824715612115726353">गुप्त मोड सक्षम करें</translation>
 <translation id="2838830882081735096">डेटा माइग्रेशन और ARC की अनुमति न दें</translation>
-<translation id="2839294585867804686">नेटवर्क फ़ाइल शेयर की सेटिंग</translation>
+<translation id="2839294585867804686">नेटवर्क फ़ाइल शेयर करने की सुविधा की सेटिंग</translation>
 <translation id="2840269525054388612">उन प्रिंटर के बारे में बताती है जिनका इस्तेमाल कोई उपयोगकर्ता कर सकता है.
 
       इस नीति का इस्तेमाल तभी किया जाता है जब <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> के लिए <ph name="PRINTERS_WHITELIST" /> को चुना गया हो
@@ -1193,7 +1195,7 @@
       अगर इस नीति को सेट किए बिना छोड़ दिया जाता है, तो 'यूआरएल-की' के साथ पहचान ज़ाहिर न करने वाले डेटा संग्रह की सेटिंग चालू कर दी जाएगी लेकिन उपयोगकर्ता इसे बदल सकेगा.</translation>
 <translation id="4250680216510889253">नहीं</translation>
 <translation id="4261820385751181068">डिवाइस प्रवेश स्क्रीन भाषा</translation>
-<translation id="4264607809747169568">ChromeOS की उपलब्धता के लिए नेटवर्क फ़ाइल शेयर को नियंत्रित करती है</translation>
+<translation id="4264607809747169568">ChromeOS की उपलब्धता के लिए, नेटवर्क फ़ाइल शेयर करने की सुविधा को नियंत्रित करती है</translation>
 <translation id="427220754384423013">उन प्रिंटर के बारे में बताती है जिनका इस्तेमाल कोई उपयोगकर्ता कर सकता है.
       इस नीति का इस्तेमाल तभी किया जाता है जब <ph name="BULK_PRINTERS_ACCESS_MODE" /> के लिए <ph name="PRINTERS_WHITELIST" /> को चुना गया हो.
 
@@ -1627,7 +1629,7 @@
       नीति का मान मिलीसेकंड में बताया जाना चाहिए.</translation>
 <translation id="5511702823008968136">बुकमार्क बार सक्षम करें</translation>
 <translation id="5512418063782665071">होम पेज URL</translation>
-<translation id="551639594034811656">यह नीति ऐसे प्रतिशतों की सूची तय करती है जिनसे OU में अपडेट मिलने के पहले दिन से, हर दिन अपडेट होने वाले <ph name="PRODUCT_OS_NAME" /> डिवाइसों का हिस्सा तय होगा. अपडेट मिलने का समय अपडेट प्रकाशित होने के समय के बाद का होगा, क्योंकि डिवाइस पर अपडेट के लिए देखे जाने से पहले अपडेट को प्रकाशित हुए कुछ समय बीत चुका होगा.
+<translation id="551639594034811656">यह नीति ऐसे प्रतिशतों की सूची तय करती है जिनसे OU में अपडेट मिलने के पहले दिन से, हर दिन अपडेट होने वाले <ph name="PRODUCT_OS_NAME" /> डिवाइसों का हिस्सा तय होगा. अपडेट मिलने का समय, अपडेट प्रकाशित होने के समय के बाद का होगा क्योंकि डिवाइस पर अपडेट के लिए देखे जाने से पहले, अपडेट को प्रकाशित हुए कुछ समय बीत चुका होगा.
 
       हर (दिन, प्रतिशत) की जोड़ी में समूह का वह प्रतिशत शामिल होगा जिसे अपडेट मिलने के बाद बताए गए दिनों में अपडेट किया जाना है. उदाहरण के लिए, अगर हमारे पास [(4, 40), (10, 70), (15, 100)] की जोड़ियां हैं, तो फिर समूह के 40% डिवाइस अपडेट दिखाई देने के 4 दिनों के बाद अपडेट किए जाने चाहिए. 70% डिवाइस 10 दिनों के बाद अपडेट किए जाने चाहिए और उसके बाद यह इसी तरीके से आगे बढ़ता जाएगा.
 
@@ -2012,6 +2014,11 @@
       अगर इस नीति को सेट नहीं किया जाता है या सूची खाली है तो, सभी स्कीम को <ph name="PRODUCT_NAME" /> में एक्सेस किया जा सकेगा.</translation>
 <translation id="6652197835259177259">स्थानीय रूप से प्रबंधित उपयोगकर्ताओं की सेटिंग</translation>
 <translation id="6658245400435704251">किसी अपडेट के पहली बार सर्वर पर पुश किए जाने से लेकर किसी डिवाइस द्वारा उसके डाउनलोड में बार-बार किए जाने वाले विलंब की अवधि निर्दिष्ट करता है. डिवाइस दीवार-घड़ी के समय के संबंध में और बाकी के भाग की अपडेट जाँच की संख्या के संबंध में कुछ समय तक प्रतीक्षा कर सकता है. किसी भी स्थिति में, स्कैटर समय के साथ ऊपरी रूप पर परिबद्ध होता है ताकि डिवाइस हमेशा के लिए कभी भी किसी अपडेट के डाउनलोड होने की प्रतीक्षा में अटक न जाए.</translation>
+<translation id="6665599130599311250">अगर नीति गलत पर सेट की जाती है या सेट किए बिना छोड़ दी जाती है, तो 'प्रबंधित मेहमान सत्र' https://support.google.com/chrome/a/answer/3017014 - मानक "सार्वजनिक सत्र" में बताए गए तरीके से व्यवहार करेगा.
+
+      अगर यह नीति सही पर सेट की जाती है, तो 'प्रबंधित मेहमान सत्र' का सामना "प्रबंधित सत्र" के व्यवहार से होगा जो नियमित "सार्वजनिक सत्र" पर लागू किए जाने वाले कई प्रतिबंधों को खत्म कर देगा.
+
+      अगर यह नीति सेट की जाती है, तो उपयोगकर्ता उसे बदल नहीं सकता या ओवरराइड नहीं कर सकता.</translation>
 <translation id="6665670272107384733">सेट करें कि तुरंत से अनलॉक करने की सुविधा का इस्तेमाल करने के लिए उपयोगकर्ता को कितने समय में पासवर्ड डालना होगा</translation>
 <translation id="6681229465468164801">यह नीति आपको उन 'यूआरएल पैटर्न' की सूची सेट करने देती है जो ऐसी साइटों के बारे में बताते हैं जिन्हें उपयोगकर्ता से किसी यूएसबी डिवाइस के एक्सेस की मंज़ूरी मांगने से रोका गया है.
 
@@ -2178,6 +2185,16 @@
 <translation id="6943577887654905793">Mac/Linux प्राथमिकता नाम:</translation>
 <translation id="69525503251220566">डिफ़ॉल्ट खोज प्रदाता के लिए चित्र-द्वारा-खोजें सुविधा प्रदान करने वाला पैरामीटर</translation>
 <translation id="6956272732789158625">किसी भी साइट को कुंजी जेनरेशन का उपयोग न करने दें</translation>
+<translation id="6982028490425791294">
+      अगर नीति सही पर सेट की जाती है, तो <ph name="PRODUCT_NAME" /> को 'Google सेवाओं' (उदाहरण Google Meet) से 'WebRTC इवेंट लॉग' इकट्ठे करने और उन लॉग को Google पर अपलोड करने की अनुमति होती है.
+      अगर नीति गलत पर सेट की जाती है या सेट नहीं की जाती है, तो <ph name="PRODUCT_NAME" /> ऐसे लॉग इकट्ठे नहीं कर पाएगा और न ही उन्हें अपलोड कर पाएगा.
+
+      इन लॉग में भेजे गए और मिलने वाले RTP पैकेट के समय और आकार, नेटवर्क पर व्यस्तता के बारे में सुझाव जैसी जानकारी और ऑडियो और वीडियो फ़्रेम के समय और क्वालिटी के बारे में मेटाडेटा मौजूद होता है. यह जानकारी Chrome में ऑडियो या वीडियो कॉल से जुड़ी समस्याओं, जैसे कि बैंडविड्थ के अनुमान संबंधी समस्याएं वगैरह को डीबग करते समय फ़ायदेमंद होती है. लॉग में कॉल की ऑडियो या वीडियो सामग्री शामिल नहीं होती है.
+
+      डेटा इकट्ठा करने के यह काम सिर्फ़ Google की Google Hangouts या Google Meet जैसी वेब सेवाएं ट्रिगर कर सकती हैं.
+
+      इन लॉग को सत्र आईडी के ज़रिए ऐसे दूसरे लॉग से जोड़ा जा सकता है, जिसे Google सेवा की ओर से ही इकट्ठा किया है; ऐसा ज़्यादा आसानी से डीबग करने के लिए किया जाता है.
+      </translation>
 <translation id="6994082778848658360">यह नीति बताती है कि अगर मौजूदा सुरक्षा तत्व हार्डवेयर, दो तरीके से पहचान की पुष्टि की सुविधा के साथ काम कर सकता है तो, किस तरह उसका इस्तेमाल कर इस सुविधा का फ़ायदा उठाया जा सकता है. उपयोगकर्ता की मौजूदगी का पता लगाने के लिए मशीन के पावर बटन का उपयोग किया जाता है. 
 
       अगर 'बंद' को चुना जाता है तो, कोई दूसरा तरीका उपलब्ध नहीं कराया जाता.
@@ -2579,7 +2596,7 @@
       </translation>
 <translation id="7902255855035461275">इस सूची के पैटर्न का मिलान अनुरोध करने वाले यूआरएल के सुरक्षा
       मूल से किया जाता है. अगर मिलान हो जाता है, तो वीडियो
-      डिवाइस सूचना दिए बिना ही दे दिए जाएंगे.
+      कैप्चर डिवाइस के लिए एक्सेस, सूचना दिए बिना ही दे दिए जाएंगे.
 
       नोट: वर्शन 45 तक, यह नीति सिर्फ़ किओस्क मोड में ही काम करती थी.</translation>
 <translation id="7912255076272890813">अनुमत ऐप्स /एक्सटेंशन प्रकारों को कॉन्फ़िगर करें</translation>
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb
index d8f0b10..43601724 100644
--- a/components/policy/resources/policy_templates_hr.xtb
+++ b/components/policy/resources/policy_templates_hr.xtb
@@ -269,6 +269,7 @@
       Ako se postavi na False, izvješća s mjernim podacima o upotrebi i dijagnostičkim podacima bit će onemogućena.
 
       Ako se ne konfigurira, izvješća s mjernim podacima o upotrebi i dijagnostičkim podacima na neupravljanim će uređajima biti onemogućena, a na upravljanim omogućena.</translation>
+<translation id="1920046221095339924">Dopusti upravljanu sesiju na uređaju</translation>
 <translation id="1929709556673267855">Pruža konfiguracije za pisače tvrtke koji su povezani s uređajima.
 
       To vam pravilo omogućuje da pružite konfiguracije pisača za <ph name="PRODUCT_OS_NAME" /> uređaje. Format je jednak kao za rječnik NativePrinters, osim što je potrebno dodatno polje "id" ili "guid" po pisaču za dopuštanje ili ograničavanje pisača.
@@ -302,6 +303,7 @@
 
       Ako se ta postavka omogući ili nema vrijednost, korisnik će moći kontrolirati Automatsko popunjavanje za adrese na korisničkom sučelju.</translation>
 <translation id="1960840544413786116">Jesu li dopušteni certifikati koje izdaju lokalna pouzdana sidra, a kojima nedostaje proširenje subjectAlternativeName</translation>
+<translation id="1962273523772270623">Dopusti zbirku zapisnika događaja WebRTC s Googleovih usluga</translation>
 <translation id="1964634611280150550">Onemogućen je anoniman način rada</translation>
 <translation id="1964802606569741174">To pravilo nema utjecaja na Android aplikaciju YouTube. Ako se treba primijeniti sigurnosni način na YouTubeu, instaliranje Android aplikacije YouTube ne može biti dopušteno.</translation>
 <translation id="1969212217917526199">Nadjačava pravila na međuverzijama za otklanjanje pogrešaka hosta daljinskog pristupa.
@@ -1925,6 +1927,11 @@
       Ako se to pravilo ne postavi ili ako je popis prazan, sve će sheme biti dostupne na usluzi <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Postavke lokalno upravljanih korisnika</translation>
 <translation id="6658245400435704251">Određuje do koliko sekundi uređaj može nasumično odgađati preuzimanje ažuriranja od trenutka kad je ažuriranje prvi put poslano na poslužitelj. Uređaj može dio tog vremena čekati u smislu stvarnog proteka vremena, a preostalo vrijeme u smislu broja provjera ažuriranja. U bilo kojem slučaju, gornja granica raspršivanja konstantan je iznos vremena tako da uređaj nikad ne može zauvijek zapeti čekajući ažuriranje.</translation>
+<translation id="6665599130599311250">Ako se to pravilo postavi na False ili se ne postavi, upravljana gostujuća sesija ponašat će se kako je dokumentirano na https://support.google.com/chrome/a/answer/3017014 – standardna "Javna sesija".
+
+      Ako se to pravilo postavi na True ili se ne postavi, upravljana gostujuća sesija poprimit će ponašanje "Upravljane sesije" koja uklanja mnoga ograničenja uspostavljena za regularne "Javne sesije".
+
+      Ako je postavljeno ovo pravilo, korisnik ga ne može ni promijeniti niti nadjačati.</translation>
 <translation id="6665670272107384733">Odredi koliko često korisnik mora unijeti zaporku za upotrebu brzog otključavanja</translation>
 <translation id="6681229465468164801">Omogućuje vam postavljanje popisa uzoraka URL-ova koji navode web-lokacije kojima se sprječava da od korisnika traže dopuštenje za pristup USB uređaju.
 
@@ -2081,6 +2088,17 @@
 <translation id="6943577887654905793">Naziv Mac/Linux preferencije:</translation>
 <translation id="69525503251220566">Značajka pretraživanja po slici koja pruža parametre za zadanog davatelja usluge pretraživanja</translation>
 <translation id="6956272732789158625">Nemoj dopustiti nijednoj web-lokaciji da upotrebljava generiranje ključeva</translation>
+<translation id="6982028490425791294">
+      Ako se pravilo postavi na True, <ph name="PRODUCT_NAME" /> ima dopuštenje prikupljati zapisnike događaja WebRTC s Googleovih usluga (npr. Google Meet) i prenijeti te zapisnike na Google.
+
+      Ako se pravilo postavi na False ili se ne postavi, <ph name="PRODUCT_NAME" /> ne smije prikupljati niti prenositi takve zapisnike.
+
+      Ti zapisnici sadrže podatke kao što su vrijeme i veličina poslanih i primljenih RTP paketa, povratne informacije o zagušenju na mreži i medapodatke o vremenu i kvaliteti zvučnih i videozapisa. Ti podaci pomažu pri otklanjanju pogrešaka kod audio i videopoziva na Chromeu, kao što su poteškoće s procjenom propusnosti itd. Zapisnici ne sadrže audio ili videosadržaje poziva.
+
+      Ta kolekcija podataka može se pokrenuti samo pomoću Googleovih web-usluga, kao što su Hangouts ili Google Meet.
+
+      Ti zapisnici mogu se putem ID-ja sesija povezati s drugim zapisnicima koje je prikupila sama Googleova usluga; to je namijenjeno lakšem otklanjanju pogrešaka.
+      </translation>
 <translation id="6994082778848658360">Određuje način na koji se hardver s ugrađenim sigurnosnim elementom može upotrebljavati za pružanje dvostruke autentifikacije ako je kompatibilan s ovom značajkom. Tipka za uključivanje/isključivanje uređaja upotrebljava se za otkrivanje korisnikove fizičke prisutnosti.
 
       Ako se odabere "Onemogućeno", dvostruka se autentifikacija ne upotrebljava.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 713e8fe..4d4f4118 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -267,6 +267,7 @@
       Jika disetel ke false, pelaporan metrik dan data diagnostik akan dinonaktifkan.
 
       Jika tidak dikonfigurasi, pelaporan metrik dan data diagnostik akan dinonaktifkan di perangkat yang tidak dikelola dan diaktifkan di perangkat yang dikelola.</translation>
+<translation id="1920046221095339924">Mengizinkan sesi yang dikelola di perangkat</translation>
 <translation id="1929709556673267855">Memberikan konfigurasi untuk printer perusahaan yang terkait dengan perangkat.
 
       Kebijakan ini memungkinkan Anda memberikan konfigurasi printer untuk perangkat <ph name="PRODUCT_OS_NAME" />. Formatnya sama dengan kamus NativePrinters, dengan kolom "id" atau "guid" tambahan yang dibutuhkan per printer untuk pemberian izin atau pemblokiran izin.
@@ -300,6 +301,7 @@
 
       Jika setelan ini diaktifkan atau tidak memiliki nilai, pengguna dapat mengontrol fitur IsiOtomatis untuk alamat di UI.</translation>
 <translation id="1960840544413786116">Apakah sertifikat yang dikeluarkan oleh sumber tepercaya setempat yang tidak menyertakan ekstensi subjectAlternativeName diizinkan atau tidak</translation>
+<translation id="1962273523772270623">Mengizinkan pengumpulan log peristiwa WebRTC dari layanan Google</translation>
 <translation id="1964634611280150550">Mode penyamaran dinonaktifkan</translation>
 <translation id="1964802606569741174">Kebijakan ini tidak memengaruhi aplikasi YouTube Android. Jika Mode Perlindungan di YouTube harus diterapkan, pemasangan aplikasi YouTube Android harus dilarang.</translation>
 <translation id="1969212217917526199">Menggantikan kebijakan pada versi Debug untuk host akses jarak jauh.
@@ -1552,7 +1554,7 @@
       Nilai kebijakan sebaiknya ditentukan dalam milidetik.</translation>
 <translation id="5511702823008968136">Aktifkan Bilah Bookmark</translation>
 <translation id="5512418063782665071">URL beranda</translation>
-<translation id="551639594034811656">Kebijakan ini menentukan daftar persentase yang akan menentukan jumlah perangkat <ph name="PRODUCT_OS_NAME" /> di OU untuk diupdate per hari sejak hari pertama update ditemukan. Waktu penemuan lebih lama daripada waktu publikasi update, karena publikasi update mungkin agak lama hingga perangkat memeriksa apakah ada update.
+<translation id="551639594034811656">Kebijakan ini menentukan daftar persentase yang akan menentukan jumlah perangkat <ph name="PRODUCT_OS_NAME" /> di OU untuk diupdate per hari sejak hari pertama update ditemukan. Waktu penemuan lebih lama daripada waktu publikasi update, karena mungkin perlu waktu agak lama hingga perangkat memeriksa apakah ada update.
 
       Tiap pasangan (hari, persentase) berisi persentase fleet mana yang harus diupdate menurut jumlah hari tertentu sejak update ditemukan. Misalnya, jika ada pasangan [(4, 40), (10, 70), (15, 100)], maka 40% fleet harus diupdate 4 hari setelah update ditemukan. 70% harus diupdate setelah 10 hari, dan seterusnya.
 
@@ -1915,6 +1917,11 @@
       Jika kebijakan ini tidak disetel atau daftar kosong, semua skema akan dapat diakses di <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Setelan pengguna yang dikelola secara lokal</translation>
 <translation id="6658245400435704251">Menentukan jumlah waktu (dalam detik) sebuah perangkat dapat menunda download pembaruannya secara acak dari saat pembaruan tersebut pertama kali didorong ke server. Perangkat dapat menunggu dengan sebagian dari waktu ini dari segi prediksi waktu penyelesaian tugas dan sisa waktunya dari segi jumlah pemeriksaan pembaruan. Dalam keadaan apa pun, penyebaran dibatasi dengan jumlah waktu yang konstan sehingga perangkat tidak akan terus menunggu download pembaruan selamanya.</translation>
+<translation id="6665599130599311250">Jika kebijakan ini disetel ke false atau tidak disetel, sesi tamu yang dikelola akan berperilaku seperti didokumentasikan di https://support.google.com/chrome/a/answer/3017014 - "Sesi Publik" standar.
+
+      Jika kebijakan ini disetel ke true, sesi tamu yang dikelola akan melakukan perilaku "Sesi Terkelola" yang menghapus banyak batasan yang berlaku untuk "Sesi Publik" reguler.
+
+      Jika kebijakan ini disetel, pengguna tidak dapat mengubah atau menggantinya.</translation>
 <translation id="6665670272107384733">Setel seberapa sering pengguna harus memasukkan sandi untuk menggunakan buka kunci cepat.</translation>
 <translation id="6681229465468164801">Memungkinkan Anda menyetel daftar pola URL yang menentukan situs mana yang dicegah agar tidak meminta pengguna memberikan akses ke perangkat USB.
 
@@ -2079,6 +2086,17 @@
 <translation id="6943577887654905793">Nama preferensi Mac/Linux:</translation>
 <translation id="69525503251220566">Parameter menyediakan fitur telusuri pakai gambar untuk penyedia penelusuran default</translation>
 <translation id="6956272732789158625">Jangan izinkan situs apa pun menggunakan pembuatan kunci</translation>
+<translation id="6982028490425791294">
+      Jika kebijakan disetel ke true, <ph name="PRODUCT_NAME" /> diizinkan untuk mengumpulkan log peristiwa WebRTCdari layanan Google (mis., Google Meet), dan mengupload log tersebut ke Google.
+
+      Jika kebijakan disetel ke false, atau tidak disetel, <ph name="PRODUCT_NAME" /> tidak boleh mengumpulkan atau mengupload log tersebut.
+
+      Log ini berisi informasi seperti waktu dan ukuran paket RTP yang dikirim dan diterima, masukan tentang kemacetan di jaringan, dan metadata tentang waktu dan kualitas frame audio dan video. Informasi ini bermanfaat saat melakukan debug masalah pada panggilan audio atau video di Chrome, misalnya masalah perkiraan bandwidth, dll. Log tidak berisi konten audio atau video dari panggilan.
+
+      Pengumpulan data ini hanya dapat dipicu oleh layanan web Google, seperti Google Hangouts atau Google Meet.
+
+      Log ini dapat dikaitkan, melalui ID sesi, dengan log lain yang dikumpulkan oleh layanan Google itu sendiri. Ini dimaksudkan agar debug lebih mudah.
+      </translation>
 <translation id="6994082778848658360">Menentukan bagaimana hardware elemen pengaman on-board digunakan untuk memberikan autentikasi faktor kedua jika kompatibel dengan fitur ini. Tombol power mesin digunakan untuk mendeteksi keberadaan pengguna.
 
       Jika 'Dinonaktifkan' dipilih, tidak ada faktor kedua yang diberikan.
@@ -2455,7 +2473,7 @@
       Jika kebijakan dinonaktifkan, Isolasi Situs eksplisit tidak akan terjadi dan uji coba kolom IsolateOrigins dan SitePerProcess akan dinonaktifkan. Pengguna tetap dapat mengaktifkan SitePerProcess secara manual.
       Jika kebijakan tidak dikonfigurasi, pengguna dapat mengubah setelan ini.
       </translation>
-<translation id="7902255855035461275">Pola dalam daftar ini akan dicocokan dengan asal
+<translation id="7902255855035461275">Pola dalam daftar ini akan dicocokkan dengan asal
       keamanan URL yang meminta.  Jika ditemukan kecocokan, akses ke perangkat
       yang merekam audio akan diberikan tanpa permintaan.
 
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 3a35de31..c8fa7a8 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -256,6 +256,7 @@
       Se viene impostata su false, i rapporti sulle metriche e sui dati diagnostici verranno disattivati.
 
       Se non viene configurata, i rapporti sulle metriche e sui dati diagnostici verranno disattivati sui dispositivi non gestiti e attivati sui dispositivi gestiti.</translation>
+<translation id="1920046221095339924">Consenti la sessione gestita sul dispositivo</translation>
 <translation id="1929709556673267855">Consente di specificare le configurazioni delle stampanti aziendali associate ai dispositivi.
 
       Questa norma ti consente di specificare le configurazioni delle stampanti per i dispositivi <ph name="PRODUCT_OS_NAME" />. Il formato corrisponde a quello del dizionario NativePrinters, con un campo "id" o "guid" aggiuntivo obbligatorio per ciascuna stampante ai fini dell'autorizzazione o della negazione della stessa.
@@ -289,6 +290,7 @@
 
       Se questa impostazione è attivata o non è impostata su alcun valore, l'utente potrà gestire la funzione Compilazione automatica per gli indirizzi nell'interfaccia utente.</translation>
 <translation id="1960840544413786116">Consente di stabilire se consentire i certificati privi dell'estensione subjectAlternativeName emessi dai trust anchor locali</translation>
+<translation id="1962273523772270623">Consenti la raccolta di log eventi WebRTC dai servizi Google</translation>
 <translation id="1964634611280150550">Modalità di navigazione in incognito non attiva</translation>
 <translation id="1964802606569741174">Questa norma non ha effetto sull'app YouTube per Android. Se è necessario applicare la modalità di protezione di YouTube, l'installazione dell'app YouTube per Android non deve essere consentita.</translation>
 <translation id="1969212217917526199">Sostituisce le build di debug dell'host di accesso remoto.
@@ -1881,6 +1883,11 @@
 Se questa norma non viene impostata o se l'elenco è vuoto, sarà possibile accedere a tutti gli schemi in <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Impostazioni degli utenti gestiti localmente</translation>
 <translation id="6658245400435704251">Consente di specificare il numero di secondi massimo per cui un dispositivo può ritardare in modo casuale il download di un suo aggiornamento dal momento della pubblicazione dell'aggiornamento sul server. Il dispositivo può attendere una parte di questo tempo in termini di tempo reale e la parte rimanente in termini di numero di controlli della disponibilità di aggiornamenti. In ogni caso, la dispersione ha un limite massimo pari a un periodo di tempo costante in modo che un dispositivo non si blocchi mai in attesa di scaricare un aggiornamento.</translation>
+<translation id="6665599130599311250">Se questa norma viene impostata su false o non viene impostata, la sessione ospite gestita avrà il comportamento descritto all'indirizzo https://support.google.com/chrome/a/answer/3017014 ("Sessione pubblica" standard).
+
+      Se questa norma viene impostata su true, la sessione ospite gestita avrà il comportamento "Sessione gestita", a cui non vengono applicate tante limitazioni che sono invece valide per le normali "Sessioni pubbliche".
+
+      Se questa norma viene impostata, l'utente non potrà modificarla o eseguirne l'override.</translation>
 <translation id="6665670272107384733">Imposta la frequenza di inserimento della password per poter usare lo sblocco rapido</translation>
 <translation id="6681229465468164801">Consente di impostare un elenco di pattern URL che specificano i siti che non possono richiedere all'utente l'accesso al dispositivo USB.
 
@@ -2038,6 +2045,17 @@
 <translation id="6943577887654905793">Nome di preferenza per Mac/Linux:</translation>
 <translation id="69525503251220566">Parametro che fornisce la funzione di ricerca tramite immagine per il provider di ricerca predefinito</translation>
 <translation id="6956272732789158625">Non consentire a nessun sito di utilizzare la generazione di chiavi</translation>
+<translation id="6982028490425791294">
+      Se questa norma viene impostata su true, <ph name="PRODUCT_NAME" /> è autorizzato a raccogliere log eventi WebRTC dai servizi Google (ad esempio Google Meet) e a caricarli su Google.
+
+      Se la norma viene impostata su false o non viene impostata, <ph name="PRODUCT_NAME" /> non può raccogliere e caricare tali log.
+
+      Questi log contengono informazioni quali data/ora e dimensioni dei pacchetti RTP inviati e ricevuti, feedback sulla congestione della rete, nonché metadati su tempo e qualità dei frame audio e video. Queste informazioni sono utili per il debug di problemi con le chiamate audio o le videochiamate in Chrome, ad esempio i problemi relativi alla stima della larghezza di banda. I log non contengono l'audio o i video delle chiamate.
+
+      La raccolta dei dati può essere attivata soltanto dai servizi web di Google, ad esempio Google Hangouts o Google Meet.
+
+      I log potrebbero essere associati tramite un ID sessione ad altri log raccolti dal servizio Google stesso al fine di facilitare il debug.
+      </translation>
 <translation id="6994082778848658360">Consente di specificare in che modo è possibile usare l'hardware degli elementi di sicurezza su scheda per fornire l'autenticazione a due fattori, se compatibile con questa funzione. Il tasto di accensione del computer viene usato per rilevare la presenza fisica dell'utente.
 
        Se selezioni l'opzione "Disabilitata", non viene fornita l'autenticazione a due fattori.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index d1d1f2c..bf205712 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -1552,13 +1552,13 @@
       ポリシーの値は、ミリ秒単位で指定する必要があります。</translation>
 <translation id="5511702823008968136">ブックマーク バーを有効にする</translation>
 <translation id="5512418063782665071">ホームページの URL</translation>
-<translation id="551639594034811656">このポリシーでは、アップデートが最初に検出された日からの経過日数ごとに、組織部門の <ph name="PRODUCT_OS_NAME" /> デバイスのうちでアップデートを適用するデバイスの割合(%)を指定します。アップデートの公開からデバイスでのアップデート チェックまでは時間が空くことがあるため、アップデートの検出日はアップデートの公開日よりも後になることがよくあります。
+<translation id="551639594034811656">このポリシーでは、アップデートが最初に検出された日からの経過日数ごとに、組織部門の <ph name="PRODUCT_OS_NAME" /> デバイスのうちでアップデートを適用するデバイスの割合(%)を指定します。アップデートの公開からデバイスでのアップデート チェックまでは時間が空くことがあるため、アップデートの検出日はアップデートの公開日よりも後になります。
 
-      このポリシーでは、アップデートが検出されてからの日数と、アップデートを適用するデバイスの割合(%)を、(日付, %) の形式で指定します。たとえば [(4, 40), (10, 70), (15, 100)] と指定した場合は、アップデートの検出から 4 日後にデバイスの 40% にアップデートを適用し、10 日後には 70% に適用する、という意味になります。
+      このポリシーでは、アップデートが検出されてからの日数と、アップデートを適用するデバイスの割合(%)を、(日数, %) の形式で指定します。たとえば [(4, 40), (10, 70), (15, 100)] と指定した場合は、アップデートの検出から 4 日後にデバイスの 40% にアップデートを適用し、10 日後には 70% に適用する、という意味になります。
 
       このポリシーのリストに値が指定されている場合は、<ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> ポリシーではなくこのポリシーに沿ってアップデートが適用されます。
 
-      このポリシーのリストが空の場合、段階的な適用は行われず、アップデートは他のデバイス ポリシーに沿って適用されます。
+      値が指定されていない場合は、段階的な適用は行われず、アップデートは他のデバイス ポリシーに沿って適用されます。
 
       このポリシーはチャンネルの切り替えには適用されません。</translation>
 <translation id="5523812257194833591">一定時間経過後に自動ログインする公開セッションです。
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb
index 3695658..655fcb40 100644
--- a/components/policy/resources/policy_templates_kn.xtb
+++ b/components/policy/resources/policy_templates_kn.xtb
@@ -553,6 +553,7 @@
 
        ಸಾಧನವು ಸ್ಥಳೀಯ ಬಳಕೆದಾರ ಡೇಟಾವನ್ನು ಇರಿಸಿದಲ್ಲಿ ಅಥವಾ ತಿರಸ್ಕರಿಸಿದರೂ ಈ ನೀತಿಯು ಯಾವುದೇ ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ ಎಂಬುದನ್ನು ಗಮನಿಸಿ.</translation>
 <translation id="2433412232489478893"><ph name="PRODUCT_NAME" /> ಗಾಗಿ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಫೈಲ್ ಹಂಚಿಕೊಳ್ಳುವ ವೈಶಿಷ್ಟ್ಯ ಬಳಸಲು ನಿರ್ದಿಷ್ಟ ಬಳಕೆದಾರರಿಗೆ ಅನುಮತಿ ಇದೆಯೇ ಎಂಬುದನ್ನು ಈ ಕಾರ್ಯನೀತಿಯು ನಿಯಂತ್ರಿಸುತ್ತದೆ.
+
       ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ ಅಥವಾ True ಎಂಬುದಾಗಿ ಹೊಂದಿಸಿದರೆ, ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಫೈಲ್‌ಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳುವ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು, ಬಳಕೆದಾರರಿಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ.
 
       ಈ ಕಾರ್ಯನೀತಿಯನ್ನು False ಎಂಬುದಾಗಿ ಹೊಂದಿಸಿದರೆ, ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಫೈಲ್‌ಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳುವ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು, ಬಳಕೆದಾರರಿಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.</translation>
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb
index e1e491df6..1f6da0b 100644
--- a/components/policy/resources/policy_templates_lv.xtb
+++ b/components/policy/resources/policy_templates_lv.xtb
@@ -275,6 +275,7 @@
       Ja politikai ir iestatīta vērtība “False”, lietojuma un diagnostikas datu nosūtīšana tiks atspējota.
 
       Ja politika nav konfigurēta, lietojuma un diagnostikas datu nosūtīšana tiks atspējota nepārvaldītās ierīcēs un iespējota pārvaldītās ierīcēs.</translation>
+<translation id="1920046221095339924">Atļaut pārvaldīto sesiju ierīcē</translation>
 <translation id="1929709556673267855">Nodrošina konfigurāciju ar ierīcēm saistītajiem uzņēmuma printeriem.
 
       Šī politika ļauj nodrošināt printeru konfigurāciju <ph name="PRODUCT_OS_NAME" /> ierīcēm. Formāts ir tāds pats kā NativePrinters vārdnīcā, taču baltā vai melnā saraksta izveidei papildus katram printerim ir jānorāda lauks “id” vai “guid”.
@@ -307,6 +308,7 @@
 
       Ja šis iestatījums ir iespējots vai tā vērtība nav norādīta, lietotājs varēs kontrolēt adrešu informācijas automātisko aizpildi lietotāja saskarnē.</translation>
 <translation id="1960840544413786116">Nosaka, vai atļaut sertifikātus, kurus izsnieguši lokāli uzticamības enkuri un kuriem trūkst paplašinājuma subjectAlternativeName.</translation>
+<translation id="1962273523772270623">Atļaut WebRTC notikumu žurnālu apkopošanu no Google pakalpojumiem</translation>
 <translation id="1964634611280150550">Inkognito režīms atspējots</translation>
 <translation id="1964802606569741174">Šī politika neietekmē Android lietotni YouTube. Ja lietotnē YouTube tiks aktivizēts drošais režīms, nedrīkst atļaut instalēt Android lietotni YouTube.</translation>
 <translation id="1969212217917526199">Šī politika tiek izmantota, lai ignorētu attālās piekļuves saimniekdatora atkļūdošanas versiju politiku.
@@ -526,7 +528,7 @@
       Ja šis iestatījums nav iestatīts, lietotāji var izlemt, vai izmantot šo funkciju.
 
       Šis iestatījums ir noņemts pārlūkā <ph name="PRODUCT_NAME" /> 29 un jaunākās versijās.</translation>
-<translation id="2433412232489478893">Šī politika nosaka, vai lietotājam ir atļauta tīkla failu kopīgošanas funkcija lietošanai ar <ph name="PRODUCT_NAME" />.
+<translation id="2433412232489478893">Šī politika nosaka, vai lietotājs var lietot tīkla failu kopīgošanas funkciju ar <ph name="PRODUCT_NAME" />.
 
       Ja šī politika nav konfigurēta vai tai nav iestatīta vērtība “True”, lietotāji varēs izmantot tīkla failu kopīgošanas ierīces.
 
@@ -1631,7 +1633,7 @@
 
       Ja šai politikai ir noteikta vērtība, atjauninājumi ignorē <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> politiku un ievēro šo politiku.
 
-      Ja šis saraksts ir tukšs, izstādīšana netiks veikta, un jauninājumi tiks piemēroti saskaņā ar citu ierīču politiku.
+      Ja šis saraksts ir tukšs, izstādīšana netiks veikta, un atjauninājumi tiks piemēroti saskaņā ar citu ierīču politiku.
 
       Šī politika neattiecas uz kanālu slēdžiem.</translation>
 <translation id="5523812257194833591">Publiska sesija, kurā pēc aizkaves veikt automātisku pieteikšanos.
@@ -2000,6 +2002,11 @@
       Ja šī politika nav iestatīta vai saraksts ir tukšs, pārlūkā <ph name="PRODUCT_NAME" /> varēs piekļūt visām shēmām.</translation>
 <translation id="6652197835259177259">Lokāli pārvaldītu lietotāju iestatījumi</translation>
 <translation id="6658245400435704251">Norāda sekunžu skaitu, kuru laikā ierīce var nejaušā secībā atlikt atjauninājuma lejupielādi, sākot ar laiku, kad serveris pirmo reizi nosūtīja atjauninājumu. Daļa no šī ierīces gaidīšanas laika var būt pulksteņa laiks, un daļa — atjauninājuma pārbaužu skaits. Jebkurā gadījumā izkliede ir saistīta ar noteiktu laika periodu, lai ierīces nebūtu bezgalīgi jāgaida atjauninājuma lejupielāde.</translation>
+<translation id="6665599130599311250">Ja politikai ir iestatīta vērtība “False” vai tā nav iestatīta, pārvaldītā viesa sesija rīkosies kā dokumentēts https://support.google.com/chrome/a/answer/3017014 — standarta “Publiskā sesija”.
+
+      Ja šai politikai ir iestatīta vērtība “True”, pārvaldītā viesa sesija pieņems “Pārvaldītās sesijas” rīcību, kas atceļ daudzus ierobežojumus, kuri ir spēkā parastai “Publiskajai sesijai”.
+ 
+      Ja šī politika ir iestatīta, lietotājs to nevar mainīt vai ignorēt.</translation>
 <translation id="6665670272107384733">Paroles ievadīšanas biežuma iestatīšana, lai varētu izmantot ātro atbloķēšanu</translation>
 <translation id="6681229465468164801">Ļauj iestatīt vietrāžu URL modeļu sarakstu ar vietnēm, kurām nav atļauts lūgt lietotājam piešķirt piekļuvi USB ierīcei.
 
@@ -2165,6 +2172,18 @@
 <translation id="6943577887654905793">Mac/Linux preferences nosaukums:</translation>
 <translation id="69525503251220566">Parametrs, kas noklusējuma meklēšanas pakalpojumu sniedzējam nodrošina funkciju Meklēšana pēc attēla</translation>
 <translation id="6956272732789158625">Neatļaut izmantot atslēgu ģenerēšanu nevienā vietnē</translation>
+<translation id="6982028490425791294">
+      Ja šai politikai ir iestatīta vērtība “True”, <ph name="PRODUCT_NAME" /> ir atļauts apkopot WebRTC notikumu žurnālus no Google pakalpojumiem (piem., Google Meet) un augšupielādēt šos žurnālus uzņēmumam Google.
+
+      Ja šai politikai ir iestatīta vērtība “False” vai vērtība nav iestatīta, <ph name="PRODUCT_NAME" /> nedrīkst apkopot vai augšupielādēt tādus žurnālus.
+
+      Šie žurnāli satur informāciju, piemēram, nosūtīto un saņemto RTP paku laiku un izmēru, atsauksmes par pārslodzi tīklā un metadatus par audio un video ietvaru laiku un kvalitāti. Šī informācija ir noderīga, atkļūdojot problēmas ar audio vai video zvaniem pārlūkā Chrome, piemēram, joslas platuma novērtējuma problēmas utt. Žurnāli nesatur audio vai video saturu no zvana.
+
+
+      Šo datu apkopošanu var aktivizēt tikai Google tīmekļa pakalpojumi, piemēram, Google Hangouts vai Google Meet.
+
+      Šos žurnālus, izmantojot sesijas ID, var saistīt ar citiem žurnāliem, kurus apkopo pats Google pakalpojums; tas ir paredzēts, lai atvieglotu atkļūdošanu
+      </translation>
 <translation id="6994082778848658360">Norāda, kā var izmantot pievienoto drošības elementa aparatūru divfaktoru autentificēšanai, ja tā ir saderīga ar šo funkciju.
 Lietotāja fiziskās klātbūtnes noteikšanai tiek izmantota ierīces barošanas poga.
 
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb
index f825581..1592cbf 100644
--- a/components/policy/resources/policy_templates_ml.xtb
+++ b/components/policy/resources/policy_templates_ml.xtb
@@ -683,7 +683,7 @@
 <translation id="2598508021807251719"><ph name="PRODUCT_OS_NAME" /> പ്രദർശിപ്പിച്ചേക്കാവുന്ന ഭാഷകൾ കോൺഫിഗർ ചെയ്യുന്നു.
 
       ഈ നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ഈ നയത്തിൽ വ്യക്തമാക്കിയിട്ടുള്ള ഏതെങ്കിലും ഒരു ഭാഷയിൽ മാത്രം <ph name="PRODUCT_OS_NAME" /> പ്രദർശിപ്പിക്കാൻ കോൺഫിഗർ ചെയ്യാനേ ഉപയോക്താവിന് കഴിയൂ. ഈ നയം സജ്ജീകരിച്ചിട്ടില്ലെങ്കിലോ ഒരു ശൂന്യമായ ലിസ്‌റ്റിലേക്കാണ് സജ്ജീകരിച്ചിരിക്കുന്നതെങ്കിലോ, പിന്തുണയ്ക്കുന്ന എല്ലാ UI ഭാഷകളിലും <ph name="PRODUCT_OS_NAME" /> പ്രദർശിപ്പിക്കാനാവും. അസാധുവായ മൂല്യങ്ങളുള്ള ഒരു ലിസ്‌റ്റിലേക്കാണ് ഈ നയം സജ്ജീകരിച്ചിരിക്കുന്നതെങ്കിൽ, അസാധുവായ എല്ലാ മൂല്യങ്ങളും അവഗണിക്കപ്പെടും. ഈ നയമനുസരിച്ച് അനുവദനീയമല്ലാത്ത ഒരു ഭാഷയിൽ <ph name="PRODUCT_OS_NAME" /> പ്രദർശിപ്പിക്കാൻ ഒരു ഉപയോക്താവ് മുമ്പ് കോൺഫിഗർ ചെയ്‌തിട്ടുണ്ടെങ്കിൽ, ഉപയോക്താവ് അടുത്ത തവണ സൈൻ ഇൻ ചെയ്യുമ്പോൾ പ്രദർശിപ്പിക്കുന്ന ഭാഷ ഒരു അനുവദനീയ UI ഭാഷയിലേക്ക് മാറും. ഉപയോക്താവ് തിരഞ്ഞെടുത്ത ഭാഷകൾ കോൺഫിഗർ ചെയ്‌തിട്ടുണ്ടായിരുന്നെങ്കിൽ, അവയിൽ ഒന്ന് ഈ നയപ്രകാരം അനുവദനീയമാണെങ്കിൽ, <ph name="PRODUCT_OS_NAME" /> ഈ ഭാഷയിലേക്ക് മാറും. അല്ലെങ്കിൽ, ഈ നയത്തിൽ അസാധുവായ എൻട്രികൾ മാത്രമാണുള്ളതെങ്കിൽ, ഈ നയപ്രകാരം വ്യക്തമാക്കിയിട്ടുള്ള ആദ്യ സാധുവായ മൂല്യത്തിലേക്കോ ഒരു ഫാൾബാക്ക് ഭാഷയിലേക്കോ (നിലവിൽ യുഎസ്-ഇംഗ്ലീഷ്) <ph name="PRODUCT_OS_NAME" /> മാറും.</translation>
-<translation id="2604182581880595781">നെറ്റ്‌വർക്ക് ഫയൽ പങ്കിടലിന് സമാനമായ നയങ്ങൾ കോൺഫിഗർ ചെയ്യുക.</translation>
+<translation id="2604182581880595781">നെറ്റ്‌വർക്ക് ഫയൽ പങ്കിടലുമായി ബന്ധപ്പെട്ട നയങ്ങൾ കോൺഫിഗർ ചെയ്യുക.</translation>
 <translation id="2623014935069176671">പ്രാരംഭ ഉപയോക്തൃ പ്രവർത്തനത്തിനായി കാത്തിരിക്കുക</translation>
 <translation id="262740370354162807"><ph name="CLOUD_PRINT_NAME" /> എന്നതിലേക്കുള്ള പ്രമാണങ്ങളുടെ സമർപ്പണം പ്രാപ്‌തമാക്കുക</translation>
 <translation id="2627554163382448569">എന്‍റർപ്രൈസ് പ്രിന്‍ററുകൾക്ക് കോൺഫിഗറേഷനുകൾ നൽകുന്നു.
@@ -1840,7 +1840,7 @@
 <translation id="5512418063782665071">ഹോം  പേജ്  URL</translation>
 <translation id="551639594034811656">അപ്ഡേറ്റ് ആദ്യം കണ്ടെത്തിയ ദിവസം മുതലുള്ള ഓരോ ആഴ്ചയിലും അപ്ഡേറ്റ് ചെയ്യാനുള്ള, OU-വിലെ <ph name="PRODUCT_OS_NAME" /> ഉപകരണങ്ങളുടെ ഒരു ഭാഗത്തെ നിർവചിക്കുന്ന ശതമാനങ്ങളുടെ ഒരു ലിസ്‌റ്റിനെ ഈ നയം നിർവചിക്കുന്നു. അപ്ഡേറ്റ് പ്രസിദ്ധീകരിച്ച് അൽപ്പസമയത്തിന് ശേഷമാവും ഉപകരണം അപ്ഡേറ്റുകൾക്കായി പരിശോധിക്കുക എന്നതിനാൽ, അപ്ഡേറ്റ് കണ്ടെത്തിയ സമയം അത് പ്രസിദ്ധീകരിച്ചതിന് ശേഷമുള്ളതായിരിക്കും.
 
-      അപ്ഡേറ്റ് കണ്ടെത്തിയ സമയം മുതൽ നിശ്ചിത ദിവസങ്ങൾ, ഫ്ലീറ്റിന്റെ എത്ര ശതമാനം അപ്ഡേറ്റ് ചെയ്യേണ്ടതുണ്ട് എന്ന് ഓരോ (ദിവസം, ശതമാനം) ജോടിയിലും ഉണ്ട്. ഉദാഹരണത്തിന്, നമുക്ക് [(4, 40), (10, 70), (15, 100)] എന്നീ ജോടികൾ ഉണ്ടെങ്കിൽ, ഫ്ലീറ്റിന്റെ 40%, അപ്ഡേറ്റ് കണ്ടതിന് ശേഷം 4 ദിവസം അപ്ഡേറ്റ് ചെയ്‌തിരിക്കും. 10 ദിവസത്തിന് ശേഷം 70% അപ്ഡേറ്റ് ചെയ്യും, ഇത് ഇങ്ങനെ തുടരും.
+      അപ്ഡേറ്റ് കണ്ടെത്തിയ സമയം മുതൽ നിശ്ചിത ദിവസങ്ങൾ, ഫ്ലീറ്റിന്റെ എത്ര ശതമാനം അപ്ഡേറ്റ് ചെയ്യേണ്ടതുണ്ട് എന്ന് ഓരോ (ദിവസം, ശതമാനം) ജോടിയിലും ഉണ്ട്. ഉദാഹരണത്തിന്, നമുക്ക് [(4, 40), (10, 70), (15, 100)] എന്നീ ജോടികൾ ഉണ്ടെങ്കിൽ, ഫ്ലീറ്റിന്റെ 40%, അപ്ഡേറ്റ് കണ്ട്, 4 ദിവസത്തിന് ശേഷമാണ് അപ്ഡേറ്റ് ചെയേണ്ടത്.  70%, 10 ദിവസത്തിന് ശേഷം അപ്ഡേറ്റ് ചെയ്യണം, ഇത് ഇങ്ങനെ തുടരും.
 
       ഈ നയത്തിനായി ഒരു മൂല്യം നിർവചിച്ചിട്ടുണ്ടെങ്കിൽ, അപ്‌ഡേറ്റുകൾ, <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> എന്ന നയം അവഗണിക്കുകയും പകരം ഈ നയം പിന്തുടരുകയും ചെയ്യും.
 
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb
index d374e7f..56f4e89 100644
--- a/components/policy/resources/policy_templates_ms.xtb
+++ b/components/policy/resources/policy_templates_ms.xtb
@@ -275,6 +275,7 @@
       Jika ditetapkan kepada palsu, pelaporan metrik dan data diagnostik akan dilumpuhkan.
 
       Jika tidak dikonfigurasikan, pelaporan metrik dan data diagnostik akan dilumpuhkan pada peranti tidak diurus dan didayakan pada peranti yang diurus.</translation>
+<translation id="1920046221095339924">Benarkan sesi yang diurus pada peranti</translation>
 <translation id="1929709556673267855">Menyediakan konfigurasi untuk pencetak perusahaan yang dihubungkan pada peranti.
 
        Dasar ini membenarkan anda menyediakan konfigurasi pencetak kepada peranti <ph name="PRODUCT_OS_NAME" />. Format adalah sama dengan format kamus NativePrinters, dengan medan tambahan "id" atau "guid" yang diperlukan bagi setiap pencetak untuk penyenaraian putih atau hitam.
@@ -308,6 +309,7 @@
 
       Jika tetapan ini didayakan atau tiada nilai, pengguna akan dapat mengawal ciri Autolengkap untuk alamat dalam UI.</translation>
 <translation id="1960840544413786116">Sama ada hendak membenarkan sijil yang dikeluarkan oleh pengukuhan kepercayaan setempat yang tiasa sambungan subjectAlternativeName</translation>
+<translation id="1962273523772270623">Benarkan pengumpulan log peristiwa WebRTC daripada perkhidmatan Google</translation>
 <translation id="1964634611280150550">Mod Inkognito dilumpuhkan</translation>
 <translation id="1964802606569741174">Dasar ini tidak berkesan terhadap apl YouTube Android. Jika Mod Keselamatan pada YouTube harus dikuatkuasakan, pemasangan apl YouTube Android tidak boleh dibenarkan.</translation>
 <translation id="1969212217917526199">Mengatasi dasar pada binaan Nyahpepijat bagi hos akses jauh.
@@ -1622,7 +1624,7 @@
       Nilai dasar ini harus ditetapkan dalam milisaat.</translation>
 <translation id="5511702823008968136">Dayakan Bar Penanda Halaman</translation>
 <translation id="5512418063782665071">URL halaman utama</translation>
-<translation id="551639594034811656">Dasar ini mentakrifkan senarai peratusan yang akan menentukan pecahan peranti <ph name="PRODUCT_OS_NAME" /> dalam OU yang akan dikemas kini setiap minggu bermula dari hari kemas kini itu mula-mula ditemui. Masa penemuan adalah lebih kemudian daripada masa kemas kini diterbitkan memandangkan peranti menyemak kemas kini beberapa ketika selepas kemas kini itu diterbitkan.
+<translation id="551639594034811656">Dasar ini mentakrifkan senarai peratusan yang akan menentukan pecahan peranti <ph name="PRODUCT_OS_NAME" /> dalam OU yang akan dikemas kini setiap hari bermula dari hari kemas kini itu mula-mula ditemui. Masa penemuan adalah lebih kemudian daripada masa kemas kini diterbitkan memandangkan peranti menyemak kemas kini beberapa ketika selepas kemas kini itu diterbitkan.
 
       Setiap pasangan (hari, peratusan) mengandungi peratusan himpunan yang perlu dikemas kini mengikut bilangan hari yang dinyatakan sejak kemas kini ditemui. Contohnya, jika kami mempunyai pasangan [(4, 40), (10, 70), (15, 100)], maka 40% daripada himpunan seharusnya telah dikemas kini 4 hari selepas kemas kini ditemui. 70% harus dikemas kini selepas 10 hari dan begitulah seterusnya.
 
@@ -2001,6 +2003,11 @@
       Jika dasar ini dibiarkan tanpa ditetapkan atau senarai tersebut kosong, semua skim akan boleh diakses dalam <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Tetapan pengguna terurus setempat</translation>
 <translation id="6658245400435704251">Menyatakan bilangan saat sehingga peranti boleh melambatkan muat turun kemas kini secara rawak dari masa kemas kini mula ditolak keluar ke pelayan. Peranti mungkin menunggu sebahagian masa ini dari segi masa jam dinding dan bahagian yang selebihnya dari segi bilangan semakan kemas kini. Dalam apa jua keadaan, serakan atas disempadani oleh jumlah masa yang tetap supaya peranti tidak sekali-kali akan tersekat menunggu selama-lamanya untuk memuat turun kemas kini.</translation>
+<translation id="6665599130599311250">Jika dasar ini ditetapkan kepada palsu atau dibiarkan tidak ditetapkan, sesi tetamu yang diurus akan bergelagat seperti yang didokumenkan dalam https://support.google.com/chrome/a/answer/3017014 - "Sesi Umum" standard.
+
+      Jika dasar ini ditetapkan kepada benar, sesi tetamu yang diurus akan mengguna pakai gelagat "Sesi yang Diurus" yang memansuhkan banyak sekatan yang dikenakan pada "Sesi Umum" biasa.
+
+      Jika dasar ini ditetapkan, pengguna tidak dapat mengubah atau mengatasinya.</translation>
 <translation id="6665670272107384733">Tetapkan kekerapan pengguna perlu memasukkan kata laluan untuk menggunakan buka kunci pantas</translation>
 <translation id="6681229465468164801">Membolehkan anda menetapkan senarai corak url bagi menentukan tapak yang dihalang daripada meminta pengguna memberi tapak tersebut akses kepada peranti USB.
 
@@ -2166,6 +2173,17 @@
 <translation id="6943577887654905793">Nama keutamaan Mac/Linux:</translation>
 <translation id="69525503251220566">Parameter yang menyediakan ciri cari melalui imej untuk penyedia carian lalai</translation>
 <translation id="6956272732789158625">Jangan benarkan mana-mana tapak untuk menggunakan penghasilan kunci</translation>
+<translation id="6982028490425791294">
+      Jika dasar ditetapkan kepada benar, <ph name="PRODUCT_NAME" /> dibenarkan mengumpulkan log peristiwa WebRTC daripada perkhidmatan Google (mis. Google Meet) dan memuat naik log tersebut ke Google.
+
+      Jika dasar ini ditetapkan kepada palsu atau tidak ditetapkan, <ph name="PRODUCT_NAME" /> tidak boleh mengumpul mahupun memuat naik log tersebut.
+
+      Log ini mengandungi maklumat seperti masa dan saiz paket RTP yang dihantar dan diterima, maklum balas tentang kesesakan pada rangkaian serta metadata tentang masa dan kualiti bingkai audio dan video. Maklumat ini berguna apabila menyahpepijat isu berkaitan panggilan audio atau video dalam Chrome, seperti isu anggaran lebar jalur, dll. Log tidak mengandungi kandungan audio atau video daripada panggilan.
+
+      Pengumpulan data ini hanya boleh dicetuskan oleh perkhidmatan web Google, seperti Google Hangouts atau Google Meet.
+
+      Log ini mungkin dikaitkan, melalui ID sesi, dengan log lain yang dikumpulkan oleh perkhidmatan Google itu sendiri; ini bertujuan untuk memudahkan penyahpepijatan.
+      </translation>
 <translation id="6994082778848658360">Menyatakan cara perkakasan unsur selamat atas papan boleh digunakan untuk menyediakan pengesahan faktor kedua jika serasi dengan ciri ini. Butang kuasa mesin digunakan untuk mengesan kehadiran fizikal pengguna.
 
       Jika 'Dilumpuhkan' dipilih, faktor kedua tidak disediakan.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index 34b38a99..d82a13f 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -267,6 +267,7 @@
       Als dit beleid is ingesteld op false (onwaar), wordt de rapportage van statistieken en diagnostische gegevens uitgeschakeld.
 
       Als dit beleid niet is ingesteld, wordt de rapportage van statistieken en diagnostische gegevens op niet-beheerde apparaten uitgeschakeld en op beheerde apparaten ingeschakeld.</translation>
+<translation id="1920046221095339924">Beheerde sessie op apparaat toestaan</translation>
 <translation id="1929709556673267855">Hiermee worden configuraties geleverd voor zakelijke printers die aan apparaten zijn gekoppeld.
 
       Met dit beleid kun je printerconfiguraties leveren aan <ph name="PRODUCT_OS_NAME" />-apparaten. De indeling is gelijk aan het NativePrinters-woordenboek, aangevuld met een vereist ID- of GUID-veld per printer voor het op de witte of zwarte lijst zetten.
@@ -300,6 +301,7 @@
 
       Als deze instelling is ingeschakeld of er geen waarde is ingesteld, kan de gebruiker 'Automatisch aanvullen' voor adressen beheren in de UI.</translation>
 <translation id="1960840544413786116">Of door lokale vertrouwensankers uitgegeven certificaten zonder de extensie subjectAlternativeName zijn toegestaan</translation>
+<translation id="1962273523772270623">Verzameling van WebRTC-gebeurtenislogboeken van Google-services toestaan</translation>
 <translation id="1964634611280150550">Incognitomodus uitgeschakeld</translation>
 <translation id="1964802606569741174">Dit beleid is niet van invloed op de YouTube-app voor Android. Als de veiligheidsmodus voor YouTube moet worden afgedwongen, moet je installatie van de YouTube-app voor Android niet toestaan.</translation>
 <translation id="1969212217917526199">Hiermee worden beleidsregels overgeschreven op Debug-builds van de host voor externe toegang.
@@ -1988,6 +1990,11 @@
       Als je dit beleid niet instelt of als de lijst leeg is, zijn alle schema's toegankelijk in <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Instellingen voor lokaal beheerde gebruikers</translation>
 <translation id="6658245400435704251">Bepaalt het maximaal aantal seconden dat een apparaat willekeurig de download van een update mag uitstellen vanaf het moment dat de update voor het eerst naar de server werd gepusht. Het apparaat kan een deel van deze tijd wachten in termen van kloktijd en het resterende deel in termen van het aantal updatecontroles. De maximale spreiding is in elk geval begrensd door een constante periode zodat een apparaat nooit vastloopt tijdens het wachten tot een update kan worden gedownload.</translation>
+<translation id="6665599130599311250">Als dit beleid is ingesteld op 'false' (onwaar) of niet is ingesteld, vertoont de beheerde gastsessie het gedrag dat is gedocumenteerd op https://support.google.com/chrome/a/answer/3017014 (de standaard 'openbare sessie').
+
+      Als dit beleid is ingesteld op 'true' (waar), vertoont de beheerde gastsessie het gedrag van een 'beheerde sessie', waardoor veel van de beperkingen die gelden voor gewone 'openbare sessies' worden opgeheven.
+
+      Als dit beleid is ingesteld, kan de gebruiker het niet wijzigen of overschrijven.</translation>
 <translation id="6665670272107384733">Instellen hoe vaak een gebruiker het wachtwoord moet opgeven om de functie voor snel ontgrendelen te kunnen gebruiken</translation>
 <translation id="6681229465468164801">Hiermee kun je een lijst met URL-patronen opgeven voor sites die de gebruiker geen toestemming mogen vragen om ze toegang te verlenen tot een USB-apparaat.
 
@@ -2144,6 +2151,17 @@
 <translation id="6943577887654905793">Voorkeursnaam voor Mac/Linux:</translation>
 <translation id="69525503251220566">Parameter die een functie voor zoeken op afbeelding levert voor de standaardzoekprovider</translation>
 <translation id="6956272732789158625">Sites niet toestaan sleutels te genereren</translation>
+<translation id="6982028490425791294">
+      Als het beleid is ingesteld op 'true' (waar), mag <ph name="PRODUCT_NAME" /> WebRTC-gebeurtenislogboeken van Google-services (zoals Google Meet) verzamelen en die logboeken uploaden naar Google.
+
+      Als het beleid is ingesteld op 'false' (onwaar) of niet is ingesteld, mag <ph name="PRODUCT_NAME" /> dergelijke logboeken niet verzamelen of uploaden.
+
+      Deze logboeken bevatten informatie zoals de tijd en grootte van verzonden en ontvangen RTP-pakketten, feedback over overbelasting van het netwerk en metadata met betrekking tot de tijd en kwaliteit van audio- en videoframes. Deze informatie is nuttig voor het opsporen van fouten met audio- of videogesprekken in Chrome, zoals problemen met bandbreedteschattingen, enzovoort. De logboeken bevatten geen audio- of videocontent uit het gesprek.
+
+      Deze gegevensverzameling kan alleen worden geactiveerd door webservices van Google, zoals Google Hangouts of Google Meet.
+
+      Deze logboeken kunnen door middel van een sessie-ID worden gekoppeld aan andere logboeken die worden verzameld door de Google-service zelf. Dit wordt gedaan om fouten gemakkelijker te kunnen opsporen.
+      </translation>
 <translation id="6994082778848658360">Geeft aan hoe de ingebouwde Secure Element-hardware kan worden gebruikt voor authenticatie met meerdere factoren, indien de hardware geschikt is voor deze functie. De aan/uit-knop van de machine wordt gebruikt om de fysieke aanwezigheid van de gebruiker te detecteren.
 
       Als Uitgeschakeld is geselecteerd, wordt er geen tweede factor verstrekt.
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb
index 974755b..287f8de 100644
--- a/components/policy/resources/policy_templates_no.xtb
+++ b/components/policy/resources/policy_templates_no.xtb
@@ -518,11 +518,11 @@
       Hvis denne innstillingen ikke angis, kan brukere bestemme om de vil bruke den eller ikke.
 
       Denne innstillingen er fjernet fra <ph name="PRODUCT_NAME" /> 29 og nyere versjoner.</translation>
-<translation id="2433412232489478893">Denne retningslinjen kontrollerer om delte nettverksressurser-funksjonen for <ph name="PRODUCT_NAME" /> er tillatt for en bruker.
-   
-      Hvis denne retningslinjen ikke er konfigurert eller satt til Sann, vil brukeren ha mulighet til å bruke delte nettverksressurser.
+<translation id="2433412232489478893">Denne regelen kontrollerer om delte nettverksressurser for <ph name="PRODUCT_NAME" /> er tillatt for en bruker.
 
-      Hvis denne retningslinjen er satt til Usann, vil ikke brukere ha mulighet til å bruke delte nettverksressurser.</translation>
+      Hvis denne regelen ikke er konfigurert eller satt til sant (true), kan brukeren bruke delte nettverksressurser.
+
+      Hvis denne regelen er satt til usant (false), kan ikke brukere bruke delte nettverksressurser.</translation>
 <translation id="2438609638493026652">Slår på rapportering av viktige hendelser under Android-appinstallasjoner til Google. Hendelser registreres bare for apper som ble installert på grunn av en regel.
 
       Hvis regelen er satt til «True» (sann), blir hendelser loggført.
@@ -604,7 +604,7 @@
 <translation id="2598508021807251719">Konfigurerer hvilke lokaliteter <ph name="PRODUCT_OS_NAME" /> kan vises i.
 
       Hvis denne regelen er angitt, kan brukeren bare konfigurere <ph name="PRODUCT_OS_NAME" /> til å vises i en av lokalitetene som er angitt av denne regelen. Hvis regelen ikke er angitt eller er angitt med en tom liste, kan <ph name="PRODUCT_OS_NAME" /> vises i alle UI-lokalitetene som støttes. Hvis regelen er angitt med en liste med ugyldige verdier, ignoreres alle de ugyldige verdiene. Hvis en bruker tidligere konfigurerte <ph name="PRODUCT_OS_NAME" /> til å bli vist på en lokalitet som ikke tillates av denne regelen, byttes den viste lokaliteten til en tillatt UI-lokalitet neste gang brukeren logger på. Hvis brukeren har konfigurert foretrukne lokaliteter og en av de foretrukne lokalitetene tillates av denne regelen, bytter <ph name="PRODUCT_OS_NAME" /> til denne lokaliteten. Ellers bytter <ph name="PRODUCT_OS_NAME" /> til den første gyldige verdien angitt av denne regelen eller til en reservelokalitet (en-US) hvis denne regelen bare inneholder ugyldige oppføringer.</translation>
-<translation id="2604182581880595781">Konfigurer delte nettverksresurser relatert til retningslinjene.</translation>
+<translation id="2604182581880595781">Konfigurer retningslinjer knyttet til delte nettverksresurser.</translation>
 <translation id="2623014935069176671">Vent på første brukeraktivitet</translation>
 <translation id="262740370354162807">Aktiver sending av dokumenter til <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Gir konfigurasjoner for bedriftsskrivere.
@@ -1164,18 +1164,18 @@
 
           Hvis denne regelen ikke angis, brukes den globale standardverdien for alle nettstedene, enten fra regelen «DefaultKeygenSetting» hvis den er angitt, eller fra brukerens personlige konfigurasjon.</translation>
 <translation id="4239720644496144453">Bufferen brukes ikke til Android-apper. Hvis flere brukere installerer den samme Android-appen, blir den lastet ned på nytt for hver bruker.</translation>
-<translation id="4243336580717651045">Aktiverer anonymisert datainnsamling med nettadressenøkkel i <ph name="PRODUCT_NAME" />,  hindrer brukerne i å endre denne innstillingen. 
+<translation id="4243336580717651045">Aktiverer anonymisert datainnsamling med nettadressenøkkel i <ph name="PRODUCT_NAME" />, og hindrer brukerne i å endre denne innstillingen. 
 
-      Anonymisert datainnsamling med nettadressenøkkel sender nettadressene til sidene som brukeren besøker til Google, for å muliggjøre bedre søk og surfing på nett.
+      Anonymisert datainnsamling med nettadressenøkkel sender nettadressene til sidene som brukeren besøker, til Google, for å muliggjøre bedre søk og surfing på nettet.
 
-      Hvis denne retningslinjen aktiveres, vil anonymisert datainnsamling med nettadressenøkkel alltid være aktiv.
+      Hvis du slår på denne regelen, er anonymisert datainnsamling med nettadressenøkkel alltid aktiv.
 
-     Hvis denne retningslinjen deaktiveres, vil anonymisert datainnsamling med nettadressenøkkel aldri være aktiv.
+      Hvis du slår av denne regelen, er anonymisert datainnsamling med nettadressenøkkel aldri aktiv.
 
-      Hvis denne retningslinjen ikke angis, vil anonymisert datainnsamling med nettadressenøkkel være aktivert, men brukeren kan endre på det.</translation>
+      Hvis du ikke angir noen innstilling for denne regelen, er anonymisert datainnsamling med nettadressenøkkel aktiv, men brukeren kan endre den.</translation>
 <translation id="4250680216510889253">Nei</translation>
 <translation id="4261820385751181068">Lokalitet for påloggingsskjermen på enheten</translation>
-<translation id="4264607809747169568">Kontroller tilgjengeligheten til delte nettverksressurser for ChromeOS</translation>
+<translation id="4264607809747169568">Kontroller tilgjengeligheten for delte nettverksressurser for ChromeOS</translation>
 <translation id="427220754384423013">Angir skriverne som en bruker kan bruke.
 
       Denne regelen brukes bare hvis <ph name="PRINTERS_WHITELIST" /> er valgt for <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1602,15 +1602,15 @@
       Retningslinjeverdien må spesifiseres i millisekunder.</translation>
 <translation id="5511702823008968136">Aktiver bokmerkerad</translation>
 <translation id="5512418063782665071">Nettadresse for startside</translation>
-<translation id="551639594034811656">Denne retningslinjen definerer en liste med prosenter som definerer hvor stor andel av <ph name="PRODUCT_OS_NAME" />-enheter i OU som må oppdateres per dag, starter fra den dagen oppdateringen ble oppdaget. Oppdagelsestidspunktet er senere enn tidspunktet for utgivelsen av oppdateringen, siden det kan ta litt tid før enheten sjekker etter oppdateringen.
+<translation id="551639594034811656">Denne regelen angir en liste med prosentverdier som definerer hvor stor andel av <ph name="PRODUCT_OS_NAME" />-enheter i OE som må oppdateres per dag, fra og med den dagen oppdateringen ble oppdaget. Oppdagelsestidspunktet er senere enn tidspunktet for utgivelsen av oppdateringen, siden det kan ta litt tid før enheten sjekker etter oppdateringer.
 
-      Hver (dag, prosent)-par inneholder hvilken prosent av systemet som må oppdateres innen det angitte antall dager etter oppdagelsen av oppdateringen. For eksempel, hvis vi har parene [(4, 40), (10, 70), (15, 100)], må 40% av systemene bli oppdatert innen 4 dager etter oppdagelsen av oppdateringen. 70% må være ferdig etter 10 dag, osv.
+      Hvert (dag, prosent)-par inneholder hvor stor prosentandel av flåten som må oppdateres innen det angitte antallet dager etter at oppdateringen ble oppdaget. Eksempel: Hvis vi har parene [(4, 40), (10, 70), (15, 100)], må 40 % av flåten være oppdatert innen 4 dager etter at oppdateringen ble oppdaget, 70 % må være oppdatert etter 10 dager og så videre.
 
-      Hvis det ikke er angitt en verdi for denne retningslinjen, vil oppdateringene ignorere <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />-retningslinjen og følge denne retningslinjen istedet.
+      Hvis det er angitt en verdi for denne regelen, ignoreres regelen <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> for oppdateringer, og denne regelen følges i stedet.
 
-      Hvis denne listen er tom, vil det ikke gjennomføres noen fase og oppdateringene vil installeres i henhold til andre enhetsinnstillinger.
+      Hvis denne listen er tom, utføres ingen gradvis oppdatering, og oppdateringer installeres i stedet i henhold til andre enhetsinnstillinger.
 
-     Denne retningslinjen gjelder ikke for kanalbrytere.</translation>
+      Denne regelen gjelder ikke for kanalsvitsjer.</translation>
 <translation id="5523812257194833591">Automatisk pålogging til offentlig økt etter en gitt tid.
 
       Hvis denne innstillingen angis, skjer det en automatisk pålogging etter en gitt periode av brukerinaktivitet. Den offentlige økten må allerede være konfigurert (se |DeviceLocalAccounts|).
@@ -1838,7 +1838,7 @@
           Den anbefalte måten å låse skjermen på når den er inaktiv, er å aktivere skjermlåsing ved hvilemodus, slik at <ph name="PRODUCT_OS_NAME" /> aktiverer skjermlåsen etter det innstilte inaktive perioden. Tidsinnstillingen for skjermlåsen bør bare brukes når skjermlåsen skal aktiveres lenge før hvilemodus, eller når bruk av hvilemodus ved inaktivitet ikke er ønskelig i det hele tatt.
 
           Innstillingsverdien bør angis i millisekunder. Verdien må være mindre enn inaktivitetsforsinkelsen.</translation>
-<translation id="6097601282776163274">Aktiver anonymisert datainnsamling med nettadressenøkkel</translation>
+<translation id="6097601282776163274">Slå på anonymisert datainnsamling med nettadressenøkkel</translation>
 <translation id="6111936128861357925">Tillat dinosaurspill-påskeegget</translation>
 <translation id="6114416803310251055">avskrevet</translation>
 <translation id="6133088669883929098">Tillat alle nettsteder å bruke nøkkelgenerering</translation>
@@ -2545,11 +2545,9 @@
       Hvis regelen er deaktivert, er det ingen nettstedsisolering, og feltprøver for IsolateOrigins og SitePerProcess deaktiveres. Brukerne kan fortsatt aktivere SitePerProcess manuelt.
       Hvis regelen ikke er konfigurert, kan brukerne endre denne innstillingen.
       </translation>
-<translation id="7902255855035461275">Mønstrene i denne listen sammenlignes med sikkerhetskilden
-      til nettadressen forespørselen kommer fra. Hvis det finnes samsvar, blir 
-      tilgang til videoopptaksenheter gitt uten forespørsel på forhånd.
+<translation id="7902255855035461275">Mønstrene i denne listen sammenlignes med sikkerhetskilden til nettadressen forespørselen kommer fra. Hvis det finnes samsvar, blir tilgang til videoopptaksenheter gitt uten forespørsel på forhånd.
 
-      MERK: Frem til versjon 45 ble denne regelen bare støttet i kioskmodus.</translation>
+MERK: Frem til versjon 45 ble denne regelen bare støttet i kioskmodus.</translation>
 <translation id="7912255076272890813">Konfigurer tillatte typer apper og utvidelser</translation>
 <translation id="7915236031252389808">Du kan angi nettadressen til en .pac-fil for en proxy-tjener her.
 
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb
index 74fab1d..48fdb7c2 100644
--- a/components/policy/resources/policy_templates_pl.xtb
+++ b/components/policy/resources/policy_templates_pl.xtb
@@ -264,6 +264,7 @@
 
       Jeśli jej nie włączysz, przesyłanie statystyk i danych diagnostycznych będzie wyłączone.
       Jeśli jej nie skonfigurujesz, przesyłanie statystyk użytkowania i danych diagnostycznych będzie wyłączone na urządzeniach niezarządzanych, ale włączone na zarządzanych.</translation>
+<translation id="1920046221095339924">Zezwalaj na sesję zarządzaną na urządzeniu</translation>
 <translation id="1929709556673267855">Udostępnia konfiguracje drukarek firmowych powiązanych z urządzeniami.
 
       Ta zasada umożliwia udostępnianie konfiguracji drukarek urządzeniom z systemem <ph name="PRODUCT_OS_NAME" />. 
@@ -298,6 +299,7 @@
 
       Jeśli to ustawienie jest włączone lub nie jest skonfigurowane, użytkownik może samodzielnie skonfigurować Autouzupełnianie adresów w interfejsie.</translation>
 <translation id="1960840544413786116">Określa, czy zezwolić na certyfikaty wydane przez lokalne kotwice zaufania, którym brakuje rozszerzenia subjectAlternativeName</translation>
+<translation id="1962273523772270623">Zezwalaj na zbieranie dzienników zdarzeń WebRTC z usług Google</translation>
 <translation id="1964634611280150550">Tryb incognito wyłączony</translation>
 <translation id="1964802606569741174">Ta zasada nie ma wpływu na aplikację YouTube na Androida. Aby wymusić Tryb bezpieczny w YouTube, trzeba uniemożliwić zainstalowanie tej aplikacji.</translation>
 <translation id="1969212217917526199">Zastępuje zasady w kompilacjach hosta dostępu zdalnego w trybie debugowania.
@@ -1908,6 +1910,11 @@
       Jeśli ta zasada pozostanie nieustawiona lub lista jest pusta, wszystkie schematy są dostępne w <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Ustawienia użytkowników zarządzanych lokalnie</translation>
 <translation id="6658245400435704251">Określa, o ile sekund urządzenie może losowo opóźnić pobranie aktualizacji w stosunku do czasu jej opublikowania na serwerze. Urządzenie może odczekać część tego okresu, licząc w sekundach zegara, a pozostałą część, licząc w testach dostępności aktualizacji. Tak czy inaczej okres opóźnienia jest ograniczony z góry, by urządzenie nigdy nie utknęło w stanie oczekiwania na pobranie aktualizacji.</translation>
+<translation id="6665599130599311250">Jeśli ta zasada ma wartość Fałsz lub nie jest ustawiona, zarządzana sesja gościa będzie działać tak, jak opisano na https://support.google.com/chrome/a/answer/3017014, czyli jako standardowa „sesja publiczna”.
+
+      Jeśli ta zasada ma wartość Prawda, sesja będzie „sesją zarządzaną” i nie będzie objęta wieloma ograniczeniami dotyczącymi „sesji publicznych”.
+
+      Jeśli ta zasada jest ustawiona, użytkownik nie może jej zmienić ani zastąpić.</translation>
 <translation id="6665670272107384733">Określ, jak często użytkownik musi podawać hasło, by używać szybkiego odblokowania</translation>
 <translation id="6681229465468164801">Pozwala utworzyć listę wzorców adresów URL określających witryny, które nie mogą prosić użytkownika o przyznanie dostępu do urządzeń USB.
 
@@ -2062,6 +2069,17 @@
 <translation id="6943577887654905793">Nazwa ustawienia w systemie macOS/Linux:</translation>
 <translation id="69525503251220566">Parametr udostępniający funkcję wyszukiwania obrazem dla domyślnego dostawcy wyszukiwania</translation>
 <translation id="6956272732789158625">Nie zezwalaj na generowanie kluczy w żadnej witrynie</translation>
+<translation id="6982028490425791294">
+      Jeśli ta zasada ma wartość Fałsz, <ph name="PRODUCT_NAME" /> może zbierać dzienniki zdarzeń WebRTC z naszych usług (np. Google Meet) i przesyłać te dane do Google.
+
+      Jeśli ta zasada ma wartość Fałsz lub nie jest ustawiona, <ph name="PRODUCT_NAME" /> nie może zbierać ani przesyłać takich dzienników.
+
+      Dzienniki zawierają takie informacje jak daty i godziny wysłania i odebrania pakietów RTP, dane dotyczące obciążenia sieci oraz metadane związane z jakością ramek audio i wideo. Te informacje są przydatne podczas debugowania problemów z połączeniami audio lub wideo w Chrome, takich jak kłopoty z szacowaniem przepustowości. Dzienniki nie zawierają treści połączeń audio ani wideo.
+
+      Zbieranie danych mogą inicjować tylko usługi internetowe Google, takie jak Google Hangouts czy Google Meet.
+
+      Aby ułatwić debugowanie, możemy za pomocą identyfikatora sesji łączyć te dzienniki z innymi dziennikami zbieranymi przez usługi Google.
+      </translation>
 <translation id="6994082778848658360">Określa, jak można użyć zainstalowanego sprzętowego elementu zabezpieczeń w celu stosowania uwierzytelniania dwuskładnikowego, jeśli jest on zgodny z tą funkcją. Przycisk zasilania komputera wykrywa fizyczną obecność użytkownika.
 
       Jeśli wybierzesz „Wyłączone”, uwierzytelnianie dwuskładnikowe nie będzie dostępne.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index 9c15dbf..137a2eb 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -263,6 +263,7 @@
       Se configurada como falsa, os relatórios de métricas e dados de diagnóstico serão desativados.
 
       Se não for configurada, os relatórios de métricas e dados de diagnóstico serão desativados em dispositivos não gerenciados e ativados em dispositivos gerenciados.</translation>
+<translation id="1920046221095339924">Permite sessão gerenciada no dispositivo</translation>
 <translation id="1929709556673267855">Fornece configurações para impressoras corporativas associadas a dispositivos.
 
       Esta política permite fornecer configurações de impressora para dispositivos <ph name="PRODUCT_OS_NAME" />. O formato é igual ao do dicionário NativePrinters, com um campo obrigatório "id" ou "guid" adicional por impressora para colocar ou remover da lista de permissões.
@@ -296,6 +297,7 @@
 
       Se essa configuração estiver ativada ou não tiver um valor definido, o usuário poderá controlar o recurso Preenchimento automático para endereços na IU.</translation>
 <translation id="1960840544413786116">Se os certificados emitidos pelas âncoras de confiança locais que estão sem a extensão subjectAlternativeName devem ser permitidos</translation>
+<translation id="1962273523772270623">Permite a coleta de logs de eventos WebRTC dos serviços do Google</translation>
 <translation id="1964634611280150550">Modo de navegação anônima desativado</translation>
 <translation id="1964802606569741174">Esta política não tem nenhum efeito sobre o app do YouTube para Android. Se o modo de segurança do YouTube precisar ser aplicado, a instalação desse app será bloqueada.</translation>
 <translation id="1969212217917526199">Modifica as políticas sobre versões de depuração do host de acesso remoto.
@@ -1907,6 +1909,11 @@
       Se esta política não for definida ou se a lista estiver vazia, todos os esquemas serão acessíveis no <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Configurações de usuários gerenciados localmente</translation>
 <translation id="6658245400435704251">Especifica o número de segundos que um dispositivo pode chegar a atrasar aleatoriamente o download de uma atualização a partir do momento em que a atualização foi lançada no servidor. O dispositivo pode esperar uma parte desse intervalo de tempo em tempo cronológico e o restante contado em número de verificações de atualizações. Em todo caso, a dispersão tem como limite máximo uma quantidade constante de tempo para que o dispositivo nunca fique parado indefinidamente esperando para fazer o download de uma atualização.</translation>
+<translation id="6665599130599311250">Se esta política for definida como falsa ou não for definida, a sessão de visitante gerenciada terá o comportamento documentado em https://support.google.com/chrome/a/answer/3017014, a "Sessão pública" padrão.
+
+      Se esta política for definida como verdadeira, a sessão de visitante gerenciada terá o comportamento de "Sessão gerenciada", o que elimina muitas das restrições estabelecidas para "Sessões públicas" normais.
+
+      Se esta política for definida, o usuário não poderá alterá-la ou modificá-la.</translation>
 <translation id="6665670272107384733">Definir com que frequência o usuário precisa digitar a senha para usar o desbloqueio rápido</translation>
 <translation id="6681229465468164801">Permite definir uma lista de padrões de URL que especificam quais sites não podem pedir que o usuário conceda acesso a um dispositivo USB.
 
@@ -2070,6 +2077,17 @@
 <translation id="6943577887654905793">Nome de preferência Mac/Linux:</translation>
 <translation id="69525503251220566">Parâmetro que fornece recursos de pesquisa por imagem para o provedor de pesquisa padrão</translation>
 <translation id="6956272732789158625">Não permitir que nenhum site use a geração de chaves</translation>
+<translation id="6982028490425791294">
+      Se a política for definida como verdadeira, o <ph name="PRODUCT_NAME" /> poderá coletar logs de eventos WebRTC dos serviços do Google (por exemplo, do Google Meet) e enviá-los para o Google.
+
+      Se a política for definida como falsa ou não for definida, o <ph name="PRODUCT_NAME" /> não poderá coletar nem enviar esses logs.
+
+      Esses logs contêm informações como tempo e tamanho dos pacotes RTP enviados e recebidos, feedback sobre congestionamento na rede e metadados sobre o tempo e a qualidade de frames de vídeo e áudio. Essas informações são úteis na depuração de problemas com chamadas de áudio ou videochamadas no Chrome, como problemas de estimativa de largura de banda etc. Os logs não apresentam conteúdo de áudio ou vídeo da chamada.
+
+      Essa coleta de dados só pode ser acionada pelos serviços da Web do Google, como o Google Hangouts ou o Google Meet.
+
+      Esses logs podem ser associados, por meio de um código de sessão, a outros logs coletados pelo próprio serviço do Google para facilitar a depuração.
+      </translation>
 <translation id="6994082778848658360">Especifica como o hardware de elemento seguro integrado pode ser usado para fornecer uma autenticação de segundo fator, se ele for compatível com esse recurso. O botão liga/desliga da máquina é usado para detectar a presença física do usuário.
 
       Se a opção Desativado for selecionada, nenhum segundo fator será fornecido.
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb
index b47b545..185ff798 100644
--- a/components/policy/resources/policy_templates_pt-PT.xtb
+++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -268,6 +268,7 @@
       Se a política estiver definida como falsa, o relatório de métricas e de dados de diagnóstico é desativado.
 
       Se a política não estiver configurada, o relatório de métricas e de dados de diagnóstico é desativado em dispositivos não geridos e é ativado em dispositivos geridos.</translation>
+<translation id="1920046221095339924">Permitir sessões geridas no dispositivo</translation>
 <translation id="1929709556673267855">Fornece configurações para impressoras empresariais associadas a dispositivos.
 
       Esta política permite-lhe fornecer configurações de impressora para dispositivos <ph name="PRODUCT_OS_NAME" />. O formato é igual ao formato do dicionário NativePrinters, com um campo "id" ou "guid" obrigatório adicional por impressora para adição à lista de autorizações ou à lista negra.
@@ -301,6 +302,7 @@
 
       Se esta definição estiver ativada ou não tiver qualquer valor, o utilizador pode controlar o Preenchimento automático para os endereços na IU.</translation>
 <translation id="1960840544413786116">Se deve ou não autorizar os certificados emitidos por âncoras fidedignas locais que têm a extensão subjectAlternativeName em falta</translation>
+<translation id="1962273523772270623">Permitir a recolha de registos de eventos WebRTC dos serviços Google</translation>
 <translation id="1964634611280150550">Modo de navegação anónima desativado</translation>
 <translation id="1964802606569741174">Esta política não tem qualquer efeito na aplicação YouTube para Android. Se for necessário aplicar o modo de segurança no YouTube, a autorização para instalar a aplicação YouTube para Android deve ser removida.</translation>
 <translation id="1969212217917526199">Substitui políticas em compilações de Depuração do anfitrião de acesso remoto.
@@ -519,7 +521,7 @@
       Se esta definição não for definida, o utilizador poderá decidir utilizar esta função ou não.
 
       Esta definição foi removida do <ph name="PRODUCT_NAME" /> 29 e versões superiores.</translation>
-<translation id="2433412232489478893">Esta política controla se a funcionalidade Partilhas de ficheiros na rede para o <ph name="PRODUCT_NAME" /> é permitida para um utilizador.
+<translation id="2433412232489478893">Esta política controla se a funcionalidade Partilhas de ficheiros na rede do <ph name="PRODUCT_NAME" /> é permitida para um utilizador.
 
       Se esta política não estiver configurada ou estiver definida como verdadeira, os utilizadores podem utilizar as Partilhas de ficheiros na rede.
 
@@ -1566,7 +1568,7 @@
 <translation id="5512418063782665071">URL da página inicial</translation>
 <translation id="551639594034811656">Esta política define uma lista de percentagens que definem a fração de dispositivos <ph name="PRODUCT_OS_NAME" /> na UO a atualizar por dia, com início a partir do dia em que a atualização é detetada pela primeira vez. A hora da deteção é posterior à hora da publicação da atualização, uma vez que pode demorar algum tempo após a publicação da atualização até que o dispositivo verifique a existência de atualizações.
 
-      Cada par (dia, percentagem) contém a percentagem da frota que tem de ser atualizada até ao dia de números indicado após a deteção da atualização. Por exemplo, se tivermos os pares [(4, 40), (10, 70), (15, 100)], significa que 40% da frota deveria ter sido atualizada 4 dias após a deteção da atualização, 70% deveria ter sido atualizada 10 dias depois e assim sucessivamente.
+      Cada par (dia, percentagem) contém a percentagem da frota que tem de ser atualizada até ao número de dias indicado após a deteção da atualização. Por exemplo, se tivermos os pares [(4, 40), (10, 70), (15, 100)], significa que 40% da frota deveria ter sido atualizada 4 dias após a deteção da atualização, 70% deveria ter sido atualizada 10 dias depois e assim sucessivamente.
 
       Se existir algum valor definido para esta política, as atualizações ignoram a política <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> e seguem esta política.
 
@@ -1927,6 +1929,11 @@
       Se esta política não for definida ou a lista estiver vazia, todos os esquemas estarão acessíveis em <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Definições de utilizadores geridos localmente</translation>
 <translation id="6658245400435704251">Especifica o número de segundos até que um dispositivo possa aleatoriamente atrasar a sua transferência de uma atualização a partir do momento em que a atualização foi retirada pela primeira vez do servidor. O dispositivo pode esperar uma parte deste tempo em termos de tempo total de processamento e a restante parte em termos do número de verificações de atualização. Em qualquer caso, a dispersão está associada de forma superior a uma quantidade constante de tempo para que um dispositivo nunca fique preso indefinidamente à espera de transferir uma atualização.</translation>
+<translation id="6665599130599311250">Se definir esta política como falsa, ou não a definir, a sessão de convidado gerida irá comportar-se conforme documentado em https://support.google.com/chrome/a/answer/3017014 – a "Sessão pública" padrão.
+
+      Se definir esta política como verdadeira, a sessão de convidado gerida assume o comportamento "Sessão gerida" que levanta muitas das restrições em vigor aplicadas às "Sessões públicas" padrão.
+
+      Se esta política estiver definida, o utilizador não a pode alterar nem substituir.</translation>
 <translation id="6665670272107384733">Definir com que frequência o utilizador tem de introduzir a palavra-passe para utilizar o desbloqueio rápido</translation>
 <translation id="6681229465468164801">Permite definir uma lista de padrões de URL que especificam sites impedidos de pedir ao utilizador que lhes conceda acesso a um dispositivo USB.
 
@@ -2091,6 +2098,17 @@
 <translation id="6943577887654905793">Nome de preferência do Mac/Linux</translation>
 <translation id="69525503251220566">Parâmetro que fornece a funcionalidade de pesquisa por imagem ao fornecedor de pesquisas predefinido</translation>
 <translation id="6956272732789158625">Não permitir que os sites utilizem a geração de chaves</translation>
+<translation id="6982028490425791294">
+      Se definir esta política como verdadeira, o <ph name="PRODUCT_NAME" /> obtém permissão para recolher registos de eventos WebRTC dos serviços Google (por exemplo, o Google Meet) e carregar os mesmos para a Google.
+
+       Se definir esta política como falsa, ou não a definir, o <ph name="PRODUCT_NAME" /> não pode recolher nem carregar os referidos registos.
+
+      Estes registos contêm informações, como o tempo e o tamanho dos pacotes RTP enviados e recebidos, comentários acerca do congestionamento na rede e metadados acerca do tempo e da qualidade dos frames de áudio e vídeo. Estas informações são úteis durante a depuração de problemas com chamadas de áudio ou de vídeo no Chrome, como problemas de estimativa da largura de banda, etc. Os registos não possuem quaisquer conteúdos de áudio ou de vídeo resultantes da chamada.
+
+      Esta recolha de dados só pode ser acionada pelos serviços Web da Google, como o Google Hangouts ou o Google Meet.
+
+      Estes registos podem ser associados, através de um ID de sessão, a outros registos recolhidos pelo próprio serviço Google. Este processo pretende tornar a depuração mais fácil.
+      </translation>
 <translation id="6994082778848658360">Especifica de que forma o hardware de elemento seguro integrado pode ser utilizado para fornecer uma autenticação de fator duplo, se for compatível com esta funcionalidade. O botão ligar/desligar do computador é utilizado para detetar a presença física do utilizador.
 
       Se estiver selecionado "Desativado", o fator duplo não é fornecido.
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb
index 149850c..a246bc5 100644
--- a/components/policy/resources/policy_templates_ro.xtb
+++ b/components/policy/resources/policy_templates_ro.xtb
@@ -268,6 +268,7 @@
       Dacă politica este dezactivată, raportarea valorilor și a datelor de diagnosticare va fi dezactivată.
 
       Dacă politica nu este configurată, raportarea valorilor și a datelor de diagnosticare va fi dezactivată pe dispozitivele negestionate și activată pe dispozitivele gestionate.</translation>
+<translation id="1920046221095339924">Permite sesiunea gestionată pe dispozitiv</translation>
 <translation id="1929709556673267855">Specifică configurațiile pentru imprimantele companiei asociate dispozitivelor.
 
       Această politică îți permite să specifici configurațiile imprimantelor pentru dispozitivele <ph name="PRODUCT_OS_NAME" />. Formatul este același cu cel al dicționarului NativePrinters, având în plus un câmp „id” sau „guid” obligatoriu pentru fiecare imprimantă, pentru trecerea pe lista albă sau pe lista neagră.
@@ -301,6 +302,7 @@
 
       Dacă setarea este activată sau nu are nicio valoare, utilizatorul va putea controla funcția de completare automată pentru adrese în interfața de utilizare.</translation>
 <translation id="1960840544413786116">Dacă sunt permise certificatele din care lipsește extensia subjectAlternativeName, emise de ancorele de încredere de pe dispozitiv</translation>
+<translation id="1962273523772270623">Permite colectarea jurnalelor de evenimente WebRTC din serviciile Google</translation>
 <translation id="1964634611280150550">Modul incognito a fost dezactivat</translation>
 <translation id="1964802606569741174">Această politică nu afectează aplicația Android YouTube. Dacă trebuie impus Modul sigur pe YouTube, nu trebuie permisă instalarea aplicației Android YouTube.</translation>
 <translation id="1969212217917526199">Suprascrie politicile în versiunile de depanare ale gazdei de acces de la distanță.
@@ -1933,6 +1935,11 @@
       Dacă această politică este neconfigurată sau dacă lista este goală, toate schemele vor putea fi accesate în <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Setări pentru utilizatorii gestionați local</translation>
 <translation id="6658245400435704251">Specifică numărul de secunde până la care un dispozitiv poate întârzia în mod aleatoriu descărcarea unei actualizări, din momentul în care respectiva actualizare a fost publicată pe server. O parte din perioada în care dispozitivul așteaptă efectuarea actualizării poate fi exprimată în termeni temporali, iar partea rămasă printr-un număr de verificări ale existenței unei actualizări. În orice caz, difuzarea are ca limită superioară o valoare constantă de timp, astfel încât un dispozitiv nu poate rămâne niciodată blocat definitiv în așteptarea descărcării unei actualizări.</translation>
+<translation id="6665599130599311250">Dacă această politică este dezactivată sau nu este configurată, sesiunea pentru invitați gestionată se va comporta așa cum este descris la https://support.google.com/chrome/a/answer/3017014 – „Sesiunea publică” standard.
+
+      Dacă această politică este activată, sesiunea pentru invitați gestionată se va comporta ca o „Sesiune gestionată” care ridică multe dintre restricțiile aplicate „Sesiunilor publice” obișnuite.
+
+      Dacă această politică este configurată, utilizatorul nu o poate modifica sau ignora.</translation>
 <translation id="6665670272107384733">Setează frecvența cu care un utilizator trebuie să introducă parola pentru a folosi deblocarea rapidă</translation>
 <translation id="6681229465468164801">Îți permite să setezi o listă de șabloane de adrese URL care specifică site-urile împiedicate să ceară utilizatorului să le acorde acces la un dispozitiv USB.
 
@@ -2096,6 +2103,17 @@
 <translation id="6943577887654905793">Nume preferință Mac/Linux:</translation>
 <translation id="69525503251220566">Parametru care pune la dispoziție funcția Căutare după imagine pentru furnizorul de căutare prestabilit</translation>
 <translation id="6956272732789158625">Nu permite niciunui site să folosească generarea cheilor</translation>
+<translation id="6982028490425791294">
+      Dacă politica este activată, <ph name="PRODUCT_NAME" /> poate să colecteze jurnale de evenimente WebRTC din serviciile Google (de exemplu, Google Meet) și să le încarce pe Google.
+
+      Dacă politica este dezactivată sau nu este configurată, <ph name="PRODUCT_NAME" /> nu poate colecta sau încărca astfel de jurnale.
+
+      Jurnalele conțin informații precum ora și dimensiunea pachetelor RTP trimise și primite, feedback privind congestionarea rețelei și metadate despre ora și calitatea cadrelor audio și video. Aceste informații sunt utile pentru remedierea problemelor privind apelurile audio sau video în Chrome, cum ar fi problemele de estimare a lățimii de bandă etc. Jurnalele nu conțin înregistrări audio sau video din apel.
+
+      Această colectare a datelor poate fi declanșată numai de serviciile web Google, precum Google Hangouts sau Google Meet.
+
+      Jurnalele pot fi asociate, prin intermediul unui ID de sesiune, cu alte jurnale colectate chiar de serviciile Google. Astfel, se poate simplifica remedierea erorilor.
+      </translation>
 <translation id="6994082778848658360">Specifică modul în care poate fi folosit hardware-ul elementului de securitate încorporat pentru a oferi o autentificare cu doi factori, dacă se acceptă de această funcție. Butonul de pornire al dispozitivului este folosit ca să detecteze prezența fizică a utilizatorului.
 
       Dacă selectezi „Dezactivat”, al doilea factor nu mai este oferit.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index c6f477fc..5be4c510 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -1534,7 +1534,7 @@
       Значение устанавливается в миллисекундах.</translation>
 <translation id="5511702823008968136">Включить панель закладок</translation>
 <translation id="5512418063782665071">URL главной страницы</translation>
-<translation id="551639594034811656">Правило формирует список значений в процентах, которые определяют долю устройств <ph name="PRODUCT_OS_NAME" /> в ОП, которые должны обновляться ежедневно, начиная с того дня, когда обновление было обнаружено. Проверка происходит в определенное время, поэтому обновление может быть обнаружено только через некоторое время после публикации.
+<translation id="551639594034811656">Правило формирует список значений в процентах, которые определяют долю устройств <ph name="PRODUCT_OS_NAME" /> в ОП, которые должны обновляться ежедневно, начиная с того дня, когда обновление было обнаружено. Оно может быть обнаружено спустя некоторое время после публикации, когда устройство проверяет наличие обновлений.
 
       В каждой паре значений (день, процентная величина) указывается, какая доля устройств должна быть обновлена через определенное количество дней после того, как обновление было обнаружено. Например, если мы видим пары [(4, 40), (10, 70), (15, 100)], это означает, что 40 % устройств должны быть обновлены через 4 дня после того, как обнаружено обновление, 70 % – через 10 дней и т. д.
 
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb
index 107f0e3f..4551f84 100644
--- a/components/policy/resources/policy_templates_sk.xtb
+++ b/components/policy/resources/policy_templates_sk.xtb
@@ -262,6 +262,7 @@
       Ak je pravidlo nastavené na hodnotu False, nahlasovanie metrík a diagnostických údajov bude zakázané.
 
       Ak pravidlo nie je nakonfigurované, nahlasovanie metrík a diagnostických údajov bude zakázané v nespravovaných zariadeniach a povolené v spravovaných zariadeniach.</translation>
+<translation id="1920046221095339924">Povoliť spravovanú reláciu v zariadení</translation>
 <translation id="1929709556673267855">Umožňuje poskytnúť konfigurácie pre podnikové tlačiarne združené so zariadeniami.
 
       Toto pravidlo umožňuje poskytnúť konfigurácie tlačiarní zariadeniam so systémom <ph name="PRODUCT_OS_NAME" />.  Formát je rovnaký ako slovník NativePrinters a obsahuje dodatočné pole pre hodnotu „id“ alebo „guid“ na tlačiareň, ktoré umožňuje pridanie na bielu listinu alebo zoznam zakázaných položiek.
@@ -295,6 +296,7 @@
 
       Ak ho povolíte alebo preň nenastavíte žiadnu hodnotu, používateľ bude môcť ovládať funkciu Automatické dopĺňanie pre adresy v používateľskom rozhraní.</translation>
 <translation id="1960840544413786116">Či sú povolené certifikáty vydané miestnymi dôveryhodnými autoritami, v ktorých chýba rozšírenie subjectAlternativeName</translation>
+<translation id="1962273523772270623">Povoliť zhromažďovanie denníkov udalostí WebRTC zo služieb Googlu</translation>
 <translation id="1964634611280150550">Režim inkognito je zakázaný</translation>
 <translation id="1964802606569741174">Toto pravidlo nemá žiaden vplyv na aplikáciu YouTube pre Android. Ak chcete v službe YouTube vynútiť Bezpečnostný režim, inštalácia aplikácie YouTube pre Android by mala byť zakázaná.</translation>
 <translation id="1969212217917526199">Prepíše pravidlá v zostavách ladenia používaných hostiteľom vzdialeného prístupu.
@@ -1978,6 +1980,11 @@
       Ak je toto pravidlo nenastavené alebo je zoznam prázdny, bude sa dať v prehliadači <ph name="PRODUCT_NAME" /> pristupovať ku všetkým schémam.</translation>
 <translation id="6652197835259177259">Nastavenia miestne spravovaných používateľov</translation>
 <translation id="6658245400435704251">Určí počet sekúnd, o koľko môže zariadenie náhodne zdržať sťahovanie aktualizácie odvtedy, čo bola aktualizácia odoslaná na server. Zariadenie môže čakať určitý čas a sa pokúsiť o určitý počet kontrol aktualizácií. Oneskorenie je obmedzené nemenným maximálnym časovým intervalom tak, aby zariadenie nečakalo na stiahnutie aktualizácie donekonečna.</translation>
+<translation id="6665599130599311250">Ak toto pravidlo nastavíte na hodnotu false alebo ho ponecháte nenastavené, spravovaná relácia hosťa sa bude správať tak, ako je uvedené v časti https://support.google.com/chrome/a/answer/3017014 – štandardná Verejná relácia.
+
+      Ak ho nastavíte na hodnotu true, spravovaná relácia hosťa sa bude správať tak, ako je uvedené v časti Spravovaná relácia. V tejto relácii sú zrušené mnohé obmedzenia, ktoré platia pre bežné Verejné relácie.
+
+      Ak toto pravidlo nastavíte, používateľ ho nemôže zmeniť ani prepísať.</translation>
 <translation id="6665670272107384733">Nastaviť, ako často musí používateľ zadávať heslo na používanie rýchleho odomknutia</translation>
 <translation id="6681229465468164801">Umožňuje nastaviť zoznam vzorov webových adries určujúcich weby, ktoré nemôžu používateľa požiadať o udelenie prístupu k zariadeniu USB.
 
@@ -2145,6 +2152,17 @@
 <translation id="6943577887654905793">Názov predvoľby v systéme Mac/Linux:</translation>
 <translation id="69525503251220566">Parameter poskytujúci funkciu vyhľadávania podľa obrázka pre predvoleného poskytovateľa vyhľadávania</translation>
 <translation id="6956272732789158625">Nepovoliť žiadnym webovým stránkam používať generovanie kľúčov</translation>
+<translation id="6982028490425791294">
+      Ak toto pravidlo nastavíte na hodnotu true, prehliadaču <ph name="PRODUCT_NAME" /> povolíte zhromažďovať denníky udalostí WebRTC zo služieb Googlu (napr. Google Meet) a nahrávať ich do Googlu.
+
+      Ak ho nastavíte na hodnotu false alebo ho ponecháte nenastavené, <ph name="PRODUCT_NAME" /> nebude môcť tieto denníky zhromažďovať ani nahrávať.
+
+      Tieto denníky obsahujú informácie, ako napríklad čas a veľkosť odoslaných a prijatých balíkov RTP, spätnú väzbu týkajúcu sa preťaženia siete a metadáta o čase a kvalite zvuku a snímok videa. Tieto informácie sú užitočné pri ladení problémov so zvukovými alebo videohovormi v Chrome, ako napríklad problémoch s odhadom rýchlosti pripojenia atď. Do denníkov sa neukladá zvukový ani video obsah hovoru.
+
+      Zhromažďovanie týchto dát sa dá spustiť iba pomocou webových služieb Googlu, ako je napríklad Google Hangouts alebo Google Meet.
+
+      Tieto denníky môžu byť prostredníctvom identifikátora relácie priradené k iným denníkom zhromaždeným príslušnou službou Google. Ide o zamýšľané správanie, ktoré má uľahčiť ladenie.
+      </translation>
 <translation id="6994082778848658360">Umožňuje určiť, ako môže byť hardvér zabezpečeného prvku na základnej doske počítača použitý na poskytovanie druhého faktora overenia totožnosti, ak je kompatibilný s touto funkciou. Vypínač zariadenia sa používa na rozpoznanie fyzickej prítomnosti používateľa.
 
       Ak vyberiete možnosť Zakázané, druhý faktor nebude poskytovaný.
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb
index cb5b3ccd..a24573b 100644
--- a/components/policy/resources/policy_templates_sl.xtb
+++ b/components/policy/resources/policy_templates_sl.xtb
@@ -275,6 +275,7 @@
       Če je onemogočen, je pošiljanje podatkov meritev in diagnostičnih podatkov onemogočeno.
 
       Če ni nastavljen, je pošiljanje podatkov meritev in diagnostičnih podatkov onemogočeno v neupravljanih napravah in omogočeno v upravljanih.</translation>
+<translation id="1920046221095339924">Omogočanje upravljane seje v napravi</translation>
 <translation id="1929709556673267855">Posreduje konfiguracije za tiskalnike v podjetjih, vezane na naprave.
 
       Ta pravilnik vam omogoča, da posredujete konfiguracije tiskalnikov napravam z operacijskim sistemom <ph name="PRODUCT_OS_NAME" />. Oblika je enaka obliki imenika NativePrinters, z dodatnim obveznim poljem »id« ali »guid« na tiskalnik zaradi dodajanja na seznam dovoljenih ali nedovoljenih.
@@ -308,6 +309,7 @@
 
       Če je ta nastavitev omogočena ali nima nastavljene vrednosti, bo uporabnik lahko nadziral samodejno izpolnjevanje za naslove v uporabniškem vmesniku.</translation>
 <translation id="1960840544413786116">Ali naj se dovoli potrdila, ki jih izdajo lokalna sidra zaupanja in jim manjka razširitev subjectAlternativeName</translation>
+<translation id="1962273523772270623">Omogočanje zbiranja dnevnikov dogodkov tehnologije WebRTC iz Googlovih storitev</translation>
 <translation id="1964634611280150550">Način brez beleženja zgodovine je onemogočen</translation>
 <translation id="1964802606569741174">Ta pravilnik ne vpliva na aplikacijo YouTube za Android. Če naj bo varni način v YouTubu uveljavljen, mora biti namestitev aplikacije YouTube za Android onemogočena.</translation>
 <translation id="1969212217917526199">Preglasi pravilnike za delovne različice gostitelja za oddaljeni dostop, namenjene odpravljanju napak.
@@ -1638,7 +1640,7 @@
 
       Če je za ta pravilnik določena vrednost, posodobitve prezrejo pravilnik <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> in upoštevajo ta pravilnik.
 
-      Če je seznam prazen, ni priprav in posodobitve bodo uveljavljene glede na druge pravilnike naprave.
+      Če je seznam prazen, ni postopnega nameščanja posodobitev in bodo posodobitve uveljavljene glede na druge pravilnike naprave.
 
       Ta pravilnik se ne uporablja pri preklapljanju med kanali.</translation>
 <translation id="5523812257194833591">Samodejna prijava javne seje po časovnem zamiku.
@@ -2011,6 +2013,11 @@
 Če ta pravilnik ni nastavljen ali je seznam prazen, bodo v brskalniku <ph name="PRODUCT_NAME" /> dostopne vse sheme.</translation>
 <translation id="6652197835259177259">Nastavitve lokalno upravljanih uporabnikov</translation>
 <translation id="6658245400435704251">Določa število sekund, do katerega lahko naprava naključno odloži prenos posodobitve od trenutka, ko je bila posodobitev prvič na voljo v strežniku. Naprava lahko del tega časa čaka v smislu dejansko pretečenega časa, preostali del pa v smislu števila preverjanj za posodobitve. Razpršitev je v vsakem primeru omejena navzgor na nespremenljiv čas, tako da se ne more zgoditi, da bi naprava neomejen čas čakala na prenos posodobitve.</translation>
+<translation id="6665599130599311250">Če je ta pravilnik onemogočen ali ni nastavljen, bo upravljana seja gosta delovala, kot je opisano na https://support.google.com/chrome/a/answer/3017014 – standardna »seja gosta«.
+
+      Če je ta pravilnik omogočen, bo upravljana seja gosta prevzela delovanje »upravljane seja«, ki odpravlja številne omejitve, ki veljajo za običajne »javne seje«.
+
+      Če ta pravilnik ni nastavljen, ga uporabniki ne morejo spremeniti ali preglasiti.</translation>
 <translation id="6665670272107384733">Nastavi, kako pogosto mora uporabnik vnesti geslo, če želi uporabljati hitro odklepanje</translation>
 <translation id="6681229465468164801">Omogoča nastavitev seznama vzorcev URL-jev, ki določa, katerim spletnim mestom je preprečeno pozivanje uporabnikov k odobritvi dostopa do naprave USB.
 
@@ -2177,6 +2184,17 @@
 <translation id="6943577887654905793">Ime nastavitve za Mac/Linux:</translation>
 <translation id="69525503251220566">Parameter, ki omogoča funkcijo iskanja po sliki za privzetega ponudnika iskanja</translation>
 <translation id="6956272732789158625">Spletnim mestom ne dovoli uporabe ustvarjanja ključev</translation>
+<translation id="6982028490425791294">
+      Če je pravilnik omogočen, <ph name="PRODUCT_NAME" /> sme zbirati dnevnike dogodkov tehnologije WebRTC iz Googlovih storitev (npr. iz Googla Meet) in te dnevnike nalagati v Google.
+
+      Če je pravilnik onemogočen ali ni nastavljen, <ph name="PRODUCT_NAME" /> tovrstnih dnevnikov ne sme ne zbirati ne nalagati.
+
+      Ti dnevniki vsebujejo podatke, kot so čas in velikost poslanih ter prejetih paketov RT, povratne informacije o preobremenjenosti omrežja ter metapodatki o času in kakovosti zvočnih ter slikovnih okvirov. Ti podatki so v pomoč pri odpravljanju napak z zvočnimi klici ali videoklici v Chromu, na primer pri težavah z ocenjevanjem pasovne širine ipd. Dnevniki ne vsebujejo zvočne in slikovne vsebine klica.
+
+      To zbiranje podatkov lahko sprožijo samo Googlove spletne storitve, na primer Google Hangouts ali Google Meet.
+
+      Ti dnevniki so lahko prek ID-ja seje povezani z drugimi dnevniki, ki jih zbira sama Googlova storitev, in sicer zaradi lažjega odpravljanja napak.
+      </translation>
 <translation id="6994082778848658360">Določa, kako lahko vgrajena strojna oprema za varnostni element zagotovi dvojno preverjanje pristnosti, če je združljiva s to funkcijo. Gumb za vklop na računalniku zazna fizično prisotnost uporabnika.
 
       Če je izbrana možnost »Onemogočeno«, dvojno preverjanje ni zagotovljeno.
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb
index 740008e..d5450ce 100644
--- a/components/policy/resources/policy_templates_sr.xtb
+++ b/components/policy/resources/policy_templates_sr.xtb
@@ -274,6 +274,7 @@
       Ако су подешене на Нетачно, пријављивање показатеља и дијагностичких података ће бити онемогућено.
 
       Ако нису конфигурисане, пријављивање показатеља и дијагностичких података ће бити онемогућено на уређајима којима се не управља, а омогућено на уређајима којима се управља.</translation>
+<translation id="1920046221095339924">Омогућавају управљане сесије на уређају</translation>
 <translation id="1929709556673267855">Пружају конфигурације за штампаче предузећа повезане са уређајима.
 
       Ове смернице вам омогућавају да <ph name="PRODUCT_OS_NAME" /> уређајима пружате конфигурације за штампаче. Формат је исти као речник NativePrinters, уз додатно обавезно поље „id“ или „guid“ по штампачу за стављање на белу или црну листу.
@@ -307,6 +308,7 @@
 
       Ако је ово подешавање омогућено или није подешено, корисник ће моћи да контролише функцију аутоматског попуњавања за адресе у корисничком интерфејсу.</translation>
 <translation id="1960840544413786116">Да ли ће дозволити сертификате које издају локална поуздана полазишта, а којима недостаје ознака subjectAlternativeName</translation>
+<translation id="1962273523772270623">Омогућавају прикупљање WebRTC евиденција догађаја из Google услуга</translation>
 <translation id="1964634611280150550">Режим Без архивирања је онемогућен</translation>
 <translation id="1964802606569741174">Ове смернице немају никаквог утицаја на апликацију YouTube за Android. Ако треба да се примени безбедни режим на YouTube-у, инсталација апликације YouTube за Android не би требало да буде дозвољена.</translation>
 <translation id="1969212217917526199">Замењују смернице у верзијама хоста са даљинским приступом које служе за отклањање грешака.
@@ -522,11 +524,11 @@
       Ако не подесите ово подешавање, корисник може да одлучи да ли ће користити ову функцију или неће.
 
       Ово подешавање је уклоњено из <ph name="PRODUCT_NAME" />-а 29 и новијих верзија.</translation>
-<translation id="2433412232489478893">Ове смернице контролишу да ли је функција Дељења датотека на мрежи за <ph name="PRODUCT_NAME" /> дозвољена за корисника.
+<translation id="2433412232489478893">Ова смерница контролише да ли је функција дељења датотека у мрежи за <ph name="PRODUCT_NAME" /> дозвољена за корисника.
 
-      Када ове смернице нису подешене или су подешене на вредност Тачно, корисник ће моћи да користе Дељења датотека на мрежи.
+      Када ова смерница није конфигурисана или је подешена на вредност Тачно, корисници могу да користе дељења датотека у мрежи.
 
-      Када су ове смернице подешене на вредност Нетачно, корисници неће моћи да користе Дељења датотека на мрежи.</translation>
+      Када је ова смерница подешена на вредност Нетачно, корисници не могу да користе дељења датотека у мрежи.</translation>
 <translation id="2438609638493026652">Омогућава извештавање Google-а о кључним догађајима током инсталирања Android апликација. Догађаји се евидентирају само за апликације чије инсталирање су активирале смернице.
 
       Ако су смернице подешене на вредност Тачно, догађаји ће се евидентирати.
@@ -608,7 +610,7 @@
 <translation id="2598508021807251719">Конфигуришу локалитете на којима <ph name="PRODUCT_OS_NAME" /> може да се приказује.
 
       Ако подесите ове смернице, корисник може да конфигурише <ph name="PRODUCT_OS_NAME" /> само тако да се приказује на једном од локалитета који наводе ове смернице. Ако не подесите ове смернице или их подесите на празну листу, <ph name="PRODUCT_OS_NAME" /> може да се приказује на свим подржаним локалитетима корисничког интерфејса. Ако подесите ове смернице на листу са неважећим вредностима, све неважеће вредности се игноришу. Ако је корисник претходно конфигурисао <ph name="PRODUCT_OS_NAME" /> тако да се приказује на локалитету који ове смернице не дозвољавају, локалитет приказа се мења у дозвољени локалитет корисничког интерфејса када се корисник следећи пут пријави. Ако је корисник конфигурисао жељене локалитете и ако ове смернице дозвољавају један од њих, <ph name="PRODUCT_OS_NAME" /> се пребацује на тај локалитет. У супротном, <ph name="PRODUCT_OS_NAME" /> се пребацује на прву важећу вредност коју наводе ове смернице или на резервни локалитет (тренутно је то en-US) ако ове смернице садрже само неважеће локалитете.</translation>
-<translation id="2604182581880595781">Конфигуришу сродне смернице за Дељења датотека на мрежи.</translation>
+<translation id="2604182581880595781">Конфигурише сродне смернице за дељења датотека у мрежи.</translation>
 <translation id="2623014935069176671">Чекај првобитну активност корисника</translation>
 <translation id="262740370354162807">Омогући слање докумената на услугу <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Пружају конфигурације за штампаче предузећа.
@@ -694,7 +696,7 @@
 <translation id="2823870601012066791">Локација <ph name="PRODUCT_OS_NAME" /> клијената у Windows регистру:</translation>
 <translation id="2824715612115726353">Омогући режим без архивирања</translation>
 <translation id="2838830882081735096">Онемогући пренос података и ARC</translation>
-<translation id="2839294585867804686">Подешавања функције Дељења датотека на мрежи</translation>
+<translation id="2839294585867804686">Подешавања функције дељења датотека у мрежи</translation>
 <translation id="2840269525054388612">Наводе штампаче које корисник може да користи.
 
       Ове смернице се користе само ако изаберете <ph name="PRINTERS_WHITELIST" /> за <ph name="DEVICE_PRINTERS_ACCESS_MODE" />
@@ -1186,7 +1188,7 @@
       Ако не подесите ове смернице, прикупљање анонимних података преко URL кључева ће бити омогућено, али ће корисник моћи то да промени.</translation>
 <translation id="4250680216510889253">Не</translation>
 <translation id="4261820385751181068">Локалитет екрана за пријављивање на уређају</translation>
-<translation id="4264607809747169568">Контролишу доступност функције Дељења датотека на мрежи за Chrome ОС</translation>
+<translation id="4264607809747169568">Контролишу доступност функције дељења датотека у мрежи за Chrome ОС</translation>
 <translation id="427220754384423013">Наводе штампаче које корисник може да користи.
 
       Ове смернице се користе само ако изаберете <ph name="PRINTERS_WHITELIST" /> за <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1618,15 +1620,15 @@
       Вредност смернице треба да се наведе у милисекундама.</translation>
 <translation id="5511702823008968136">Омогући Траку са обележивачима</translation>
 <translation id="5512418063782665071">URL адреса почетне странице</translation>
-<translation id="551639594034811656">Ове смернице дефинишу листу процената којим ће се дефинисати удео <ph name="PRODUCT_OS_NAME" /> уређаја у ОЈ за дневно ажурирање, почев од дана када је ажурирање први пут откривено. Време откривања је касније од времена објављивања ажурирања јер после објављивања ажурирања може да прође одређено време док уређај не провери да ли постоје ажурирања.
+<translation id="551639594034811656">Ова смерница дефинише листу процената којима ће се дефинисати удео <ph name="PRODUCT_OS_NAME" /> уређаја у ОЈ за дневно ажурирање, почев од дана када је ажурирање први пут откривено. Време откривања је касније од времена објављивања ажурирања јер од објављивања ажурирања може да прође доста времена док уређај не провери да ли постоје ажурирања.
 
-      Сваки пар (дан, проценат) садржи проценат уређаја који треба да се ажурирају за одређени број дана од времена откривања ажурирања. На пример, ако постоје парови [(4, 40), (10, 70), (15, 100)], то значи да 40% уређаја треба да се ажурира у року од четири дана од откривања ажурирања, 70% треба да се ажурира у року од 10 дана и тако даље.
+      Сваки пар (дан, проценат) наводи који проценат уређаја треба да се ажурира за наведени број дана од времена откривања ажурирања. На пример, ако постоје парови [(4, 40), (10, 70), (15, 100)], то значи да 40% уређаја треба да се ажурира у року од четири дана од откривања ажурирања, 70% треба да се ажурира у року од 10 дана и тако даље.
 
-      Ако ове смернице дефинишу вредност, ажурирања ће занемарити смернице <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> и примениће ове смернице уместо тих.
+      Ако ова смерница дефинише вредност, ажурирања занемарују смерницу <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> и примењују ову смерницу уместо ње.
 
-      Ако је ова листа празна, неће бити постепеног представљања и ажурирања ће се примењивати у складу са другим смерницама за уређај.
+      Ако је ова листа празна, не долази до увођења у фазама и ажурирања се примењују у складу са другим смерницама за уређај.
 
-      Ове смернице се не примењују на пребацивање канала.</translation>
+      Ове смернице се не примењују на промене канала.</translation>
 <translation id="5523812257194833591">Јавна сесија коју треба аутоматски пријавити после одређеног периода.
 
       Ако су ове смернице подешене, наведена сесија ће бити аутоматски пријављена када истекне одређени период на екрану за пријављивање без корисничке интеракције. Јавна сесија мора већ да буде конфигурисана (погледајте |DeviceLocalAccounts|).
@@ -1993,6 +1995,11 @@
       Ако се ове смернице не подесе или листа буде празна, све шеме ће бити доступне у <ph name="PRODUCT_NAME" />-у.</translation>
 <translation id="6652197835259177259">Подешавања за кориснике којима се локално управља</translation>
 <translation id="6658245400435704251">Наводи максимални број секунди колико уређај може насумично да одложи преузимање ажурирања од тренутка када ажурирање постане доступно на серверу. Уређај може да сачека део овог времена у смислу реалног времена и остатак у смислу броја провера ажурирања. У сваком случају, горња граница времена расипања је константна, па уређај никада не чека да преузме ажурирање неограничено дуго.</translation>
+<translation id="6665599130599311250">Ако подесите ове смернице на Нетачно или их не подесите, управљана сесија госта се понаша на начин наведен на https://support.google.com/chrome/a/answer/3017014 – стандардна „Јавна сесија“.
+
+      Ако подесите ове смернице на Тачно, понашање управљане сесије госта постаје „Управљана сесија“ чиме се уклања велики број ограничења за стандардне „Јавне сесије“.
+
+      Ако подесите ове смернице, корисник не може да их измени или замени.</translation>
 <translation id="6665670272107384733">Подешавају колико често корисник мора да уноси лозинку да би користио брзо откључавање</translation>
 <translation id="6681229465468164801">Омогућавају вам да подесите листу образаца URL-ова који наводе сајтове којима није дозвољено да питају корисника да им омогући приступ USB уређају.
 
@@ -2157,6 +2164,17 @@
 <translation id="6943577887654905793">Назив подешавања за Mac/Linux:</translation>
 <translation id="69525503251220566">Функција претраге према слици која пружа параметре за подразумеваног добављача претраге</translation>
 <translation id="6956272732789158625">Не дозволи ниједном сајту да користи генерисање шифара</translation>
+<translation id="6982028490425791294">
+      Ако подесите ове смернице на Тачно, <ph name="PRODUCT_NAME" /> може да прикупља WebRTC евиденције догађаја из Google услуга (нпр. Google Meet) и отпрема их на Google.
+
+      Ако подесите ове смернице на Нетачно или их не подесите, <ph name="PRODUCT_NAME" /> не може да прикупља нити отпрема те евиденције.
+
+      Те евиденције садрже информације, попут времена слања и примања RTP пакета и њихове величине, повратних информација о закрчењима на мрежи и метаподатака о времену и квалитету аудио и видео оквира. Те информације су корисне при отклањању грешака са аудио и видео позивима у Chrome-у, попут проблема са проценама пропусног опсега и слично. Евиденције не укључују аудио или видео садржај позива.
+
+      Ову колекцију података можете да покренете само помоћу Google веб-услуга, као што је Google Hangouts или Google Meet.
+
+      Те евиденције могу да буду повезане, посредством ИД-а сесије, са другим евиденцијама прикупљеним помоћу саме услуге Google. На тај начин отклањање грешака постаје лакше.
+      </translation>
 <translation id="6994082778848658360">Прецизира како уграђени хардвер безбедносног елемента може да се користи да пружи двоструку потврду идентитета ако је компатибилан са овом функцијом. Дугме за напајање уређаја се користи за утврђивање физичког присуства корисника.
 
       Ако изаберете „Онемогућено“, не пружа се други фактор.
@@ -2552,11 +2570,11 @@
       Ако онемогућите ове смернице, не долази до експлицитне изолације сајтова, а пробне верзије смерница IsolateOrigins и SitePerProcess се онемогућавају. Корисници и даље могу ручно да омогуће SitePerProcess.
       Ако не конфигуришете смернице, корисник може да промени ово подешавање.
       </translation>
-<translation id="7902255855035461275">Обрасци на овој листи ће се поредити са безбедносним
+<translation id="7902255855035461275">Обрасци на овој листи се пореде са безбедносним
       пореклом URL-а који шаље захтев. Ако се пронађе подударање, приступ уређајима за
-      снимање видео садржаја ће бити одобрен без слања упита.
+      снимање видео садржаја се одобрава без слања упита.
 
-      НАПОМЕНА: До верзије 45 ове смернице су биле подржане само у режиму киоска.</translation>
+      НАПОМЕНА: До верзије 45 ова смерница је била подржана само у режиму киоска.</translation>
 <translation id="7912255076272890813">Конфигурисање дозвољених типова апликација/додатака</translation>
 <translation id="7915236031252389808">Овде можете да наведете URL за .pac датотеку проксија.
 
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb
index 01c0a8e7..205f24f 100644
--- a/components/policy/resources/policy_templates_sv.xtb
+++ b/components/policy/resources/policy_templates_sv.xtb
@@ -275,6 +275,7 @@
       Om värdet är falskt inaktiveras rapportering av statistik och diagnostisk data.
 
       Om principen inte har konfigurerats inaktiveras rapporteringen av statistik och diagnostisk data på enheter som inte hanteras men aktiveras på hanterade enheter.</translation>
+<translation id="1920046221095339924">Tillåt hanterad session på enheten</translation>
 <translation id="1929709556673267855">Tillhandahåller skrivarkonfigurationer för företagsskrivare som kopplats till enheter.
 
       Med den här principen kan du tillhandahålla skrivarkonfigurationer för <ph name="PRODUCT_OS_NAME" />-enheter. Formatet är samma som för ordlistan NativePrinters, plus ett obligatoriskt id- eller guid-fält per skrivare som används för vitlistan/svarta listan.
@@ -308,6 +309,7 @@
 
       Om inställningen aktiveras eller lämnas utan värde kan användarna själva styra Autofyll för adresser i användargränssnittet.</translation>
 <translation id="1960840544413786116">Om certifikat som utfärdats av lokala tillitsankare och saknar tillägget subjectAlternativeName tillåts eller inte</translation>
+<translation id="1962273523772270623">Tillåt insamling av WebRTC-händelseloggar från Googles tjänster</translation>
 <translation id="1964634611280150550">Inkognitoläget är inaktiverat</translation>
 <translation id="1964802606569741174">Den här principen gäller inte YouTube-appen för Android. Om Säkert läge på YouTube ska vara obligatoriskt bör du blockera möjligheten att installera YouTube-appen för Android.</translation>
 <translation id="1969212217917526199">Åsidosätter policyer på felsökningsversioner av fjärråtkomstvärden.
@@ -2008,6 +2010,11 @@
       Om den här principen inte ställs in eller om listan är tom är alla scheman tillgängliga i <ph name="PRODUCT_NAME" />.</translation>
 <translation id="6652197835259177259">Inställningar för lokalt hanterade användare</translation>
 <translation id="6658245400435704251">Anger hur många sekunder en nedladdning av en uppdatering via en enhet får försenas slumpmässigt från den tidpunkt då uppdateringen först skickades till servern. Enheten kan hållas i vänteläge dels under en vanlig tidsperiod, dels beroende på antalet uppdateringskontroller. Spridningen är alltid bunden till en övre tidsgräns så att en enhet aldrig fastnar för gott medan en uppdatering håller på att laddas ned.</translation>
+<translation id="6665599130599311250">Om principen är inställd på falskt eller lämnas utan inställning fungerar en hanterad gästsession på det sätt som dokumenteras på https://support.google.com/chrome/a/answer/3017014 – en vanlig ”offentlig session”.
+
+      Om principen är inställd på sant fungerar en hanterad gästsession som en ”hanterad session”, vilket häver många av de begränsningar som gäller för vanliga ”offentliga sessioner”.
+
+      Om principen har ställts in kan användaren inte ändra eller åsidosätta den.</translation>
 <translation id="6665670272107384733">Ställ in hur ofta användaren måste ange lösenord för att kunna använda snabb upplåsning</translation>
 <translation id="6681229465468164801">Låter dig ange med hjälp av en lista med webbadressmönster vilka webbplatser som inte får begära åtkomstbehörighet till en USB-enhet.
 
@@ -2174,6 +2181,17 @@
 <translation id="6943577887654905793">Namn för Mac/Linux-inställning:</translation>
 <translation id="69525503251220566">Parameter som anger bildsökningsfunktionen för sökleverantören som är standard</translation>
 <translation id="6956272732789158625">Tillåt inte att någon webbplats använder nyckelgenerering</translation>
+<translation id="6982028490425791294">
+      Om principen är inställd på sant får <ph name="PRODUCT_NAME" /> samla in WebRTC-händelseloggar från Googles tjänster (t.ex. Google Meet) och ladda upp dem till Google.
+
+      Om principen är inställd på falskt eller lämnas utan inställning får <ph name="PRODUCT_NAME" /> inte samla in eller ladda upp sådana loggar.
+
+      Loggarna innehåller information som när RTP-paket skickades och togs emot och hur stora de var, feedback om överbelastning i nätverket och metadata om ljud och bildramars längd och kvalitet. Informationen är praktisk vid felsökning av problem med ljud- eller videosamtal i Chrome, t.ex. vid uppskattning av bandbredd med mera. Loggarna innehåller inte ljud eller video från själva samtalet.
+
+      Datainsamlingen kan bara aktiveras av Googles webbtjänster som Google Hangouts eller Google Meet.
+
+      Loggarna kan gå att koppla via ett sessions-id till andra loggar som samlats in av Google-tjänsten. Detta är avsiktligt för att underlätta felsökningen.
+      </translation>
 <translation id="6994082778848658360">Anger hur den integrerade maskinvaran för säkra element kan användas för tvåfaktorsautentisering om den är kompatibel med den här funktionen. Strömbrytaren på datorn används för att identifiera användarens fysiska närvaro.
 
       Om Inaktiverad har valts tillhandahålls ingen tvåfaktorsautentisering.
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb
index 9d199f97..fc6c78e 100644
--- a/components/policy/resources/policy_templates_sw.xtb
+++ b/components/policy/resources/policy_templates_sw.xtb
@@ -262,6 +262,7 @@
       Ukiweka kuwa sivyo, kipengele cha kuripoti data ya vipimo na uchunguzi kitazimwa.
 
       Kama hujaweka mipangilio ya sera hii, kipengele cha kuripoti vipimo na data ya uchunguzi kitazimwa kwenye vifaa visivyodhibitiwa na kuwashwa kwenye vifaa vinavyodhibitiwa.</translation>
+<translation id="1920046221095339924">Ruhusu vipindi vinavyodhibitiwa kwenye kifaa</translation>
 <translation id="1929709556673267855">Hutoa mipangilio ya printa za biashara zilizooanishwa kwenye vifaa.
 
       Sera hii hukuruhusu kuweka mipangilio ya printa kwenye vifaa vya <ph name="PRODUCT_OS_NAME" />.  Muundo huu ni sawa na ule wa kamusi ya NativePrinters, unaohitaji sehemu ya ziada ya "kitambulisho" au "mwongozo" kwa kila printa kwa ajili ya kutoa idhini au kunyima idhini.
@@ -294,6 +295,7 @@
 
       Iwapo mipangilio hii imewashwa au haina thamani yoyote, mtumiaji ataweza kudhibiti kipengele cha Kujaza Kiotomatiki kwa anwani kwenye kiolesura.</translation>
 <translation id="1960840544413786116">Ikiwa utaruhusu vyeti vilivyotolewa na nanga za ndani zinazoaminika visivyo na kiendelezi cha subjectAlternativeName</translation>
+<translation id="1962273523772270623">Ruhusu ukusanyaji wa kumbukumbu za matukio ya WebRTC kutoka huduma za Google</translation>
 <translation id="1964634611280150550">Hali fiche imezimwa</translation>
 <translation id="1964802606569741174">Sera hii haiathiri progamu ya Android YouTube. Ikiwa Hali ya Usalama kwenye YouTube inapaswa kutekelezwa, kusakinishwa kwa programu ya Android YouTube haipaswi kuruhusiwa.</translation>
 <translation id="1969212217917526199">Hubatilisha sera kwenye miundo ya Kutatua ya seva pangishi ya uwezo wa kufikia kwa mbali.
@@ -1971,6 +1973,11 @@
 Iwapo sera hii haitawekwa au orodha ni tupu miradi yote itapatikana katika <ph name="PRODUCT_NAME" /> .</translation>
 <translation id="6652197835259177259">Mipangilio ya watumiaji inayodhibitiwa kwa ndani</translation>
 <translation id="6658245400435704251">Inabainisha idadi ya sekunde ambazo kifaa kinaweza kuamua kuchelewesha upakuaji wake wa sasisho kutoka wakati ambapo usasishaji ulisukumwa kwanza nje katika seva. Kifaa kinaweza kusubiri kijisehemu cha muda huu kwa hali ya muda wa saa na kijisehemu kinachosalia katika hali ya idadi ya ukaguzi wa visasisho. Katika hali yoyote, utawanyishaji umekitwa katika kiwango cha kudumu cha muda ili kifaa kisikwame tena kikisubiri kupakua sasisho kwa muda mrefu.</translation>
+<translation id="6665599130599311250">Ukiweka sera hii kuwa 'sivyo' au usipoiweka, kipindi cha mgeni kinachodhibitiwa kitatumika kama ilivyowekwa katika https://support.google.com/chrome/a/answer/3017014 -  "Kipindi cha Umma" cha kawaida.
+
+Ukiweka sera hii kuwa 'ndivyo', kipindi cha mgeni kinachodhibitiwa kitachukua sifa ya "Kipindi Kinachodhibitiwa" ambayo huondoa masharti kadhaa yanayowekwa kwa ajili ya"Vipindi vya Umma" vya kawaida.
+
+      Ukiweka sera hii, mtumiaji hawezi kuibadilisha wala kuibatilisha.</translation>
 <translation id="6665670272107384733">Weka mara ambazo mtumiaji anatakiwa kuweka nenosiri ili atumie kipengele cha kufungua haraka.</translation>
 <translation id="6681229465468164801">Hukuruhusu uweke orodha ya ruwaza za url ambayo inabainisha tovuti zinazozuiliwa ili zisimuulize mtumiaji atoe ruhusa ya kufikia kifaa cha USB.
 
@@ -2139,6 +2146,17 @@
 <translation id="6943577887654905793">Jina la Mac/Linux inayopendelewa:</translation>
 <translation id="69525503251220566">Kigezo kinachotoa kipengele cha kutafuta kwa picha kwa mtoa huduma wa utafutaji chaguomsingi</translation>
 <translation id="6956272732789158625">Usiruhusu tovuti yoyote itumie uundaji ufunguo</translation>
+<translation id="6982028490425791294">
+      Ukiweka sera hii kuwa 'ndivyo', <ph name="PRODUCT_NAME" /> itaruhusiwa kukusanya kumbukumbu za matukio ya WebRTC kutoka huduma za Google (k.m., Google Meet) na kupakia kumbukumbu hizo kwenye Google.
+
+      Ukiweka sera hii kuwa 'sivyo', au usipoiweka, huenda <ph name="PRODUCT_NAME" /> isikusanye wala kupakia kumbukumbu kama hizo.
+
+      Kumbukumbu hizi zinajumuisha maelezo kama vile wakati na ukubwa wa vifurushi vya RTP vilivyotumwa na kupokelewa, maoni kuhusu msongamano kwenye mtandao na metadata kuhusu wakati na ubora wa fremu za sauti na video. Maelezo haya husaidia wakati wa kutatua matatizo ya simu za sauti na za video katika Chrome, kama vile matatizo ya kukadiria kipimo data n.k. Kumbukumbu hizi hazijumuishi maudhui ya simu ya sauti wala ya video.
+
+      Ukusanyaji wa data hii unaweza kuanzishwa tu na huduma za wavuti za Google, kama vile Google Hangouts au Google Meet.
+
+      Kumbukumbu hizi zinaweza kuhusishwa na kumbukumbu zingine ambazo hukusanywa na huduma ya Google yenyewe kupitia Kitambulisho cha kipindi; hali hii inanuia kurahisisha hatua ya utatuzi.
+      </translation>
 <translation id="6994082778848658360">Hubainisha jinsi maunzi salama unayotumia yanaweza kutoa uthibitishaji wa hatua mbili ikiwa yanaweza kukitumia kipengele hiki. Kitufe cha kuwasha/kuzima mashine kinatumika kutambua kuwepo kwa mtumiaji mwenyewe.
 
       Ukichagua 'Imezimwa', hamna uthibitishaji wa hatua mbili utakaotolewa.
@@ -2534,7 +2552,7 @@
     Ikiwa sera imezimwa, hakuna Utengaji kwa kila Tovuti uliobainishwa wazi utakaotokea na majaribio ya sehemu za IsolateOrigins na SitePerProcess yatazimwa. Watumaji bado wataweza kuwasha SitePerProcess wenyewe.
      Ikiwa mipangilio ya sera haijawekwa, mtumiaji ataweza kubadilisha mipangilio hii.
       </translation>
-<translation id="7902255855035461275">Michoro katika orodha hii italinganishwa dhidi ya asili ya usalama wa ombi la URL.  Ikilingana, idhini ya kufikia vifaa vya kurekodi video itatolewa bila ombi. KUMBUKA: Kabla ya toleo la 45, sera hii ilitumika katika hali ya Skrini nzima pekee.</translation>
+<translation id="7902255855035461275">Michoro katika orodha hii italinganishwa na ya asili ya usalama wa ombi la URL.  Ikilingana, idhini ya kufikia vifaa vya kurekodi video itatolewa bila ombi. KUMBUKA: Kabla ya toleo la 45, sera hii ilitumika katika hali ya Skrini nzima pekee.</translation>
 <translation id="7912255076272890813">Sanidi aina za programu/viendelezi zinazoruhusiwa</translation>
 <translation id="7915236031252389808">Unaweza kubainisha URL ya seva mbadala ya faili ya .pac hapa.
 
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb
index 988dbaf..cadfd56 100644
--- a/components/policy/resources/policy_templates_ta.xtb
+++ b/components/policy/resources/policy_templates_ta.xtb
@@ -2475,7 +2475,7 @@
       கொள்கை முடக்கப்பட்டிருந்தால், வெளிப்படையாகத் தளத்தைத் தனிப்படுத்தும் செயல்முறை எதுவும் நடக்காது. IsolateOrigins மற்றும் SitePerProcessஸின் புலச் சோதனைகள் முடக்கப்படும். பயனர்களால் SitePerProcessஸை கைமுறையாக இயக்க முடியும்.
       கொள்கை உள்ளமைக்கப்படவில்லை என்றால், பயனரால் இந்த அமைப்பை மாற்ற முடியும்.
       </translation>
-<translation id="7902255855035461275">இந்தப் பட்டியலில் உள்ள பேட்டர்ன்கள், கோரப்படும் URLலின் பாதுகாப்பு மூலத்துடன் ஒப்பிடப்படும்.  பொருத்தம் கண்டறிப்பட்டால், எந்த அறிவிப்பும் இல்லாமல், வீடியோப் படமெடுக்கும் சாதனங்களுக்கு அணுகல் வழங்கப்படும்.
+<translation id="7902255855035461275">இந்தப் பட்டியலில் உள்ள பேட்டர்ன்கள், கோரப்படும் URLலின் பாதுகாப்பு மூலத்துடன் ஒப்பிடப்படும்.  பொருத்தம் கண்டறிப்பட்டால், எந்த அறிவிப்பும் இல்லாமல், வீடியோ எடுக்கும் சாதனங்களுக்கு அணுகல் வழங்கப்படும்.
 
       குறிப்பு: பதிப்பு 45 வரை, கியோஸ்க் பயன்முறையில் மட்டுமே இந்தக் கொள்கை ஆதரிக்கப்பட்டது.</translation>
 <translation id="7912255076272890813">அனுமதிக்கப்படும் பயன்பாடு/நீட்டிப்பு வகைகளை உள்ளமை</translation>
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb
index 6eef4b54..716977b4 100644
--- a/components/policy/resources/policy_templates_te.xtb
+++ b/components/policy/resources/policy_templates_te.xtb
@@ -602,7 +602,7 @@
 ఈ విధానం స్థానిక వినియోగదారు డేటాను పరికరం ఉంచుతుందా లేదా తీసివేస్తుందా అన్నదాన్ని ప్రభావితం చేయదు.</translation>
 <translation id="2433412232489478893">వినియోగదారునికి <ph name="PRODUCT_NAME" /> కోసం నెట్‌వర్క్ ఫైల్ షేరింగ్‌లు ఫీచర్‌కు అనుమతి ఉంటుందా లేదా అనేదాన్ని ఈ విధానం నియంత్రిస్తుంది.
 
-ఈ విధానం కాన్ఫిగర్ చేయబడనప్పుడు లేదా ఒప్పుకి సెట్ చేయబడినప్పుడు, వినియోగదారులు నెట్‌వర్క్ ఫైల్ షేరింగ్‌లను ఉపయోగించుకోగలగుతారు.
+ఈ విధానం కాన్ఫిగర్ చేయబడనప్పుడు లేదా ఒప్పుకి సెట్ చేయబడినప్పుడు, వినియోగదారులు నెట్‌వర్క్ ఫైల్ షేరింగ్‌లను ఉపయోగించుకోగలుగుతారు.
 
 ఈ విధానం తప్పుకి సెట్ చేయబడినప్పుడు, వినియోగదారులు నెట్‌వర్క్ ఫైల్ షేరింగ్‌లను ఉపయోగించుకోలేరు.</translation>
 <translation id="2438609638493026652">Android యాప్ ఇన్‌స్టాలేషన్ సమయంలో కీలక ఈవెంట్‌లను Googleకి నివేదించడం ప్రారంభిస్తుంది. విధానం ప్రకారం ఇన్‌స్టాలేషన్ యాక్టివేట్ చేయబడిన యాప్‌ల కోసం మాత్రమే ఈవెంట్‌లు నివేదించబడతాయి.
@@ -1865,7 +1865,7 @@
 
 ఈ విధానానికి నిర్వచించబడిన ఎదైనా విలువ ఉంటే, అప్‌డేట్‌లు <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> విధానాన్ని విస్మరించి, దానికి బదులు ఈ విధానాన్ని అనుసరిస్తాయి.
 
-ఈ జాబితా ఖాళీగా ఉంటే, ఎలాంటి స్టేజింగ్ ఉండదు మరియు అప్‌డేట్‌లు పరికరం ఇతర విధానాలను బట్టి వర్తింపచేయబడతాయి.
+ఈ జాబితా ఖాళీగా ఉంటే, ఎలాంటి స్టేజింగ్ ఉండదు మరియు అప్‌డేట్‌లు ఇతర పరికర విధానాలను బట్టి వర్తింపచేయబడతాయి.
 
 ఈ విధానం ఛానెల్ మార్పులకు వర్తించదు.</translation>
 <translation id="5523812257194833591">ఆలస్యం తర్వాత స్వీయ లాగిన్‌కు పబ్లిక్ సెషన్‌.
@@ -2871,7 +2871,7 @@
       విధానాన్ని నిలిపివేస్తే, ప్రత్యేకంగా సైట్‌ని వేరుపరిచే ప్రాసెస్ జరగదు మరియు IsolateOrigins మరియు SitePerProcess యొక్క ఫీల్డ్ ట్రయల్‌లు నిలిపివేయబడతాయి. వినియోగదారులు ఇప్పటికీ SitePerProcessను మాన్యువల్‌గా ప్రారంభించగలుగుతారు.
       విధానాన్ని కాన్ఫిగర్ చేయకపోతే, వినియోగదారు ఈ సెట్టింగ్‌ను మార్చగలుగుతారు.
       </translation>
-<translation id="7902255855035461275">ఈ జాబితాలోని ఆకృతులు అభ్యర్థిస్తున్న URL భద్రతా మూలాధారంతో సరిపోల్చబడతాయి. సరిపోలినది కనుగొనబడితే, వీడియోను కాప్చర్ చేసే పరికరాలకు ఎలాంటి ప్రేరేపణ లేకుండా యాక్సెస్ మంజూరు చేయబడుతుంది.
+<translation id="7902255855035461275">ఈ జాబితాలోని ఆకృతులు అభ్యర్థిస్తున్న URL భద్రతా మూలాధారంతో సరిపోల్చబడతాయి. సరిపోలినది కనుగొనబడితే, ఎలాంటి ప్రేరేపణ లేకుండా, వీడియోను కాప్చర్ చేసే పరికరాలకు యాక్సెస్ మంజూరు చేయబడుతుంది.
 
 గమనిక: వెర్షన్ 45 వరకు, ఈ విధానానికి కియోస్క్ మోడ్‌లో మాత్రమే మద్దతు ఇవ్వబడింది.</translation>
 <translation id="7912255076272890813">అనుమతించబడిన అనువర్తన/పొడిగింపు రకాలను కాన్ఫిగర్ చేయండి</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 45db0f2..473911a 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -1141,7 +1141,7 @@
       หากไม่ได้ตั้งค่านโยบายนี้ จะมีการเปิดใช้การรวบรวมข้อมูลที่ไม่ระบุตัวบุคคลซึ่งผูกกับ URL แต่ผู้ใช้จะเปลี่ยนการตั้งค่าได้</translation>
 <translation id="4250680216510889253">ไม่มี</translation>
 <translation id="4261820385751181068">ภาษาในหน้าจอการลงชื่อเข้าใช้อุปกรณ์</translation>
-<translation id="4264607809747169568">ควบคุมพื้นที่แชร์ไฟล์ของเครือข่ายเพื่อการพร้อมใช้งานของ ChromeOS</translation>
+<translation id="4264607809747169568">ควบคุมพื้นที่แชร์ไฟล์ของเครือข่ายเพื่อความพร้อมใช้งานของ ChromeOS</translation>
 <translation id="427220754384423013">ระบุเครื่องพิมพ์ที่ผู้ใช้ใช้งานได้
 
       ใช้นโยบายนี้ต่อเมื่อเลือก <ph name="PRINTERS_WHITELIST" /> สำหรับโหมด <ph name="BULK_PRINTERS_ACCESS_MODE" /> เท่านั้น
@@ -1543,9 +1543,9 @@
       ค่าในนโยบายควรระบุด้วยหน่วยมิลลิวินาที</translation>
 <translation id="5511702823008968136">เปิดใช้งานแถบบุ๊กมาร์ก</translation>
 <translation id="5512418063782665071">URL ของหน้าแรก</translation>
-<translation id="551639594034811656">นโยบายนี้จะกำหนดรายการเปอร์เซ็นต์ที่จะแบ่งส่วนของอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> ใน OU ที่จะอัปเดตต่อวันโดยเริ่มจากวันที่พบอัปเดตเป็นครั้งแรก เวลาที่พบจะมาทีหลังเวลาเผยแพร่การอัปเดตเพราะอาจต้องใช้เวลาสักระยะ ก่อนที่อุปกรณ์จะตรวจหาอัปเดตหลังจากที่มีการเผยแพร่อัปเดต
+<translation id="551639594034811656">นโยบายนี้จะกำหนดรายการเปอร์เซ็นต์ที่จะแบ่งส่วนของอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> ใน OU ที่จะอัปเดตต่อวันโดยเริ่มจากวันที่พบอัปเดตเป็นครั้งแรก เวลาที่พบจะมาทีหลังเวลาเผยแพร่อัปเดตเพราะอาจต้องใช้เวลาสักระยะกว่าอุปกรณ์จะตรวจหาอัปเดตหลังจากที่มีการเผยแพร่
 
-      คู่รายการ (วัน เปอร์เซ็นต์) แต่ละคู่จะบอกจำนวนเปอร์เซ็นต์ของอุปกรณ์ที่จะต้องอัปเดตภายในจำนวนวันที่ระบุนับจากที่พบอัปเดต เช่น คู่รายการ [(4, 40), (10, 70), (15, 100)] หมายความว่า 40% ของอุปกรณ์ควรต้องอัปเดตภายใน 4 วันนับจากที่พบอัปเดต, 70% ของอุปกรณ์ควรจะต้องอัปเดตภายใน 10 วัน คู่รายการต่อไปก็เป็นไปในทำนองเดียวกัน
+      คู่รายการ (วัน, เปอร์เซ็นต์) แต่ละคู่จะบอกจำนวนเปอร์เซ็นต์ของอุปกรณ์ที่จะต้องอัปเดตภายในจำนวนวันที่ระบุนับจากที่พบอัปเดต เช่น คู่รายการ [(4, 40), (10, 70), (15, 100)] หมายความว่า 40% ของอุปกรณ์ควรต้องอัปเดตภายใน 4 วันนับจากที่พบอัปเดตและ 70% ของอุปกรณ์ควรจะต้องอัปเดตภายใน 10 วัน คู่รายการต่อไปก็เป็นไปในทำนองเดียวกัน
       หากมีการกำหนดค่าไว้ในนโยบายนี้ ระบบจะไม่ใช้นโยบาย <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> ในการอัปเดต แต่จะใช้นโยบายนี้แทน
 
       หากรายการนี้ว่างเปล่า จะไม่มีการกำหนดแบบทีละขั้นและระบบจะทำการอัปเดตตามนโยบายอื่นๆ ของอุปกรณ์
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index ff5d1c7..53084eb 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -268,6 +268,7 @@
       Якщо вибрано значення false, показники використання та діагностичні дані не надсилатимуться.
 
       Якщо це правило не налаштовано, надсилання показників використання та діагностичних даних буде вимкнено на некерованих пристроях і ввімкнено на керованих.</translation>
+<translation id="1920046221095339924">Дозволити керований сеанс на пристрої</translation>
 <translation id="1929709556673267855">Указує налаштування принтерів підприємства, зв’язаних із пристроями.
 
       Це правило дає змогу налаштувати принтери на пристроях із <ph name="PRODUCT_OS_NAME" />. Формат той самий, що й у словника NativePrinters, але є додаткове поле id чи guid для кожного принтера, щоб додати його в білий або чорний список.
@@ -301,6 +302,7 @@
 
       Якщо це налаштування ввімкнено або значення не вибрано, користувачі зможуть керувати функцією автозаповнення адрес в інтерфейсі.</translation>
 <translation id="1960840544413786116">Чи дозволяти сертифікати, видані локальними ключами довіри, які не мають розширення subjectAlternativeName</translation>
+<translation id="1962273523772270623">Дозволити збирати журнали подій WebRTC із сервісів Google</translation>
 <translation id="1964634611280150550">Режим анонімного перегляду вимкнено</translation>
 <translation id="1964802606569741174">Це правило не впливає на додаток YouTube на пристрої Android. Щоб для YouTube використовувався Безпечний режим, забороніть встановлення додатка YouTube на пристрої Android.</translation>
 <translation id="1969212217917526199">Замінює правила налагоджувальних складань хосту віддаленого доступу.
@@ -1559,7 +1561,7 @@
 
       Кожна пара (день, відсоток) показує, яка відсоткова частка ресурсів має оновитися впродовж зазначеної кількості днів після того, як виявлено оновлення. Наприклад, якщо є пари [(4, 40), (10, 70), (15, 100)], то 40% ресурсів має оновитися впродовж 4 днів; 70% – упродовж 10 днів тощо.
 
-      Якщо для цього правила встановлено значення, оновлення ігноруватимуть правило <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> і натомість застосовуватимуть це правило.
+      Якщо для цього правила встановлено значення, для оновлень ігноруватиметься правило <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> і натомість застосовуватиметься це правило.
 
       Якщо список порожній, оновлення не буде поетапним і виконуватиметься відповідно до правил пристрою.
 
@@ -1918,6 +1920,11 @@
       Якщо це правило не встановлено або список порожній, у <ph name="PRODUCT_NAME" /> можна отримувати доступ за всіма схемами.</translation>
 <translation id="6652197835259177259">Налаштування локально керованих користувачів</translation>
 <translation id="6658245400435704251">Визначає кількість секунд, на яку пристрій може навмання затримати завантаження оновлення з моменту, коли це оновлення вперше надсилається на сервер. Пристрій може чекати частину цього часу, виражену в одиницях виміру годинника, а решту часу – у кількості перевірок оновлення. У будь-якому випадку, верхня межа розсіяння встановлена на постійне значення часу, щоб пристрій ніколи не зациклювався, постійно очікуючи на завантаження оновлення.</translation>
+<translation id="6665599130599311250">Якщо для цього правила вибрано значення false або його не налаштовано, сеанс у режимі "Гість" проходить, як указано на сторінці https://support.google.com/chrome/a/answer/3017014, тобто як стандартний "Загальнодоступний сеанс".
+
+      Якщо для цього правила вибрано значення true, сеанс у режимі "Гість" проходить як "Керований сеанс", тобто без багатьох обмежень, що діють для звичайного "Загальнодоступного сеансу".
+
+      Якщо це правило налаштовано, користувач не може змінити або замінити його.</translation>
 <translation id="6665670272107384733">Вибрати, як часто користувач має вводити пароль, щоб швидко розблоковувати пристрій</translation>
 <translation id="6681229465468164801">Дозволяє створювати список шаблонів URL-адрес сайтів, яким заборонено запитувати в користувача доступ до пристрою USB.
 
@@ -2074,6 +2081,17 @@
 <translation id="6943577887654905793">Назва налаштування в Mac/Linux:</translation>
 <translation id="69525503251220566">Параметр, що додаає функцію пошуку за зображенням у пошукову систему за умовчанням</translation>
 <translation id="6956272732789158625">Заборонити всім сайтам генерувати ключі</translation>
+<translation id="6982028490425791294">
+      Якщо для цього правила вибрано значення true, <ph name="PRODUCT_NAME" /> може збирати журнали подій WebRTC із сервісів Google (як-от Google Meet) і завантажувати їх у Google.
+
+      Якщо для цього правила вибрано значення false або його не налаштовано, <ph name="PRODUCT_NAME" /> не може збирати й завантажувати такі журнали.
+
+      Ці журнали містять таку інформацію, як час і розміри надісланих та отриманих пакетів RTP, відгуки про перевантаження мережі й метадані про час і якість фреймів аудіо та відео. Ці дані допомагають усувати проблеми з аудіо- й відеовикликами в Chrome, як-от неправильна оцінка пропускної спроможності тощо. Аудіо- й відеовміст викликів не включається в журнали.
+
+      Збір цих даних можуть ініціювати лише веб-сервіси Google, як-от Google Hangouts або Google Meet.
+
+      Ці журнали можуть пов’язуватися (за допомогою ідентифікатора сеансу) з іншими журналами, які збирає сервіс Google. Це робиться, щоб спростити налагодження.
+      </translation>
 <translation id="6994082778848658360">Визначає, як наявне апаратне забезпечення елемента безпеки можна використовувати для двофакторної автентифікації, якщо воно сумісне з цією функцією. Фізична присутність користувача визначається за допомогою кнопки живлення комп’ютера.
 
       Якщо вибрано опцію "Вимкнено", другий фактор не використовується.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index 1e189c7..93dd6e5 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -523,7 +523,7 @@
       Nếu cài đặt này không được đặt, người dùng có thể quyết định sử dụng chức năng này hay không.
 
       Cài đặt này đã bị xóa khỏi phiên bản <ph name="PRODUCT_NAME" /> 29 và các phiên bản cao hơn.</translation>
-<translation id="2433412232489478893">Chính sách này kiểm soát có cho phép người dùng sử dụng tính năng Chia sẻ tệp trong mạng cho <ph name="PRODUCT_NAME" /> hay không.
+<translation id="2433412232489478893">Chính sách này kiểm soát việc có cho phép người dùng sử dụng tính năng Chia sẻ tệp trong mạng cho <ph name="PRODUCT_NAME" /> hay không.
 
       Khi chưa định cấu hình chính sách này hoặc khi đặt chính sách thành True, người dùng sẽ có thể sử dụng tính năng Chia sẻ tệp trong mạng.
 
@@ -1620,13 +1620,13 @@
       Giá trị của chính sách này sẽ được chỉ định theo mili giây.</translation>
 <translation id="5511702823008968136">Bật Thanh dấu trang</translation>
 <translation id="5512418063782665071">URL trang chủ</translation>
-<translation id="551639594034811656">Chính sách này xác định danh sách tỷ lệ phần trăm để xác định tỷ lệ thiết bị <ph name="PRODUCT_OS_NAME" /> trong đơn vị tổ chức sẽ cập nhật mỗi ngày, bắt đầu từ ngày phát hiện bản cập nhật đầu tiên. Thời điểm phát hiện muộn hơn thời điểm phát hành bản cập nhật vì có thể mất một khoảng thời gian từ khi phát hành bản cập nhật cho tới khi thiết bị kiểm tra các bản cập nhật.
+<translation id="551639594034811656">Chính sách này xác định danh sách tỷ lệ phần trăm cho biết số lượng thiết bị <ph name="PRODUCT_OS_NAME" /> trong đơn vị tổ chức sẽ được cập nhật mỗi ngày, bắt đầu từ ngày bản cập nhật được phát hiện lần đầu tiên. Vì thiết bị có thể kiểm tra các bản cập nhật sau một khoảng thời gian sau khi bản cập nhật được phát hành, nên thời điểm phát hiện sẽ muộn hơn thời điểm phát hành bản cập nhật.
 
-      Mỗi cặp (ngày, tỷ lệ phần trăm) chứa tỷ lệ phần trăm của nhóm phải được cập nhật trong một số ngày nhất định kể từ khi phát hiện thấy bản cập nhật. Ví dụ: nếu chúng ta có các cặp [(4, 40), (10, 70), (15, 100)], thì 40% của nhóm đã được cập nhật sau 4 ngày phát hiện thấy bản cập nhật. 70% sẽ được cập nhật sau 10 ngày, v.v.
+      Mỗi cặp (ngày, tỷ lệ phần trăm) chứa tỷ lệ phần trăm của nhóm phải được cập nhật trong một số ngày nhất định kể từ khi phát hiện thấy bản cập nhật. Ví dụ: nếu chúng ta có các cặp [(4, 40), (10, 70), (15, 100)], thì 40% của nhóm này sẽ phải được cập nhật trong vòng 4 ngày sau khi phát hiện bản cập nhật, 70% sẽ phải cập nhật sau 10 ngày, v.v.
 
       Nếu có một giá trị xác định cho chính sách này, thì bản cập nhật sẽ bỏ qua chính sách <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> và tuân thủ chính sách này.
 
-      Nếu danh sách này trống, thì sẽ không có giai đoạn và bản cập nhật nào được áp dụng theo các chính sách khác của thiết bị.
+      Nếu danh sách này trống, thì sẽ không có giai đoạn và các bản cập nhật sẽ được áp dụng theo các chính sách khác của thiết bị.
 
       Chính sách này không áp dụng cho quá trình chuyển đổi giữa các kênh.</translation>
 <translation id="5523812257194833591">Tự động đăng nhập vào phiên công khai sau thời gian chờ.
@@ -2547,11 +2547,11 @@
       Nếu bạn tắt chính sách này, sẽ không có sự Cô lập trang web rõ ràng nào xảy ra và các phiên bản dùng thử tại chỗ của IsolateOrigins và SitePerProcess sẽ bị tắt. Người dùng sẽ vẫn có thể bật SitePerProcess theo cách thủ công.
       Nếu bạn không định cấu hình chính sách này, thì người dùng sẽ có thể thay đổi tùy chọn cài đặt này.
       </translation>
-<translation id="7902255855035461275">Các mẫu trong danh sách này sẽ được đối sánh dựa trên nguồn gốc bảo mật
+<translation id="7902255855035461275">Các mẫu trong danh sách này sẽ được so khớp dựa trên nguồn gốc bảo mật
       của URL yêu cầu. Nếu tìm thấy mẫu phù hợp, quyền truy cập
       vào thiết bị quay video sẽ được cấp mà không có lời nhắc.
 
-      LƯU Ý: Cho tới phiên bản 45 thì chính sách này chỉ được hỗ trợ ở chế độ Kiosk.</translation>
+      LƯU Ý: Trước phiên bản 45, chính sách này chỉ được hỗ trợ ở chế độ Kiosk.</translation>
 <translation id="7912255076272890813">Định cấu hình loại ứng dụng/tiện ích được cho phép</translation>
 <translation id="7915236031252389808">Bạn có thể chỉ định URL cho tệp .pac proxy tại đây.
 
diff --git a/components/safe_browsing/browser/base_parallel_resource_throttle.cc b/components/safe_browsing/browser/base_parallel_resource_throttle.cc
index 86868a57..05a4c6f 100644
--- a/components/safe_browsing/browser/base_parallel_resource_throttle.cc
+++ b/components/safe_browsing/browser/base_parallel_resource_throttle.cc
@@ -157,8 +157,9 @@
     return;
   }
 
+  network::ResourceResponseHead response_head;
   url_loader_throttle_holder_->throttle()->WillProcessResponse(
-      GURL(), network::ResourceResponseHead(), defer);
+      GURL(), &response_head, defer);
   if (!*defer)
     throttle_in_band_ = false;
 }
diff --git a/components/safe_browsing/browser/browser_url_loader_throttle.cc b/components/safe_browsing/browser/browser_url_loader_throttle.cc
index 8b10f84..56aebd5e 100644
--- a/components/safe_browsing/browser/browser_url_loader_throttle.cc
+++ b/components/safe_browsing/browser/browser_url_loader_throttle.cc
@@ -88,7 +88,7 @@
 
 void BrowserURLLoaderThrottle::WillProcessResponse(
     const GURL& response_url,
-    const network::ResourceResponseHead& response_head,
+    network::ResourceResponseHead* response_head,
     bool* defer) {
   if (blocked_) {
     // OnCheckUrlResult() has set |blocked_| to true and called
diff --git a/components/safe_browsing/browser/browser_url_loader_throttle.h b/components/safe_browsing/browser/browser_url_loader_throttle.h
index 5fabb8d..008ca577 100644
--- a/components/safe_browsing/browser/browser_url_loader_throttle.h
+++ b/components/safe_browsing/browser/browser_url_loader_throttle.h
@@ -49,7 +49,7 @@
       bool* defer,
       std::vector<std::string>* to_be_removed_headers) override;
   void WillProcessResponse(const GURL& response_url,
-                           const network::ResourceResponseHead& response_head,
+                           network::ResourceResponseHead* response_head,
                            bool* defer) override;
 
  private:
diff --git a/components/safe_browsing/renderer/renderer_url_loader_throttle.cc b/components/safe_browsing/renderer/renderer_url_loader_throttle.cc
index c3ce971..64ab30a 100644
--- a/components/safe_browsing/renderer/renderer_url_loader_throttle.cc
+++ b/components/safe_browsing/renderer/renderer_url_loader_throttle.cc
@@ -92,7 +92,7 @@
 
 void RendererURLLoaderThrottle::WillProcessResponse(
     const GURL& response_url,
-    const network::ResourceResponseHead& response_head,
+    network::ResourceResponseHead* response_head,
     bool* defer) {
   // If |blocked_| is true, the resource load has been canceled and there
   // shouldn't be such a notification.
diff --git a/components/safe_browsing/renderer/renderer_url_loader_throttle.h b/components/safe_browsing/renderer/renderer_url_loader_throttle.h
index 3d90186..8ba410e 100644
--- a/components/safe_browsing/renderer/renderer_url_loader_throttle.h
+++ b/components/safe_browsing/renderer/renderer_url_loader_throttle.h
@@ -40,7 +40,7 @@
       bool* defer,
       std::vector<std::string>* to_be_removed_headers) override;
   void WillProcessResponse(const GURL& response_url,
-                           const network::ResourceResponseHead& response_head,
+                           network::ResourceResponseHead* response_head,
                            bool* defer) override;
 
   // mojom::UrlCheckNotifier implementation.
diff --git a/components/security_interstitials/DEPS b/components/security_interstitials/DEPS
index 4958397..d5bf5ad 100644
--- a/components/security_interstitials/DEPS
+++ b/components/security_interstitials/DEPS
@@ -9,6 +9,7 @@
   "+components/grit/components_resources.h",
   "+components/url_formatter",
   "+net/base",
+  "+net/cert",
   "+net/ssl",
   "+ui/base"
 ]
diff --git a/components/security_interstitials/core/browser/resources/ssl.js b/components/security_interstitials/core/browser/resources/ssl.js
index 4f180d3..94474a3b 100644
--- a/components/security_interstitials/core/browser/resources/ssl.js
+++ b/components/security_interstitials/core/browser/resources/ssl.js
@@ -14,6 +14,10 @@
   appendDebuggingField('Current date', loadTimeData.getString('currentDate'));
   appendDebuggingField('PEM encoded chain', loadTimeData.getString('pem'),
                        true);
+  var ctInfo = loadTimeData.getString('ct');
+  if (ctInfo) {
+    appendDebuggingField('Certificate Transparency', ctInfo);
+  }
 
   $('error-code').addEventListener('click', toggleDebuggingInfo);
 }
diff --git a/components/security_interstitials/core/common_string_util.cc b/components/security_interstitials/core/common_string_util.cc
index bf218065..b9220a15 100644
--- a/components/security_interstitials/core/common_string_util.cc
+++ b/components/security_interstitials/core/common_string_util.cc
@@ -10,6 +10,7 @@
 #include "components/strings/grit/components_strings.h"
 #include "components/url_formatter/url_formatter.h"
 #include "net/base/net_errors.h"
+#include "net/cert/ct_sct_to_string.h"
 #include "ui/base/l10n/l10n_util.h"
 
 namespace security_interstitials {
@@ -48,6 +49,15 @@
       base::TimeFormatShortDate(ssl_info.cert->valid_expiry()));
   load_time_data->SetString("currentDate",
                             base::TimeFormatShortDate(time_triggered));
+  std::vector<std::string> sct_list;
+  for (const auto& sct_status : ssl_info.signed_certificate_timestamps) {
+    std::string sct_info = "\n\nSCT " + sct_status.sct->log_description + " (" +
+                           net::ct::OriginToString(sct_status.sct->origin) +
+                           ", " + net::ct::StatusToString(sct_status.status) +
+                           ")";
+    sct_list.push_back(sct_info);
+  }
+  load_time_data->SetString("ct", base::StrCat(sct_list));
   std::vector<std::string> encoded_chain;
   ssl_info.cert->GetPEMEncodedChain(&encoded_chain);
   load_time_data->SetString("pem", base::StrCat(encoded_chain));
diff --git a/components/signin/core/browser/account_info.cc b/components/signin/core/browser/account_info.cc
index ca29895..b795bcc 100644
--- a/components/signin/core/browser/account_info.cc
+++ b/components/signin/core/browser/account_info.cc
@@ -60,6 +60,8 @@
   modified |= UpdateField(&locale, other.locale);
   modified |= UpdateField(&picture_url, other.picture_url);
   modified |= UpdateField(&is_child_account, other.is_child_account);
+  modified |= UpdateField(&is_under_advanced_protection,
+                          other.is_under_advanced_protection);
 
   return modified;
 }
diff --git a/components/signin/core/browser/account_info.h b/components/signin/core/browser/account_info.h
index 30165bcf..4856bee 100644
--- a/components/signin/core/browser/account_info.h
+++ b/components/signin/core/browser/account_info.h
@@ -31,6 +31,7 @@
   std::string locale;
   std::string picture_url;
   bool is_child_account = false;
+  bool is_under_advanced_protection = false;
 
   // Returns true if all fields in the account info are empty.
   bool IsEmpty() const;
diff --git a/components/signin/core/browser/account_tracker_service.cc b/components/signin/core/browser/account_tracker_service.cc
index 8394a944..eb85a65 100644
--- a/components/signin/core/browser/account_tracker_service.cc
+++ b/components/signin/core/browser/account_tracker_service.cc
@@ -35,6 +35,8 @@
 const char kAccountLocalePath[] = "locale";
 const char kAccountPictureURLPath[] = "picture_url";
 const char kAccountChildAccountStatusPath[] = "is_child_account";
+const char kAdvancedProtectionAccountStatusPath[] =
+    "is_under_advanced_protection";
 
 // TODO(M48): Remove deprecated preference migration.
 const char kAccountServiceFlagsPath[] = "service_flags";
@@ -334,6 +336,19 @@
   SaveToPrefs(state);
 }
 
+void AccountTrackerService::SetIsAdvancedProtectionAccount(
+    const std::string& account_id,
+    const bool& is_under_advanced_protection) {
+  DCHECK(base::ContainsKey(accounts_, account_id));
+  AccountState& state = accounts_[account_id];
+  if (state.info.is_under_advanced_protection == is_under_advanced_protection)
+    return;
+  state.info.is_under_advanced_protection = is_under_advanced_protection;
+  if (!state.info.gaia.empty())
+    NotifyAccountUpdated(state);
+  SaveToPrefs(state);
+}
+
 bool AccountTrackerService::IsMigratable() const {
 #if !defined(OS_CHROMEOS)
   for (std::map<std::string, AccountState>::const_iterator it =
@@ -488,6 +503,13 @@
         if (dict->GetBoolean(kAccountChildAccountStatusPath, &is_child_account))
           state.info.is_child_account = is_child_account;
 
+        bool is_under_advanced_protection = false;
+        if (dict->GetBoolean(kAdvancedProtectionAccountStatusPath,
+                             &is_under_advanced_protection)) {
+          state.info.is_under_advanced_protection =
+              is_under_advanced_protection;
+        }
+
         if (!state.info.gaia.empty())
           NotifyAccountUpdated(state);
       }
@@ -548,6 +570,8 @@
   dict->SetString(kAccountLocalePath, state.info.locale);
   dict->SetString(kAccountPictureURLPath, state.info.picture_url);
   dict->SetBoolean(kAccountChildAccountStatusPath, state.info.is_child_account);
+  dict->SetBoolean(kAdvancedProtectionAccountStatusPath,
+                   state.info.is_under_advanced_protection);
 }
 
 void AccountTrackerService::RemoveFromPrefs(const AccountState& state) {
diff --git a/components/signin/core/browser/account_tracker_service.h b/components/signin/core/browser/account_tracker_service.h
index 510512ae..2100f2f 100644
--- a/components/signin/core/browser/account_tracker_service.h
+++ b/components/signin/core/browser/account_tracker_service.h
@@ -131,6 +131,10 @@
   void SetIsChildAccount(const std::string& account_id,
                          const bool& is_child_account);
 
+  // Sets whether the account is under advanced protection.
+  void SetIsAdvancedProtectionAccount(const std::string& account_id,
+                                      const bool& is_under_advanced_protection);
+
   void RemoveAccount(const std::string& account_id);
 
   AccountIdMigrationState GetMigrationState() const;
diff --git a/components/signin/core/browser/account_tracker_service_unittest.cc b/components/signin/core/browser/account_tracker_service_unittest.cc
index 980e2d55..9d0d5ad 100644
--- a/components/signin/core/browser/account_tracker_service_unittest.cc
+++ b/components/signin/core/browser/account_tracker_service_unittest.cc
@@ -721,6 +721,10 @@
     tracker.SetIsChildAccount("beta", true);
 #endif
 
+#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS)
+    tracker.SetIsAdvancedProtectionAccount("beta", true);
+#endif
+
     fetcher.Shutdown();
     tracker.Shutdown();
   }
@@ -735,6 +739,11 @@
     ASSERT_EQ(1u, infos.size());
     CheckAccountDetails("beta", infos[0]);
     ASSERT_TRUE(infos[0].is_child_account);
+#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS)
+    ASSERT_TRUE(infos[0].is_under_advanced_protection);
+#else
+    ASSERT_FALSE(infos[0].is_under_advanced_protection);
+#endif
     tracker.Shutdown();
   }
 }
@@ -1360,3 +1369,30 @@
 
   account_tracker()->RemoveObserver(&observer);
 }
+
+#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) && !defined(OS_IOS)
+TEST_F(AccountTrackerServiceTest, AdvancedProtectionAccountBasic) {
+  AccountTrackerService tracker;
+  tracker.Initialize(signin_client());
+  FakeAccountFetcherService fetcher;
+  fetcher.Initialize(signin_client(), token_service(), &tracker,
+                     std::make_unique<TestImageDecoder>());
+  fetcher.EnableNetworkFetchesForTest();
+  std::string account_id("advanced_protection");
+  SimulateTokenAvailable(account_id);
+  IssueAccessToken(account_id);
+
+  tracker.SetIsAdvancedProtectionAccount(account_id, true);
+  AccountInfo info = tracker.GetAccountInfo(account_id);
+  EXPECT_TRUE(info.is_under_advanced_protection);
+
+  tracker.SetIsAdvancedProtectionAccount(account_id, false);
+  info = tracker.GetAccountInfo(account_id);
+  EXPECT_FALSE(info.is_under_advanced_protection);
+
+  SimulateTokenRevoked(account_id);
+  fetcher.Shutdown();
+  tracker.Shutdown();
+}
+
+#endif
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb
index 3ccbda5..e53b5e5 100644
--- a/components/strings/components_strings_am.xtb
+++ b/components/strings/components_strings_am.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">ቀጥል</translation>
 <translation id="2365563543831475020">በ<ph name="CRASH_TIME" /> ላይ የተያዘው የብልሽት ሪፖርት አልተሰቀለም</translation>
 <translation id="2367567093518048410">ደረጃ</translation>
+<translation id="2378238891085281592">እርስዎ የግል ሆነዋል</translation>
 <translation id="2384307209577226199">የንግድ ድርጅት ነባሪ</translation>
 <translation id="2386255080630008482">የአገልጋይ እውቅና ማረጋገጫ ተሽሯል።</translation>
 <translation id="2392959068659972793">ምንም እሴት ያልተዋቀረላቸው መምሪያዎችን አሳይ</translation>
@@ -354,6 +355,7 @@
 <translation id="3391030046425686457">የመላኪያ አድራሻ</translation>
 <translation id="3395827396354264108">የመውሰጃ ዘዴ</translation>
 <translation id="3399952811970034796">የመላኪያ አድራሻ</translation>
+<translation id="3409072600744224192">የእርስዎን ዕልባቶችን በሁሉም መሣሪያዎችዎ ላይ ለማግኘት <ph name="SIGN_IN_LINK" />።</translation>
 <translation id="3422248202833853650">የማህደረ ትውስታ ቦታን ለማስለቀቅ ከሌሎች ፕሮግራሞች ዘግተው ለመውጣት ይውጡ።</translation>
 <translation id="3422472998109090673"><ph name="HOST_NAME" /> አሁን ላይ ሊደረስበት አይችልም።</translation>
 <translation id="3427092606871434483">ፍቀድ (ነባሪ)</translation>
@@ -513,6 +515,7 @@
 <translation id="450710068430902550">ከአስተዳዳሪ ጋር ማጋራት</translation>
 <translation id="4515275063822566619">ካርዶች እና አድራሻዎች ከChrome እና ከGoogle መለያዎ (<ph name="ACCOUNT_EMAIL" />) የተገኙ ናቸው። በ<ph name="BEGIN_LINK" />ቅንብሮች<ph name="END_LINK" /> ውስጥ ሊያቀናብሯቸው ይችላሉ።</translation>
 <translation id="4522570452068850558">ዝርዝሮች</translation>
+<translation id="4524805452350978254">ካርዶችን አቀናብር</translation>
 <translation id="4552089082226364758">ብልጭታ</translation>
 <translation id="4558551763791394412">ቅጥያዎችዎን አሰናክለው ይሞክሩ።</translation>
 <translation id="457875822857220463">መላኪያ</translation>
@@ -578,6 +581,7 @@
 <translation id="5045550434625856497">ትክክል ያልሆነ የይለፍ ቃል</translation>
 <translation id="5056549851600133418">ለእርስዎ የሚሆኑ ጽሑፎች</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />የወኪሉን አድራሻ መፈተሽ<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">ካርዶችዎን በሁሉም መሣሪያዎችዎ ላይ ለማግኘት በመለያ ይግቡና ስምረትን ያብሩ።</translation>
 <translation id="5086888986931078152">ከአንዳንድ ጣቢያዎች የመጣ ጥበቃ የሚደረግለት የይዘት መዳረሻ ሊያጡ ይችላሉ።</translation>
 <translation id="5087286274860437796">የአገልጋይ የዕውቅና ማረጋገጫ በዚህ ጊዜ ላይ የሚሰራ አይደለም።</translation>
 <translation id="5087580092889165836">ካርድ አክል</translation>
@@ -623,6 +627,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />፣ <ph name="MATCH_POSITION" /> ከ<ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">የእውቂያ መረጃ ይምረጡ</translation>
 <translation id="5327248766486351172">ስም</translation>
+<translation id="5327567770033251652">ስምረትን አብራ</translation>
 <translation id="5332219387342487447">የመላኪያ መንገድ</translation>
 <translation id="5355557959165512791">የዕውቅና ማረጋገጫው ስለተሻረ <ph name="SITE" />ን መጎብኘት አይችሉም። የአውታረ መረብ ስህተቶች እና ጥቃቶች አብዛኛው ጊዜ ጊዜያዊ ብቻ ናቸው፣ ስለዚህ ይህ ገጽ በኋላ ላይ ሊሠራ ይችላል።</translation>
 <translation id="536296301121032821">የመምሪያ ቅንብሮችን ማከማቸት አልተሳካም</translation>
@@ -687,6 +692,7 @@
 <translation id="5765072501007116331">የማድረሻ ዘዴዎችን እና መስፈርቶችን ለመመልከት አድራሻ ይምረጡ</translation>
 <translation id="5770114862687765385">ፋይሉ የተበላሸ ይመስላል። ክፍለ-ጊዜውን ዳግም ለማስጀመር የ«ዳግም አዝራር» አዝራሩን ጠቅ ያድርጉት።</translation>
 <translation id="5778550464785688721">MIDI መሣሪያዎች ሙሉ ቁጥጥር</translation>
+<translation id="57838592816432529">ድምጽ ይዝጉ</translation>
 <translation id="5784606427469807560">የእርስዎን ካርድ ማረጋገጥ ላይ አንድ ችግር ነበር። የበይነመረብ ግንኙነትዎን ይፈትሹት እና እንደገና ይሞክሩ።</translation>
 <translation id="5785756445106461925">በተጨማሪ፣ ይህ ገጽ ደህንነታቸው ያልተጠበቀ ሌሎች ንብረቶችን አካትቷል። እነዚህ ንብረቶች በሽግግር ወቅት በሌሎች ሊታዩ ይችላሉ፣ እናም የገጹን መልክ ለመለወጥ በአጥቂዎች ሊቀየሩ ይችላሉ።</translation>
 <translation id="5786044859038896871">የካርድዎን መረጃ መሙላት ይፈልጋሉ?</translation>
@@ -698,6 +704,7 @@
 <translation id="5866257070973731571">ስልክ ቁጥር ያክሉ</translation>
 <translation id="5869405914158311789">ይህ ጣቢያ ሊደረስበት አይችልም</translation>
 <translation id="5869522115854928033">የተቀመጡ የይለፍ ቃሎች</translation>
+<translation id="5887400589839399685">ካርድ ተቀምጧል</translation>
 <translation id="5893752035575986141">ክሬዲት ካርዶች ተቀባይነት አላቸው።</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (ሰምሯል)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 ጥቅም ላይ ያለ}one{# ጥቅም ላይ ያለ}other{# ጥቅም ላይ}}</translation>
@@ -815,18 +822,22 @@
 <translation id="6915804003454593391">ተጠቃሚ፦</translation>
 <translation id="6944692733090228304">በ<ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> ወደ የማይተዳደር ጣቢያ ላይ የእርስዎን የይለፍ ቃል አስገብተዋል። ለእርስዎ መለያ ጥበቃ ለማድረግ፣ በሌሎች መተግበሪያዎች እና ጣቢያዎች ላይ የእርስዎን የይለፍ ቃል ዳግም አይጠቀሙ።</translation>
 <translation id="6945221475159498467">ይምረጡ</translation>
+<translation id="6948540501704460596">የእርስዎን ዕልባቶችን በሁሉም መሣሪያዎችዎ ላይ ለማግኘት <ph name="SYNC_LINK" />።</translation>
 <translation id="6948701128805548767">የመውሰጃ ዘዴዎችን እና መስፈርቶችን ለመመልከት አድራሻ ይምረጡ</translation>
 <translation id="6949872517221025916">የይለፍ ቃል ዳግም ያስገቡ</translation>
 <translation id="6950684638814147129">የJSON እሴቱን በመተንተን ላይ ሳለ ስህተት፦ <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">ገጹን በአዲስ የግል ትር ውስጥ ይክፈቱ</translation>
 <translation id="6957887021205513506">የአገልጋዩ እውቅና ማረጋገጫ የተጭበረበረ ይመስላል።</translation>
 <translation id="6965382102122355670">እሺ</translation>
 <translation id="6965978654500191972">መሣሪያ</translation>
 <translation id="6970216967273061347">ወረዳ</translation>
 <translation id="6973656660372572881">ሁለቱም ቋሚ ተኪ አገልጋዮች እና የ.pac ስክሪፕት ዩአርኤል ተገልጸዋል።</translation>
+<translation id="6984479912851154518">በውጫዊ ማከማቻ በኩል ለማጫወት ከግል ሁነታ በመውጣት ላይ። ይቀጥል?</translation>
 <translation id="6989763994942163495">የላቁ ቅንብሮችን አሳይ...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">እነዚህ ክፍያዎች የአንድ ጊዜ ወይም ተደጋጋሚ፣ እና የማያስታውቁ ሊሆኑ ይችላሉ።</translation>
 <translation id="7029809446516969842">የይለፍ ቃላት</translation>
+<translation id="7042837854211185817">ካርዶችዎን በሁሉም መሣሪያዎች ላይ ለማግኘት ስምረትን ያብሩ።</translation>
 <translation id="7050187094878475250"><ph name="DOMAIN" /> ጋር ለመድረስ ሞክረዋል፣ ነገር ግን አገልጋዩ አስተማማኝ ለመሆን የሚያስቸግር በጣም ረጅም የሆነ የማረጋገጫ ጊዜ ነው ያለው።</translation>
 <translation id="7053983685419859001">አግድ</translation>
 <translation id="7064851114919012435">የእውቂያ መረጃ</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">ዕልባቶች</translation>
 <translation id="883848425547221593">ሌላ እልባቶች</translation>
 <translation id="884264119367021077">የመላኪያ አድራሻ</translation>
+<translation id="8846319957959474018">መተግበሪያዎችን በቀላሉ በዕልባቶች ይክፈቱ</translation>
 <translation id="884923133447025588">ምንም የመሻሪያ ዘዴ አልተገኘም።</translation>
 <translation id="885730110891505394">ከGoogle ጋር ማጋራት</translation>
 <translation id="8858065207712248076">Chrome የእርስዎን የ<ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> ይለፍ ቃል በሌሎች ጣቢያዎች ላይ ዳግም ከተጠቀሙበት እንደገና እንዲያዋቅሩት ይመክራል።</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index ae45b5a..5c6ec8f9 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">المتابعة</translation>
 <translation id="2365563543831475020">لم يتم تحميل تقرير الأعطال الذي تم الحصول عليه في <ph name="CRASH_TIME" /></translation>
 <translation id="2367567093518048410">المستوى</translation>
+<translation id="2378238891085281592">الانتقال إلى الوضع الخاص</translation>
 <translation id="2384307209577226199">السياسة تلقائية في المؤسسة ويمكن إلغاؤها</translation>
 <translation id="2386255080630008482">تم إبطال شهادة الخادم.</translation>
 <translation id="2392959068659972793">عرض السياسات التي لم يتم تعيين قيم لها</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">عنوان التسليم</translation>
 <translation id="3395827396354264108">طريقة الاستلام</translation>
 <translation id="3399952811970034796">عنوان التسليم</translation>
+<translation id="3409072600744224192">للحصول على البطاقات على جميع أجهزتك، <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">جرّب الخروج من البرامج الأخرى لتفريغ مساحة من الذاكرة.</translation>
 <translation id="3422472998109090673">يتعذر الوصول إلى <ph name="HOST_NAME" /> حاليًا.</translation>
 <translation id="3427092606871434483">السماح (تلقائي)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">المشاركة مع المشرف</translation>
 <translation id="4515275063822566619">‏تأتي البطاقات والعناوين من Chrome وحسابك في Google (<ph name="ACCOUNT_EMAIL" />). ويمكنك إدارتها في <ph name="BEGIN_LINK" />الإعدادات<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">التفاصيل</translation>
+<translation id="4524805452350978254">إدارة البطاقات</translation>
 <translation id="4552089082226364758">الفلاش</translation>
 <translation id="4558551763791394412">جرّب إيقاف الإضافات.</translation>
 <translation id="457875822857220463">التسليم</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">كلمة مرور غير صحيحة</translation>
 <translation id="5056549851600133418">مقالات من أجلك</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />التحقق من عنوان الخادم الوكيل<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">للحصول على البطاقات على جميع الأجهزة، يُرجى تسجيل الدخول وتفعيل المزامنة.</translation>
 <translation id="5086888986931078152">قد تفقد إمكانية الوصول إلى محتوى محمي من بعض المواقع.</translation>
 <translation id="5087286274860437796">شهادة الخادم ليست صالحة حاليًا.</translation>
 <translation id="5087580092889165836">إضافة بطاقة</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />، <ph name="MATCH_POSITION" /> من <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">اختيار معلومات الاتصال</translation>
 <translation id="5327248766486351172">الاسم</translation>
+<translation id="5327567770033251652">تفعيل المزامنة</translation>
 <translation id="5332219387342487447">طريقة الشحن</translation>
 <translation id="5355557959165512791">لا يمكنك زيارة <ph name="SITE" /> الآن لأنه تم إبطال شهادته. أخطاء الشبكة والهجمات عليها عادةً ما تكون مؤقتة، لذا ستعمل هذه الصفحة في وقت على الأرجح.</translation>
 <translation id="536296301121032821">تعذّر تخزين إعدادات السياسة</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">لعرض طرق التسليم ومتطلباته، حدِّد عنوانًا</translation>
 <translation id="5770114862687765385">يبدو أن الملف تالف. انقر على الزر "إعادة تعيين" لإعادة تعيين الجلسة.</translation>
 <translation id="5778550464785688721">‏التحكم الكامل في MIDI</translation>
+<translation id="57838592816432529">كتم الصوت</translation>
 <translation id="5784606427469807560">حدثت مشكلة أثناء التأكد من بطاقتك. تحقق من اتصالك بالإنترنت وأعد المحاولة.</translation>
 <translation id="5785756445106461925">إضافة إلى ذلك، تتضمن هذه الصفحة موارد أخرى غير آمنة. ويستطيع الآخرون مشاهدة هذه الموارد أثناء نقلها، كما يستطيع أي مهاجم تعديلها لتغيير مظهر الصفحة.</translation>
 <translation id="5786044859038896871">هل تريد ملء معلومات بطاقتك؟</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">إضافة رقم الهاتف</translation>
 <translation id="5869405914158311789">لا يمكن الوصول إلى موقع الويب هذا</translation>
 <translation id="5869522115854928033">كلمات المرور المحفوظة</translation>
+<translation id="5887400589839399685">تم حفظ البطاقة</translation>
 <translation id="5893752035575986141">يتم قبول بطاقات الائتمان.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (تمت المزامنة)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 قيد الاستخدام}zero{# قيد الاستخدام}two{# قيد الاستخدام}few{# قيد الاستخدام}many{# قيد الاستخدام}other{# قيد الاستخدام}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">المستخدم:</translation>
 <translation id="6944692733090228304">لقد أدخلتَ كلمة المرور في موقع ويب لا تديره <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. ويُرجى عدم إعادة استخدام كلمة المرور في التطبيقات ومواقع الويب الأخرى لحماية حسابك.</translation>
 <translation id="6945221475159498467">تحديد</translation>
+<translation id="6948540501704460596">للحصول على البطاقات على جميع أجهزتك، <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">لعرض طرق الاستلام ومتطلباته، حدِّد عنوانًا</translation>
 <translation id="6949872517221025916">إعادة تحديد كلمة المرور</translation>
 <translation id="6950684638814147129">‏حدث خطأ أثناء تحليل قيمة JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">فتح الصفحة في علامة تبويب جديدة "للوضع الخاص"</translation>
 <translation id="6957887021205513506">يبدو أن شهادة الخادم مزيفة.</translation>
 <translation id="6965382102122355670">موافق</translation>
 <translation id="6965978654500191972">جهاز</translation>
 <translation id="6970216967273061347">المنطقة</translation>
 <translation id="6973656660372572881">‏تم تحديد كل من الخوادم الوكيلة الثابتة وعنوان URL للنص البرمجي pac.</translation>
+<translation id="6984479912851154518">ستتم مغادرة الوضع الخاص للدفع عبر تطبيق خارجي. هل تريد المتابعة؟</translation>
 <translation id="6989763994942163495">عرض الإعدادات المتقدمة...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
-<translation id="7016992613359344582">قد تُمثل هذه الرسوم رسومًا لمرة واحدة أو رسومًا متكررة وقد تكون غير واضحة.</translation>
+<translation id="7016992613359344582">قد يتمّ تحصيل هذه الرسوم لمرة واحدة أو بشكل متكرر، وقد تكون غير واضحة.</translation>
 <translation id="7029809446516969842">كلمات المرور</translation>
+<translation id="7042837854211185817">للحصول على البطاقات على جميع الأجهزة، يُرجى تفعيل المزامنة.</translation>
 <translation id="7050187094878475250">لقد حاولت الوصول إلى <ph name="DOMAIN" />، ولكن الخادم قدم شهادة مدة صلاحيتها طويلة جدًا مما يجعلها غير جديرة بالثقة.</translation>
 <translation id="7053983685419859001">منع</translation>
 <translation id="7064851114919012435">معلومات الاتصال</translation>
@@ -1075,6 +1086,7 @@
 <translation id="8820817407110198400">الإشارات المرجعية</translation>
 <translation id="883848425547221593">إشارات أخرى</translation>
 <translation id="884264119367021077">عنوان الشحن</translation>
+<translation id="8846319957959474018">فتح التطبيقات بسهولة باستخدام الإشارات المرجعية</translation>
 <translation id="884923133447025588">لم يتمّ العثور على أي آلبة إبطال.</translation>
 <translation id="885730110891505394">‏مشاركة مع Google</translation>
 <translation id="8858065207712248076">‏يُوصي Chrome بإعادة تحديد كلمة المرور <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> في حال إعادة استخدامها في مواقع ويب أخرى.</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb
index 65d8e78..4bd2f1a 100644
--- a/components/strings/components_strings_bg.xtb
+++ b/components/strings/components_strings_bg.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Напред</translation>
 <translation id="2365563543831475020">Сигналът за срив, записан в/ъв <ph name="CRASH_TIME" />, не бе качен</translation>
 <translation id="2367567093518048410">Ниво</translation>
+<translation id="2378238891085281592">Преминахте в режим на частно сърфиране</translation>
 <translation id="2384307209577226199">Зададено по подразбиране в корпоративна среда</translation>
 <translation id="2386255080630008482">Сертификатът на сървъра е анулиран.</translation>
 <translation id="2392959068659972793">Да се показват правилата без зададена стойност</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Адрес за бърза доставка</translation>
 <translation id="3395827396354264108">Начин на вземане</translation>
 <translation id="3399952811970034796">Адрес за бърза доставка</translation>
+<translation id="3409072600744224192"><ph name="SIGN_IN_LINK" />, за да получите картите си на всичките си устройства.</translation>
 <translation id="3422248202833853650">Затворете другите програми, за да освободите памет.</translation>
 <translation id="3422472998109090673">Понастоящем няма достъп до <ph name="HOST_NAME" />.</translation>
 <translation id="3427092606871434483">Разрешаване (по подразбиране)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Споделяне с администратор</translation>
 <translation id="4515275063822566619">Картите и адресите са от Chrome и профила ви в Google (<ph name="ACCOUNT_EMAIL" />). Можете да ги управлявате от <ph name="BEGIN_LINK" />настройките<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Подробности</translation>
+<translation id="4524805452350978254">Управление на картите</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Опитайте да деактивирате разширенията.</translation>
 <translation id="457875822857220463">Бърза доставка</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Грешна парола</translation>
 <translation id="5056549851600133418">Статии за вас</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Проверете адреса на прокси сървъра<ph name="END_LINK" />.</translation>
+<translation id="5072538239104292703">Влезте в профила си и включете синхронизирането, за да получите картите си на всичките си устройства</translation>
 <translation id="5086888986931078152">Може да загубите достъп до защитено съдържание от някои сайтове.</translation>
 <translation id="5087286274860437796">Понастоящем сертификатът на сървъра не е валиден.</translation>
 <translation id="5087580092889165836">Добавяне на карта</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> от <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Избиране на информация за връзка</translation>
 <translation id="5327248766486351172">Име</translation>
+<translation id="5327567770033251652">Включете синхронизирането</translation>
 <translation id="5332219387342487447">Начин за доставка</translation>
 <translation id="5355557959165512791">В момента не можете да посетите сайта <ph name="SITE" />, защото сертификатът му е анулиран. Обикновено грешките в мрежата и атаките срещу нея са временни, така че тази страница вероятно ще работи по-късно.</translation>
 <translation id="536296301121032821">Съхраняването на настройките за правилото не бе успешно</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">За да видите начините на бърза доставка и изискванията, изберете адрес</translation>
 <translation id="5770114862687765385">Файлът изглежда е повреден. Кликнете върху бутона за повторно задаване, за да рестартирате сесията.</translation>
 <translation id="5778550464785688721">Пълен контрол над MIDI устройства</translation>
+<translation id="57838592816432529">Заглушаване</translation>
 <translation id="5784606427469807560">При потвърждаването на картата ви възникна проблем. Проверете връзката си с интернет и опитайте отново.</translation>
 <translation id="5785756445106461925">Освен това тази страница включва други ресурси, които не са защитени. Докато се предават, те могат да бъдат видени от други хора и да бъдат модифицирани от извършител на атака, така че да се промени изгледът на страницата.</translation>
 <translation id="5786044859038896871">Искате ли да се попълнят данните за кредитната ви карта?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Добавяне на телефонен номер</translation>
 <translation id="5869405914158311789">Няма достъп до този сайт</translation>
 <translation id="5869522115854928033">Запазени пароли</translation>
+<translation id="5887400589839399685">Картата бе запазена</translation>
 <translation id="5893752035575986141">Приемат се кредитни карти.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (синхронизирано)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{Използва се 1}other{Използват се #}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Потребител:</translation>
 <translation id="6944692733090228304">Въведохте паролата си на сайт, който не се управлява от <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. За да защитите профила си, не използвайте паролата си повторно в други приложения и сайтове.</translation>
 <translation id="6945221475159498467">Изберете</translation>
+<translation id="6948540501704460596"><ph name="SYNC_LINK" />, за да получите картите си на всичките си устройства.</translation>
 <translation id="6948701128805548767">За да видите начините на вземане и изискванията, изберете адрес</translation>
 <translation id="6949872517221025916">Задаване на нова парола</translation>
 <translation id="6950684638814147129">При синтактичния анализ на стойността в JSON възникна грешка: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Отворете страницата в нов частен раздел</translation>
 <translation id="6957887021205513506">Изглежда, че сертификатът на сървъра е подправен.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Устройство</translation>
 <translation id="6970216967273061347">Окръг</translation>
 <translation id="6973656660372572881">Посочени са както фиксирани прокси сървъри, така и URL адрес на скрипт във формат .pac.</translation>
+<translation id="6984479912851154518">Ще напуснете режима на частно сърфиране, за да платите във външно приложение. Искате ли да продължите?</translation>
 <translation id="6989763994942163495">Показване на разширените настройки...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Тези таксувания може да са еднократни или повтарящи се и е възможно да не са явни.</translation>
 <translation id="7029809446516969842">Пароли</translation>
+<translation id="7042837854211185817">Включете синхронизирането, за да получите картите си на всичките си устройства.</translation>
 <translation id="7050187094878475250">Опитахте да се свържете с/ъс <ph name="DOMAIN" />, но сървърът предостави сертификат, чийто период на валидност е твърде дълъг, за да е надежден.</translation>
 <translation id="7053983685419859001">Блокиране</translation>
 <translation id="7064851114919012435">Информация за връзка</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">Отметки</translation>
 <translation id="883848425547221593">Други отметки</translation>
 <translation id="884264119367021077">Адрес за доставка</translation>
+<translation id="8846319957959474018">Лесно отваряйте приложения с помощта на отметки</translation>
 <translation id="884923133447025588">Не е намерен механизъм за анулиране.</translation>
 <translation id="885730110891505394">Споделяне с Google</translation>
 <translation id="8858065207712248076">Chrome препоръчва да зададете повторно паролата си за <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />, ако сте я използвали и на други сайтове.</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb
index 52184e72..bc168ee1 100644
--- a/components/strings/components_strings_bn.xtb
+++ b/components/strings/components_strings_bn.xtb
@@ -689,6 +689,7 @@
 <translation id="5765072501007116331">ডেলিভারির পদ্ধতি এবং প্রয়োজনীয়তাগুলি দেখতে একটি ঠিকানা বেছে নিন</translation>
 <translation id="5770114862687765385">ফাইলটি ত্রুটিপূর্ণ বলে মনে হচ্ছে। সেশনটি রিসেট করার জন্য 'রিসেট' বোতামে ক্লিক করুন।</translation>
 <translation id="5778550464785688721">MIDI ডিভাইসসমূহ পূর্ণ নিয়ন্ত্রণ</translation>
+<translation id="57838592816432529">মিউট করুন</translation>
 <translation id="5784606427469807560">আপনার কার্ডটি নিশ্চিত করতে একটি সমস্যা হয়েছিল৷আপনার ইন্টারনেট সংযোগ পরীক্ষা করে আবার চেষ্টা করুন৷</translation>
 <translation id="5785756445106461925">উপরন্তু, এই পৃষ্ঠাতে অন্যান্য সংস্থান অন্তর্ভুক্ত রয়েছে যা নিরাপদ নয়৷ এই সংস্থানগুলি ট্রানজিটের সময় অন্যরা দেখতে পাবে এবং পৃষ্ঠাটির চেহারাটি পরিবর্তন করতে কোনও আক্রমণকারী এর পরিবর্তন করতে পারেন৷</translation>
 <translation id="5786044859038896871">আপনি কি আপনার কার্ডের তথ্য পূরণ করতে চান?</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index 5e2f2c7..aa0ac4a 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Continua</translation>
 <translation id="2365563543831475020">L'informe d'error capturat (<ph name="CRASH_TIME" />) no s'ha penjat</translation>
 <translation id="2367567093518048410">Nivell</translation>
+<translation id="2378238891085281592">Has passat al mode privat</translation>
 <translation id="2384307209577226199">Predeterminada de l'empresa</translation>
 <translation id="2386255080630008482">El certificat del servidor s'ha revocat.</translation>
 <translation id="2392959068659972793">Mostra les polítiques sense valors definits</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Adreça d'entrega</translation>
 <translation id="3395827396354264108">Mètode de recollida</translation>
 <translation id="3399952811970034796">Adreça d'entrega</translation>
+<translation id="3409072600744224192">Per accedir a les targetes des de tots els dispositius, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Prova de sortir d'altres programes per alliberar memòria.</translation>
 <translation id="3422472998109090673">Actualment no es pot accedir a <ph name="HOST_NAME" />.</translation>
 <translation id="3427092606871434483">Permet (opció predeterminada)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Comparteix informació amb l'administrador</translation>
 <translation id="4515275063822566619">Les targetes i les adreces s'obtenen de Chrome i del teu compte de Google (<ph name="ACCOUNT_EMAIL" />). Pots gestionar-les des de <ph name="BEGIN_LINK" />Configuració<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Detalls</translation>
+<translation id="4524805452350978254">Gestiona les targetes</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Desactiveu les extensions</translation>
 <translation id="457875822857220463">Entrega</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Contrasenya incorrecta</translation>
 <translation id="5056549851600133418">Articles que us poden interessar</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Comproveu l'adreça del servidor intermediari<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Per accedir a les targetes des de tots els dispositius, inicia la sessió i activa la sincronització.</translation>
 <translation id="5086888986931078152">Pot ser que perdis l'accés al contingut protegit d'alguns llocs web.</translation>
 <translation id="5087286274860437796">En aquest moment el certificat del servidor no és vàlid.</translation>
 <translation id="5087580092889165836">Afegiu una targeta</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> de <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Tria la informació de contacte</translation>
 <translation id="5327248766486351172">Nom</translation>
+<translation id="5327567770033251652">activa la sincronització</translation>
 <translation id="5332219387342487447">Mètode d'enviament</translation>
 <translation id="5355557959165512791">En aquest moment no pots visitar <ph name="SITE" /> perquè se li ha revocat el certificat. Els atacs i els errors de xarxa acostumen a ser temporals, o sigui que probablement la pàgina funcionarà més endavant.</translation>
 <translation id="536296301121032821">No s'ha pogut emmagatzemar la configuració de la política</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Per veure els mètodes i els requisits d'entrega, selecciona una adreça</translation>
 <translation id="5770114862687765385">Sembla que el fitxer està malmès. Fes clic al botó Restableix per restablir la sessió.</translation>
 <translation id="5778550464785688721">Control total dels dispositius MIDI</translation>
+<translation id="57838592816432529">Silencia</translation>
 <translation id="5784606427469807560">S'ha produït un problema en confirmar la targeta. Comprova la connexió a Internet i torna-ho a provar.</translation>
 <translation id="5785756445106461925">A més, aquesta pàgina conté altres recursos que no són segurs. La resta d'usuaris poden visualitzar-los mentre estan en trànsit, i algun atacant podria modificar-los per canviar l'aparença de la pàgina.</translation>
 <translation id="5786044859038896871">Vols emplenar la informació de la teva targeta?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Afegeix un número de telèfon</translation>
 <translation id="5869405914158311789">No es pot accedir a aquest lloc</translation>
 <translation id="5869522115854928033">Contrasenyes desades</translation>
+<translation id="5887400589839399685">S'ha desat la targeta</translation>
 <translation id="5893752035575986141">S'accepten targetes de crèdit.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (informació sincronitzada)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 en ús}other{# en ús}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Usuari:</translation>
 <translation id="6944692733090228304">Has introduït la contrasenya en un lloc web que no està gestionat per <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Per protegir el teu compte, no facis servir la mateixa contrasenya en altres aplicacions ni llocs web.</translation>
 <translation id="6945221475159498467">Selecciona</translation>
+<translation id="6948540501704460596">Per accedir a les targetes des de tots els dispositius, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Per veure els mètodes i els requisits de recollida, selecciona una adreça</translation>
 <translation id="6949872517221025916">Restableix la contrasenya</translation>
 <translation id="6950684638814147129">S'ha produït un error en analitzar el valor JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Obre la pàgina en una pestanya privada nova</translation>
 <translation id="6957887021205513506">Sembla que el certificat del servidor és una falsificació.</translation>
 <translation id="6965382102122355670">D'acord</translation>
 <translation id="6965978654500191972">Dispositiu</translation>
 <translation id="6970216967273061347">Districte</translation>
 <translation id="6973656660372572881">S'especifiquen tant els servidors intermediaris fixos com un URL d'script .pac.</translation>
+<translation id="6984479912851154518">Per pagar amb una aplicació externa sortiràs del mode privat. Vols continuar?</translation>
 <translation id="6989763994942163495">Mostra la configuració avançada...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Aquests càrrecs poden ser únics o periòdics i és possible que no s'indiquin d'una manera evident.</translation>
 <translation id="7029809446516969842">Contrasenyes</translation>
+<translation id="7042837854211185817">Per accedir a les targetes des de tots els dispositius, activa la sincronització.</translation>
 <translation id="7050187094878475250">Heu provat de connectar-vos a <ph name="DOMAIN" />, però el servidor ha presentat un certificat amb un període de validesa massa gran per poder confiar-hi.</translation>
 <translation id="7053983685419859001">Bloqueja</translation>
 <translation id="7064851114919012435">Informació de contacte</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">Adreces d'interès</translation>
 <translation id="883848425547221593">Altres adreces d'interès</translation>
 <translation id="884264119367021077">Adreça d’enviament</translation>
+<translation id="8846319957959474018">Obre aplicacions fàcilment amb les adreces d'interès</translation>
 <translation id="884923133447025588">No s'ha trobat cap mecanisme de revocació.</translation>
 <translation id="885730110891505394">Comparteix informació amb Google</translation>
 <translation id="8858065207712248076">Chrome et recomana que restableixis la contrasenya per a <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> si l'has fet servir en altres llocs web.</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb
index 85e4d7db..afcb38b 100644
--- a/components/strings/components_strings_cs.xtb
+++ b/components/strings/components_strings_cs.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Pokračovat</translation>
 <translation id="2365563543831475020">Zpráva o selhání pořízená <ph name="CRASH_TIME" /> nebyla nahrána</translation>
 <translation id="2367567093518048410">Úroveň</translation>
+<translation id="2378238891085281592">Jste v soukromém režimu</translation>
 <translation id="2384307209577226199">Výchozí podnikové nastavení</translation>
 <translation id="2386255080630008482">Certifikát serveru byl zamítnut.</translation>
 <translation id="2392959068659972793">Zobrazit zásady bez nastavených hodnot</translation>
@@ -352,6 +353,7 @@
 <translation id="3391030046425686457">Adresa doručení</translation>
 <translation id="3395827396354264108">Způsob vyzvednutí</translation>
 <translation id="3399952811970034796">Adresa doručení</translation>
+<translation id="3409072600744224192">Chcete-li své záložky synchronizovat do všech zařízení, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Zkuste uvolnit paměť ukončením jiných programů.</translation>
 <translation id="3422472998109090673">Web <ph name="HOST_NAME" /> momentálně není dostupný.</translation>
 <translation id="3427092606871434483">Povolit (výchozí)</translation>
@@ -510,6 +512,7 @@
 <translation id="450710068430902550">Sdílení s administrátorem</translation>
 <translation id="4515275063822566619">Karty a adresy pocházejí z Chromu a z vašeho účtu Google (<ph name="ACCOUNT_EMAIL" />). Můžete je spravovat v <ph name="BEGIN_LINK" />Nastavení<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Podrobnosti</translation>
+<translation id="4524805452350978254">Spravovat karty</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Zkuste zakázat rozšíření.</translation>
 <translation id="457875822857220463">Doručení</translation>
@@ -575,6 +578,7 @@
 <translation id="5045550434625856497">Nesprávné heslo</translation>
 <translation id="5056549851600133418">Články pro vás</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Zkontrolovat adresu proxy serveru<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Chcete-li mít karty ve všech zařízeních, přihlaste se a zapněte synchronizaci.</translation>
 <translation id="5086888986931078152">Můžete ztratit přístup k chráněnému obsahu z některých webů.</translation>
 <translation id="5087286274860437796">Certifikát serveru v tuto chvíli není platný.</translation>
 <translation id="5087580092889165836">Přidat kartu</translation>
@@ -620,6 +624,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> z <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Vybrat kontaktní údaje</translation>
 <translation id="5327248766486351172">Název</translation>
+<translation id="5327567770033251652">zapnout synchronizaci</translation>
 <translation id="5332219387342487447">Způsob dopravy</translation>
 <translation id="5355557959165512791">Web <ph name="SITE" /> teď nemůžete navštívit, protože jeho certifikát byl zrušen. Síťové chyby a útoky jsou obvykle dočasné, tato stránka pravděpodobně později bude fungovat.</translation>
 <translation id="536296301121032821">Ukládání nastavení zásady se nezdařilo</translation>
@@ -684,6 +689,7 @@
 <translation id="5765072501007116331">Chcete-li zobrazit způsoby doručení a požadavky, vyberte adresu</translation>
 <translation id="5770114862687765385">Soubor se zdá být poškozený. Relaci resetujete kliknutím na tlačítko Resetovat.</translation>
 <translation id="5778550464785688721">Úplná kontrola zařízení MIDI</translation>
+<translation id="57838592816432529">Ztlumit</translation>
 <translation id="5784606427469807560">Při ověřování vaší karty došlo k problému. Zkontrolujte připojení k internetu a zkuste to znovu.</translation>
 <translation id="5785756445106461925">Tato stránka obsahuje ještě další nezabezpečené zdroje. Tyto zdroje budou během přenosu moci zobrazit jiní uživatelé a případní útočníci je mohou upravit a změnit tak vzhled stránky.</translation>
 <translation id="5786044859038896871">Chcete vyplnit informace o kartě?</translation>
@@ -695,6 +701,7 @@
 <translation id="5866257070973731571">Přidání telefonního čísla</translation>
 <translation id="5869405914158311789">Tento web není dostupný</translation>
 <translation id="5869522115854928033">Uložená hesla</translation>
+<translation id="5887400589839399685">Karta byla uložena</translation>
 <translation id="5893752035575986141">Obchodník přijímá kreditní karty.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (synchronizováno)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{Používá se 1}few{Používají se #}many{Používá se #}other{Používá se #}}</translation>
@@ -811,18 +818,22 @@
 <translation id="6915804003454593391">Uživatel:</translation>
 <translation id="6944692733090228304">Zadali jste heslo na webu, který není spravován organizací <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Aby byl váš účet chráněn, nepoužívejte jeho heslo v jiných aplikacích a na jiných webech.</translation>
 <translation id="6945221475159498467">Vybrat</translation>
+<translation id="6948540501704460596">Chcete-li své záložky synchronizovat do všech zařízení, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Chcete-li zobrazit způsoby vyzvednutí a požadavky, vyberte adresu</translation>
 <translation id="6949872517221025916">Resetovat heslo</translation>
 <translation id="6950684638814147129">Při analýze hodnoty JSON došlo k chybě: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Otevřete stránku na nové anonymní kartě</translation>
 <translation id="6957887021205513506">Zdá se, že certifikát serveru je podvrh.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Zařízení</translation>
 <translation id="6970216967273061347">Obvod</translation>
 <translation id="6973656660372572881">Určeny jsou pevně dané servery proxy i adresa URL skriptu PAC.</translation>
+<translation id="6984479912851154518">Chystáte se opustit soukromý režim, abyste mohli zaplatit v externí aplikaci. Chcete pokračovat?</translation>
 <translation id="6989763994942163495">Zobrazit rozšířená nastavení...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Může se jednat o jednorázové nebo opakované poplatky, které nemusejí být jasně patrné.</translation>
 <translation id="7029809446516969842">Hesla</translation>
+<translation id="7042837854211185817">Chcete-li mít karty ve všech zařízeních, zapněte synchronizaci.</translation>
 <translation id="7050187094878475250">Pokusili jste se připojit k doméně <ph name="DOMAIN" />, ale server předložil certifikát, který má příliš dlouhé období platnosti a je proto nedůvěryhodný.</translation>
 <translation id="7053983685419859001">Blokovat</translation>
 <translation id="7064851114919012435">Kontaktní údaje</translation>
@@ -1070,6 +1081,7 @@
 <translation id="8820817407110198400">Záložky</translation>
 <translation id="883848425547221593">Jiné záložky</translation>
 <translation id="884264119367021077">Dodací adresa</translation>
+<translation id="8846319957959474018">Aplikace otevřete snadno pomocí záložek</translation>
 <translation id="884923133447025588">Nebyl nalezen žádný mechanismus zamítnutí.</translation>
 <translation id="885730110891505394">Sdílení s Googlem</translation>
 <translation id="8858065207712248076">Pokud jste heslo organizace <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> použili na jiném webu, doporučujeme vám ho resetovat.</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index a108a47..1e4b4ba771 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Fortsæt</translation>
 <translation id="2365563543831475020">Nedbrudsrapporten, der blev registreret <ph name="CRASH_TIME" />, blev ikke uploadet</translation>
 <translation id="2367567093518048410">Niveau</translation>
+<translation id="2378238891085281592">Du er nu i privat tilstand</translation>
 <translation id="2384307209577226199">Virksomhedsstandard</translation>
 <translation id="2386255080630008482">Serverens certifikat er blevet tilbagekaldt.</translation>
 <translation id="2392959068659972793">Vis politikker uden nogen værdier</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Leveringsadresse</translation>
 <translation id="3395827396354264108">Afhentningsmetode</translation>
 <translation id="3399952811970034796">Leveringsadresse</translation>
+<translation id="3409072600744224192"><ph name="SIGN_IN_LINK" /> for at se dine kort på alle dine enheder.</translation>
 <translation id="3422248202833853650">Prøv at lukke programmer for at frigøre hukommelse.</translation>
 <translation id="3422472998109090673"><ph name="HOST_NAME" /> kan ikke læses i øjeblikket.</translation>
 <translation id="3427092606871434483">Tillad (standardindstilling)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Deling med administrator</translation>
 <translation id="4515275063822566619">Kort og adresser er fra Chrome og din Google-konto (<ph name="ACCOUNT_EMAIL" />). Du kan administrere dem i <ph name="BEGIN_LINK" />Indstillinger<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Detaljer</translation>
+<translation id="4524805452350978254">Administrer kort</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Prøv at deaktivere dine udvidelser.</translation>
 <translation id="457875822857220463">Levering</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Ugyldig adgangskode</translation>
 <translation id="5056549851600133418">Artikler til dig</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Tjekke proxy-adressen<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Log ind, og aktivér synkronisering for at se dine kort på alle dine enheder.</translation>
 <translation id="5086888986931078152">Du kan miste adgang til beskyttet indhold fra visse websites.</translation>
 <translation id="5087286274860437796">Serverens certifikatet er ikke gyldigt i øjeblikket.</translation>
 <translation id="5087580092889165836">Tilføj kort</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> af <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Vælg kontaktoplysninger</translation>
 <translation id="5327248766486351172">Navn</translation>
+<translation id="5327567770033251652">aktivér synkronisering</translation>
 <translation id="5332219387342487447">Leveringsmetode</translation>
 <translation id="5355557959165512791">Du kan ikke besøge <ph name="SITE" /> lige nu, da dets certifikat er blevet tilbagekaldt. Netværksfejl og angreb er normalt midlertidige, så siden vil sandsynligvis fungere igen senere.</translation>
 <translation id="536296301121032821">Der kunne ikke gemmes indstillinger for politik</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Vælg en adresse for at se leveringsmetoder og -krav</translation>
 <translation id="5770114862687765385">Filen ser ud til at være beskadiget. Klik på knappen "Nulstil" for at nulstille sessionen.</translation>
 <translation id="5778550464785688721">Fuld kontrol over MIDI</translation>
+<translation id="57838592816432529">Slå lyden fra</translation>
 <translation id="5784606427469807560">Der opstod et problem under bekræftelsen af dit kort. Kontrollér, at du har forbindelse til internettet, og prøv igen.</translation>
 <translation id="5785756445106461925">Desuden indeholder denne side andre ressourcer, som ikke er sikre. Disse ressourcer kan ses af andre under overførslen og kan ændres af en hacker, så siden ser anderledes ud.</translation>
 <translation id="5786044859038896871">Skal dine kortoplysninger udfyldes?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Tilføj telefonnummer</translation>
 <translation id="5869405914158311789">Der kan ikke oprettes forbindelse til dette website</translation>
 <translation id="5869522115854928033">Gemte adgangskoder</translation>
+<translation id="5887400589839399685">Kortet er gemt</translation>
 <translation id="5893752035575986141">Kreditkort accepteres.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (synkroniseret)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 i brug}one{# i brug}other{# i brug}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Bruger:</translation>
 <translation id="6944692733090228304">Du indtastede din adgangskode på et website, der ikke administreres af <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Du kan beskytte din konto ved at undgå at bruge din adgangskode i andre apps og på andre websites.</translation>
 <translation id="6945221475159498467">Vælg</translation>
+<translation id="6948540501704460596"><ph name="SYNC_LINK" /> for at se dine kort på alle dine enheder.</translation>
 <translation id="6948701128805548767">Vælg en adresse for at se afhentningsmetoder og -krav</translation>
 <translation id="6949872517221025916">Nulstil adgangskode</translation>
 <translation id="6950684638814147129">Der opstod en fejl under parsing af JSON-værdien: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Åbn siden på en ny privat fane</translation>
 <translation id="6957887021205513506">Serverens certifikat ser ud til at være en forfalskning.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Enhed</translation>
 <translation id="6970216967273061347">Distrikt</translation>
 <translation id="6973656660372572881">Både faste proxyservere og en webadresse for .pac-script angives.</translation>
+<translation id="6984479912851154518">Du forlader privat tilstand for at betale via en ekstern app. Vil du fortsætte?</translation>
 <translation id="6989763994942163495">Vis avancerede indstillinger...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Disse debiteringer kan være enkeltstående eller gentagne og fremgår muligvis ikke tydeligt.</translation>
 <translation id="7029809446516969842">Adgangskoder</translation>
+<translation id="7042837854211185817">Aktivér synkronisering for at se dine kort på alle dine enheder.</translation>
 <translation id="7050187094878475250">Du forsøgte at gå til <ph name="DOMAIN" />, men serveren præsenterede et certifikat, hvis gyldighedsperiode er for lang til at være pålidelig.</translation>
 <translation id="7053983685419859001">Bloker</translation>
 <translation id="7064851114919012435">Kontaktoplysninger</translation>
@@ -1075,6 +1086,7 @@
 <translation id="8820817407110198400">Bogmærker</translation>
 <translation id="883848425547221593">Andre bogmærker</translation>
 <translation id="884264119367021077">Leveringsadresse</translation>
+<translation id="8846319957959474018">Åbn nemt apps med bogmærker</translation>
 <translation id="884923133447025588">Der blev ikke fundet nogen funktion til tilbagekaldelse.</translation>
 <translation id="885730110891505394">Deling med Google</translation>
 <translation id="8858065207712248076">Chrome anbefaler, at du nulstiller din adgangskode til <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />, hvis du har brugt den på andre websites.</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index 839404b..458af0f 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Weiter</translation>
 <translation id="2365563543831475020">Absturzbericht erfasst am <ph name="CRASH_TIME" />, wurde nicht hochgeladen</translation>
 <translation id="2367567093518048410">Ebene</translation>
+<translation id="2378238891085281592">Sie befinden sich jetzt im privaten Modus</translation>
 <translation id="2384307209577226199">Standardeinstellung durch Unternehmen</translation>
 <translation id="2386255080630008482">Das Serverzertifikat wurde aufgehoben.</translation>
 <translation id="2392959068659972793">Richtlinien ohne Wert zeigen</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Lieferadresse</translation>
 <translation id="3395827396354264108">Abholoption</translation>
 <translation id="3399952811970034796">Lieferadresse</translation>
+<translation id="3409072600744224192">Karten auf allen Ihren Geräten abrufen: <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Versuchen Sie, andere Programme zu beenden, um Speicher freizugeben.</translation>
 <translation id="3422472998109090673"><ph name="HOST_NAME" /> ist momentan nicht erreichbar.</translation>
 <translation id="3427092606871434483">Zulassen (Standardeinstellung)</translation>
@@ -513,6 +515,7 @@
 <translation id="450710068430902550">Datenfreigabe an Administrator</translation>
 <translation id="4515275063822566619">Karten und Adressen stammen aus Chrome und aus Ihrem Google-Konto (<ph name="ACCOUNT_EMAIL" />). Sie können sie in den <ph name="BEGIN_LINK" />Einstellungen<ph name="END_LINK" /> verwalten.</translation>
 <translation id="4522570452068850558">Details</translation>
+<translation id="4524805452350978254">Karten verwalten</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Deaktivieren Sie Ihre Erweiterungen.</translation>
 <translation id="457875822857220463">Lieferung</translation>
@@ -578,6 +581,7 @@
 <translation id="5045550434625856497">Falsches Passwort</translation>
 <translation id="5056549851600133418">Artikel für Sie</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Proxyadresse prüfen<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Wenn Sie Ihre Karten auf allen Geräten sehen möchten, melden Sie sich an und aktivieren Sie die Synchronisierung.</translation>
 <translation id="5086888986931078152">Eventuell verlieren Sie den Zugriff auf geschützte Inhalte von einigen Websites.</translation>
 <translation id="5087286274860437796">Das Serverzertifikat ist zurzeit ungültig.</translation>
 <translation id="5087580092889165836">Karte hinzufügen</translation>
@@ -599,7 +603,7 @@
 <translation id="5190835502935405962">Lesezeichenleiste</translation>
 <translation id="5201306358585911203">Auf einer in dieser Seite eingebetteten Seite wird Folgendes angezeigt</translation>
 <translation id="5205222826937269299">Name erforderlich</translation>
-<translation id="5215116848420601511">Zahlungsmethoden und Adressen bei Google Pay</translation>
+<translation id="5215116848420601511">Zahlungsmethoden und Adressen bei Google Pay verwenden</translation>
 <translation id="5222812217790122047">E-Mail-Adresse erforderlich</translation>
 <translation id="5230733896359313003">Versandadresse</translation>
 <translation id="5250209940322997802">"Mit Netzwerk verbinden"</translation>
@@ -623,6 +627,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> von <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Kontaktdaten auswählen</translation>
 <translation id="5327248766486351172">Name</translation>
+<translation id="5327567770033251652">Synchronisierung aktivieren</translation>
 <translation id="5332219387342487447">Versandart</translation>
 <translation id="5355557959165512791">Sie können <ph name="SITE" /> zurzeit nicht aufrufen, da das Zertifikat widerrufen wurde. Netzwerkfehler und Angriffe sind in der Regel nur vorübergehend, sodass die Seite wahrscheinlich später wieder funktioniert.</translation>
 <translation id="536296301121032821">Fehler beim Speichern der Richtlinieneinstellungen</translation>
@@ -687,6 +692,7 @@
 <translation id="5765072501007116331">Wählen Sie eine Adresse aus, um Lieferoptionen und -anforderungen zu sehen</translation>
 <translation id="5770114862687765385">Die Datei scheint beschädigt zu sein. Klicken Sie auf die Schaltfläche "Zurücksetzen", um die Sitzung zurückzusetzen.</translation>
 <translation id="5778550464785688721">MIDI-Geräte: volle Kontrolle</translation>
+<translation id="57838592816432529">Stummschalten</translation>
 <translation id="5784606427469807560">Beim Bestätigen Ihrer Karte ist ein Problem aufgetreten. Überprüfen Sie Ihre Internetverbindung und versuchen Sie es noch einmal.</translation>
 <translation id="5785756445106461925">Außerdem enthält diese Seite andere, nicht sichere Ressourcen. Diese Ressourcen können während der Übertragung von anderen Nutzern angezeigt und von Angreifern bearbeitet werden, die das Layout der Seite verändern.</translation>
 <translation id="5786044859038896871">Möchten Sie Ihre Kreditkarteninformationen eingeben?</translation>
@@ -698,6 +704,7 @@
 <translation id="5866257070973731571">Telefonnummer hinzufügen</translation>
 <translation id="5869405914158311789">Diese Website ist nicht erreichbar</translation>
 <translation id="5869522115854928033">Gespeicherte Passwörter</translation>
+<translation id="5887400589839399685">Karte gespeichert</translation>
 <translation id="5893752035575986141">Kreditkarten werden akzeptiert.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (synchronisiert)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 wird verwendet}other{# werden verwendet}}</translation>
@@ -815,18 +822,22 @@
 <translation id="6915804003454593391">Nutzer:</translation>
 <translation id="6944692733090228304">Sie haben Ihr Passwort auf einer Website eingegeben, die nicht von <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> verwaltet wird. Zum Schutz Ihres Kontos sollten Sie das Passwort nicht für andere Apps und Websites verwenden.</translation>
 <translation id="6945221475159498467">Auswählen</translation>
+<translation id="6948540501704460596">Karten auf allen Ihren Geräten abrufen: <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Wählen Sie eine Adresse aus, um Abholoptionen und -anforderungen zu sehen</translation>
 <translation id="6949872517221025916">Passwort zurücksetzen</translation>
 <translation id="6950684638814147129">Fehler beim Parsen des JSON-Werts: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Seite in neuem, privatem Tab öffnen</translation>
 <translation id="6957887021205513506">Das Zertifikat des Servers ist möglicherweise eine Fälschung.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Gerät</translation>
 <translation id="6970216967273061347">Bezirk</translation>
 <translation id="6973656660372572881">Sowohl feste Proxyserver als auch eine PAC-Skript-URL sind festgelegt.</translation>
+<translation id="6984479912851154518">Der private Modus wird beendet, um über eine externe Anwendung zu zahlen. Weiter?</translation>
 <translation id="6989763994942163495">Erweiterte Einstellungen anzeigen</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Diese Belastungen können einmalig oder wiederkehrend sein und sind vielleicht nicht offensichtlich.</translation>
 <translation id="7029809446516969842">Passwörter</translation>
+<translation id="7042837854211185817">Wenn Sie Ihre Karten auf allen Geräten sehen möchten, aktivieren Sie die Synchronisierung.</translation>
 <translation id="7050187094878475250">Sie haben versucht, <ph name="DOMAIN" /> zu erreichen. Der Server hat jedoch ein Zertifikat präsentiert, dessen Gültigkeitsdauer zu lang ist, um vertrauenswürdig zu sein.</translation>
 <translation id="7053983685419859001">Blockieren</translation>
 <translation id="7064851114919012435">Kontaktdaten</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">Lesezeichen</translation>
 <translation id="883848425547221593">Andere Lesezeichen</translation>
 <translation id="884264119367021077">Versandadresse</translation>
+<translation id="8846319957959474018">Apps einfach über Lesezeichen öffnen</translation>
 <translation id="884923133447025588">Kein Sperrmechanismus gefunden.</translation>
 <translation id="885730110891505394">Datenfreigabe an Google</translation>
 <translation id="8858065207712248076">Chrome empfiehlt, Ihr Passwort für <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> zurückzusetzen, wenn Sie es auf anderen Websites verwendet haben.</translation>
@@ -1091,7 +1103,7 @@
 <translation id="8957210676456822347">Erfassungsportal-Autorisierung</translation>
 <translation id="8971063699422889582">Das Serverzertifikat ist abgelaufen.</translation>
 <translation id="8978053250194585037">Google Safe Browsing hat kürzlich <ph name="BEGIN_LINK" />Phishingaktivitäten<ph name="END_LINK" /> auf <ph name="SITE" /> festgestellt. Phishingwebsites geben sich als andere Websites aus, um Sie zu täuschen.</translation>
-<translation id="8983003182662520383">Zahlungsmethoden und Adressen bei Google Pay</translation>
+<translation id="8983003182662520383">Zahlungsmethoden und Adressen bei Google Pay verwenden</translation>
 <translation id="8987927404178983737">Monat</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Die Website, die Sie aufrufen möchten, enthält schädliche Programme</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb
index 865e29b..fdfea38 100644
--- a/components/strings/components_strings_el.xtb
+++ b/components/strings/components_strings_el.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Συνέχεια</translation>
 <translation id="2365563543831475020">Οι αναφορές σφαλμάτων που καταγράφηκαν <ph name="CRASH_TIME" /> δεν έχουν μεταφορτωθεί</translation>
 <translation id="2367567093518048410">Επίπεδο</translation>
+<translation id="2378238891085281592">Ενεργοποιήσατε την κατάσταση ιδιωτικής περιήγησης</translation>
 <translation id="2384307209577226199">Προεπιλογή επιχείρησης</translation>
 <translation id="2386255080630008482">Το πιστοποιητικό του διακομιστή ανακλήθηκε.</translation>
 <translation id="2392959068659972793">Εμφάνιση πολιτικών χωρίς τιμή που να έχει οριστεί.</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Διεύθυνση παράδοσης</translation>
 <translation id="3395827396354264108">Τρόπος παραλαβής</translation>
 <translation id="3399952811970034796">Διεύθυνση παράδοσης</translation>
+<translation id="3409072600744224192">Για να έχετε πρόσβαση στις κάρτες σας σε όλες τις συσκευές σας, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Δοκιμάστε να εξέλθετε από τα άλλα προγράμματα για να απελευθερώσετε μνήμη.</translation>
 <translation id="3422472998109090673">Προς το παρόν, δεν είναι δυνατή η πρόσβαση στον κεντρικό υπολογιστή <ph name="HOST_NAME" />.</translation>
 <translation id="3427092606871434483">Να επιτρέπεται (προεπιλογή)</translation>
@@ -515,6 +517,7 @@
 <translation id="450710068430902550">Κοινοποίηση στο διαχειριστή</translation>
 <translation id="4515275063822566619">Οι κάρτες και οι διευθύνσεις προέρχονται από το Chrome και τον Λογαριασμό σας Google (<ph name="ACCOUNT_EMAIL" />). Μπορείτε να τις διαχειριστείτε στις <ph name="BEGIN_LINK" />Ρυθμίσεις<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Λεπτομέρειες</translation>
+<translation id="4524805452350978254">Διαχείριση καρτών</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Δοκιμάστε να απενεργοποιήσετε τις επεκτάσεις σας.</translation>
 <translation id="457875822857220463">Παράδοση</translation>
@@ -580,6 +583,7 @@
 <translation id="5045550434625856497">Λανθασμένος κωδικός πρόσβασης</translation>
 <translation id="5056549851600133418">Άρθρα για εσάς</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Ελέγξτε τη διεύθυνση του διακομιστή μεσολάβησης<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Για να έχετε πρόσβαση στις κάρτες σας σε όλες τις συσκευές, συνδεθείτε και ενεργοποιήστε τον συγχρονισμό.</translation>
 <translation id="5086888986931078152">Ενδέχεται να χάσετε την πρόσβαση σε προστατευμένο περιεχόμενο από ορισμένους ιστοτόπους.</translation>
 <translation id="5087286274860437796">Το πιστοποιητικό του διακομιστή δεν είναι έγκυρο αυτήν τη στιγμή.</translation>
 <translation id="5087580092889165836">Προσθήκη κάρτας</translation>
@@ -625,6 +629,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> από <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Επιλογή στοιχείων επικοινωνίας</translation>
 <translation id="5327248766486351172">Όνομα</translation>
+<translation id="5327567770033251652">ενεργοποίηση συγχρονισμού</translation>
 <translation id="5332219387342487447">Μέθοδος αποστολής</translation>
 <translation id="5355557959165512791">Δεν μπορείτε να επισκεφτείτε τον ιστότοπο <ph name="SITE" /> αυτήν τη στιγμή επειδή το πιστοποιητικό έχει ανακληθεί. Τα σφάλματα δικτύου και οι επιθέσεις είναι συνήθως προσωρινά, συνεπώς αυτή η σελίδα πιθανότατα θα λειτουργήσει αργότερα.</translation>
 <translation id="536296301121032821">Αποτυχία αποθήκευσης ρυθμίσεων πολιτικής</translation>
@@ -689,6 +694,7 @@
 <translation id="5765072501007116331">Για να δείτε τρόπους και απαιτήσεις παράδοσης, επιλέξτε μια διεύθυνση</translation>
 <translation id="5770114862687765385">Το αρχείο φαίνεται να είναι κατεστραμμένο. Κάντε κλικ στο κουμπί "Επαναφορά" για να επαναφέρετε την περίοδο λειτουργίας.</translation>
 <translation id="5778550464785688721">Πλήρης έλεγχος συσκευών MIDI</translation>
+<translation id="57838592816432529">Σίγαση</translation>
 <translation id="5784606427469807560">Παρουσιάστηκε κάποιο πρόβλημα κατά την επιβεβαίωση της κάρτας σας. Ελέγξτε τη σύνδεσή σας στο διαδίκτυο και δοκιμάστε ξανά.</translation>
 <translation id="5785756445106461925">Επίσης, αυτή η σελίδα περιέχει άλλους πόρους, οι οποίοι δεν είναι ασφαλείς. Αυτοί οι πόροι μπορούν να προβληθούν από άλλους χρήστες κατά τη μετάβαση και μπορούν να τροποποιηθούν από έναν εισβολέα ώστε να αλλάξει η εμφάνιση της σελίδας.</translation>
 <translation id="5786044859038896871">Θέλετε να συμπληρωθούν τα στοιχεία της κάρτας σας;</translation>
@@ -700,6 +706,7 @@
 <translation id="5866257070973731571">Προσθήκη αριθμού τηλεφώνου</translation>
 <translation id="5869405914158311789">Δεν είναι δυνατή η πρόσβαση σε αυτόν τον ιστότοπο</translation>
 <translation id="5869522115854928033">Αποθηκευμένοι κωδικοί πρόσβασης</translation>
+<translation id="5887400589839399685">Η κάρτα αποθηκεύτηκε</translation>
 <translation id="5893752035575986141">Οι πιστωτικές κάρτες γίνονται δεκτές.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (συγχρονισμένο)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 σε χρήση}other{# σε χρήση}}</translation>
@@ -817,18 +824,22 @@
 <translation id="6915804003454593391">Χρήστης</translation>
 <translation id="6944692733090228304">Καταχωρίσατε τον κωδικό πρόσβασής σας σε έναν ιστότοπο τον οποίο δεν διαχειρίζεται ο οργανισμός <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Για να προστατεύσετε τον λογαριασμό σας, μην χρησιμοποιήσετε ξανά αυτόν τον κωδικό πρόσβασης σε άλλες εφαρμογές και ιστότοπους.</translation>
 <translation id="6945221475159498467">Επιλογή</translation>
+<translation id="6948540501704460596">Για να έχετε πρόσβαση στις κάρτες σας σε όλες τις συσκευές σας, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Για να δείτε τρόπους και απαιτήσεις παραλαβής, επιλέξτε μια διεύθυνση</translation>
 <translation id="6949872517221025916">Επαναφορά κωδικού πρόσβασης</translation>
 <translation id="6950684638814147129">Σφάλμα κατά την ανάλυση της τιμής JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Ανοίξτε τη σελίδα σε μια νέα καρτέλα ιδιωτικής περιήγησης</translation>
 <translation id="6957887021205513506">Το πιστοποιητικό του διακομιστή φαίνεται να είναι πλαστό.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Συσκευή</translation>
 <translation id="6970216967273061347">Περιοχή</translation>
 <translation id="6973656660372572881">Καθορίζονται τόσο οι σταθεροί διακομιστές μεσολάβησης όσο και μια διεύθυνση URL σεναρίου .pac.</translation>
+<translation id="6984479912851154518">Αποχώρηση από την κατάσταση ιδιωτικής περιήγησης για πληρωμή μέσω εξωτερικής εφαρμογής. Συνέχεια;</translation>
 <translation id="6989763994942163495">Εμφάνιση σύνθετων ρυθμίσεων…</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Αυτές οι χρεώσεις μπορεί να είναι εφάπαξ ή επαναλαμβανόμενες και ίσως να μην είναι εμφανείς.</translation>
 <translation id="7029809446516969842">Κωδικοί πρόσβασης</translation>
+<translation id="7042837854211185817">Για να έχετε πρόσβαση στις κάρτες σας σε όλες τις συσκευές, ενεργοποιήστε τον συγχρονισμό.</translation>
 <translation id="7050187094878475250">Επιχειρήσατε να μεταβείτε στο <ph name="DOMAIN" />, αλλά ο διακομιστής παρουσίασε ένα πιστοποιητικό με περίοδο εγκυρότητας η οποία είναι πολύ μεγάλη για να θεωρηθεί αξιόπιστη.</translation>
 <translation id="7053983685419859001">Αποκλεισμός</translation>
 <translation id="7064851114919012435">Στοιχεία επικοινωνίας</translation>
@@ -1076,6 +1087,7 @@
 <translation id="8820817407110198400">Σελιδοδείκτες</translation>
 <translation id="883848425547221593">Άλλοι σελιδοδείκτες</translation>
 <translation id="884264119367021077">Διεύθυνση αποστολής</translation>
+<translation id="8846319957959474018">Εύκολο άνοιγμα εφαρμογών με σελιδοδείκτες</translation>
 <translation id="884923133447025588">Δεν εντοπίστηκε μηχανισμός ακύρωσης.</translation>
 <translation id="885730110891505394">Κοινοποίηση στις υπηρεσίες της Google</translation>
 <translation id="8858065207712248076">Το Chrome συνιστά την επαναφορά του κωδικού πρόσβασης <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> εάν τον έχετε χρησιμοποιήσει και σε άλλους ιστοτόπους.</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index 37f55cde..523adc5 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Continue</translation>
 <translation id="2365563543831475020">Crash report captured on <ph name="CRASH_TIME" /> was not uploaded</translation>
 <translation id="2367567093518048410">Level</translation>
+<translation id="2378238891085281592">You’ve gone private</translation>
 <translation id="2384307209577226199">Enterprise default</translation>
 <translation id="2386255080630008482">Server's certificate has been revoked</translation>
 <translation id="2392959068659972793">Show policies with no value set</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Delivery address</translation>
 <translation id="3395827396354264108">Pickup method</translation>
 <translation id="3399952811970034796">Delivery Address</translation>
+<translation id="3409072600744224192">To get your cards on all your devices, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Try exiting other programmes to free up memory.</translation>
 <translation id="3422472998109090673"><ph name="HOST_NAME" /> is currently unreachable.</translation>
 <translation id="3427092606871434483">Allow (default)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Sharing with Administrator</translation>
 <translation id="4515275063822566619">Cards and addresses are from Chrome and your Google account (<ph name="ACCOUNT_EMAIL" />). You can manage them in <ph name="BEGIN_LINK" />Settings<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Details</translation>
+<translation id="4524805452350978254">Manage cards</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Try disabling your extensions.</translation>
 <translation id="457875822857220463">Delivery</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Incorrect password</translation>
 <translation id="5056549851600133418">Articles for you</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Checking the proxy address<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">To get your cards on all devices, sign in and turn on sync.</translation>
 <translation id="5086888986931078152">You may lose access to protected content from some sites.</translation>
 <translation id="5087286274860437796">Server's certificate is not valid at this time.</translation>
 <translation id="5087580092889165836">Add card</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> of <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Choose contact info</translation>
 <translation id="5327248766486351172">Name</translation>
+<translation id="5327567770033251652">turn on sync</translation>
 <translation id="5332219387342487447">Delivery Method</translation>
 <translation id="5355557959165512791">You cannot visit <ph name="SITE" /> right now because its certificate has been revoked. Network errors and attacks are usually temporary, so this page will probably work later.</translation>
 <translation id="536296301121032821">Failed to store policy settings</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">To see delivery methods and requirements, select an address</translation>
 <translation id="5770114862687765385">The file seems to be corrupted. Click the 'Reset' button to reset the session.</translation>
 <translation id="5778550464785688721">MIDI devices full control</translation>
+<translation id="57838592816432529">Mute</translation>
 <translation id="5784606427469807560">There was a problem confirming your card. Check your Internet connection and try again.</translation>
 <translation id="5785756445106461925">Further, this page includes other resources which are not secure. These resources can be viewed by others while in transit, and can be modified by an attacker to change the look of the page.</translation>
 <translation id="5786044859038896871">Do you want to fill in your card info?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Add Phone Number</translation>
 <translation id="5869405914158311789">This site can’t be reached</translation>
 <translation id="5869522115854928033">Saved passwords</translation>
+<translation id="5887400589839399685">Card saved</translation>
 <translation id="5893752035575986141">Credit cards are accepted.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (synced)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 in use}other{# in use}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">User:</translation>
 <translation id="6944692733090228304">You entered your password on a site that’s not managed by <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. To protect your account, don’t reuse your password on other apps and sites.</translation>
 <translation id="6945221475159498467">Select</translation>
+<translation id="6948540501704460596">To get your cards on all your devices, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">To see pickup methods and requirements, select an address</translation>
 <translation id="6949872517221025916">Reset password</translation>
 <translation id="6950684638814147129">Error while parsing JSON value: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Open page in a new Private tab</translation>
 <translation id="6957887021205513506">The server's certificate appears to be a forgery.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Device</translation>
 <translation id="6970216967273061347">District</translation>
 <translation id="6973656660372572881">Both fixed proxy servers and a .pac script URL are specified.</translation>
+<translation id="6984479912851154518">Leaving private mode to pay via an external application. Continue?</translation>
 <translation id="6989763994942163495">+ Show advanced settings</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">These charges could be one-off or recurring and may not be obvious.</translation>
 <translation id="7029809446516969842">Passwords</translation>
+<translation id="7042837854211185817">To get your cards on all devices, turn on sync.</translation>
 <translation id="7050187094878475250">You attempted to reach <ph name="DOMAIN" />, but the server presented a certificate whose validity period is too long to be trustworthy.</translation>
 <translation id="7053983685419859001">Block</translation>
 <translation id="7064851114919012435">Contact info</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">Bookmarks</translation>
 <translation id="883848425547221593">Other Bookmarks</translation>
 <translation id="884264119367021077">Delivery address</translation>
+<translation id="8846319957959474018">Open apps easily with bookmarks</translation>
 <translation id="884923133447025588">No revocation mechanism found.</translation>
 <translation id="885730110891505394">Sharing with Google</translation>
 <translation id="8858065207712248076">Chrome recommends resetting your <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> password if you reused it on other sites.</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb
index 36f7768..2106de2 100644
--- a/components/strings/components_strings_es-419.xtb
+++ b/components/strings/components_strings_es-419.xtb
@@ -689,6 +689,7 @@
 <translation id="5765072501007116331">Para ver los requisitos y métodos de entrega, selecciona una dirección</translation>
 <translation id="5770114862687765385">Es posible que el archivo esté dañado. Haz clic en "Restablecer" para reiniciar la sesión.</translation>
 <translation id="5778550464785688721">Control total de dispositivos MIDI</translation>
+<translation id="57838592816432529">Silenciar</translation>
 <translation id="5784606427469807560">Se produjo un problema al confirmar tu tarjeta. Comprueba tu conexión a Internet y vuelve a intentarlo.</translation>
 <translation id="5785756445106461925">Además, esta página incluye otros recursos que no son seguros. Otras personas pueden ver estos recursos mientras se encuentran en tránsito, y un atacante puede modificarlos para cambiar la apariencia de la página.</translation>
 <translation id="5786044859038896871">¿Deseas llenar los campos con la información de tu tarjeta?</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index a8a136e1..0761b90e 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Continuar</translation>
 <translation id="2365563543831475020">No se ha subido el informe sobre fallos registrado el <ph name="CRASH_TIME" /></translation>
 <translation id="2367567093518048410">Nivel</translation>
+<translation id="2378238891085281592">Has entrado en modo privado.</translation>
 <translation id="2384307209577226199">Empresa (con valores predeterminados)</translation>
 <translation id="2386255080630008482">Se ha revocado el certificado de servidor.</translation>
 <translation id="2392959068659972793">Mostrar políticas sin valores establecidos</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Dirección de entrega</translation>
 <translation id="3395827396354264108">Método de recogida</translation>
 <translation id="3399952811970034796">Dirección de entrega</translation>
+<translation id="3409072600744224192">Para ver las tarjetas en todos tus dispositivos, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Prueba a salir de otros programas para liberar memoria.</translation>
 <translation id="3422472998109090673">No se puede acceder a la página <ph name="HOST_NAME" /> en este momento.</translation>
 <translation id="3427092606871434483">Permitir (predeterminado)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Compartir con el administrador</translation>
 <translation id="4515275063822566619">Las tarjetas y las direcciones proceden de Chrome y tu cuenta de Google (<ph name="ACCOUNT_EMAIL" />). Puedes gestionarlas en <ph name="BEGIN_LINK" />Configuración<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Detalles</translation>
+<translation id="4524805452350978254">Gestionar tarjetas</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Inhabilita las extensiones.</translation>
 <translation id="457875822857220463">Envío</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Contraseña incorrecta</translation>
 <translation id="5056549851600133418">Artículos recomendados para ti</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Comprobar la dirección del proxy<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Para ver las tarjetas en todos tus dispositivos, inicia sesión y activa la sincronización.</translation>
 <translation id="5086888986931078152">Es posible que dejes de tener acceso al contenido protegido de algunos sitios web.</translation>
 <translation id="5087286274860437796">El certificado del servidor no es válido en este momento.</translation>
 <translation id="5087580092889165836">Añadir tarjeta</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> de <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Seleccionar información de contacto</translation>
 <translation id="5327248766486351172">Nombre</translation>
+<translation id="5327567770033251652">activa la sincronización</translation>
 <translation id="5332219387342487447">Método de envío</translation>
 <translation id="5355557959165512791">No puedes acceder a <ph name="SITE" /> en este momento porque su certificado se ha revocado. Los ataques y los errores de red suelen ser temporales, por lo que es probable que esta página funcione más tarde.</translation>
 <translation id="536296301121032821">Error al almacenar la configuración de la política</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Selecciona una dirección para ver los métodos de entrega y los requisitos</translation>
 <translation id="5770114862687765385">Parece que el archivo está dañado. Haz clic en el botón Recuperar para recuperar la sesión.</translation>
 <translation id="5778550464785688721">Control total de dispositivos MIDI</translation>
+<translation id="57838592816432529">Silenciar</translation>
 <translation id="5784606427469807560">Se ha producido un problema al confirmar tu tarjeta. Comprueba tu conexión a Internet y vuelve a intentarlo.</translation>
 <translation id="5785756445106461925">Además, esta página incluye otros recursos que no son seguros. Otros usuarios pueden acceder a estos recursos mientras están en circulación y un atacante puede modificarlos para cambiar el aspecto de la página.</translation>
 <translation id="5786044859038896871">¿Quieres rellenar la información de la tarjeta?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Añade un número de teléfono</translation>
 <translation id="5869405914158311789">No se puede acceder a este sitio web</translation>
 <translation id="5869522115854928033">Contraseñas guardadas</translation>
+<translation id="5887400589839399685">Tarjeta guardada</translation>
 <translation id="5893752035575986141">Se aceptan tarjetas de crédito.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (sincronizado)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 en uso}other{# en uso}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Usuario:</translation>
 <translation id="6944692733090228304"><ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> no gestiona el sitio web en el que has introducido tu contraseña. Para proteger tu cuenta, no utilices la misma contraseña en otras aplicaciones o sitios web.</translation>
 <translation id="6945221475159498467">Seleccionar</translation>
+<translation id="6948540501704460596">Para ver las tarjetas en todos tus dispositivos, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Selecciona una dirección para ver los métodos de recogida y los requisitos</translation>
 <translation id="6949872517221025916">Cambiar contraseña</translation>
 <translation id="6950684638814147129">No se ha podido analizar el valor JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Abre una página en una nueva pestaña privada</translation>
 <translation id="6957887021205513506">El certificado del servidor parece ser falso.</translation>
 <translation id="6965382102122355670">Aceptar</translation>
 <translation id="6965978654500191972">Dispositivo</translation>
 <translation id="6970216967273061347">Distrito</translation>
 <translation id="6973656660372572881">Se especifican tanto servidores proxy fijos como una URL de secuencia de comandos .pac.</translation>
+<translation id="6984479912851154518">Saldrás del modo privado para hacer un pago en una aplicación externa. ¿Quieres continuar?</translation>
 <translation id="6989763994942163495">Mostrar configuración avanzada...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Estos cargos pueden ser únicos o periódicos, y es posible que no se indiquen de una forma evidente.</translation>
 <translation id="7029809446516969842">Contraseñas</translation>
+<translation id="7042837854211185817">Para ver las tarjetas en todos tus dispositivos, activa la sincronización.</translation>
 <translation id="7050187094878475250">Has intentado acceder a <ph name="DOMAIN" />, pero el servidor ha presentado un certificado cuyo periodo de validez es demasiado largo para que se considere de confianza.</translation>
 <translation id="7053983685419859001">Bloquear</translation>
 <translation id="7064851114919012435">Información de contacto</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">Marcadores</translation>
 <translation id="883848425547221593">Otros marcadores</translation>
 <translation id="884264119367021077">Dirección de envío</translation>
+<translation id="8846319957959474018">Abre aplicaciones fácilmente con los marcadores</translation>
 <translation id="884923133447025588">No se ha encontrado ningún mecanismo de revocación.</translation>
 <translation id="885730110891505394">Compartir con Google</translation>
 <translation id="8858065207712248076">Chrome te recomienda que cambies tu contraseña de <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> si la has vuelto a utilizar en otros sitios web.</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb
index 3009960..b1edd33 100644
--- a/components/strings/components_strings_et.xtb
+++ b/components/strings/components_strings_et.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Jätka</translation>
 <translation id="2365563543831475020"><ph name="CRASH_TIME" /> talletatud krahhiaruannet ei laaditud üles</translation>
 <translation id="2367567093518048410">Tase</translation>
+<translation id="2378238891085281592">Olete privaatses režiimis</translation>
 <translation id="2384307209577226199">Ettevõtte vaikeseade</translation>
 <translation id="2386255080630008482">Serveri sertifikaat on tühistatud.</translation>
 <translation id="2392959068659972793">Kuva reeglid, mille väärtusi pole määratud</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Kohaletoimetamise aadress</translation>
 <translation id="3395827396354264108">Kättesaamisviis</translation>
 <translation id="3399952811970034796">Kohaletoimetamisaadress</translation>
+<translation id="3409072600744224192">Järjehoidjate hankimiseks kõikidesse seadmetesse toimige järgmiselt: <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Proovige mälu vabastamiseks väljuda muudest programmidest.</translation>
 <translation id="3422472998109090673">Hostiga <ph name="HOST_NAME" /> ei saa praegu ühendust.</translation>
 <translation id="3427092606871434483">Luba (vaikimisi)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Administraatoriga jagamine</translation>
 <translation id="4515275063822566619">Kaardid ja aadressid pärinevad Chrome'ist ning teie Google'i kontolt (<ph name="ACCOUNT_EMAIL" />). Neid saate hallata menüüs <ph name="BEGIN_LINK" />Seaded<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Üksikasjad</translation>
+<translation id="4524805452350978254">Halda kaarte</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Keelake laiendused.</translation>
 <translation id="457875822857220463">Kohaletoimetamine</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Vale salasõna</translation>
 <translation id="5056549851600133418">Teile soovitatud artiklid</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Kontrollige puhverserveri aadressi<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Kaartide kõikidesse seadmetesse hankimiseks logige sisse ja lülitage sünkroonimine sisse</translation>
 <translation id="5086888986931078152">Võite kaotada juurdepääsu mõne saidi kaitstud sisule.</translation>
 <translation id="5087286274860437796">Serveri sertifikaat pole praegu kehtiv.</translation>
 <translation id="5087580092889165836">Lisa kaart</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" />/<ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Valige kontaktteave</translation>
 <translation id="5327248766486351172">Nimi</translation>
+<translation id="5327567770033251652">lülita sünkroonimine sisse</translation>
 <translation id="5332219387342487447">Tarneviis</translation>
 <translation id="5355557959165512791">Te ei saa saiti <ph name="SITE" /> praegu külastada, sest selle sertifikaat on tühistatud. Võrguvead ja -rünnakud on tavaliselt ajutised, nii et leht tõenäoliselt hiljem töötab.</translation>
 <translation id="536296301121032821">Reegli seadete talletamine ebaõnnestus</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Kohaletoimetamisviiside ja nõuete nägemiseks valige aadress</translation>
 <translation id="5770114862687765385">Näib, et fail on rikutud. Seansi lähtestamiseks klõpsake nupul „Lähtesta”.</translation>
 <translation id="5778550464785688721">MIDI-seadmete täielik juhtimine</translation>
+<translation id="57838592816432529">Vaigista</translation>
 <translation id="5784606427469807560">Kaardi kinnitamisel tekkis probleem. Kontrollige Interneti-ühendust ja proovige uuesti.</translation>
 <translation id="5785756445106461925">Lisaks sisaldab see leht teisi ressursse, mis pole turvalised. Edastamise ajal võivad ressursse vaadata ka teised ja ründajad saavad lehe välimuse muutmiseks ressursse muuta.</translation>
 <translation id="5786044859038896871">Kas soovite sisestada oma kaarditeabe?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Telefoninumbri lisamine</translation>
 <translation id="5869405914158311789">Selle saidiga ei saa ühendust</translation>
 <translation id="5869522115854928033">Salvestatud paroolid</translation>
+<translation id="5887400589839399685">Kaart on salvestatud</translation>
 <translation id="5893752035575986141">Kaupmees aktsepteerib krediitkaarte.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (sünkroonitud)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 on kasutusel}other{# on kasutusel}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Kasutaja:</translation>
 <translation id="6944692733090228304">Sisestasite oma parooli saidile, mida ei halda <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Oma konto kaitsmiseks ärge kasutage oma parooli muudes rakendustes ega saitidel.</translation>
 <translation id="6945221475159498467">Vali</translation>
+<translation id="6948540501704460596">Järjehoidjate hankimiseks kõikidesse seadmetesse toimige järgmiselt: <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Kättesaamisviiside ja nõuete nägemiseks valige aadress</translation>
 <translation id="6949872517221025916">Lähtestage parool</translation>
 <translation id="6950684638814147129">Viga JSON-väärtuse sõelumisel: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Avage leht uuel privaatsel vahelehel</translation>
 <translation id="6957887021205513506">Serveri sertifikaat näib olevat võltsing.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Seade</translation>
 <translation id="6970216967273061347">Ringkond</translation>
 <translation id="6973656660372572881">Määratud on nii fikseeritud puhverserverid kui ka pac-skriptiga URL.</translation>
+<translation id="6984479912851154518">Väljute privaatsest režiimist, et välise rakenduse kaudu maksta. Kas soovite jätkata?</translation>
 <translation id="6989763994942163495">Kuva täpsemad seaded ...</translation>
 <translation id="7012363358306927923">Hiina UnionPay</translation>
 <translation id="7016992613359344582">Tasud võivad olla ühekordsed või korduvad ja need ei pruugi olla ilmselged.</translation>
 <translation id="7029809446516969842">Paroolid</translation>
+<translation id="7042837854211185817">Kaartide kõigisse seadmetesse hankimiseks lülitage sünkroonimine sisse.</translation>
 <translation id="7050187094878475250">Üritasite jõuda domeenile <ph name="DOMAIN" />, kuid server esitas sertifikaadi, mille kehtivusaeg on liiga pikk, et olla usaldusväärne.</translation>
 <translation id="7053983685419859001">Blokeeri</translation>
 <translation id="7064851114919012435">Kontaktteave</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">Järjehoidjad</translation>
 <translation id="883848425547221593">Muud järjehoidjad</translation>
 <translation id="884264119367021077">Tarneaadress</translation>
+<translation id="8846319957959474018">Järjehoidjate abil saate hõlpsasti rakendusi avada</translation>
 <translation id="884923133447025588">Tühistusmehhanismi ei leitud.</translation>
 <translation id="885730110891505394">Jagamine Google'iga</translation>
 <translation id="8858065207712248076">Chromium soovitab teil organisatsiooni <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> parooli lähtestada, kui kasutasite seda ka muudel saitidel.</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb
index 351177a..fb00309 100644
--- a/components/strings/components_strings_fa.xtb
+++ b/components/strings/components_strings_fa.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">ادامه</translation>
 <translation id="2365563543831475020">گزارش خرابی ثبت‌شده در <ph name="CRASH_TIME" /> بارگذاری نشد</translation>
 <translation id="2367567093518048410">سطح</translation>
+<translation id="2378238891085281592">به حالت ناشناس رفته‌اید</translation>
 <translation id="2384307209577226199">پیش‌فرض شرکتی</translation>
 <translation id="2386255080630008482">گواهی سرور باطل شده است.</translation>
 <translation id="2392959068659972793">نمایش خط‌مشی‌ها با مقدار تنظیم نشده</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">نشانی ارسال</translation>
 <translation id="3395827396354264108">روش تحویل گرفتن</translation>
 <translation id="3399952811970034796">نشانی ارسال</translation>
+<translation id="3409072600744224192">برای دریافت کارت‌ها در همه دستگاه‌هایتان، <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">سعی کنید از برنامه‌های دیگر خارج شوید تا حافظه آزاد شود.</translation>
 <translation id="3422472998109090673">دسترسی به <ph name="HOST_NAME" /> درحال حاضر امکان‌پذیر نیست.</translation>
 <translation id="3427092606871434483">اجازه (پیش‌فرض)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">اشتراک‌گذاری با سرپرست سیستم</translation>
 <translation id="4515275063822566619">‏کارت‌ها و نشانی‌ها از Chrome و حساب Google شما (<ph name="ACCOUNT_EMAIL" />) هستند. می‌توانید آن‌ها را در <ph name="BEGIN_LINK" />تنظیمات<ph name="END_LINK" /> مدیریت کنید.</translation>
 <translation id="4522570452068850558">جزئیات</translation>
+<translation id="4524805452350978254">مدیریت کارت‌ها</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">افزونه‌ها را غیرفعال کنید.</translation>
 <translation id="457875822857220463">ارسال</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">گذرواژه نادرست</translation>
 <translation id="5056549851600133418">مقالاتی برای شما</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />بررسی آدرس پروکسی<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">برای دریافت کارت‌ها در همه دستگاه‌ها، به سیستم وارد شوید و همگام‌سازی را روشن کنید.</translation>
 <translation id="5086888986931078152">ممکن است دسترسی به محتوای محافظت‌شده برخی از سایت‌ها را از دست بدهید.</translation>
 <translation id="5087286274860437796">در حال حاضر گواهی سرور معتبر نیست.</translation>
 <translation id="5087580092889165836">افزودن کارت</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> از <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">انتخاب اطلاعات تماس</translation>
 <translation id="5327248766486351172">نام</translation>
+<translation id="5327567770033251652">روشن کردن همگام‌سازی</translation>
 <translation id="5332219387342487447">روش ارسال کالا</translation>
 <translation id="5355557959165512791">درحال‌حاضر نمی‌توانید از <ph name="SITE" /> دیدن کنید، زیرا گواهینامه آن لغو شده است. معمولاً خطاهای شبکه و حمله‌ها موقتی هستند، بنابراین احتمالاً این صفحه بعداً کار خواهد کرد.</translation>
 <translation id="536296301121032821">تنظیمات خط‌‌مشی ذخیره نشد</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">برای دیدن روش‌های تحویل و شرایط موردنیاز، یک نشانی انتخاب کنید</translation>
 <translation id="5770114862687765385">به نظر می‌رسد فایل خراب شده باشد. برای بازنشانی جلسه، روی دکمه «بازنشانی» کلیک کنید.</translation>
 <translation id="5778550464785688721">‏کنترل کامل دستگاه‌های MIDI</translation>
+<translation id="57838592816432529">بی‌صدا کردن</translation>
 <translation id="5784606427469807560">هنگام تأیید کارت مشکلی پیش آمد. اتصال اینترنتتان را بررسی و دوباره امتحان کنید.</translation>
 <translation id="5785756445106461925">علاوه بر این، این صفحه دارای منابع دیگری است که امن نیستند. دیگران می‌توانند در حین انتقال، این منابع را ببینند و این منابع می‌توانند برای تغییر قفل صفحه، توسط یک مهاجم تغییر داده شوند.</translation>
 <translation id="5786044859038896871">می‌خواهید اطلاعات کارتتان را وارد کنید؟</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">افزودن شماره تلفن</translation>
 <translation id="5869405914158311789">دسترسی به این سایت امکان‌پذیر نیست</translation>
 <translation id="5869522115854928033">گذرواژه‌های ذخیره‌شده</translation>
+<translation id="5887400589839399685">کارت ذخیره‌ شد</translation>
 <translation id="5893752035575986141">کارت‌های اعتباری پذیرفته می‌شوند.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (همگام‌سازی‌شده)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{۱ کوکی درحال استفاده}one{# کوکی درحال استفاده}other{# کوکی درحال استفاده}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">کاربر:</translation>
 <translation id="6944692733090228304">گذرواژه‌تان را در سایتی وارد کردید که توسط <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> مدیریت نمی‌شود. برای محافظت از حسابتان، از گذرواژه‌تان در برنامه‌ها و سایت‌های دیگر استفاده نکنید.</translation>
 <translation id="6945221475159498467">انتخاب</translation>
+<translation id="6948540501704460596">برای دریافت کارت‌ها در همه دستگاه‌هایتان، <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">برای دیدن روش‌های تحویل گرفتن و شرایط موردنیاز، یک نشانی انتخاب کنید</translation>
 <translation id="6949872517221025916">بازنشانی گذرواژه</translation>
 <translation id="6950684638814147129">‏خطا هنگام تجزیه مقدار JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">صفحه را در برگه «ناشناس» جدیدی باز کنید</translation>
 <translation id="6957887021205513506">به نظر می‌رسد که گواهی سرور جعلی باشد.</translation>
 <translation id="6965382102122355670">قبول</translation>
 <translation id="6965978654500191972">دستگاه</translation>
 <translation id="6970216967273061347">حوزه</translation>
 <translation id="6973656660372572881">‏هم سرورهای پروکسی ثابت و هم آدرس اسکریپت pac. مشخص شده‌اند.</translation>
+<translation id="6984479912851154518">درحال خروج از حالت ناشناس، برای پرداخت ازطریق برنامه‌ای خارجی. ادامه می‌دهید؟</translation>
 <translation id="6989763994942163495">نمایش تنظیمات پیشرفته ...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">ممکن است این هزینه‌ها یک‌باره یا تکرارشونده باشند یا واضح نباشند.</translation>
 <translation id="7029809446516969842">گذرواژه‌ها</translation>
+<translation id="7042837854211185817">برای دریافت کارت‌ها در همه دستگاه‌ها، همگام‌سازی را روشن کنید.</translation>
 <translation id="7050187094878475250">تلاش کردید به دامنه <ph name="DOMAIN" /> بروید اما گواهینامه‌ای که سرور ارائه کرد، دارای یک تاریخ اعتبار بسیار طولانی است و مورداعتماد نیست.</translation>
 <translation id="7053983685419859001">مسدود کردن</translation>
 <translation id="7064851114919012435">اطلاعات تماس</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">نشانک‌ها</translation>
 <translation id="883848425547221593">نشانک‌های دیگر</translation>
 <translation id="884264119367021077">اطلاعات ارسال</translation>
+<translation id="8846319957959474018">برنامه‌ها را به‌سادگی بااستفاده از نشانک‌ها باز کنید</translation>
 <translation id="884923133447025588">هیچ مکانیزم ابطالی یافت نشد.</translation>
 <translation id="885730110891505394">‏اشتراک‌گذاری با Google</translation>
 <translation id="8858065207712248076">‏Chrome توصیه می‌کند اگر از گذرواژه <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> خود در سایت دیگری استفاده کردید آن را بازنشانی کنید.</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb
index a6b734b..f7c4a78 100644
--- a/components/strings/components_strings_fi.xtb
+++ b/components/strings/components_strings_fi.xtb
@@ -689,6 +689,7 @@
 <translation id="5765072501007116331">Valitse osoite, niin näet toimitustavat ja vaatimukset.</translation>
 <translation id="5770114862687765385">Tiedosto on ilmeisesti vioittunut. Nollaa käyttökerta klikkaamalla Nollaa.</translation>
 <translation id="5778550464785688721">MIDI-laitteiden täysi käyttöoikeus</translation>
+<translation id="57838592816432529">Mykistä</translation>
 <translation id="5784606427469807560">Korttia vahvistettaessa tapahtui virhe. Tarkista internetyhteys ja yritä uudelleen.</translation>
 <translation id="5785756445106461925">Tällä sivulla on kuitenkin muita osia, jotka eivät ole suojattuja. Muut voivat tarkastella näitä osia siirron aikana, ja hyökkääjä voi muuttaa sivun ulkoasua muokkaamalla näitä osia.</translation>
 <translation id="5786044859038896871">Täytetäänkö kortin tiedot?</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 11143cc..42f0581 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -688,6 +688,7 @@
 <translation id="5765072501007116331">Upang makita ang mga pamamaraan at kinakailangan sa paghahatid, pumili ng address</translation>
 <translation id="5770114862687765385">Mukhang sira ang file. I-click ang button na 'I-reset' upang i-reset ang session.</translation>
 <translation id="5778550464785688721">Ganap na pagkontrol sa mga MIDI device</translation>
+<translation id="57838592816432529">I-mute</translation>
 <translation id="5784606427469807560">Nagkaroon ng problema sa pagkumpirma ng iyong card. Suriin ang koneksyon sa internet at subukang muli.</translation>
 <translation id="5785756445106461925">Bukod pa rito, ang page na ito ay may iba pang mga mapagkukunang hindi secure. Makikita ng iba ang mga mapagkukunang ito habang ipinadadala, at maaaring baguhin ng isang umaatake upang baguhin ang hitsura ng page.</translation>
 <translation id="5786044859038896871">Gusto mo bang ilagay ang impormasyon ng iyong card?</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index 72bd6d0..623fbd0 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Continuer</translation>
 <translation id="2365563543831475020">Le rapport d'erreur enregistré le <ph name="CRASH_TIME" /> n'a pas été importé.</translation>
 <translation id="2367567093518048410">Niveau</translation>
+<translation id="2378238891085281592">Vous êtes passé en mode privé</translation>
 <translation id="2384307209577226199">Valeur par défaut définie par l'entreprise</translation>
 <translation id="2386255080630008482">Le certificat du serveur a été révoqué.</translation>
 <translation id="2392959068659972793">Afficher les règles non paramétrées</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Adresse de livraison</translation>
 <translation id="3395827396354264108">Mode d'enlèvement</translation>
 <translation id="3399952811970034796">Adresse de livraison</translation>
+<translation id="3409072600744224192">Pour accéder à vos cartes sur tous vos appareils, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Essayez de fermer les autres programmes pour libérer de la mémoire.</translation>
 <translation id="3422472998109090673"><ph name="HOST_NAME" /> est actuellement inaccessible.</translation>
 <translation id="3427092606871434483">Autoriser (par défaut)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Partage avec l'administrateur</translation>
 <translation id="4515275063822566619">Les cartes et les adresses proviennent de Chrome et de votre compte Google (<ph name="ACCOUNT_EMAIL" />). Vous pouvez les gérer dans les <ph name="BEGIN_LINK" />Paramètres<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Détails</translation>
+<translation id="4524805452350978254">Gérer les cartes</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Essayez de désactiver les extensions.</translation>
 <translation id="457875822857220463">Livraison</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Mot de passe incorrect</translation>
 <translation id="5056549851600133418">Articles pour vous</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Vérifier l'adresse du proxy<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Connectez-vous et activez la synchronisation pour accéder à vos cartes sur tous vos appareils.</translation>
 <translation id="5086888986931078152">Vous risquez de ne plus avoir accès au contenu protégé de certains sites.</translation>
 <translation id="5087286274860437796">Le certificat actuel du serveur n'est pas valide.</translation>
 <translation id="5087580092889165836">Ajouter une carte</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> sur <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Sélectionner les coordonnées</translation>
 <translation id="5327248766486351172">Nom</translation>
+<translation id="5327567770033251652">activer la synchronisation</translation>
 <translation id="5332219387342487447">Mode de livraison</translation>
 <translation id="5355557959165512791">Le site <ph name="SITE" /> est actuellement inaccessible, car son certificat a été révoqué. Les erreurs réseau et les attaques sont généralement temporaires. Vous devriez donc pouvoir accéder à cette page plus tard.</translation>
 <translation id="536296301121032821">Échec du stockage des paramètres de la règle.</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Sélectionnez une adresse pour consulter les modes et conditions de livraison disponibles</translation>
 <translation id="5770114862687765385">Le fichier semble être corrompu. Cliquez sur le bouton "Réinitialiser" pour réinitialiser la session.</translation>
 <translation id="5778550464785688721">Contrôle total des appareils MIDI</translation>
+<translation id="57838592816432529">Couper le son</translation>
 <translation id="5784606427469807560">Un problème est survenu lors de la validation de votre carte. Vérifiez votre connexion Internet, puis réessayez.</translation>
 <translation id="5785756445106461925">De plus, cette page inclut d'autres ressources qui ne sont pas sécurisées. Ces ressources peuvent être consultées par des tiers pendant leur transfert, et modifiées par un pirate informatique dans le but de changer l'aspect de cette page.</translation>
 <translation id="5786044859038896871">Souhaitez-vous indiquer vos informations de carte de paiement ?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Ajouter un numéro de téléphone</translation>
 <translation id="5869405914158311789">Ce site est inaccessible</translation>
 <translation id="5869522115854928033">Mots de passe enregistrés</translation>
+<translation id="5887400589839399685">Carte enregistrée</translation>
 <translation id="5893752035575986141">Les cartes de crédit sont acceptées.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (synchronisés)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 en cours d'utilisation}one{# en cours d'utilisation}other{# en cours d'utilisation}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Utilisateur :</translation>
 <translation id="6944692733090228304">Vous avez saisi votre mot de passe sur un site qui n'est pas géré par <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Pour protéger votre compte, ne réutilisez pas ce mot de passe dans d'autres applications ni sur d'autres sites.</translation>
 <translation id="6945221475159498467">Sélectionner</translation>
+<translation id="6948540501704460596">Pour accéder à vos cartes sur tous vos appareils, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Sélectionnez une adresse pour consulter les modes et conditions d'enlèvement disponibles</translation>
 <translation id="6949872517221025916">Réinitialiser le mot de passe</translation>
 <translation id="6950684638814147129">Erreur lors de l'analyse de la valeur JSON : <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Ouvrir la page dans un nouvel onglet privé</translation>
 <translation id="6957887021205513506">Le certificat du serveur semble être contrefait.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Périphérique</translation>
 <translation id="6970216967273061347">District</translation>
 <translation id="6973656660372572881">Les serveurs proxy déterminés et une URL de script .pac sont spécifiés tous les deux.</translation>
+<translation id="6984479912851154518">En payant via une application externe, vous allez quitter le mode privé. Voulez-vous continuer ?</translation>
 <translation id="6989763994942163495">Afficher les paramètres avancés…</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Il peut s'agir de frais uniques ou récurrents qui ne sont pas toujours clairement signalés.</translation>
 <translation id="7029809446516969842">Mots de passe</translation>
+<translation id="7042837854211185817">Activez la synchronisation pour accéder à vos cartes sur tous vos appareils.</translation>
 <translation id="7050187094878475250">Vous avez essayé d'accéder à <ph name="DOMAIN" />, mais la durée de validité du certificat du serveur est trop longue pour être fiable.</translation>
 <translation id="7053983685419859001">Bloquer</translation>
 <translation id="7064851114919012435">Coordonnées</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">Favoris</translation>
 <translation id="883848425547221593">Autres favoris</translation>
 <translation id="884264119367021077">Adresse de livraison</translation>
+<translation id="8846319957959474018">Ouvrir les applications facilement grâce aux favoris</translation>
 <translation id="884923133447025588">Aucun système de révocation trouvé</translation>
 <translation id="885730110891505394">Partage avec Google</translation>
 <translation id="8858065207712248076">L'équipe Chrome vous recommande de réinitialiser votre mot de passe <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> si vous l'avez réutilisé sur d'autres sites.</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb
index c866de1..74b12796 100644
--- a/components/strings/components_strings_gu.xtb
+++ b/components/strings/components_strings_gu.xtb
@@ -688,6 +688,7 @@
 <translation id="5765072501007116331">વિતરણ પદ્ધતિઓ અને આવશ્યકતાઓ જોવા માટે, એક સરનામું પસંદ કરો</translation>
 <translation id="5770114862687765385">ફાઇલ ખામીવાળી લાગે છે. સત્રને રીસેટ કરવા માટે 'રીસેટ કરો' બટન પર ક્લિક કરો.</translation>
 <translation id="5778550464785688721">MIDI ઉપકરણોનું પૂર્ણ નિયંત્રણ</translation>
+<translation id="57838592816432529">અવાજ બંધ કરો</translation>
 <translation id="5784606427469807560">તમારા કાર્ડની પુષ્ટિ કરવામાં એક સમસ્યા આવી હતી. તમારું ઇન્ટરનેટ કનેક્શન તપાસો અને ફરીથી પ્રયાસ કરો.</translation>
 <translation id="5785756445106461925">વળી, આ પૃષ્ઠમાં અન્ય એવા સાધનો છે જે સુરક્ષિત નથી. ટ્રાંઝિટમાં હોવા પર અન્ય લોકો દ્વારા આ સાધનો જોઈ શકાય છે અને પૃષ્ઠનો દેખાવ બદલવા માટે હુમલાખોર દ્વારા સંશોધિત કરવામાં આવી શકે છે.</translation>
 <translation id="5786044859038896871">શું તમે તમારી કાર્ડ માહિતી ભરવા માગો છો?</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index dc36e78a..ef33875 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">जारी रखें</translation>
 <translation id="2365563543831475020"><ph name="CRASH_TIME" /> पर कैप्चर की गई ख़राबी रिपोर्ट अपलोड नहीं की गई</translation>
 <translation id="2367567093518048410">स्तर</translation>
+<translation id="2378238891085281592">आप ’निजी’ मोड में चले गए हैं</translation>
 <translation id="2384307209577226199">एंटरप्राइज़ डिफ़ॉल्ट</translation>
 <translation id="2386255080630008482">सर्वर का प्रमाणपत्र निरस्त कर दिया गया है.</translation>
 <translation id="2392959068659972793">कोई भी मान सेट नहीं की गई नीतियां दिखाएं</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">वितरण पता</translation>
 <translation id="3395827396354264108">पिकअप का तरीका</translation>
 <translation id="3399952811970034796">डिलीवरी का पता</translation>
+<translation id="3409072600744224192">अपने सभी डिवाइस पर अपने कार्ड पाने के लिए, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">जगह खाली करने के लिए दूसरे प्रोग्राम से बाहर निकलकर देखें.</translation>
 <translation id="3422472998109090673"><ph name="HOST_NAME" /> वर्तमान में पहुंच योग्य नहीं है.</translation>
 <translation id="3427092606871434483">अनुमति दें (डिफ़ॉल्ट)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">व्यवस्थापक के साथ शेयर करना</translation>
 <translation id="4515275063822566619">कार्ड और पते Chrome और आपके Google खाते (<ph name="ACCOUNT_EMAIL" />) से मिलते हैं. आप उन्हें <ph name="BEGIN_LINK" />सेटिंग<ph name="END_LINK" /> में जाकर प्रबंधित कर सकते हैं.</translation>
 <translation id="4522570452068850558">विवरण</translation>
+<translation id="4524805452350978254">कार्ड प्रबंधित करें</translation>
 <translation id="4552089082226364758">फ़्लैश</translation>
 <translation id="4558551763791394412">अपने एक्सटेंशन अक्षम करके देखें.</translation>
 <translation id="457875822857220463">वितरण</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">ग़लत पासवर्ड</translation>
 <translation id="5056549851600133418">आपके लिए लेख</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />प्रॉक्सी पते की जाँच करें<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">सभी डिवाइस पर अपने कार्ड पाने के लिए, साइन इन करें और 'सिंक करें' को चालू करें.</translation>
 <translation id="5086888986931078152">आप कुछ साइटों पर सुरक्षित सामग्री का एक्सेस खो सकते हैं.</translation>
 <translation id="5087286274860437796">सर्वर का प्रमाण पत्र इस समय मान्य नहीं है.</translation>
 <translation id="5087580092889165836">कार्ड जोड़ें</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" /> में से <ph name="MATCH_POSITION" /></translation>
 <translation id="5324080437450482387">संपर्क जानकारी चुनें</translation>
 <translation id="5327248766486351172">नाम</translation>
+<translation id="5327567770033251652">सिंक करना चालू करें</translation>
 <translation id="5332219387342487447">शिपिंग का तरीका</translation>
 <translation id="5355557959165512791">आप इस समय <ph name="SITE" /> पर नहीं जा सकते हैं क्योंकि उसका प्रमाणपत्र रद्द कर दिया गया है. नेटवर्क की गड़बड़ी और हमले आमतौर पर कुछ देर के लिए होते हैं, इसलिए मुमकिन है कि यह पेज बाद में काम करे.</translation>
 <translation id="536296301121032821">नीति सेटिंग संग्रहित करने में विफल</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">वितरण के तरीके और ज़रूरतें देखने के लिए, कोई पता चुनें</translation>
 <translation id="5770114862687765385">लगता है फ़ाइल खराब हो गई है. सत्र रीसेट करने के लिए 'रीसेट करें' बटन क्लिक करें.</translation>
 <translation id="5778550464785688721">MIDI डिवाइस पूर्ण नियंत्रण</translation>
+<translation id="57838592816432529">म्यूट करें</translation>
 <translation id="5784606427469807560">आपके कार्ड की पुष्टि करते समय समस्‍या हुई. अपना इंटरनेट कनेक्‍शन जाँचें और पुन: प्रयास करें.</translation>
 <translation id="5785756445106461925">इसके अतिरिक्त, इस पेज में ऐसे अन्य संसाधन भी शामिल हैं, जो सुरक्षित नहीं हैं. ट्रांज़िट में होने के दौरान ये संसाधन अन्य लोगों द्वारा देखे जा सकते हैं और पेज का स्वरूप बदलने के लिए किसी हमवलावर द्वारा इनमें बदलाव किए जा सकते हैं.</translation>
 <translation id="5786044859038896871">क्या अपनी कार्ड जानकारी भरना चाहते हैं?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">फ़ोन नंबर जोड़ें</translation>
 <translation id="5869405914158311789">इस साइट तक नहीं पहुंचा जा सकता</translation>
 <translation id="5869522115854928033">सहेजे गए पासवर्ड</translation>
+<translation id="5887400589839399685">कार्ड सेव किया गया</translation>
 <translation id="5893752035575986141">क्रेडिट कार्ड स्वीकार किए जाते हैं.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (सिंक किया गया)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 उपयोग में है}one{# उपयोग में हैं}other{# उपयोग में हैं}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">उपयोगकर्ता:</translation>
 <translation id="6944692733090228304">आपने एक ऐसी साइट पर अपना पासवर्ड डाला है जिसे <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> प्रबंधित नहीं करता है. अपने खाते को सुरक्षित रखने के लिए, दूसरे ऐप्लिकेशन और साइटों पर अपने पासवर्ड का दोबारा इस्तेमाल नहीं करें.</translation>
 <translation id="6945221475159498467">चुनें</translation>
+<translation id="6948540501704460596">अपने सभी डिवाइस पर अपने कार्ड पाने के लिए, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">पिकअप के तरीके और ज़रूरतें देखने के लिए, कोई पता चुनें</translation>
 <translation id="6949872517221025916">पासवर्ड रीसेट करें</translation>
 <translation id="6950684638814147129">JSON मान पार्स करते समय गड़बड़ी हुई: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">पेज को नए 'निजी टैब' में खोलें</translation>
 <translation id="6957887021205513506">सर्वर का प्रमाणपत्र फर्जी दिखाई देता है.</translation>
 <translation id="6965382102122355670">ठीक है</translation>
 <translation id="6965978654500191972">डिवाइस</translation>
 <translation id="6970216967273061347">जिला</translation>
 <translation id="6973656660372572881">फ़िक्‍स्‍ड प्रॉक्‍सी सर्वर और .pac स्‍क्रिप्‍ट URL दोनों ही बताए गए हैं.</translation>
+<translation id="6984479912851154518">किसी बाहरी ऐप्लिकेशन के ज़रिए भुगतान करने के लिए 'निजी' मोड छोड़ रहे हैं. जारी रखना चाहते हैं?</translation>
 <translation id="6989763994942163495">अतिरिक्त सेटिंग दिखाएं...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">ये शुल्क एक बार लगने वाले या बार-बार लगने वाले हो सकते हैं और हो सकता है कि इनके बारे में स्पष्ट जानकारी न दी जाए.</translation>
 <translation id="7029809446516969842">पासवर्ड</translation>
+<translation id="7042837854211185817">सभी डिवाइस पर अपने कार्ड पाने के लिए, सिंक चालू करें.</translation>
 <translation id="7050187094878475250">आपने <ph name="DOMAIN" /> तक पहुंचने का प्रयास किया था, लेकिन सर्वर ने ऐसा प्रमाणपत्र प्रस्‍तुत किया जिसकी मान्‍यता अवधि विश्‍वसनीय होने के लिए बहुत लंबी है.</translation>
 <translation id="7053983685419859001">अवरोधित करें</translation>
 <translation id="7064851114919012435">संपर्क जानकारी</translation>
@@ -1075,6 +1086,7 @@
 <translation id="8820817407110198400">बुकमार्क</translation>
 <translation id="883848425547221593">अन्य बुकमार्क</translation>
 <translation id="884264119367021077">शिपिंग पता</translation>
+<translation id="8846319957959474018">बुकमार्क के ज़रिए आसानी से ऐप्लिकेशन खोलें</translation>
 <translation id="884923133447025588">कोई निरस्तीकरण प्रक्रिया प्राप्त नहीं हुई.</translation>
 <translation id="885730110891505394">Google के साथ शेयर करना</translation>
 <translation id="8858065207712248076">अगर आपने अपने <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> पासवर्ड का दूसरी साइटों पर दोबारा इस्तेमाल किया है, तो Chrome आपको उसे रीसेट करने का सुझाव देता है.</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb
index d63eaa54..a90ec73 100644
--- a/components/strings/components_strings_hr.xtb
+++ b/components/strings/components_strings_hr.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Nastavi</translation>
 <translation id="2365563543831475020">Izvješće o rušenju programa generirano <ph name="CRASH_TIME" /> još nije preneseno</translation>
 <translation id="2367567093518048410">Razina</translation>
+<translation id="2378238891085281592">Sada ste u privatnom načinu</translation>
 <translation id="2384307209577226199">Zadano pravilo organizacije</translation>
 <translation id="2386255080630008482">Opozvan je certifikat poslužitelja.</translation>
 <translation id="2392959068659972793">Prikaži pravila bez postavljenih vrijednosti</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Adresa za dostavu</translation>
 <translation id="3395827396354264108">Način preuzimanja</translation>
 <translation id="3399952811970034796">Adresa za dostavu</translation>
+<translation id="3409072600744224192">Da biste imali svoje kartice na svim svojim uređajima, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Pokušajte zatvoriti ostale programe da biste oslobodili memoriju.</translation>
 <translation id="3422472998109090673">Host <ph name="HOST_NAME" /> trenutačno nije dostupan.</translation>
 <translation id="3427092606871434483">Dopusti (zadano)</translation>
@@ -513,6 +515,7 @@
 <translation id="450710068430902550">Dijeljenje s administratorom</translation>
 <translation id="4515275063822566619">Kartice i adrese dolaze iz Cromea i vašeg Google računa (<ph name="ACCOUNT_EMAIL" />). Njima možete upravljati u <ph name="BEGIN_LINK" />Postavkama<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Detalji</translation>
+<translation id="4524805452350978254">Upravljanje karticama</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Pokušajte onemogućiti proširenja.</translation>
 <translation id="457875822857220463">Dostava</translation>
@@ -578,6 +581,7 @@
 <translation id="5045550434625856497">Pogrešna zaporka</translation>
 <translation id="5056549851600133418">Preporučeni članci</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />provjerite proxy adresu<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Da bi se vaše kartice prikazale na svim uređajima, prijavite se i uključite sinkronizaciju.</translation>
 <translation id="5086888986931078152">Možda ćete izgubiti pristup zaštićenom sadržaju s nekih web-lokacija.</translation>
 <translation id="5087286274860437796">Certifikat poslužitelja trenutačno nije važeći.</translation>
 <translation id="5087580092889165836">Dodaj karticu</translation>
@@ -623,6 +627,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> od <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Odaberite podatke za kontakt</translation>
 <translation id="5327248766486351172">Naziv</translation>
+<translation id="5327567770033251652">uključite sinkronizaciju</translation>
 <translation id="5332219387342487447">Način otpreme</translation>
 <translation id="5355557959165512791">Trenutačno ne možete otvoriti web-lokaciju <ph name="SITE" /> jer je njezin certifikat opozvan. Mrežne pogreške i napadi uglavnom su privremeni i ta bi stranica kasnije trebala funkcionirati.</translation>
 <translation id="536296301121032821">Pohrana postavki pravila nije uspjela</translation>
@@ -687,6 +692,7 @@
 <translation id="5765072501007116331">Odaberite adresu za prikaz načina dostave i zahtjeva za dostavu.</translation>
 <translation id="5770114862687765385">Čini se da je datoteka oštećena. Kliknite gumb "Poništi" da biste poništili sesiju.</translation>
 <translation id="5778550464785688721">Potpuni nadzor nad MIDI uređajima</translation>
+<translation id="57838592816432529">Isključi zvuk</translation>
 <translation id="5784606427469807560">Pojavio se problem prilikom potvrđivanja kartice. Provjerite internetsku vezu i pokušajte ponovo.</translation>
 <translation id="5785756445106461925">Nadalje, ova stranica sadrži druge resurse koji nisu sigurni. Te resurse mogu vidjeti drugi tijekom prijenosa i napadač ih može izmijeniti kako bi promijenio izgled stranice.</translation>
 <translation id="5786044859038896871">Želite li ispuniti podatke o kartici?</translation>
@@ -698,6 +704,7 @@
 <translation id="5866257070973731571">Dodajte telefonski broj</translation>
 <translation id="5869405914158311789">Web-lokacija ne može se dohvatiti</translation>
 <translation id="5869522115854928033">Spremljene zaporke</translation>
+<translation id="5887400589839399685">Kartica je spremljena</translation>
 <translation id="5893752035575986141">Prihvaćaju se kreditne kartice.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (sinkronizirano)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 u upotrebi}one{# u upotrebi}few{# u upotrebi}other{# u upotrebi}}</translation>
@@ -815,18 +822,22 @@
 <translation id="6915804003454593391">Korisnik:</translation>
 <translation id="6944692733090228304">Unijeli ste zaporku na web-lokaciju kojom ne upravlja <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Da biste zaštitili račun, nemojte upotrebljavati tu zaporku za druge aplikacije i web-lokacije.</translation>
 <translation id="6945221475159498467">Odaberi</translation>
+<translation id="6948540501704460596">Da biste imali svoje kartice na svim svojim uređajima, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Odaberite adresu za prikaz načina preuzimanja i zahtjeva za preuzimanje</translation>
 <translation id="6949872517221025916">Poništite zaporku</translation>
 <translation id="6950684638814147129">Došlo je do pogreške prilikom raščlanjivanja vrijednosti JSON-a: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Otvorite stranicu u novoj privatnoj kartici</translation>
 <translation id="6957887021205513506">Certifikat poslužitelja izgleda kao falsifikat.</translation>
 <translation id="6965382102122355670">U redu</translation>
 <translation id="6965978654500191972">Uređaj</translation>
 <translation id="6970216967273061347">Distrikt</translation>
 <translation id="6973656660372572881">Određeni su fiksni proxy poslužitelji i URL .pac skripte.</translation>
+<translation id="6984479912851154518">Napuštate privatni način rada da biste platili putem vanjske aplikacije. Želite li nastaviti?</translation>
 <translation id="6989763994942163495">Pokaži napredne postavke...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Ta terećenja mogu biti jednokratna ili ponavljajuća i možda nisu odmah vidljiva.</translation>
 <translation id="7029809446516969842">Zaporke</translation>
+<translation id="7042837854211185817">Da bi se prikazale kartice na svim uređajima, uključite sinkronizaciju.</translation>
 <translation id="7050187094878475250">Pokušali ste pristupiti domeni <ph name="DOMAIN" />, ali je poslužitelj pružio certifikat koji nije pouzdan zbog predugog razdoblja valjanosti.</translation>
 <translation id="7053983685419859001">Blokiraj</translation>
 <translation id="7064851114919012435">Podaci za kontakt</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">Knjižne oznake</translation>
 <translation id="883848425547221593">Druge oznake</translation>
 <translation id="884264119367021077">Adresa za dostavu</translation>
+<translation id="8846319957959474018">Jednostavno otvaranje aplikacija pomoću oznaka</translation>
 <translation id="884923133447025588">Nije pronađen mehanizam za opoziv.</translation>
 <translation id="885730110891505394">Dijeljenje s Googleom</translation>
 <translation id="8858065207712248076">Chrome preporučuje poništavanje zaporke za organizaciju <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> ako ste je upotrebljavali za druge web-lokacije.</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb
index c54b9d62..86c9b9d 100644
--- a/components/strings/components_strings_hu.xtb
+++ b/components/strings/components_strings_hu.xtb
@@ -686,6 +686,7 @@
 <translation id="5765072501007116331">A kézbesítési módok és követelmények megtekintéséhez válassza ki a címet</translation>
 <translation id="5770114862687765385">Úgy tűnik, a fájl sérült. A munkamenet visszaállításához kattintson a „Visszaállítás” gombra.</translation>
 <translation id="5778550464785688721">MIDI eszközök – teljes hozzáférés</translation>
+<translation id="57838592816432529">Némítás</translation>
 <translation id="5784606427469807560">A kártya ellenőrzése során hiba történt. Ellenőrizze az internetkapcsolatot, majd próbálkozzon újra.</translation>
 <translation id="5785756445106461925">Emellett az oldal azonban más forrásokat is tartalmaz, amelyek nem biztonságosak. Ezeket a forrásokat mások is megtekinthetik átvitel közben, és megváltoztatásukkal a támadók módosíthatják az oldal viselkedését.</translation>
 <translation id="5786044859038896871">Ki szeretné tölteni a kártyaadatait?</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb
index 912d70c2..5996802a 100644
--- a/components/strings/components_strings_id.xtb
+++ b/components/strings/components_strings_id.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Lanjut</translation>
 <translation id="2365563543831475020">Laporan kerusakan yang diambil pada pukul <ph name="CRASH_TIME" /> tidak diupload</translation>
 <translation id="2367567093518048410">Tingkat</translation>
+<translation id="2378238891085281592">Anda telah masuk mode rahasia</translation>
 <translation id="2384307209577226199">Default perusahaan</translation>
 <translation id="2386255080630008482">Sertifikat server telah dicabut.</translation>
 <translation id="2392959068659972793">Tampilkan kebijakan tanpa nilai yang disetel</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Alamat pengiriman</translation>
 <translation id="3395827396354264108">Metode pengambilan</translation>
 <translation id="3399952811970034796">Alamat Pengiriman</translation>
+<translation id="3409072600744224192">Untuk mendapatkan kartu di semua perangkat Anda, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Coba program lain yang ada untuk mengosongkan memori.</translation>
 <translation id="3422472998109090673"><ph name="HOST_NAME" /> saat ini tidak dapat dijangkau.</translation>
 <translation id="3427092606871434483">Izinkan (default)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Berbagi dengan Administrator</translation>
 <translation id="4515275063822566619">Kartu dan alamat berasal dari Chrome dan Akun Google (<ph name="ACCOUNT_EMAIL" />). Anda dapat mengelolanya di <ph name="BEGIN_LINK" />Setelan<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Detail</translation>
+<translation id="4524805452350978254">Kelola kartu</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Coba nonaktifkan ekstensi.</translation>
 <translation id="457875822857220463">Pengiriman</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Sandi salah</translation>
 <translation id="5056549851600133418">Artikel untuk Anda</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Periksa alamat proxy<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Untuk mendapatkan kartu di semua perangkat Anda, login dan aktifkan sinkronisasi.</translation>
 <translation id="5086888986931078152">Anda dapat kehilangan akses ke konten yang dilindungi dari beberapa situs.</translation>
 <translation id="5087286274860437796">Sertifikat server saat ini tidak valid.</translation>
 <translation id="5087580092889165836">Tambahkan kartu</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> dari <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Pilih Info Kontak</translation>
 <translation id="5327248766486351172">Nama</translation>
+<translation id="5327567770033251652">aktifkan sinkronisasi</translation>
 <translation id="5332219387342487447">Metode Pengiriman</translation>
 <translation id="5355557959165512791">Anda tidak dapat membuka <ph name="SITE" /> sekarang karena sertifikatnya telah dicabut. Error jaringan dan serangan biasanya bersifat sementara, sehingga halaman ini mungkin akan berfungsi nanti.</translation>
 <translation id="536296301121032821">Gagal menyimpan setelan kebijakan</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Untuk melihat persyaratan dan metode pengiriman, pilih alamat</translation>
 <translation id="5770114862687765385">File tersebut sepertinya rusak. Harap klik tombol 'Setel Ulang' untuk menyetel ulang sesi.</translation>
 <translation id="5778550464785688721">Kontrol penuh perangkat MIDI</translation>
+<translation id="57838592816432529">Bisukan</translation>
 <translation id="5784606427469807560">Terjadi masalah saat mengonfirmasi kartu. Periksa sambungan internet Anda dan coba lagi.</translation>
 <translation id="5785756445106461925">Selain itu, halaman ini berisi sumber daya lainnya yang tidak aman. Sumber daya ini dapat dilihat oleh orang lain saat transit dan dapat dimodifikasi oleh penyerang untuk mengubah tampilan perangkat.</translation>
 <translation id="5786044859038896871">Ingin mengisi informasi kartu?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Tambahkan Nomor Telepon</translation>
 <translation id="5869405914158311789">Situs ini tidak dapat dijangkau</translation>
 <translation id="5869522115854928033">Sandi tersimpan</translation>
+<translation id="5887400589839399685">Kartu disimpan</translation>
 <translation id="5893752035575986141">Kartu kredit diterima.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (disinkronkan)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 terpakai}other{# terpakai}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Pengguna:</translation>
 <translation id="6944692733090228304">Anda memasukkan sandi di situs yang tidak dikelola oleh <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Untuk melindungi akun, jangan gunakan sandi yang sama di aplikasi dan situs lain.</translation>
 <translation id="6945221475159498467">Pilih</translation>
+<translation id="6948540501704460596">Untuk mendapatkan kartu di semua perangkat Anda, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Untuk melihat persyaratan dan metode pengambilan, pilih alamat</translation>
 <translation id="6949872517221025916">Setel Ulang Sandi</translation>
 <translation id="6950684638814147129">Error saat mengurai nilai JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Buka halaman dalam tab Rahasia baru</translation>
 <translation id="6957887021205513506">Sertifikat server tampaknya palsu.</translation>
 <translation id="6965382102122355670">Oke</translation>
 <translation id="6965978654500191972">Perangkat</translation>
 <translation id="6970216967273061347">Distrik</translation>
 <translation id="6973656660372572881">Server proxy tetap dan URL skrip .pac telah ditentukan.</translation>
+<translation id="6984479912851154518">Keluar dari mode rahasia untuk membayar melalui aplikasi eksternal. Lanjutkan?</translation>
 <translation id="6989763994942163495">Tampilkan setelan lanjutan...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Tagihan ini bisa hanya satu kali atau berulang, dan mungkin tidak pasti.</translation>
 <translation id="7029809446516969842">Sandi</translation>
+<translation id="7042837854211185817">Untuk mendapatkan kartu di semua perangkat Anda, aktifkan sinkronisasi.</translation>
 <translation id="7050187094878475250">Anda berusaha menjangkau <ph name="DOMAIN" />, namun server memberikan sertifikat yang masa berlakunya terlalu lama untuk dapat dipercaya.</translation>
 <translation id="7053983685419859001">Blokir</translation>
 <translation id="7064851114919012435">Info kontak</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">Bookmark</translation>
 <translation id="883848425547221593">Bookmark Lain</translation>
 <translation id="884264119367021077">Alamat pengiriman</translation>
+<translation id="8846319957959474018">Buka aplikasi secara mudah dengan bookmark</translation>
 <translation id="884923133447025588">Tidak ditemukan mekanisme pembatalan.</translation>
 <translation id="885730110891505394">Berbagi dengan Google</translation>
 <translation id="8858065207712248076">Chrome menyarankan untuk menyetel ulang sandi <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> jika Anda juga menggunakannya di situs lain.</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb
index bee5498..a5f49ea 100644
--- a/components/strings/components_strings_it.xtb
+++ b/components/strings/components_strings_it.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Continua</translation>
 <translation id="2365563543831475020">Il rapporto sugli arresti anomali generato il giorno <ph name="CRASH_TIME" /> non è stato caricato</translation>
 <translation id="2367567093518048410">Livello</translation>
+<translation id="2378238891085281592">Navigazione privata attiva</translation>
 <translation id="2384307209577226199">Valore predefinito aziendale</translation>
 <translation id="2386255080630008482">Il certificato del server è stato revocato.</translation>
 <translation id="2392959068659972793">Mostra criteri senza valori</translation>
@@ -352,6 +353,7 @@
 <translation id="3391030046425686457">Indirizzo di consegna</translation>
 <translation id="3395827396354264108">Metodo di ritiro</translation>
 <translation id="3399952811970034796">Indirizzo di consegna</translation>
+<translation id="3409072600744224192"><ph name="SIGN_IN_LINK" /> per avere a disposizione le tue carte su tutti i dispositivi.</translation>
 <translation id="3422248202833853650">Prova a uscire da altri programmi per liberare spazio nella memoria.</translation>
 <translation id="3422472998109090673"><ph name="HOST_NAME" /> non è attualmente raggiungibile.</translation>
 <translation id="3427092606871434483">Consenti (predefinita)</translation>
@@ -511,6 +513,7 @@
 <translation id="450710068430902550">Condivisione con l'amministratore</translation>
 <translation id="4515275063822566619">Carte di credito e indirizzi provengono da Chrome e dall'account Google (<ph name="ACCOUNT_EMAIL" />). Puoi gestirli in <ph name="BEGIN_LINK" />Impostazioni<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Dettagli</translation>
+<translation id="4524805452350978254">Gestisci le carte</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Prova a disattivare le estensioni.</translation>
 <translation id="457875822857220463">Consegna</translation>
@@ -576,6 +579,7 @@
 <translation id="5045550434625856497">Password non corretta</translation>
 <translation id="5056549851600133418">Articoli per te</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Controllare l'indirizzo proxy<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Accedi e attiva la sincronizzazione per avere a disposizione le tue carte su tutti i dispositivi.</translation>
 <translation id="5086888986931078152">Potresti non riuscire più ad accedere ai contenuti protetti di alcuni siti.</translation>
 <translation id="5087286274860437796">Il certificato del server non è valido in questa fase.</translation>
 <translation id="5087580092889165836">Aggiungi carta</translation>
@@ -621,6 +625,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> di <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Scegli le informazioni di contatto</translation>
 <translation id="5327248766486351172">Nome</translation>
+<translation id="5327567770033251652">Attiva la sincronizzazione</translation>
 <translation id="5332219387342487447">Modalità di spedizione</translation>
 <translation id="5355557959165512791">Al momento non puoi visitare il sito <ph name="SITE" /> perché il relativo certificato è stato revocato. In genere gli errori di rete e gli attacchi sono temporanei, pertanto questa pagina potrebbe funzionare più tardi.</translation>
 <translation id="536296301121032821">Archiviazione delle impostazioni criterio non riuscita</translation>
@@ -685,6 +690,7 @@
 <translation id="5765072501007116331">Seleziona un indirizzo per conoscere i requisiti e i metodi di consegna</translation>
 <translation id="5770114862687765385">Sembra che il file sia danneggiato. Fai clic sul pulsante "Ripristina" per ripristinare la sessione.</translation>
 <translation id="5778550464785688721">Controllo completo di dispositivi MIDI</translation>
+<translation id="57838592816432529">Disattiva audio</translation>
 <translation id="5784606427469807560">Si è verificato un problema durante la conferma della carta. Controlla la connessione Internet e riprova.</translation>
 <translation id="5785756445106461925">Inoltre, questa pagina include altre risorse che non sono sicure. Tali risorse possono essere visualizzate da altri durante il transito dei dati e possono essere modificate da un utente malintenzionato al fine di modificare l'aspetto della pagina.</translation>
 <translation id="5786044859038896871">Vuoi inserire automaticamente i dati della carta?</translation>
@@ -696,6 +702,7 @@
 <translation id="5866257070973731571">Aggiungi numero di telefono</translation>
 <translation id="5869405914158311789">Impossibile raggiungere il sito</translation>
 <translation id="5869522115854928033">Password salvate</translation>
+<translation id="5887400589839399685">Carta salvata</translation>
 <translation id="5893752035575986141">Le carte di credito sono accettate.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (sincronizzati)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 in uso}other{# in uso}}</translation>
@@ -812,18 +819,22 @@
 <translation id="6915804003454593391">Utente:</translation>
 <translation id="6944692733090228304">Hai inserito la password in un sito non gestito da <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Per proteggere il tuo account, non riutilizzare la password con altri siti e app.</translation>
 <translation id="6945221475159498467">Seleziona</translation>
+<translation id="6948540501704460596"><ph name="SYNC_LINK" /> per avere a disposizione le tue carte su tutti i dispositivi.</translation>
 <translation id="6948701128805548767">Seleziona un indirizzo per conoscere i requisiti e i metodi di ritiro</translation>
 <translation id="6949872517221025916">Reimposta la password</translation>
 <translation id="6950684638814147129">Errore durante l'analisi del valore JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Apri la pagina in una nuova scheda di navigazione privata</translation>
 <translation id="6957887021205513506">Il certificato del server risulta essere un falso.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Dispositivo</translation>
 <translation id="6970216967273061347">Distretto</translation>
 <translation id="6973656660372572881">Sono stati specificati sia i server proxy fissi che un URL script .pac.</translation>
+<translation id="6984479912851154518">Per procedere al pagamento tramite un'applicazione esterna, uscirai dalla modalità di navigazione privata. Vuoi continuare?</translation>
 <translation id="6989763994942163495">Mostra impostazioni avanzate...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">L'addebito potrebbe essere singolo oppure ricorrente e potrebbe non essere evidente.</translation>
 <translation id="7029809446516969842">Password</translation>
+<translation id="7042837854211185817">Attiva la sincronizzazione per avere a disposizione le tue carte su tutti i dispositivi.</translation>
 <translation id="7050187094878475250">Hai tentato di visitare il sito <ph name="DOMAIN" />, ma il server ha presentato un certificato con periodo di validità troppo lungo per poter essere ritenuto attendibile.</translation>
 <translation id="7053983685419859001">Blocca</translation>
 <translation id="7064851114919012435">Informazioni di contatto</translation>
@@ -1070,6 +1081,7 @@
 <translation id="8820817407110198400">Preferiti</translation>
 <translation id="883848425547221593">Altri Preferiti</translation>
 <translation id="884264119367021077">Indirizzo di spedizione</translation>
+<translation id="8846319957959474018">Apri facilmente le app con i preferiti</translation>
 <translation id="884923133447025588">Nessun sistema di revoca trovato.</translation>
 <translation id="885730110891505394">Condivisione con Google</translation>
 <translation id="8858065207712248076">Chrome ti consiglia di reimpostare la password di <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />, se l'hai utilizzata su altri siti.</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb
index 5e0df75f..217a0f92 100644
--- a/components/strings/components_strings_iw.xtb
+++ b/components/strings/components_strings_iw.xtb
@@ -693,6 +693,7 @@
 <translation id="5765072501007116331">עליך לבחור כתובת כדי לראות שיטות מסירה ודרישות</translation>
 <translation id="5770114862687765385">נראה שהקובץ פגום. יש ללחוץ על הלחצן 'איפוס' כדי לאפס את ההפעלה.</translation>
 <translation id="5778550464785688721">‏שליטה מלאה במכשירי MIDI</translation>
+<translation id="57838592816432529">השתק</translation>
 <translation id="5784606427469807560">הייתה בעיה באישור הכרטיס. בדוק את החיבור לאינטרנט ונסה שוב.</translation>
 <translation id="5785756445106461925">כמו כן, דף זה כולל משאבים נוספים שאינם מאובטחים. גורמים אחרים עלולים לראות את המשאבים האלה במהלך העברתם, ותוקף עלול לשנות אותם באופן שישנה את מראה הדף.</translation>
 <translation id="5786044859038896871">האם ברצונך למלא את פרטי הכרטיס שלך?</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index 208e831..84173f5 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -688,6 +688,7 @@
 <translation id="5765072501007116331">配達方法と要件を確認するには、住所を選択してください</translation>
 <translation id="5770114862687765385">ファイルが壊れているようです。[リセット] ボタンをクリックしてセッションをリセットしてください。</translation>
 <translation id="5778550464785688721">MIDI デバイスのフル コントロール</translation>
+<translation id="57838592816432529">ミュート</translation>
 <translation id="5784606427469807560">カードの確認中に問題が発生しました。インターネット接続を確認してもう一度お試しください。</translation>
 <translation id="5785756445106461925">加えて、このページには安全でない他のリソースが含まれています。このリソースは送信中に他のユーザーから見られる可能性があります。また、悪意のあるユーザーによって改変されページの見た目が変わる可能性もあります。</translation>
 <translation id="5786044859038896871">カード情報を入力しますか?</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb
index 9b5b148..609460e 100644
--- a/components/strings/components_strings_kn.xtb
+++ b/components/strings/components_strings_kn.xtb
@@ -485,7 +485,7 @@
 <translation id="4277028893293644418">ಪಾಸ್‌ವರ್ಡ್ ಮರುಹೊಂದಿಸಿ</translation>
 <translation id="4280429058323657511">, ಅವಧಿ ಮುಕ್ತಾಯ <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">ಬದಲಿಸಿ</translation>
-<translation id="4308131620840579419">ನಿಮ್ಮ ಎಲ್ಲಾ ಕಾರ್ಡ್‌ಗಳನ್ನು ಒಂದೇ ಸ್ಥಳದಲ್ಲಿ ಇರಿಸುವುದೇ?</translation>
+<translation id="4308131620840579419">ನಿಮ್ಮ ಎಲ್ಲಾ ಕಾರ್ಡ್‌ಗಳನ್ನು ಒಂದೇ ಸ್ಥಳದಲ್ಲಿ ಉಳಿಸುವುದೇ?</translation>
 <translation id="4312866146174492540">ನಿರ್ಬಂಧಿಸು (ಡಿಫಾಲ್ಟ್)</translation>
 <translation id="4325863107915753736">ಲೇಖನ ಕಂಡುಬರಲಿಲ್ಲ</translation>
 <translation id="4326324639298822553">ನಿಮ್ಮ ಮುಕ್ತಾಯ ದಿನಾಂಕವನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</translation>
@@ -683,6 +683,7 @@
 <translation id="5765072501007116331">ವಿತರಣೆಯ ವಿಧಾನಗಳು ಹಾಗೂ ಆವಶ್ಯಕತೆಗಳನ್ನು ನೋಡಲು, ಒಂದು ವಿಳಾಸವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ</translation>
 <translation id="5770114862687765385">ಫೈಲ್ ದೋಷಪೂರಿತವಾಗಿದೆ ಎಂದು ತೋರುತ್ತದೆ. ಸೆಶನ್ ಅನ್ನು ಮರುಹೊಂದಿಸಲು 'ಮರುಹೊಂದಿಸು' ಬಟನ್ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
 <translation id="5778550464785688721">MIDI ಸಾಧನಗಳು ಸಂಪೂರ್ಣ ನಿಯಂತ್ರಣ</translation>
+<translation id="57838592816432529">ಮ್ಯೂಟ್</translation>
 <translation id="5784606427469807560">ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು ದೃಢೀಕರಿಸುವಲ್ಲಿ ಸಮಸ್ಯೆ ಇದೆ. ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="5785756445106461925">ಅಲ್ಲದೇ, ಸುರಕ್ಷಿತವಲ್ಲದ ಸಂಪನ್ಮೂಲಗಳನ್ನು ಈ ಪುಟ ಒಳಗೊಂಡಿದೆ. ಪ್ರಯಾಣದ ಸಂದರ್ಭದಲ್ಲಿ ಈ ಸಂಪನ್ಮೂಲಗಳನ್ನು ಇತರರೂ ವೀಕ್ಷಿಸಬಹುದಾಗಿದೆ ಮತ್ತು ಪುಟದ ನೋಟವೇ ಬದಲಾಗುವಂತೆ ಆಕ್ರಮಣಕಾರರು ಅದನ್ನು ತಿದ್ದಬಹುದಾಗಿದೆ.</translation>
 <translation id="5786044859038896871">ನಿಮ್ಮ ಕಾರ್ಡ್ ಮಾಹಿತಿ ಭರ್ತಿ ಮಾಡಲು ನೀವು ಬಯಸುವಿರಾ?</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index 3b6f015..d641ec4 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -688,6 +688,7 @@
 <translation id="5765072501007116331">배달 방법과 요구사항을 확인하려면 주소를 선택하세요.</translation>
 <translation id="5770114862687765385">파일이 손상된 것 같습니다. 세션을 다시 설정하려면 '재설정' 버튼을 클릭하세요.</translation>
 <translation id="5778550464785688721">MIDI 기기 전체 제어</translation>
+<translation id="57838592816432529">음소거</translation>
 <translation id="5784606427469807560">카드 확인 중에 문제가 발생했습니다. 인터넷 연결을 확인하고 다시 시도하세요.</translation>
 <translation id="5785756445106461925">또한 이 페이지에는 안전하지 않은 다른 리소스가 포함되어 있습니다. 이러한 리소스는 전송 중에 다른 사람이 볼 수 있으며 페이지의 모양을 변경하기 위해 공격자가 수정할 수 있습니다.</translation>
 <translation id="5786044859038896871">카드 정보를 입력하시겠습니까?</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb
index 9cb5d0b6..e33150a 100644
--- a/components/strings/components_strings_lt.xtb
+++ b/components/strings/components_strings_lt.xtb
@@ -689,6 +689,7 @@
 <translation id="5765072501007116331">Jei norite peržiūrėti pristatymo metodus ir reikalavimus, pasirinkite adresą.</translation>
 <translation id="5770114862687765385">Panašu, kad failas sugadintas. Spustelėkite nustatymo iš naujo mygtuką ir nustatykite sesiją iš naujo.</translation>
 <translation id="5778550464785688721">MIDI įrenginių visateisis valdymas</translation>
+<translation id="57838592816432529">Nutildyti</translation>
 <translation id="5784606427469807560">Patvirtinant kortelę kilo problema. Patikrinkite interneto ryšį ir bandykite dar kartą.</translation>
 <translation id="5785756445106461925">Be to, šiame puslapyje yra kitų nesaugių išteklių. Perduodant duomenis šiuos išteklius gali peržiūrėti kiti asmenys ir keisti atakuojanti programa, siekianti pakeisti puslapio išvaizdą.</translation>
 <translation id="5786044859038896871">Ar norite, kad būtų įvesta jūsų kredito kortelės informacija?</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index 27a355b..b43278f 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Turpināt</translation>
 <translation id="2365563543831475020"><ph name="CRASH_TIME" /> notverts ziņojums par avāriju; netika lejupielādēts</translation>
 <translation id="2367567093518048410">Līmenis</translation>
+<translation id="2378238891085281592">Jūs esat atvēris privāto režīmu</translation>
 <translation id="2384307209577226199">Uzņēmuma noklusējuma politika</translation>
 <translation id="2386255080630008482">Servera sertifikāts ir atsaukts.</translation>
 <translation id="2392959068659972793">Rādīt politikas, kuru vērtība nav iestatīta</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Piegādes adrese</translation>
 <translation id="3395827396354264108">Saņemšanas veids</translation>
 <translation id="3399952811970034796">Piegādes adrese</translation>
+<translation id="3409072600744224192">Lai kartītes būtu pieejamas visās jūsu ierīcēs, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Aizveriet citas programmas, lai atbrīvotu vietu atmiņā.</translation>
 <translation id="3422472998109090673">Vietne <ph name="HOST_NAME" /> pašlaik nav sasniedzama.</translation>
 <translation id="3427092606871434483">Atļaut (pēc noklusējuma)</translation>
@@ -513,6 +515,7 @@
 <translation id="450710068430902550">Kopīgošana ar administratoru</translation>
 <translation id="4515275063822566619">Kartes un adreses tiek iegūtas no Chrome un jūsu Google konta (<ph name="ACCOUNT_EMAIL" />). Varat tās pārvaldīt <ph name="BEGIN_LINK" />iestatījumos<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Informācija</translation>
+<translation id="4524805452350978254">Pārvaldīt kartītes</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Atspējojiet paplašinājumus.</translation>
 <translation id="457875822857220463">Piegāde</translation>
@@ -578,6 +581,7 @@
 <translation id="5045550434625856497">Nepareiza parole</translation>
 <translation id="5056549851600133418">Jums piemeklēti raksti</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Pārbaudiet starpniekservera adresi<ph name="END_LINK" />.</translation>
+<translation id="5072538239104292703">Lai kartītes būtu pieejamas visās jūsu ierīcēs, pierakstieties un ieslēdziet sinhronizāciju.</translation>
 <translation id="5086888986931078152">Varat zaudēt piekļuvi aizsargātam saturam no noteiktām vietnēm.</translation>
 <translation id="5087286274860437796">Servera sertifikāts šobrīd nav derīgs.</translation>
 <translation id="5087580092889165836">Pievienot karti</translation>
@@ -623,6 +627,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" />. no <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Izvēlēties kontaktinformāciju</translation>
 <translation id="5327248766486351172">Nosaukums</translation>
+<translation id="5327567770033251652">ieslēgt sinhronizāciju</translation>
 <translation id="5332219387342487447">Piegādes veids</translation>
 <translation id="5355557959165512791">Pašlaik nevarat apmeklēt vietni <ph name="SITE" />, jo tās sertifikāts ir atsaukts. Tā kā tīkla kļūdas un uzbrukumi parasti ir īslaicīgi, visticamāk, šī lapa vēlāk darbosies.</translation>
 <translation id="536296301121032821">Neizdevās saglabāt politikas iestatījumus.</translation>
@@ -687,6 +692,7 @@
 <translation id="5765072501007116331">Lai skatītu piegādes veidus un prasības, atlasiet adresi.</translation>
 <translation id="5770114862687765385">Šķiet, ka fails ir bojāts. Lai atiestatītu sesiju, noklikšķiniet uz pogas “Atiestatīt”.</translation>
 <translation id="5778550464785688721">Pilnīga MIDI ierīču pārvaldība</translation>
+<translation id="57838592816432529">Izslēgt skaņu</translation>
 <translation id="5784606427469807560">Apstiprinot karti, radās problēma. Pārbaudiet interneta savienojumu un mēģiniet vēlreiz.</translation>
 <translation id="5785756445106461925">Turklāt šajā lapā ir citi resursi, kas nav droši. Kamēr šie resursi tiek pārsūtīti, tos var aplūkot citi, kā arī uzbrucējs var tos pārveidot, lai mainītu lapas izskatu.</translation>
 <translation id="5786044859038896871">Vai vēlaties aizpildīt laukus ar kartes informāciju?</translation>
@@ -694,10 +700,11 @@
 <translation id="5810442152076338065">Savienojums ar domēnu <ph name="DOMAIN" /> ir šifrēts, izmantojot novecojušu šifra komplektu.</translation>
 <translation id="5813119285467412249">&amp;Pievienošanas atsaukuma atcelšana</translation>
 <translation id="5838278095973806738">Neievadiet šajā vietnē sensitīvu informāciju (piemēram, paroles vai kredītkartes), jo to var nozagt uzbrucēji.</translation>
-<translation id="5863847714970149516">Nākamā lapa var mēģināt pieprasīt naudu</translation>
+<translation id="5863847714970149516">Nākamajā lapā var tikt mēģināts pieprasīt naudu</translation>
 <translation id="5866257070973731571">Tālruņa numura pievienošana</translation>
 <translation id="5869405914158311789">Šī vietne nav sasniedzama</translation>
 <translation id="5869522115854928033">Saglabātās paroles</translation>
+<translation id="5887400589839399685">Kartīte ir saglabāta</translation>
 <translation id="5893752035575986141">Tiek pieņemtas kredītkartes.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (veikta sinhronizācija)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 tiek lietots}zero{# tiek lietoti}one{# tiek lietots}other{# tiek lietoti}}</translation>
@@ -815,18 +822,22 @@
 <translation id="6915804003454593391">Lietotājs:</translation>
 <translation id="6944692733090228304">Jūs ievadījāt paroli vietnē, kuru nepārvalda <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Lai aizsargātu savu kontu, neizmantojiet šo paroli citās lietotnēs un vietnēs.</translation>
 <translation id="6945221475159498467">Atlasīt</translation>
+<translation id="6948540501704460596">Lai kartītes būtu pieejamas visās jūsu ierīcēs, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Lai skatītu saņemšanas veidus un prasības, atlasiet adresi.</translation>
 <translation id="6949872517221025916">Paroles atiestatīšana</translation>
 <translation id="6950684638814147129">JSON vērtības parsēšanas kļūda: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Atveriet lapu jaunā privātajā cilnē</translation>
 <translation id="6957887021205513506">Šķiet, ka servera sertifikāts ir viltojums.</translation>
 <translation id="6965382102122355670">Labi</translation>
 <translation id="6965978654500191972">Ierīce</translation>
 <translation id="6970216967273061347">Rajons</translation>
 <translation id="6973656660372572881">Ir norādīti gan fiksēti starpniekserveri, gan .pac skripta URL.</translation>
+<translation id="6984479912851154518">Ja maksāšanai tiks izmantota ārēja lietojumprogramma, tiks aizvērts privātais režīms. Vai turpināt?</translation>
 <translation id="6989763994942163495">Rādīt papildu iestatījumus...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Šie naudas pieprasījumi var būt vienreizēji vai atkārtoti, un tie var nebūt uzreiz pamanāmi.</translation>
 <translation id="7029809446516969842">Paroles</translation>
+<translation id="7042837854211185817">Lai kartītes būtu pieejamas visās jūsu ierīcēs, ieslēdziet sinhronizāciju.</translation>
 <translation id="7050187094878475250">Jūs mēģinājāt sasniegt domēnu <ph name="DOMAIN" />, bet serveris uzrādīja sertifikātu, kura derīguma periods ir pārāk ilgs, lai būtu uzticams.</translation>
 <translation id="7053983685419859001">Bloķēt</translation>
 <translation id="7064851114919012435">Kontaktinformācija</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">Grāmatzīmes</translation>
 <translation id="883848425547221593">Citas grāmatzīmes</translation>
 <translation id="884264119367021077">Piegādes adrese</translation>
+<translation id="8846319957959474018">Atveriet lietotnes vienkārši, izmantojot grāmatzīmes</translation>
 <translation id="884923133447025588">Nav atrasts atsaukšanas mehānisms.</translation>
 <translation id="885730110891505394">Kopīgošana ar Google</translation>
 <translation id="8858065207712248076">Chrome iesaka atiestatīt jūsu <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> paroli, ja izmantojāt to citās vietnēs.</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index fbfa106..43e8771 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -687,6 +687,7 @@
 <translation id="5765072501007116331">ഡെലിവറി രീതികളും ആവശ്യകതകളും കാണാൻ ഒരു വിലാസം തിരഞ്ഞെടുക്കുക</translation>
 <translation id="5770114862687765385">ഫയൽ കേടായതായി തോന്നുന്നു. സെഷന്‍ പുനഃസജ്ജീകരിക്കാൻ 'പുനഃസജ്ജീകരിക്കുക' ബട്ടൺ ക്ലിക്ക് ചെയ്യുക.</translation>
 <translation id="5778550464785688721">MIDI ഉപകരണങ്ങളുടെ പൂർണ നിയന്ത്രണം</translation>
+<translation id="57838592816432529">മ്യൂട്ടുചെയ്യുക</translation>
 <translation id="5784606427469807560">നിങ്ങളുടെ കാർഡ് സ്ഥിരീകരിക്കുന്നതിൽ പ്രശ്‌നമുണ്ടായി. ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിച്ച്, വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="5785756445106461925">കൂടാതെ, ഈ പേജിൽ സുരക്ഷിതമല്ലാത്ത മറ്റ് ഉറവിടങ്ങൾ ഉൾപ്പെടുന്നു. ഈ ഉറവിടങ്ങൾ കൈമാറുന്നതിനിടെ മറ്റുള്ളവർക്ക് കാണാനും പേജിന്റെ രൂപം മാറ്റുന്ന തരത്തിൽ ഒരു ആക്രമണകാരിയ്‌ക്ക് പരിഷ്‌ക്കരിക്കാനുമായേക്കും.</translation>
 <translation id="5786044859038896871">നിങ്ങളുടെ കാർഡ് വിവരം പൂരിപ്പിക്കണോ?</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb
index 6ad94e6..2192d45f 100644
--- a/components/strings/components_strings_mr.xtb
+++ b/components/strings/components_strings_mr.xtb
@@ -688,6 +688,7 @@
 <translation id="5765072501007116331">वितरण पद्धती आणि आवश्यकता पाहण्यासाठी, एक पत्ता निवडा</translation>
 <translation id="5770114862687765385">फाइल करप्ट आहे असे दिसते. सेशन रीसेट करण्यासाठी 'रीसेट करा' बटणावर क्लिक करा.</translation>
 <translation id="5778550464785688721">MIDI डिव्हाइसेस पूर्ण नियंत्रण</translation>
+<translation id="57838592816432529">निःशब्द करा</translation>
 <translation id="5784606427469807560">आपल्या कार्डची पुष्टी करताना समस्या आली. आपले इंटरनेट कनेक्शन तपासा आणि पुन्हा प्रयत्न करा.</translation>
 <translation id="5785756445106461925">पुढे, या पृष्ठात सुरक्षित नसलेली इतर संसाधने समाविष्ट आहेत. ही संसाधने संक्रमणात असताना इतरांद्वारे पाहिली जाऊ शकतात आणि पृष्ठाचे स्वरूप बदलण्यासाठी आक्रमणकर्त्याद्वारे सुधारित केली जाऊ शकतात.</translation>
 <translation id="5786044859038896871">आपण तुमची कार्ड माहिती भरू इच्छित आहात?</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb
index 994de30..02d020e 100644
--- a/components/strings/components_strings_ms.xtb
+++ b/components/strings/components_strings_ms.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Teruskan</translation>
 <translation id="2365563543831475020">Laporan ranap sistem yang dirakam pada <ph name="CRASH_TIME" /> tidak dimuat naik</translation>
 <translation id="2367567093518048410">Tahap</translation>
+<translation id="2378238891085281592">Anda menggunakan mod peribadi</translation>
 <translation id="2384307209577226199">Lalai perusahaan</translation>
 <translation id="2386255080630008482">Sijil pelayan telah dibatalkan.</translation>
 <translation id="2392959068659972793">Paparkan dasar tanpa nilai yang ditetapkan</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Alamat penghantaran</translation>
 <translation id="3395827396354264108">Kaedah pengambilan</translation>
 <translation id="3399952811970034796">Alamat Penghantaran</translation>
+<translation id="3409072600744224192">Untuk mendapatkan kad pada semua peranti anda, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Cuba keluar daripada atur cara lain untuk mengosongkan memori.</translation>
 <translation id="3422472998109090673"><ph name="HOST_NAME" /> tidak dapat dicapai pada masa ini.</translation>
 <translation id="3427092606871434483">Benarkan (lalai)</translation>
@@ -515,6 +517,7 @@
 <translation id="450710068430902550">Berkongsi dengan Pentadbir</translation>
 <translation id="4515275063822566619">Kad dan alamat adalah daripada Chrome dan Akaun Google anda (<ph name="ACCOUNT_EMAIL" />). Anda boleh mengurus kad dan alamat ini dalam <ph name="BEGIN_LINK" />Tetapan<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Butiran</translation>
+<translation id="4524805452350978254">Urus kad</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Cuba lumpuhkan sambungan anda.</translation>
 <translation id="457875822857220463">Penghantaran</translation>
@@ -580,6 +583,7 @@
 <translation id="5045550434625856497">Kata laluan tidak sah</translation>
 <translation id="5056549851600133418">Artikel untuk anda</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Menyemak alamat proksi<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Untuk mendapatkan kad pada semua peranti anda, log masuk dan hidupkan penyegerakan.</translation>
 <translation id="5086888986931078152">Anda mungkin kehilangan akses kepada kandungan dilindungi daripada sesetengah tapak web.</translation>
 <translation id="5087286274860437796">Sijil pelayan tidak sah pada masa ini.</translation>
 <translation id="5087580092889165836">Tambah kad</translation>
@@ -625,6 +629,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> daripada <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Pilih Maklumat Hubungan</translation>
 <translation id="5327248766486351172">Nama</translation>
+<translation id="5327567770033251652">hidupkan penyegerakan</translation>
 <translation id="5332219387342487447">Kaedah Penghantaran</translation>
 <translation id="5355557959165512791">Anda tidak boleh melawati <ph name="SITE" /> sekarang kerana sijil tapak ini telah ditarik balik. Ralat dan serangan rangkaian biasanya bersifat sementara. Oleh sebab itu, halaman ini mungkin akan berfungsi semula kemudian.</translation>
 <translation id="536296301121032821">Gagal menyimpan tetapan dasar</translation>
@@ -689,6 +694,7 @@
 <translation id="5765072501007116331">Pilih alamat untuk melihat kaedah dan syarat penghantaran</translation>
 <translation id="5770114862687765385">Fail tersebut kelihatan rosak. Klik butang 'Tetapkan semula' untuk menetapkan semula sesi.</translation>
 <translation id="5778550464785688721">Kawalan penuh peranti MIDI</translation>
+<translation id="57838592816432529">Redam</translation>
 <translation id="5784606427469807560">Terdapat masalah mengesahkan kad anda. Semak sambungan Internet anda dan cuba lagi.</translation>
 <translation id="5785756445106461925">Selain itu, halaman ini mengandungi sumber lain yang tidak selamat. Sumber ini boleh dilihat oleh orang lain semasa dalam transit dan boleh diubah oleh penyerang untuk menukar penampilan halaman.</translation>
 <translation id="5786044859038896871">Adakah anda ingin mengisi maklumat kad anda?</translation>
@@ -700,6 +706,7 @@
 <translation id="5866257070973731571">Tambahkan Nombor Telefon</translation>
 <translation id="5869405914158311789">Tapak ini tidak dapat dicapai</translation>
 <translation id="5869522115854928033">Kata laluan disimpan</translation>
+<translation id="5887400589839399685">Kad disimpan</translation>
 <translation id="5893752035575986141">Kad kredit diterima.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (disegerakkan)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 sedang digunakan}other{# sedang digunakan}}</translation>
@@ -817,18 +824,22 @@
 <translation id="6915804003454593391">Pengguna:</translation>
 <translation id="6944692733090228304">Anda memasukkan kata laluan di tapak yang tidak diurus oleh <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Untuk melindungi akaun anda, jangan gunakan semula kata laluan anda pada apl dan tapak lain.</translation>
 <translation id="6945221475159498467">Pilih</translation>
+<translation id="6948540501704460596">Untuk mendapatkan kad pada semua peranti anda, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Pilih alamat untuk melihat kaedah dan syarat pengambilan</translation>
 <translation id="6949872517221025916">Tetapkan Semula Kata Laluan</translation>
 <translation id="6950684638814147129">Ralat semasa menghuraikan nilai JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Buka halaman dalam tab Peribadi baharu</translation>
 <translation id="6957887021205513506">Sijil pelayan rupanya adalah pemalsuan.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Peranti</translation>
 <translation id="6970216967273061347">Daerah</translation>
 <translation id="6973656660372572881">Pelayan proksi tetap dan juga URL skrip .pac tidak ditetapkan.</translation>
+<translation id="6984479912851154518">Meninggalkan mod peribadi untuk membayar melalui aplikasi luar. Teruskan?</translation>
 <translation id="6989763994942163495">Paparkan tetapan lanjutan...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Caj ini mungkin caj sekali atau caj berulang dan mungkin tidak ketara.</translation>
 <translation id="7029809446516969842">Kata laluan</translation>
+<translation id="7042837854211185817">Untuk mendapatkan kad anda pada semua peranti, hidupkan penyegerakan.</translation>
 <translation id="7050187094878475250">Anda cuba untuk mencapai <ph name="DOMAIN" />, tetapi pelayan memberikan sijil yang tempoh sahnya terlalu panjang untuk boleh dipercayai.</translation>
 <translation id="7053983685419859001">Sekat</translation>
 <translation id="7064851114919012435">Maklumat hubungan</translation>
@@ -1076,6 +1087,7 @@
 <translation id="8820817407110198400">Penanda buku</translation>
 <translation id="883848425547221593">Penanda Halaman Lain</translation>
 <translation id="884264119367021077">Alamat penghantaran</translation>
+<translation id="8846319957959474018">Buka apl dengan mudah menggunakan penanda halaman</translation>
 <translation id="884923133447025588">Tiada mekanisme pembatalan dijumpai.</translation>
 <translation id="885730110891505394">Berkongsi dengan Google</translation>
 <translation id="8858065207712248076">Chrome mengesyorkan penetapan semula kata laluan <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> jika anda menggunakan semula kata laluan itu di tapak lain.</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index 94087dde..4007ce3 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Doorgaan</translation>
 <translation id="2365563543831475020">Het crashrapport dat is vastgelegd op <ph name="CRASH_TIME" />, is niet geüpload</translation>
 <translation id="2367567093518048410">Niveau</translation>
+<translation id="2378238891085281592">Je gebruikt de privémodus</translation>
 <translation id="2384307209577226199">Zakelijk standaard</translation>
 <translation id="2386255080630008482">Het servercertificaat is ingetrokken.</translation>
 <translation id="2392959068659972793">Beleid weergeven zonder waarde ingesteld</translation>
@@ -352,6 +353,7 @@
 <translation id="3391030046425686457">Afleveradres</translation>
 <translation id="3395827396354264108">Ophaalmethode</translation>
 <translation id="3399952811970034796">Bezorgadres</translation>
+<translation id="3409072600744224192">Als je je kaarten op alle apparaten wilt bekijken, moet je <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Probeer andere programma's af te sluiten om geheugen vrij te maken.</translation>
 <translation id="3422472998109090673"><ph name="HOST_NAME" /> is momenteel niet bereikbaar.</translation>
 <translation id="3427092606871434483">Toestaan (standaard)</translation>
@@ -510,6 +512,7 @@
 <translation id="450710068430902550">Delen met beheerder</translation>
 <translation id="4515275063822566619">Kaarten en adressen zijn afkomstig uit Chrome en je Google-account (<ph name="ACCOUNT_EMAIL" />). Je kunt ze beheren in <ph name="BEGIN_LINK" />Instellingen<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Details</translation>
+<translation id="4524805452350978254">Kaarten beheren</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Probeer je extensies uit te schakelen.</translation>
 <translation id="457875822857220463">Bezorging</translation>
@@ -575,6 +578,7 @@
 <translation id="5045550434625856497">Onjuist wachtwoord</translation>
 <translation id="5056549851600133418">Artikelen voor jou</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Het proxy-adres controleren<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Als je je kaarten op alle apparaten wilt bekijken, moet je inloggen en synchronisatie inschakelen.</translation>
 <translation id="5086888986931078152">Mogelijk heb je geen toegang meer tot beveiligde content van bepaalde sites.</translation>
 <translation id="5087286274860437796">Het servercertificaat is momenteel niet geldig.</translation>
 <translation id="5087580092889165836">Kaart toevoegen</translation>
@@ -620,6 +624,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> van <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Contactgegevens kiezen</translation>
 <translation id="5327248766486351172">Naam</translation>
+<translation id="5327567770033251652">synchronisatie inschakelen</translation>
 <translation id="5332219387342487447">Verzendmethode</translation>
 <translation id="5355557959165512791">Je kunt <ph name="SITE" /> momenteel niet bezoeken, omdat het bijbehorende certificaat is ingetrokken. Netwerkfouten en aanvallen zijn doorgaans tijdelijk, dus deze pagina werkt later waarschijnlijk correct.</translation>
 <translation id="536296301121032821">Opslaan van beleidsinstellingen is mislukt</translation>
@@ -684,6 +689,7 @@
 <translation id="5765072501007116331">Selecteer een adres om bezorgingsmethoden en vereisten te bekijken</translation>
 <translation id="5770114862687765385">Het bestand lijkt beschadigd. Klik op de knop Resetten om de sessie te resetten.</translation>
 <translation id="5778550464785688721">Volledige controle voor MIDI-apparaten</translation>
+<translation id="57838592816432529">Dempen</translation>
 <translation id="5784606427469807560">Er is een probleem opgetreden bij het bevestigen van je creditcard. Controleer je internetverbinding en probeer het opnieuw.</translation>
 <translation id="5785756445106461925">Bovendien bevat deze pagina bronnen die niet beveiligd zijn. Deze bronnen kunnen tijdens verzending door anderen worden bekeken en kunnen door een aanvaller worden gewijzigd om het uiterlijk van de pagina aan te passen.</translation>
 <translation id="5786044859038896871">Wil je de gegevens van je creditcard laten invullen?</translation>
@@ -695,6 +701,7 @@
 <translation id="5866257070973731571">Telefoonnummer toevoegen</translation>
 <translation id="5869405914158311789">Deze site is niet bereikbaar</translation>
 <translation id="5869522115854928033">Opgeslagen wachtwoorden</translation>
+<translation id="5887400589839399685">Kaart opgeslagen</translation>
 <translation id="5893752035575986141">Creditcards worden geaccepteerd.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (gesynchroniseerd)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 in gebruik}other{# in gebruik}}</translation>
@@ -811,18 +818,22 @@
 <translation id="6915804003454593391">Gebruiker:</translation>
 <translation id="6944692733090228304">Je hebt je wachtwoord ingevoerd op een site die niet door <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> wordt beheerd. Ter bescherming van je account kun je je wachtwoord beter niet hergebruiken voor andere apps en sites.</translation>
 <translation id="6945221475159498467">Selecteren</translation>
+<translation id="6948540501704460596">Als je je kaarten op alle apparaten wilt bekijken, moet je <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Selecteer een adres om ophaalmethoden en vereisten te bekijken</translation>
 <translation id="6949872517221025916">Wachtwoord opnieuw instellen</translation>
 <translation id="6950684638814147129">Fout bij het parseren van de JSON-waarde: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Pagina openen op een nieuw privétabblad</translation>
 <translation id="6957887021205513506">Het certificaat van de server lijkt vals te zijn.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Apparaat</translation>
 <translation id="6970216967273061347">District</translation>
 <translation id="6973656660372572881">Zowel vaste proxyservers als een pac-script-URL worden gespecificeerd.</translation>
+<translation id="6984479912851154518">Je verlaat de privémodus om te betalen via een externe app. Doorgaan?</translation>
 <translation id="6989763994942163495">Geavanceerde instellingen weergeven...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Deze kosten kunnen eenmalig of terugkerend zijn en zijn mogelijk niet duidelijk.</translation>
 <translation id="7029809446516969842">Wachtwoorden</translation>
+<translation id="7042837854211185817">Als je je kaarten op alle apparaten wilt bekijken, moet je synchronisatie inschakelen.</translation>
 <translation id="7050187094878475250">Je hebt geprobeerd <ph name="DOMAIN" /> te bereiken, maar de server heeft een certificaat gepresenteerd waarvan de geldigheidsperiode te lang is om betrouwbaar te zijn.</translation>
 <translation id="7053983685419859001">Blokkeren</translation>
 <translation id="7064851114919012435">Contactgegevens</translation>
@@ -1069,6 +1080,7 @@
 <translation id="8820817407110198400">Bladwijzers</translation>
 <translation id="883848425547221593">Andere bladwijzers</translation>
 <translation id="884264119367021077">Verzendadres</translation>
+<translation id="8846319957959474018">Apps gemakkelijk openen met bladwijzers</translation>
 <translation id="884923133447025588">Geen intrekkingsmechanisme gevonden.</translation>
 <translation id="885730110891505394">Delen met Google</translation>
 <translation id="8858065207712248076">Chrome raadt je aan het wachtwoord voor <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> opnieuw in te stellen als je het voor andere sites hebt hergebruikt.</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index f0401b7..2bf8aff 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -489,7 +489,7 @@
 <translation id="4277028893293644418">Tilbakestill passordet</translation>
 <translation id="4280429058323657511">, utløper <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Bytt</translation>
-<translation id="4308131620840579419">Alle kortene dine på ett sted?</translation>
+<translation id="4308131620840579419">Vil du lagre alle kortene på ett sted?</translation>
 <translation id="4312866146174492540">Blokkér (standard)</translation>
 <translation id="4325863107915753736">Artikkelen ble ikke funnet</translation>
 <translation id="4326324639298822553">Kontrollér utløpsdatoen, og prøv igjen</translation>
@@ -600,7 +600,7 @@
 <translation id="5190835502935405962">Bokmerkerad</translation>
 <translation id="5201306358585911203">På en innebygd side på denne siden står det</translation>
 <translation id="5205222826937269299">Navn er obligatorisk</translation>
-<translation id="5215116848420601511">Betalingsmåter og adresser ved bruk av Google Pay</translation>
+<translation id="5215116848420601511">Betalingsmåter og adresser som bruker Google Pay</translation>
 <translation id="5222812217790122047">E-post er obligatorisk</translation>
 <translation id="5230733896359313003">Leveringsadresse</translation>
 <translation id="5250209940322997802">«Koble til nettverk»</translation>
@@ -688,6 +688,7 @@
 <translation id="5765072501007116331">For å se leveringsmetoder og -krav, velg en adresse</translation>
 <translation id="5770114862687765385">Filen ser ut til å være skadet. Klikk på «Tilbakestill»-knappen for å tilbakestille økten.</translation>
 <translation id="5778550464785688721">Full kontroll av MIDI-enheter</translation>
+<translation id="57838592816432529">Kutt lyden</translation>
 <translation id="5784606427469807560">Det oppsto et problem under forsøket på å bekrefte kortet ditt. Kontrollér Internett-tilkoblingen din, og prøv igjen.</translation>
 <translation id="5785756445106461925">Denne siden inneholder i tillegg andre ressurser som ikke er sikre. Disse ressursene er synlige for andre mens de sendes frem og tilbake, og eventuelle angripere kan modifisere dem for å endre på utseendet til siden.</translation>
 <translation id="5786044859038896871">Vil du fylle ut kortinformasjonen?</translation>
@@ -695,7 +696,7 @@
 <translation id="5810442152076338065">Tilkoblingen til <ph name="DOMAIN" /> er kryptert med en foreldet chifferserie.</translation>
 <translation id="5813119285467412249">&amp;Legg til likevel</translation>
 <translation id="5838278095973806738">Du bør ikke oppgi sensitiv informasjon på dette nettstedet (for eksempel passord eller kredittkort) fordi den kan bli stjålet av angripere.</translation>
-<translation id="5863847714970149516">Siden som kommer kan prøve å belaste deg for penger</translation>
+<translation id="5863847714970149516">Den neste siden kan prøve å belaste deg for penger</translation>
 <translation id="5866257070973731571">Legg til telefonnummer</translation>
 <translation id="5869405914158311789">Dette nettstedet er ikke tilgjengelig</translation>
 <translation id="5869522115854928033">Lagrede passord</translation>
@@ -826,7 +827,7 @@
 <translation id="6973656660372572881">Både statiske proxytjenere og en .pac-skriptnettadresse er angitt.</translation>
 <translation id="6989763994942163495">Vis avanserte innstillinger</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
-<translation id="7016992613359344582">Disse belastningene kan være engangs eller gjentakende, og kan være skjult.</translation>
+<translation id="7016992613359344582">Disse belastningene kan skje én gang eller være gjentakende, og det er ikke sikkert de er åpenbare.</translation>
 <translation id="7029809446516969842">Passord</translation>
 <translation id="7050187094878475250">Du prøvde å nå <ph name="DOMAIN" />. Tjeneren presenterte et sertifikat som har en gyldighetsperiode som er for lang til å være pålitelig.</translation>
 <translation id="7053983685419859001">Blokkér</translation>
@@ -1041,7 +1042,7 @@
 <translation id="8498891568109133222"><ph name="HOST_NAME" /> brukte for lang tid på å svare.</translation>
 <translation id="8503559462189395349">Chrome-passord</translation>
 <translation id="8503813439785031346">Brukernavn</translation>
-<translation id="8508648098325802031">Søk ikon</translation>
+<translation id="8508648098325802031">Søkeikon</translation>
 <translation id="8543181531796978784">Du kan <ph name="BEGIN_ERROR_LINK" />rapportere et påvisningsproblem<ph name="END_ERROR_LINK" /> eller, hvis du forstår sikkerhetsrisikoen, <ph name="BEGIN_LINK" />gå til dette usikre nettstedet<ph name="END_LINK" />.</translation>
 <translation id="8543556556237226809">Har du spørsmål? Kontakt personen som administrer profilen din.</translation>
 <translation id="8553075262323480129">Oversettelsen mislyktes fordi sidens språk ikke kunne fastslås.</translation>
@@ -1091,7 +1092,7 @@
 <translation id="8957210676456822347">Captive Portal-autorisasjon</translation>
 <translation id="8971063699422889582">Tjenerens sertifikat er utløpt.</translation>
 <translation id="8978053250194585037">Google Safe Browsing <ph name="BEGIN_LINK" />oppdaget nylig nettfisking<ph name="END_LINK" /> på <ph name="SITE" />. Nettsteder for nettfisking er laget for å ligne på andre nettsteder, for å prøve å lure deg.</translation>
-<translation id="8983003182662520383">Betalingsmåter og adresser ved bruk av Google Pay</translation>
+<translation id="8983003182662520383">Betalingsmåter og adresser som bruker Google Pay</translation>
 <translation id="8987927404178983737">Måned</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Nettstedet du er i ferd med å åpne, inneholder skadelige programmer</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index 4eddd90..b69c90f 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Dalej</translation>
 <translation id="2365563543831475020">Raport o awarii utworzony w dniu: <ph name="CRASH_TIME" /> nie został przesłany</translation>
 <translation id="2367567093518048410">Poziom</translation>
+<translation id="2378238891085281592">Jesteś w trybie prywatnym</translation>
 <translation id="2384307209577226199">Domyślne zasady przedsiębiorstwa</translation>
 <translation id="2386255080630008482">Certyfikat serwera został unieważniony.</translation>
 <translation id="2392959068659972793">Pokaż zasady bez ustawionej wartości</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Adres dostawy</translation>
 <translation id="3395827396354264108">Metoda odbioru</translation>
 <translation id="3399952811970034796">Adres dostawy</translation>
+<translation id="3409072600744224192">Aby korzystać ze swoich zakładek na wszystkich urządzeniach, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Zamknij inne programy, by zwolnić pamięć.</translation>
 <translation id="3422472998109090673">Strona <ph name="HOST_NAME" /> jest obecnie nieosiągalna.</translation>
 <translation id="3427092606871434483">Zezwalaj (domyślnie)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Udostępnianie administratorowi</translation>
 <translation id="4515275063822566619">Karty i adresy pochodzą z Chrome i Twojego konta Google (<ph name="ACCOUNT_EMAIL" />). Możesz nimi zarządzać w <ph name="BEGIN_LINK" />Ustawieniach<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Szczegóły</translation>
+<translation id="4524805452350978254">Zarządzaj kartami</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Spróbuj wyłączyć rozszerzenia.</translation>
 <translation id="457875822857220463">Dostawa</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Nieprawidłowe hasło</translation>
 <translation id="5056549851600133418">Artykuły dla Ciebie</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Sprawdź adres serwera proxy<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Aby korzystać ze swoich kart na wszystkich urządzeniach, zaloguj się i włącz synchronizację.</translation>
 <translation id="5086888986931078152">Możesz stracić dostęp do treści chronionych na niektórych stronach.</translation>
 <translation id="5087286274860437796">Certyfikat serwera nie jest obecnie ważny.</translation>
 <translation id="5087580092889165836">Dodaj kartę</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> z <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Wybierz dane kontaktowe</translation>
 <translation id="5327248766486351172">Nazwa</translation>
+<translation id="5327567770033251652">włącz synchronizację</translation>
 <translation id="5332219387342487447">Metoda wysyłki</translation>
 <translation id="5355557959165512791">Nie możesz teraz otworzyć strony <ph name="SITE" />, bo jej certyfikat został unieważniony. Błędy sieci i ataki są zazwyczaj przejściowe, więc prawdopodobnie strona będzie wkrótce działać.</translation>
 <translation id="536296301121032821">Zapisanie ustawień zasady nie powiodło się</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Aby zobaczyć metody dostawy oraz wymagania, wybierz adres</translation>
 <translation id="5770114862687765385">Plik wygląda na uszkodzony. Kliknij przycisk „Zresetuj”, by zresetować sesję.</translation>
 <translation id="5778550464785688721">Pełne sterowanie urządzeniami MIDI</translation>
+<translation id="57838592816432529">Wycisz</translation>
 <translation id="5784606427469807560">Podczas potwierdzania karty wystąpił problem. Sprawdź połączenie internetowe i spróbuj ponownie.</translation>
 <translation id="5785756445106461925">Ta strona zawiera także niezabezpieczone zasoby. Podczas przesyłania mogą je wyświetlić inni użytkownicy, a osoby atakujące mogą je zmodyfikować, by zmienić wygląd strony.</translation>
 <translation id="5786044859038896871">Chcesz wpisać dane swojej karty?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Dodaj numer telefonu</translation>
 <translation id="5869405914158311789">Ta witryna jest nieosiągalna</translation>
 <translation id="5869522115854928033">Zapisane hasła</translation>
+<translation id="5887400589839399685">Zapisano kartę</translation>
 <translation id="5893752035575986141">Karty kredytowe są akceptowane.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (zsynchronizowane)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{W użyciu: 1}few{W użyciu: #}many{W użyciu: #}other{W użyciu: #}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Użytkownik:</translation>
 <translation id="6944692733090228304">Wpisałeś swoje hasło na stronie, którą nie zarządza <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Aby chronić konto, nie używaj swojego hasła w innych aplikacjach ani witrynach.</translation>
 <translation id="6945221475159498467">Wybierz</translation>
+<translation id="6948540501704460596">Aby korzystać ze swoich zakładek na wszystkich urządzeniach, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Aby zobaczyć metody odbioru oraz wymagania, wybierz adres</translation>
 <translation id="6949872517221025916">Resetuj hasło</translation>
 <translation id="6950684638814147129">Błąd podczas przetwarzania wartości JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Otwórz stronę na nowej karcie prywatnej</translation>
 <translation id="6957887021205513506">Certyfikat serwera wydaje się sfałszowany.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Urządzenie</translation>
 <translation id="6970216967273061347">Okręg</translation>
 <translation id="6973656660372572881">Określono zarówno stałe serwery proxy, jak i URL skryptu PAC.</translation>
+<translation id="6984479912851154518">Opuszczasz tryb prywatny, by zapłacić w zewnętrznej aplikacji. Kontynuować?</translation>
 <translation id="6989763994942163495">Pokaż ustawienia zaawansowane...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Może to być opłata jednorazowa lub cykliczna, a informacje o niej mogą nie być wyraźnie podane.</translation>
 <translation id="7029809446516969842">Hasła</translation>
+<translation id="7042837854211185817">Aby korzystać ze swoich kart na wszystkich urządzeniach, włącz synchronizację.</translation>
 <translation id="7050187094878475250">Próbujesz połączyć się z domeną <ph name="DOMAIN" />, ale serwer przedstawił certyfikat, którego okres ważności jest za długi, by był wiarygodny.</translation>
 <translation id="7053983685419859001">Blokuj</translation>
 <translation id="7064851114919012435">Dane kontaktowe</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">Zakładki</translation>
 <translation id="883848425547221593">Inne zakładki</translation>
 <translation id="884264119367021077">Adres wysyłki</translation>
+<translation id="8846319957959474018">Łatwo otwieraj aplikacje dzięki zakładkom</translation>
 <translation id="884923133447025588">Nie znaleziono mechanizmu unieważniania.</translation>
 <translation id="885730110891505394">Udostępnianie Google</translation>
 <translation id="8858065207712248076">Chrome zaleca zresetowanie hasła, którego używasz w: <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />, jeśli zostało użyte na innej stronie.</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb
index 26be4a99..c0edbff9 100644
--- a/components/strings/components_strings_pt-BR.xtb
+++ b/components/strings/components_strings_pt-BR.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Continuar</translation>
 <translation id="2365563543831475020">O relatório de erros registrado em <ph name="CRASH_TIME" /> não foi enviado</translation>
 <translation id="2367567093518048410">Nível</translation>
+<translation id="2378238891085281592">Você está em modo privado</translation>
 <translation id="2384307209577226199">Padrão da empresa</translation>
 <translation id="2386255080630008482">O certificado do servidor foi revogado.</translation>
 <translation id="2392959068659972793">Mostrar políticas sem valor definido</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Endereço de entrega</translation>
 <translation id="3395827396354264108">Método de retirada</translation>
 <translation id="3399952811970034796">Endereço de Entrega</translation>
+<translation id="3409072600744224192">Para ver seus cartões em todos os seus dispositivos, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Tente sair de outros programas para liberar memória.</translation>
 <translation id="3422472998109090673">No momento, não é possível acessar <ph name="HOST_NAME" />.</translation>
 <translation id="3427092606871434483">Permitir (padrão)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Compartilhar com o administrador</translation>
 <translation id="4515275063822566619">Os cartões e os endereços vieram do Chrome e da sua Conta do Google (<ph name="ACCOUNT_EMAIL" />). É possível gerenciar essas opções em <ph name="BEGIN_LINK" />Configurações<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Detalhes</translation>
+<translation id="4524805452350978254">Gerenciar cartões</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Tente desativar suas extensões.</translation>
 <translation id="457875822857220463">Entrega</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Senha incorreta</translation>
 <translation id="5056549851600133418">Artigos para você</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Verificar o endereço do proxy<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Para ver seus cartões em todos os seus dispositivos, faça login e ative a sincronização.</translation>
 <translation id="5086888986931078152">É possível que você perca o acesso a conteúdos protegidos de alguns sites.</translation>
 <translation id="5087286274860437796">O certificado do servidor não é válido no momento.</translation>
 <translation id="5087580092889165836">Adicionar cartão</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> de <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Escolher informações de contato</translation>
 <translation id="5327248766486351172">Nome</translation>
+<translation id="5327567770033251652">ative a sincronização</translation>
 <translation id="5332219387342487447">Forma de envio</translation>
 <translation id="5355557959165512791">Não é possível acessar <ph name="SITE" /> neste momento, porque o certificado dele foi revogado. Como os ataques e erros de rede são geralmente temporários, esta página provavelmente funcionará mais tarde.</translation>
 <translation id="536296301121032821">Falha ao armazenar as configurações da política</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Para ver métodos e requisitos de entrega, selecione um endereço</translation>
 <translation id="5770114862687765385">O arquivo parece estar corrompido. Clique no botão "Redefinir" para reiniciar a sessão.</translation>
 <translation id="5778550464785688721">Controle total de dispositivos MIDI</translation>
+<translation id="57838592816432529">Desativar som</translation>
 <translation id="5784606427469807560">Ocorreu um problema ao confirmar seu cartão. Verifique a conexão com a Internet e tente novamente.</translation>
 <translation id="5785756445106461925">Além disso, esta página inclui outros recursos que não são seguros. Esses recursos podem ser visualizados por outros usuários enquanto eles navegam e podem ser modificados por um invasor para alterar o comportamento da página.</translation>
 <translation id="5786044859038896871">Quer preencher as informações do cartão?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Adicione um Número de Telefone</translation>
 <translation id="5869405914158311789">Não é possível acessar esse site</translation>
 <translation id="5869522115854928033">Senhas salvas</translation>
+<translation id="5887400589839399685">Cartão salvo</translation>
 <translation id="5893752035575986141">Cartões de crédito são aceitos.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (sincronizado)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 em uso}one{# em uso}other{# em uso}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Usuário:</translation>
 <translation id="6944692733090228304">Você inseriu sua senha em um site que não é gerenciado por <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Para proteger sua conta, não reutilize sua senha em outros apps e sites.</translation>
 <translation id="6945221475159498467">Selecionar</translation>
+<translation id="6948540501704460596">Para ver seus cartões em todos os seus dispositivos, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Para ver métodos e requisitos de retirada, selecione um endereço</translation>
 <translation id="6949872517221025916">Redefinir senha</translation>
 <translation id="6950684638814147129">Erro ao analisar o valor JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Abrir página em uma nova guia privada</translation>
 <translation id="6957887021205513506">O certificado do servidor parece ser falsificado.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Dispositivo</translation>
 <translation id="6970216967273061347">Distrito</translation>
 <translation id="6973656660372572881">Ambos os servidores proxy fixo e um URL de script .pac foram especificados.</translation>
+<translation id="6984479912851154518">Saindo do modo privado para fazer um pagamento com um aplicativo externo. Continuar?</translation>
 <translation id="6989763994942163495">Mostrar configurações avançadas...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Essas cobranças podem ser únicas ou recorrentes e talvez não sejam óbvias.</translation>
 <translation id="7029809446516969842">Senhas</translation>
+<translation id="7042837854211185817">Para ver seus cartões em todos os seus dispositivos, ative a sincronização.</translation>
 <translation id="7050187094878475250">Você tentou acessar <ph name="DOMAIN" />, mas o servidor apresentou um certificado cujo período de validade é extremamente longo, o que não é confiável.</translation>
 <translation id="7053983685419859001">Bloquear</translation>
 <translation id="7064851114919012435">Dados de contato</translation>
@@ -1075,6 +1086,7 @@
 <translation id="8820817407110198400">Favoritos</translation>
 <translation id="883848425547221593">Outros favoritos</translation>
 <translation id="884264119367021077">Endereço de entrega</translation>
+<translation id="8846319957959474018">Abra apps facilmente com os favoritos</translation>
 <translation id="884923133447025588">Nenhum mecanismo de revogação encontrado.</translation>
 <translation id="885730110891505394">Compartilhar com o Google</translation>
 <translation id="8858065207712248076">O Chrome recomenda redefinir sua senha de <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> se você a reutilizou em outros sites.</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb
index e77d9c9..8ace9c0 100644
--- a/components/strings/components_strings_pt-PT.xtb
+++ b/components/strings/components_strings_pt-PT.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Continuar</translation>
 <translation id="2365563543831475020">O relatório de falhas capturado <ph name="CRASH_TIME" /> não foi carregado</translation>
 <translation id="2367567093518048410">Nível</translation>
+<translation id="2378238891085281592">Entrou no modo privado</translation>
 <translation id="2384307209577226199">Predefinição empresarial</translation>
 <translation id="2386255080630008482">O certificado do servidor foi revogado.</translation>
 <translation id="2392959068659972793">Apresentar políticas sem valor definido</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Endereço de entrega</translation>
 <translation id="3395827396354264108">Método de recolha</translation>
 <translation id="3399952811970034796">Endereço de entrega</translation>
+<translation id="3409072600744224192">Para obter os seus cartões em todos os dispositivos, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Experimente fechar outros programas para libertar memória.</translation>
 <translation id="3422472998109090673"><ph name="HOST_NAME" /> está inacessível de momento.</translation>
 <translation id="3427092606871434483">Permitir (predefinição)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Partilha com o gestor</translation>
 <translation id="4515275063822566619">Os cartões e os endereços são provenientes do Chrome e da sua Conta Google (<ph name="ACCOUNT_EMAIL" />). Pode geri-los nas <ph name="BEGIN_LINK" />Definições<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Detalhes</translation>
+<translation id="4524805452350978254">Gerir cartões</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Experimente desativar as extensões.</translation>
 <translation id="457875822857220463">Entrega</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Palavra-passe incorrecta</translation>
 <translation id="5056549851600133418">Artigos para si</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Verificar o endereço proxy<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Para obter os seus cartões em todos os dispositivos, inicie sessão e ative a sincronização.</translation>
 <translation id="5086888986931078152">Pode perder o acesso ao conteúdo protegido de alguns sites.</translation>
 <translation id="5087286274860437796">De momento, o certificado do servidor não é válido.</translation>
 <translation id="5087580092889165836">Adicionar cartão</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> de <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Escolher informações de contacto</translation>
 <translation id="5327248766486351172">Nome</translation>
+<translation id="5327567770033251652">ative a sincronização</translation>
 <translation id="5332219387342487447">Método de envio</translation>
 <translation id="5355557959165512791">Não pode visitar <ph name="SITE" /> neste momento, porque o certificado foi revogado. Os erros de rede e os ataques são geralmente temporários, pelo que esta página deverá funcionar mais tarde.</translation>
 <translation id="536296301121032821">Falha ao armazenar as definições da política</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Para ver os métodos de fornecimento e os requisitos, selecione um endereço</translation>
 <translation id="5770114862687765385">O ficheiro parece estar danificado. Clique no botão "Repor" para repor a sessão.</translation>
 <translation id="5778550464785688721">Controlo total de dispositivos MIDI</translation>
+<translation id="57838592816432529">Desativar som</translation>
 <translation id="5784606427469807560">Ocorreu um erro ao confirmar o cartão. Verifique a sua ligação à Internet e tente novamente.</translation>
 <translation id="5785756445106461925">Além disso, esta página inclui outros recursos que não são seguros. Estes recursos podem ser vistos por outros utilizadores em trânsito e modificados por um utilizador mal intencionado com o intuito de alterar o aspeto da página.</translation>
 <translation id="5786044859038896871">Pretende preencher as informações do cartão?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Adicionar número de telefone</translation>
 <translation id="5869405914158311789">Não é possível aceder a este site</translation>
 <translation id="5869522115854928033">Palavras-passe guardadas</translation>
+<translation id="5887400589839399685">Cartão guardado</translation>
 <translation id="5893752035575986141">Os cartões de crédito são admitidos.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (sincronizados)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 em utilização}other{# em utilização}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Utilizador:</translation>
 <translation id="6944692733090228304">Introduziu a palavra-passe num site que não é gerido pela <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Para proteger a conta, não reutilize a sua palavra-passe noutras aplicações e sites.</translation>
 <translation id="6945221475159498467">Selecionar</translation>
+<translation id="6948540501704460596">Para obter os seus cartões em todos os dispositivos, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Para ver os métodos de recolha e os requisitos, selecione um endereço</translation>
 <translation id="6949872517221025916">Repor palavra-passe</translation>
 <translation id="6950684638814147129">Erro ao analisar o valor JSON: <ph name="ERROR" />.</translation>
+<translation id="6957624206566198865">Abrir a página num novo separador privado</translation>
 <translation id="6957887021205513506">O certificado do servidor parece ser uma falsificação.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Dispositivo</translation>
 <translation id="6970216967273061347">Distrito</translation>
 <translation id="6973656660372572881">Foram especificados servidores proxy fixos e um URL de script .pac.</translation>
+<translation id="6984479912851154518">Está a sair do modo privado para pagar através de uma aplicação externa. Pretende continuar?</translation>
 <translation id="6989763994942163495">Mostrar definições avançadas...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Estas cobranças podem ser únicas ou recorrentes e podem não ser óbvias.</translation>
 <translation id="7029809446516969842">Palavras-passe</translation>
+<translation id="7042837854211185817">Para obter os seus cartões em todos os dispositivos, ative a sincronização.</translation>
 <translation id="7050187094878475250">Tentou aceder a <ph name="DOMAIN" />, mas o servidor apresentou um certificado cujo período de validade é demasiado longo para ser fidedigno.</translation>
 <translation id="7053983685419859001">Bloquear</translation>
 <translation id="7064851114919012435">Informações de contacto</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">Marcadores</translation>
 <translation id="883848425547221593">Outros marcadores</translation>
 <translation id="884264119367021077">Endereço para envio</translation>
+<translation id="8846319957959474018">Abra as aplicações facilmente com marcadores.</translation>
 <translation id="884923133447025588">Não foi encontrado qualquer mecanismo de revogação.</translation>
 <translation id="885730110891505394">Partilha com a Google</translation>
 <translation id="8858065207712248076">O Chrome recomenda a reposição da palavra-passe da <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> se a tiver reutilizado noutros sites.</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index fd8beee..fbb5e14 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Continuă</translation>
 <translation id="2365563543831475020">Raportul de blocare creat <ph name="CRASH_TIME" /> nu a fost încărcat</translation>
 <translation id="2367567093518048410">Nivel</translation>
+<translation id="2378238891085281592">Ai trecut în modul privat</translation>
 <translation id="2384307209577226199">Setare prestabilită la nivel de companie</translation>
 <translation id="2386255080630008482">Certificatul serverului a fost revocat.</translation>
 <translation id="2392959068659972793">Afișați politicile care nu au valori setate</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Adresă de livrare</translation>
 <translation id="3395827396354264108">Metodă de preluare</translation>
 <translation id="3399952811970034796">Adresă de livrare</translation>
+<translation id="3409072600744224192">Pentru a accesa cardurile pe toate dispozitivele, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Încearcă să ieși din celelalte programe pentru a elibera memoria.</translation>
 <translation id="3422472998109090673">Momentan, <ph name="HOST_NAME" /> nu poate fi accesat.</translation>
 <translation id="3427092606871434483">Permite (în mod prestabilit)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Permiterea accesului pentru administrator</translation>
 <translation id="4515275063822566619">Cardurile și adresele sunt din Chrome și din Contul Google (<ph name="ACCOUNT_EMAIL" />). Poți să le gestionezi în <ph name="BEGIN_LINK" />Setări<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Detalii</translation>
+<translation id="4524805452350978254">Gestionează cardurile</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Dezactivează extensiile.</translation>
 <translation id="457875822857220463">Livrare</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Parolă incorectă</translation>
 <translation id="5056549851600133418">Articole pentru tine</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />să verifici adresa proxy-ului;<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Pentru a accesa cardurile pe toate dispozitivele, conectează-te și activează sincronizarea.</translation>
 <translation id="5086888986931078152">Este posibil să pierzi accesul la conținutul protejat de pe anumite site-uri.</translation>
 <translation id="5087286274860437796">Momentan, certificatul serverului este nevalid.</translation>
 <translation id="5087580092889165836">Adaugă un card</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> din <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Alege informațiile de contact</translation>
 <translation id="5327248766486351172">Nume</translation>
+<translation id="5327567770033251652">activează sincronizarea</translation>
 <translation id="5332219387342487447">Metoda de expediere</translation>
 <translation id="5355557959165512791">Nu poți accesa <ph name="SITE" /> acum, deoarece certificatul său a fost revocat. Erorile de rețea și atacurile sunt de obicei temporare și probabil că această pagină va funcționa mai târziu.</translation>
 <translation id="536296301121032821">Setările pentru politică nu au putut fi stocate</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Pentru a vedea metodele de livrare și cerințele, selectează o adresă</translation>
 <translation id="5770114862687765385">Fișierul pare deteriorat. Pentru a reseta sesiunea, dă clic pe butonul „Resetează”.</translation>
 <translation id="5778550464785688721">Control complet asupra dispozitivelor MIDI</translation>
+<translation id="57838592816432529">Dezactivează sunetul</translation>
 <translation id="5784606427469807560">A apărut o eroare la confirmarea cardului. Verifică conexiunea la internet și încearcă din nou.</translation>
 <translation id="5785756445106461925">În plus, această pagină include alte resurse care nu sunt securizate. Aceste resurse sunt vizibile pentru alți utilizatori în cursul transferului și pot fi modificate de un atacator pentru a schimba aspectul paginii.</translation>
 <translation id="5786044859038896871">Dorești să completezi datele cardului de credit?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Adaugă un număr de telefon</translation>
 <translation id="5869405914158311789">Acest site nu poate fi accesat</translation>
 <translation id="5869522115854928033">Parole salvate</translation>
+<translation id="5887400589839399685">Cardul a fost salvat</translation>
 <translation id="5893752035575986141">Se acceptă carduri de credit.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (sincronizat)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 în uz}few{# în uz}other{# în uz}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Utilizator:</translation>
 <translation id="6944692733090228304">Ai introdus parola pe un site care nu este gestionat de <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Pentru a proteja contul, nu folosi aceeași parolă pentru alte aplicații și site-uri.</translation>
 <translation id="6945221475159498467">Selectează</translation>
+<translation id="6948540501704460596">Pentru a accesa cardurile pe toate dispozitivele, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Pentru a vedea metodele de preluare și cerințele, selectează o adresă</translation>
 <translation id="6949872517221025916">Resetează parola</translation>
 <translation id="6950684638814147129">Eroare la analizarea valorii JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Deschide pagina într-o filă privată nouă</translation>
 <translation id="6957887021205513506">Certificatul serverului pare a fi un fals.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Dispozitiv</translation>
 <translation id="6970216967273061347">Județ</translation>
 <translation id="6973656660372572881">Sunt specificate atât servere proxy fixe, cât și o adresă URL pentru scripturi .pac.</translation>
+<translation id="6984479912851154518">Vei părăsi modul privat pentru a plăti folosind o aplicație externă. Continui?</translation>
 <translation id="6989763994942163495">Afișează setările avansate...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Aceste costuri pot fi unice sau recurente și ascunse.</translation>
 <translation id="7029809446516969842">Parole</translation>
+<translation id="7042837854211185817">Pentru a accesa cardurile pe toate dispozitivele, activează sincronizarea.</translation>
 <translation id="7050187094878475250">Ai încercat să accesezi <ph name="DOMAIN" />, dar serverul a prezentat un certificat a cărui perioadă de validitate este prea lungă pentru a fi de încredere.</translation>
 <translation id="7053983685419859001">Blochează</translation>
 <translation id="7064851114919012435">Informații de contact</translation>
@@ -1075,6 +1086,7 @@
 <translation id="8820817407110198400">Marcaje</translation>
 <translation id="883848425547221593">Alte marcaje</translation>
 <translation id="884264119367021077">Adresa de expediere</translation>
+<translation id="8846319957959474018">Deschide aplicații cu ușurință folosind marcajele</translation>
 <translation id="884923133447025588">Nu a fost găsit niciun mecanism de revocare.</translation>
 <translation id="885730110891505394">Permiterea accesului pentru Google</translation>
 <translation id="8858065207712248076">Chrome îți recomandă să resetezi parola pentru <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> dacă ai folosit-o și pe alte site-uri.</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index df98bd9..2fcdd58 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -687,6 +687,7 @@
 <translation id="5765072501007116331">Выберите адрес, чтобы посмотреть способы и условия доставки.</translation>
 <translation id="5770114862687765385">Файл поврежден. Чтобы восстановить сеанс, нажмите кнопку "Сбросить".</translation>
 <translation id="5778550464785688721">Полный контроль над MIDI-устройствами</translation>
+<translation id="57838592816432529">Отключить звук</translation>
 <translation id="5784606427469807560">Не удалось подтвердить данные карты. Проверьте подключение к Интернету и повторите попытку.</translation>
 <translation id="5785756445106461925">Обратите внимание, что на странице обнаружен небезопасный контент. Возможно, при передаче ресурсы просматриваются третьими лицами, а злоумышленники могут получить доступ к странице и изменить ее поведение или внешний вид.</translation>
 <translation id="5786044859038896871">Заполнить данные банковской карты?</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb
index e22d2d6..6759a22 100644
--- a/components/strings/components_strings_sk.xtb
+++ b/components/strings/components_strings_sk.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Pokračovať</translation>
 <translation id="2365563543831475020">Správa o zlyhaní zaznamenaná v čase <ph name="CRASH_TIME" /> nebola nahraná</translation>
 <translation id="2367567093518048410">Úroveň</translation>
+<translation id="2378238891085281592">Ste v súkromnom režime</translation>
 <translation id="2384307209577226199">Predvolené nastavenie na podnikovej úrovni</translation>
 <translation id="2386255080630008482">Certifikát servera bol zrušený.</translation>
 <translation id="2392959068659972793">Zobraziť pravidlá bez nastavenej hodnoty</translation>
@@ -352,6 +353,7 @@
 <translation id="3391030046425686457">Doručovacia adresa</translation>
 <translation id="3395827396354264108">Spôsob vyzdvihnutia</translation>
 <translation id="3399952811970034796">Doručovacia adresa</translation>
+<translation id="3409072600744224192">Ak chcete mať karty vo všetkých zariadeniach, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Skúste ukončiť ostatné programy a uvoľniť tak miesto v pamäti.</translation>
 <translation id="3422472998109090673">Web <ph name="HOST_NAME" /> nie je momentálne k dispozícii.</translation>
 <translation id="3427092606871434483">Povoliť (predvolené)</translation>
@@ -510,6 +512,7 @@
 <translation id="450710068430902550">Zdieľanie so správcom</translation>
 <translation id="4515275063822566619">Karty a adresy pochádzajú z Chromu a účtu Google (<ph name="ACCOUNT_EMAIL" />). Môžete ich spravovať v <ph name="BEGIN_LINK" />Nastaveniach<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Podrobnosti</translation>
+<translation id="4524805452350978254">Spravovať karty</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Skúste deaktivovať rozšírenia.</translation>
 <translation id="457875822857220463">Doručenie</translation>
@@ -575,6 +578,7 @@
 <translation id="5045550434625856497">Nesprávne heslo</translation>
 <translation id="5056549851600133418">Články pre vás</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Skontrolovať adresu proxy servera<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Ak chcete mať karty vo všetkých zariadeniach, prihláste sa a zapnite synchronizáciu.</translation>
 <translation id="5086888986931078152">Môžete stratiť prístup ku chránenému obsahu z niektorých webov.</translation>
 <translation id="5087286274860437796">Certifikát servera je momentálne neplatný</translation>
 <translation id="5087580092889165836">Pridať kartu</translation>
@@ -620,6 +624,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> z <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Vybrať kontaktné informácie</translation>
 <translation id="5327248766486351172">Názov</translation>
+<translation id="5327567770033251652">zapnite synchronizáciu</translation>
 <translation id="5332219387342487447">Spôsob dodania</translation>
 <translation id="5355557959165512791">Web <ph name="SITE" /> momentálne nemôžete navštíviť, pretože tento certifikát bol odvolaný. Chyby siete a útoky sú zvyčajne dočasné, takže by táto stránka mala neskôr pravdepodobne fungovať.</translation>
 <translation id="536296301121032821">Nastavenia pravidla sa nepodarilo uložiť</translation>
@@ -684,6 +689,7 @@
 <translation id="5765072501007116331">Ak chcete zobraziť spôsoby a požiadavky doručenia, vyberte adresu</translation>
 <translation id="5770114862687765385">Súbor je zrejme poškodený. Obnovte reláciu kliknutím na tlačidlo Obnoviť.</translation>
 <translation id="5778550464785688721">Úplné ovládanie zariadení MIDI</translation>
+<translation id="57838592816432529">Vypnúť zvuk</translation>
 <translation id="5784606427469807560">Pri overovaní karty sa vyskytol problém. Skontrolujte pripojenie k internetu a skúste to znova.</translation>
 <translation id="5785756445106461925">Táto stránka obsahuje aj iné zdroje, ktoré nie sú zabezpečené. Tieto zdroje môžu pri prenose vidieť ostatní používatelia a útočník ich môže upraviť tak, aby zmenil vzhľad stránky.</translation>
 <translation id="5786044859038896871">Chcete vyplniť informácie o karte?</translation>
@@ -695,6 +701,7 @@
 <translation id="5866257070973731571">Pridanie telefónneho čísla</translation>
 <translation id="5869405914158311789">K tomuto webu sa nedá pripojiť</translation>
 <translation id="5869522115854928033">Uložené heslá</translation>
+<translation id="5887400589839399685">Karta bola uložená</translation>
 <translation id="5893752035575986141">Kreditné karty sú akceptované.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (synchronizované)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{Používa sa 1}few{Používajú sa #}many{Používa sa #}other{Používa sa #}}</translation>
@@ -811,18 +818,22 @@
 <translation id="6915804003454593391">Používateľ:</translation>
 <translation id="6944692733090228304">Zadali ste heslo na webe, ktorý nie je spravovaný organizáciou <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Ak chcete, aby bol váš účet chránený, nepoužívajte jeho heslo pre iné aplikácie a weby.</translation>
 <translation id="6945221475159498467">Vybrať</translation>
+<translation id="6948540501704460596">Ak chcete mať karty vo všetkých zariadeniach, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Ak chcete zobraziť spôsoby a požiadavky vyzdvihnutia, vyberte adresu</translation>
 <translation id="6949872517221025916">Obnovenie hesla</translation>
 <translation id="6950684638814147129">Chyba pri analyzovaní hodnoty JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Otvorte stránku na novej karte inkognito</translation>
 <translation id="6957887021205513506">Zdá sa, že certifikát servera je falošný.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Zariadenie</translation>
 <translation id="6970216967273061347">Obvod</translation>
 <translation id="6973656660372572881">Určené sú pevne dané servery proxy aj skript PAC webovej adresy.</translation>
+<translation id="6984479912851154518">Ak zaplatíte pomocou externej aplikácie, opustíte režim inkognito. Chcete pokračovať?</translation>
 <translation id="6989763994942163495">Zobraziť rozšírené nastavenia...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Tieto poplatky môžu byť jednorazové alebo opakované a nemusia byť predvídateľné.</translation>
 <translation id="7029809446516969842">Heslá</translation>
+<translation id="7042837854211185817">Ak chcete získať karty vo všetkých zariadeniach, zapnite synchronizáciu.</translation>
 <translation id="7050187094878475250">Pokúsili ste sa prejsť do domény <ph name="DOMAIN" />, ale server udelil certifikát, ktorého obdobie platnosti je príliš dlhé, a preto nie je dôveryhodný</translation>
 <translation id="7053983685419859001">Blokovať</translation>
 <translation id="7064851114919012435">Kontaktné informácie</translation>
@@ -1070,6 +1081,7 @@
 <translation id="8820817407110198400">Záložky</translation>
 <translation id="883848425547221593">Iné záložky</translation>
 <translation id="884264119367021077">Dodacia adresa</translation>
+<translation id="8846319957959474018">Otvárajte aplikácie ľahšie pomocou odkazov</translation>
 <translation id="884923133447025588">Nenašiel sa žiadny mechanizmus rušenia certifikátov.</translation>
 <translation id="885730110891505394">Zdieľanie s Googlom</translation>
 <translation id="8858065207712248076">Ak ste heslo organizácie <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> použili aj na iných weboch, Chrome ho odporúča obnoviť.</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index dcd61f8..2f825a5 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Nadaljuj</translation>
 <translation id="2365563543831475020">Poročilo o zrušitvi, zajeto takrat: <ph name="CRASH_TIME" />, ni bilo naloženo</translation>
 <translation id="2367567093518048410">Raven</translation>
+<translation id="2378238891085281592">Uporabljate zasebni način</translation>
 <translation id="2384307209577226199">Privzeto za podjetja</translation>
 <translation id="2386255080630008482">Potrdilo strežnika je bilo preklicano.</translation>
 <translation id="2392959068659972793">Pokaži pravilnike brez nastavljene vrednosti</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Naslov za dostavo</translation>
 <translation id="3395827396354264108">Način prevzema</translation>
 <translation id="3399952811970034796">Naslov za dostavo</translation>
+<translation id="3409072600744224192">Če želite dostopati do zaznamkov v vseh napravah, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Poskusite zapreti druge programe, da boste tako sprostili pomnilnik.</translation>
 <translation id="3422472998109090673">Spletno mesto <ph name="HOST_NAME" /> trenutno ni dosegljivo.</translation>
 <translation id="3427092606871434483">Dovoli (privzeto)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Deljenje s skrbnikom</translation>
 <translation id="4515275063822566619">Kartice in naslovi so iz Chroma in Google Računa (<ph name="ACCOUNT_EMAIL" />). Upravljate jih lahko v <ph name="BEGIN_LINK" />nastavitvah<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Podrobnosti</translation>
+<translation id="4524805452350978254">Upravljanje kartic</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Poskusite onemogočiti razširitve.</translation>
 <translation id="457875822857220463">Dostava</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Nepravilno geslo</translation>
 <translation id="5056549851600133418">Članki za vas</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />preveriti naslov strežnika proxy<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Če želite dostopati do kartic v vseh napravah, se prijavite in vklopite sinhronizacijo.</translation>
 <translation id="5086888986931078152">Morda boste izgubili dostop do zaščitene vsebine na nekaterih spletnih mestih.</translation>
 <translation id="5087286274860437796">Potrdilo strežnika trenutno ni veljavno.</translation>
 <translation id="5087580092889165836">Dodaj kartico</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> od <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Izbira podatkov za stik</translation>
 <translation id="5327248766486351172">Ime</translation>
+<translation id="5327567770033251652">vklop sinhronizacije</translation>
 <translation id="5332219387342487447">Način pošiljanja</translation>
 <translation id="5355557959165512791">Spletnega mesta <ph name="SITE" /> trenutno ni mogoče obiskati, saj je to potrdilo preklicano. Napake omrežja in napadi na omrežje so običajno začasni, zato bo ta stran verjetno delovala pozneje.</translation>
 <translation id="536296301121032821">Nastavitev pravilnika ni bilo mogoče shraniti</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Če si želite ogledati načine dostave in zahteve, izberite naslov</translation>
 <translation id="5770114862687765385">Videti je, da je datoteka poškodovana. Kliknite gumb »Ponastavi«, da ponastavite sejo.</translation>
 <translation id="5778550464785688721">Popolni nadzor naprav MIDI</translation>
+<translation id="57838592816432529">Izklopi zvok</translation>
 <translation id="5784606427469807560">Težava pri potrditvi kartice. Preverite internetno povezavo in poskusite znova.</translation>
 <translation id="5785756445106461925">Poleg tega so na tej strani druga sredstva, ki niso varna. Ta sredstva lahko med prenosom pregledujejo drugi, morebitni napadalec pa jih lahko spremeni, tako da se spremeni videz strani.</translation>
 <translation id="5786044859038896871">Ali želite izpolniti podatke kreditne kartice?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Dodajanje telefonske številke</translation>
 <translation id="5869405914158311789">Tega spletnega mesta ni mogoče doseči</translation>
 <translation id="5869522115854928033">Shranjena gesla</translation>
+<translation id="5887400589839399685">Kartica je shranjena</translation>
 <translation id="5893752035575986141">Sprejema kreditne kartice.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (sinhronizirano)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 v uporabi}one{# v uporabi}two{# v uporabi}few{# v uporabi}other{# v uporabi}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Uporabnik:</translation>
 <translation id="6944692733090228304">Vnesli ste geslo na spletnem mestu, ki ga ne upravlja: <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Zaradi zaščite računa gesla ne uporabljajte za druge aplikacije in spletna mesta.</translation>
 <translation id="6945221475159498467">Izberi</translation>
+<translation id="6948540501704460596">Če želite dostopati do kartic v vseh napravah, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Če si želite ogledati načine prevzema in zahteve, izberite naslov</translation>
 <translation id="6949872517221025916">Ponastavitev gesla</translation>
 <translation id="6950684638814147129">Napaka pri razčlenjevanju vrednosti JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Odpiranje strani v novem zasebnem zavihku</translation>
 <translation id="6957887021205513506">Potrdilo strežnika je očitno ponaredek.</translation>
 <translation id="6965382102122355670">V redu</translation>
 <translation id="6965978654500191972">Naprava</translation>
 <translation id="6970216967273061347">Okraj</translation>
 <translation id="6973656660372572881">Določeni so stalni strežniki proxy in URL skripta .pac.</translation>
+<translation id="6984479912851154518">Zaradi plačila v zunanji aplikaciji boste zapustili zasebni način. Želite nadaljevati?</translation>
 <translation id="6989763994942163495">Prikaži dodatne nastavitve ...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Te bremenitve so lahko enkratne ali ponavljajoče se in morda niso očitne.</translation>
 <translation id="7029809446516969842">Gesla</translation>
+<translation id="7042837854211185817">Če želite dostopati do kartic v vseh napravah, vklopite sinhronizacijo.</translation>
 <translation id="7050187094878475250">Poskusili ste odpreti <ph name="DOMAIN" />, vendar je strežnik uporabil potrdilo, ki ima predolgo obdobje veljavnosti, da bi bilo verodostojno.</translation>
 <translation id="7053983685419859001">Blokiraj</translation>
 <translation id="7064851114919012435">Podatki o stiku</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">Zaznamki</translation>
 <translation id="883848425547221593">Drugi zaznamki</translation>
 <translation id="884264119367021077">Naslov za pošiljanje</translation>
+<translation id="8846319957959474018">Preprosto odpirajte aplikacije z zaznamki</translation>
 <translation id="884923133447025588">Najden ni bil noben mehanizem za preklic.</translation>
 <translation id="885730110891505394">Deljenje z Googlom</translation>
 <translation id="8858065207712248076">Chrome priporoča, da ponastavite geslo za <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />, če ste ga uporabljali na drugih spletnih mestih.</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb
index f3743723..d189a3d 100644
--- a/components/strings/components_strings_sr.xtb
+++ b/components/strings/components_strings_sr.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Настави</translation>
 <translation id="2365563543831475020">Извештај о отказивању снимљен у <ph name="CRASH_TIME" /> није отпремљен</translation>
 <translation id="2367567093518048410">Ниво</translation>
+<translation id="2378238891085281592">Прешли сте на режим приватног прегледања</translation>
 <translation id="2384307209577226199">Подразумеване смернице за предузеће</translation>
 <translation id="2386255080630008482">Сертификат сервера је опозван.</translation>
 <translation id="2392959068659972793">Прикажи смернице без подешених вредности</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Адреса испоруке</translation>
 <translation id="3395827396354264108">Начин преузимања</translation>
 <translation id="3399952811970034796">Адреса испоруке</translation>
+<translation id="3409072600744224192">Да би вам картице били доступне на свим уређајима, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Пробајте да изађете из других програма да бисте ослободили меморију.</translation>
 <translation id="3422472998109090673">Хост <ph name="HOST_NAME" /> тренутно није доступан.</translation>
 <translation id="3427092606871434483">Дозволи (подразумевано)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Дељење са администратором</translation>
 <translation id="4515275063822566619">Картице и адресе су из Chrome-а и са вашег Google налога (<ph name="ACCOUNT_EMAIL" />). Њима можете да управљате у <ph name="BEGIN_LINK" />подешавњима<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Детаљи</translation>
+<translation id="4524805452350978254">Управљајте картицама</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Покушајте да онемогућите додатке.</translation>
 <translation id="457875822857220463">Испорука</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Неисправна лозинка</translation>
 <translation id="5056549851600133418">Чланци за вас</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />да проверите адресу проксија<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Да би вам картице били доступне на свим уређајима, пријавите се и укључите синхронизацију.</translation>
 <translation id="5086888986931078152">Можете да изгубите приступ заштићеном садржају са неких сајтова.</translation>
 <translation id="5087286274860437796">Сертификат сервера тренутно није важећи.</translation>
 <translation id="5087580092889165836">Додај картицу</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" />. од <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Одаберите контакт информације</translation>
 <translation id="5327248766486351172">Назив</translation>
+<translation id="5327567770033251652">укључи синхронизацију</translation>
 <translation id="5332219387342487447">Начин испоруке</translation>
 <translation id="5355557959165512791">Тренутно не можете да посетите <ph name="SITE" /> јер је његов сертификат опозван. Грешке и напади на мрежи су обично привремени, па ће ова страница вероватно функционисати касније.</translation>
 <translation id="536296301121032821">Складиштење подешавања смерница није успело</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Да бисте видели начине и захтеве за испоруку, изаберите адресу</translation>
 <translation id="5770114862687765385">Изгледа да је датотека оштећена. Кликните на дугме „Ресетуј“ да бисте ресетовали сесију.</translation>
 <translation id="5778550464785688721">Потпуна контрола над MIDI уређајима</translation>
+<translation id="57838592816432529">Искључи звук</translation>
 <translation id="5784606427469807560">Дошло је до проблема при потврди картице. Проверите интернет везу и покушајте поново.</translation>
 <translation id="5785756445106461925">Поред тога, ова страница садржи и друге ресурсе који нису безбедни. Ове ресурсе могу да виде и други док су у пролазу и нападач може да их измени како би променио изглед странице.</translation>
 <translation id="5786044859038896871">Желите ли да попуните информације о картици?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Додајте број телефона</translation>
 <translation id="5869405914158311789">Овај сајт није доступан</translation>
 <translation id="5869522115854928033">Сачуване лозинке</translation>
+<translation id="5887400589839399685">Картица је сачувана</translation>
 <translation id="5893752035575986141">Прихватају се кредитне картице.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (синхронизовано)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{Користи се 1}one{Користи се #}few{Користе се #}other{Користи се #}}</translation>
@@ -815,18 +822,22 @@
 <translation id="6915804003454593391">Корисник:</translation>
 <translation id="6944692733090228304">Унели сте лозинку на сајту којим не управља <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Да бисте заштитили налог, не користите лозинку поново у другим апликацијама ни на другим сајтовима.</translation>
 <translation id="6945221475159498467">Изабери</translation>
+<translation id="6948540501704460596">Да би вам картице били доступне на свим уређајима, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Да бисте видели начине и захтеве за преузимање, изаберите адресу</translation>
 <translation id="6949872517221025916">Ресетујте лозинку</translation>
 <translation id="6950684638814147129">Грешка при рашчлањивању JSON вредности: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Отворите страницу на новој картици за приватно прегледање</translation>
 <translation id="6957887021205513506">Изгледа да је сертификат сервера фалсификован.</translation>
 <translation id="6965382102122355670">Потврди</translation>
 <translation id="6965978654500191972">Уређај</translation>
 <translation id="6970216967273061347">Дистрикт</translation>
 <translation id="6973656660372572881">Наведени су и фиксни прокси сервери и URL адреса .pac скрипте.</translation>
+<translation id="6984479912851154518">Напустићете режим приватног прегледања да бисте платили у спољној апликацији. Желите ли да наставите?</translation>
 <translation id="6989763994942163495">Прикажи напредна подешавања...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Те наплате могу да буду једнократне или периодичне и можда нису одмах видљиве.</translation>
 <translation id="7029809446516969842">Лозинке</translation>
+<translation id="7042837854211185817">Да би вам картице били доступне на свим уређајима, укључите синхронизацију.</translation>
 <translation id="7050187094878475250">Покушали сте да посетите <ph name="DOMAIN" />, али је сервер представио сертификат са периодом важења који је предугачак да би био поуздан.</translation>
 <translation id="7053983685419859001">Блокирај</translation>
 <translation id="7064851114919012435">Контакт информације</translation>
@@ -1074,6 +1085,7 @@
 <translation id="8820817407110198400">Обележивачи</translation>
 <translation id="883848425547221593">Остали обележивачи</translation>
 <translation id="884264119367021077">Адреса за слање</translation>
+<translation id="8846319957959474018">Једноставно отварајте апликације помоћу обележивача</translation>
 <translation id="884923133447025588">Није пронађен ниједан механизам опозива.</translation>
 <translation id="885730110891505394">Дељење са Google-ом</translation>
 <translation id="8858065207712248076">Chrome вам препоручује да ресетујете лозинку за <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> ако сте је користили на другим сајтовима.</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb
index 81bf5f1..1a0d01d 100644
--- a/components/strings/components_strings_sv.xtb
+++ b/components/strings/components_strings_sv.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Fortsätt</translation>
 <translation id="2365563543831475020">Felrapport som skapades <ph name="CRASH_TIME" /> laddades inte upp</translation>
 <translation id="2367567093518048410">Nivå</translation>
+<translation id="2378238891085281592">Du surfar privat</translation>
 <translation id="2384307209577226199">Standardinställning i företaget</translation>
 <translation id="2386255080630008482">Servercertifikatet har återkallats.</translation>
 <translation id="2392959068659972793">Visa policyer utan inställt värde</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Leveransadress</translation>
 <translation id="3395827396354264108">Alternativ för utlämning</translation>
 <translation id="3399952811970034796">Leveransadress</translation>
+<translation id="3409072600744224192"><ph name="SIGN_IN_LINK" /> om du vill få tillgång till dina kort på alla enheter.</translation>
 <translation id="3422248202833853650">Testa att stänga andra program för att frigöra minne.</translation>
 <translation id="3422472998109090673"><ph name="HOST_NAME" /> kan inte nås för tillfället.</translation>
 <translation id="3427092606871434483">Tillåt (standard)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Delad med en administratör</translation>
 <translation id="4515275063822566619">Kort och adresser har hämtats från Chrome och ditt Google-konto (<ph name="ACCOUNT_EMAIL" />). Du hanterar dessa under <ph name="BEGIN_LINK" />Inställningar<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Info</translation>
+<translation id="4524805452350978254">Hantera kort</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Testa att inaktivera tilläggen.</translation>
 <translation id="457875822857220463">Leverans</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Felaktigt lösenord</translation>
 <translation id="5056549851600133418">Artiklar för dig</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />kontrollera proxyadressen<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Logga in och aktivera synkronisering om du vill få tillgång till dina kort på alla enheter.</translation>
 <translation id="5086888986931078152">Du kan förlora tillgången till skyddat innehåll från några webbplatser.</translation>
 <translation id="5087286274860437796">Servercertifikatet är inte giltigt för närvarande.</translation>
 <translation id="5087580092889165836">Lägg till kort</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> av <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Välj kontaktuppgifter</translation>
 <translation id="5327248766486351172">Namn</translation>
+<translation id="5327567770033251652">aktivera synkronisering</translation>
 <translation id="5332219387342487447">Fraktmetod</translation>
 <translation id="5355557959165512791">Det går inte att besöka <ph name="SITE" /> just nu eftersom dess certifikat har återkallats. Nätverksfel och attacker är ofta tillfälliga, så sidan kommer förmodligen att fungera senare.</translation>
 <translation id="536296301121032821">Det gick inte att spara policyinställningarna</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Välj en adress för att visa leveranssätt och krav</translation>
 <translation id="5770114862687765385">Den här filen verkar vara skadad. Återställ sessionen genom att klicka på återställningsknappen.</translation>
 <translation id="5778550464785688721">MIDI-enheter – fullständig kontroll</translation>
+<translation id="57838592816432529">Stäng av ljudet</translation>
 <translation id="5784606427469807560">Det gick inte att bekräfta kortet. Kontrollera internetanslutningen och försök igen.</translation>
 <translation id="5785756445106461925">Den här sidan innehåller emellertid andra resurser som inte är säkra. Andra kan se resurserna när de överförs och hackare kan ändra resurserna så att sidan får ett annat utseende.</translation>
 <translation id="5786044859038896871">Vill du att kortuppgifterna ska fyllas i?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Ange telefonnummer</translation>
 <translation id="5869405914158311789">Webbplatsen kan inte nås</translation>
 <translation id="5869522115854928033">Sparade lösenord</translation>
+<translation id="5887400589839399685">Kortet har sparats</translation>
 <translation id="5893752035575986141">Kreditkort får användas.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (synkroniserade)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 används}other{# används}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Användare:</translation>
 <translation id="6944692733090228304">Du har angett ditt lösenord på en webbplats som inte hanteras av <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Skydda kontot genom att inte återanvända lösenordet i andra appar och webbplatser.</translation>
 <translation id="6945221475159498467">Välj</translation>
+<translation id="6948540501704460596"><ph name="SYNC_LINK" /> om du vill få tillgång till dina kort på alla enheter.</translation>
 <translation id="6948701128805548767">Välj en adress för att visa alternativ för utlämning och krav</translation>
 <translation id="6949872517221025916">Återställ lösenord</translation>
 <translation id="6950684638814147129">Analysen av JSON-värdet misslyckades: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Öppna sidan på en ny privat flik</translation>
 <translation id="6957887021205513506">Serverns certifikat verkar vara falskt.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Enhet</translation>
 <translation id="6970216967273061347">Distrikt</translation>
 <translation id="6973656660372572881">Både fasta proxyservrar och en webbadress för PAC-skript anges.</translation>
+<translation id="6984479912851154518">Om du betalar i en extern app sker inte det i privat läge. Vill du fortsätta?</translation>
 <translation id="6989763994942163495">Visa avancerade inställningar ...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Debiteringen kan göras en gång eller återkommande och det behöver inte framgå tydligt att detta händer.</translation>
 <translation id="7029809446516969842">Lösenord</translation>
+<translation id="7042837854211185817">Aktivera synkronisering om du vill få tillgång till dina kort på alla enheter.</translation>
 <translation id="7050187094878475250">Du försökte nå <ph name="DOMAIN" />, men servern svarade med ett certifikat vars giltighetstid är för lång för att det ska vara trovärdigt.</translation>
 <translation id="7053983685419859001">Blockera</translation>
 <translation id="7064851114919012435">Kontaktuppgifter</translation>
@@ -1075,6 +1086,7 @@
 <translation id="8820817407110198400">Bokmärken</translation>
 <translation id="883848425547221593">Övriga bokmärken</translation>
 <translation id="884264119367021077">Leveransadress</translation>
+<translation id="8846319957959474018">Öppna appar enkelt med bokmärken</translation>
 <translation id="884923133447025588">Ingen återkallningsmekanism har hittats.</translation>
 <translation id="885730110891505394">Delar med Google</translation>
 <translation id="8858065207712248076">Du rekommenderas att återställa lösenordet för <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> om du har återanvänt det på andra webbplatser.</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb
index 455de2d..96288db 100644
--- a/components/strings/components_strings_sw.xtb
+++ b/components/strings/components_strings_sw.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Endelea</translation>
 <translation id="2365563543831475020">Ripoti ya kuacha kufanya kazi iliyochukuliwa <ph name="CRASH_TIME" /> haikupakiwa</translation>
 <translation id="2367567093518048410">Kiwango</translation>
+<translation id="2378238891085281592">Unatumia hali ya faragha</translation>
 <translation id="2384307209577226199">Biashara chaguomsingi</translation>
 <translation id="2386255080630008482">Cheti cha seva kimebatilishwa.</translation>
 <translation id="2392959068659972793">Onyesha sera zisizowekwa thamani</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Mahali pa kupeleka</translation>
 <translation id="3395827396354264108">Mbinu ya kuchukua</translation>
 <translation id="3399952811970034796">Mahali Bidhaa Itapelekwa</translation>
+<translation id="3409072600744224192">Ili upate kadi zako kwenye vifaa vyako vyote, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Jaribu kuondoka kwenye programu nyingine ili upate nafasi zaidi.</translation>
 <translation id="3422472998109090673"><ph name="HOST_NAME" /> haiwezi kufikiwa kwa sasa.</translation>
 <translation id="3427092606871434483">Ruhusu (chaguomsingi)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Kushiriki na Msimamizi</translation>
 <translation id="4515275063822566619">Kadi na anwani zinatoka Chrome na Akaunti yako ya Google (<ph name="ACCOUNT_EMAIL" />). Unaweza kuzidhibiti katika <ph name="BEGIN_LINK" />Mipangilio<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Maelezo</translation>
+<translation id="4524805452350978254">Dhibiti kadi</translation>
 <translation id="4552089082226364758">Mmweko</translation>
 <translation id="4558551763791394412">Jaribu kuzima viendelezi vyako.</translation>
 <translation id="457875822857220463">Usafirishaji</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Nenosiri lisilo sahihi</translation>
 <translation id="5056549851600133418">Makala kwa ajili yako</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />Kuangalia anwani mbadala<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Ingia katika akaunti na uwashe kipengele cha kusawazisha ili upate kadi zako kwenye vifaa vyako vyote.</translation>
 <translation id="5086888986931078152">Utapoteza idhini ya kufikia maudhui yanayolindwa kwenye tovuti nyingine.</translation>
 <translation id="5087286274860437796">Cheti cha seva si sahihi kwa sasa.</translation>
 <translation id="5087580092889165836">Ongeza kadi</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> kati ya <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Chagua Maelezo ya Mawasiliano</translation>
 <translation id="5327248766486351172">Jina</translation>
+<translation id="5327567770033251652">washa kipengele cha kusawazisha</translation>
 <translation id="5332219387342487447">Mbinu ya Usafirishaji</translation>
 <translation id="5355557959165512791">Huwezi kutembelea <ph name="SITE" /> sasa hivi kwa sababu cheti chake kimebatilishwa. Hitilafu na uvamizi wa mtandao kwa kawaida huwa wa muda, kwa hivyo huenda ukurasa huu utafanya kazi baadaye.</translation>
 <translation id="536296301121032821">Imeshindwa kuhifadhi mipangilio ya sera</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Chagua mahali ili uone njia za kusafirisha na mahitaji</translation>
 <translation id="5770114862687765385">Inaonekana faili imeharibika. Bofya kitufe cha 'Pakia upya' ili uanzishe upya kipindi.</translation>
 <translation id="5778550464785688721">Udhibiti kamili wa vifaa vya MIDI</translation>
+<translation id="57838592816432529">Zima sauti</translation>
 <translation id="5784606427469807560">Kulikuwa na tatizo wakati wa kuthibitisha kadi yako. Angalia muunganisho wako wa intaneti kisha ujaribu tena.</translation>
 <translation id="5785756445106461925">Mbali na hayo, ukurasa huu una rasilimali nyingine zisizo salama. Rasilimali hizi zinaweza kuangaliwa na watu wengine wanaosafiri, na zinaweza kurekebishwa na mvamizi kubadilisha mwonekano wa ukurasa.</translation>
 <translation id="5786044859038896871">Ungependa kujaza maelezo ya kadi yako?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Ongeza Nambari ya Simu</translation>
 <translation id="5869405914158311789">Imeshindwa kufungua tovuti hii</translation>
 <translation id="5869522115854928033">Manenosiri yaliyohifadhiwa</translation>
+<translation id="5887400589839399685">Kadi imehifadhiwa</translation>
 <translation id="5893752035575986141">Kadi za mikopo zinakubaliwa.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (imesawazishwa)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{1 kinatumika}other{ # vinatumika}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Mtumiaji:</translation>
 <translation id="6944692733090228304">Uliweka nenosiri lako kwenye tovuti ambayo haisimamiwi na <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Ili kulinda akaunti yako, usitumie tena nenosiri lako kwenye programu na tovuti zingine.</translation>
 <translation id="6945221475159498467">Chagua</translation>
+<translation id="6948540501704460596">Ili upate kadi zako kwenye vifaa vyako vyote, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Chagua anwani ili uone mbinu za kuchukua na mahitaji</translation>
 <translation id="6949872517221025916">Weka Nenosiri Jipya</translation>
 <translation id="6950684638814147129">Hitilafu fulani imetokea wakati wa kuchanganua thamani ya JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Fungua ukurasa katika Kichupo kipya cha faragha</translation>
 <translation id="6957887021205513506">Cheti cha seva kinaonekana kuwa ghushi.</translation>
 <translation id="6965382102122355670">Sawa</translation>
 <translation id="6965978654500191972">Kifaa</translation>
 <translation id="6970216967273061347">Wilaya</translation>
 <translation id="6973656660372572881">Seva zote za proksi thabiti na URL ya hati ya .pac zimebainishwa.</translation>
+<translation id="6984479912851154518">Unafunga hali ya faragha ili ulipe kupitia programu ya nje. Ungependa kuendelea?</translation>
 <translation id="6989763994942163495">Onyesha mipangilio ya kina...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Gharama hizi zinaweza kuwa za mara moja au za kujirudia na huenda zisiwe za moja kwa moja.</translation>
 <translation id="7029809446516969842">Manenosiri</translation>
+<translation id="7042837854211185817">Ili upate kadi zako katika vifaa vyako vyote, washa kipengele cha kusawazisha.</translation>
 <translation id="7050187094878475250">Ulijaribu kufikia <ph name="DOMAIN" />, lakini seva ikawasilisha cheti ambacho muda wake sahihi ni mrefu sana wa kuweza kuaminika.</translation>
 <translation id="7053983685419859001">Zuia</translation>
 <translation id="7064851114919012435">Maelezo ya mawasiliano</translation>
@@ -1075,6 +1086,7 @@
 <translation id="8820817407110198400">Alamisho</translation>
 <translation id="883848425547221593">Alamisho Zingine</translation>
 <translation id="884264119367021077">Anwani ya kusafirisha</translation>
+<translation id="8846319957959474018">Fungua programu kwa urahisi ukitumia alamisho</translation>
 <translation id="884923133447025588">Mbinu ya ubatilishaji haikupatikana.</translation>
 <translation id="885730110891505394">Kushiriki kwenye Google</translation>
 <translation id="8858065207712248076">Chrome inapendekeza ubadilishe nenosiri lako la <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> ikiwa ulilitumia tena kwenye tovuti zingine.</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index 5b13d946..5149177e 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -685,6 +685,7 @@
 <translation id="5765072501007116331">டெலிவரி முறைகளையும் தேவைகளையும் பார்க்க, முகவரியைத் தேர்ந்தெடுக்கவும்</translation>
 <translation id="5770114862687765385">கோப்பு சிதைந்துள்ளது போல் தெரிகிறது. அமர்வை மீட்டமைக்க, 'மீட்டமை' பொத்தானைக் கிளிக் செய்யவும்.</translation>
 <translation id="5778550464785688721">MIDI சாதனங்கள் முழுக்கட்டுப்பாடு</translation>
+<translation id="57838592816432529">ஒலியடக்கு</translation>
 <translation id="5784606427469807560">கார்டை உறுதிசெய்வதில் சிக்கல் ஏற்பட்டது. இணைய இணைப்பைச் சரிபார்த்து, மீண்டும் முயலவும்.</translation>
 <translation id="5785756445106461925">மேலும், பாதுகாப்பற்ற பிற ஆதாரங்கள் இந்தப் பக்கத்தில் உள்ளன. இந்த ஆதாரங்களை ட்ரான்ஸிட்டில் இருக்கும்போதும் பிறர் பார்வையிடலாம், மேலும் பக்கத்தின் தோற்றத்தை மாற்ற, தீங்கிழைப்பவர் அதை மாற்றியமைக்கலாம்.</translation>
 <translation id="5786044859038896871">கார்டு தகவலை நிரப்ப விரும்புகிறீர்களா?</translation>
@@ -810,7 +811,7 @@
 <translation id="6897140037006041989">பயனர் முகவர்</translation>
 <translation id="6903319715792422884">Googleளுக்குச் சில <ph name="BEGIN_WHITEPAPER_LINK" />சாதனத் தகவல்களையும் பக்க உள்ளடக்கத்தையும்<ph name="END_WHITEPAPER_LINK" /> அனுப்புவதன் மூலம் பாதுகாப்பான உலாவலை மேம்படுத்த உதவுங்கள். <ph name="PRIVACY_PAGE_LINK" /></translation>
 <translation id="6915804003454593391">பயனர்:</translation>
-<translation id="6944692733090228304"><ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> நிர்வாகிக்காத ஒரு தளத்தில் உங்கள் கடவுச்சொல்லை உள்ளிட்டுள்ளீர்கள். உங்கள் கணக்கைப் பாதுகாக்க, பிற ஆப்ஸிலும் தளங்களிலும் உங்கள் கடவுச்சொல்லை மீண்டும் பயன்படுத்த வேண்டாம்.</translation>
+<translation id="6944692733090228304"><ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> நிர்வகிக்காத ஒரு தளத்தில் உங்கள் கடவுச்சொல்லை உள்ளிட்டுள்ளீர்கள். உங்கள் கணக்கைப் பாதுகாக்க, பிற ஆப்ஸிலும் தளங்களிலும் உங்கள் கடவுச்சொல்லை மீண்டும் பயன்படுத்த வேண்டாம்.</translation>
 <translation id="6945221475159498467">தேர்ந்தெடு</translation>
 <translation id="6948701128805548767">பிக்அப் முறைகளையும் தேவைகளையும் பார்க்க, முகவரியைத் தேர்ந்தெடுக்கவும்</translation>
 <translation id="6949872517221025916">கடவுச்சொல்லை மீட்டமைக்கவும்</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index 7095e29..ff54c21 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -688,6 +688,7 @@
 <translation id="5765072501007116331">బట్వాడా పద్ధతులు మరియు అవసరాలను చూడాలంటే, చిరునామాని ఎంచుకోండి</translation>
 <translation id="5770114862687765385">ఫైల్ పాడై ఉండవచ్చు. సెషన్‌ని రీసెట్ చేయడం కోసం 'రీసెట్ చేయి' బటన్‌ని క్లిక్ చేయండి</translation>
 <translation id="5778550464785688721">MIDI పరికరాల పూర్తి నియంత్రణ</translation>
+<translation id="57838592816432529">మ్యూట్ చేయి</translation>
 <translation id="5784606427469807560">మీ కార్డ్‌ను నిర్ధారించడంలో సమస్య ఏర్పడింది. మీ ఇంటర్నెట్ కనెక్షన్‌ని తనిఖీ చేసి, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="5785756445106461925">అలాగే, ఈ పేజీలో సురక్షితం కాని ఇతర వనరులు ఉన్నాయి. ఈ వనరులను బదిలీ చేస్తున్నప్పుడు ఇతరులు చూడగలరు మరియు దాడికి పాల్పడేవారు పేజీ రూపాన్ని మార్చేలా వీటిని సవరించగలరు.</translation>
 <translation id="5786044859038896871">మీరు మీ కార్డ్ సమాచారం పూరించాలనుకుంటున్నారా?</translation>
@@ -695,7 +696,7 @@
 <translation id="5810442152076338065"><ph name="DOMAIN" />కి గల మీ కనెక్షన్ వాడుకలో లేని సైఫర్ సూట్ ఉపయోగించి గుప్తీకరించబడింది.</translation>
 <translation id="5813119285467412249">&amp;జోడించడాన్ని పునరావృతం చేయి</translation>
 <translation id="5838278095973806738">మీరు ఈ సైట్‌లో ఎలాంటి గోప్యమైన సమాచారాన్ని నమోదు చేయకూడదు (ఉదాహరణకు, పాస్‌వర్డ్‌లు లేదా క్రెడిట్ కార్డ్‌లు), దాడికి పాల్పడేవారు ఆ సమాచారం దొంగిలించే అవకాశం ఉంటుంది.</translation>
-<translation id="5863847714970149516">మీరు చూడబోతున్న పేజీ మీకు డబ్బులు ఛార్జ్ చేయడానికి ప్రయత్నించవచ్చు</translation>
+<translation id="5863847714970149516">మీరు చూడబోతున్న పేజీ మీకు డబ్బు ఛార్జ్ చేయడానికి ప్రయత్నించవచ్చు</translation>
 <translation id="5866257070973731571">ఫోన్ నంబర్‌ను జోడించండి</translation>
 <translation id="5869405914158311789">ఈ సైట్‌ను చేరుకోలేకపోయాము</translation>
 <translation id="5869522115854928033">సేవ్  చేసిన పాస్‌వర్డ్‌లు</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index 5796498..2e9cf43 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -489,7 +489,7 @@
 <translation id="4277028893293644418">รีเซ็ตรหัสผ่าน</translation>
 <translation id="4280429058323657511">หมดอายุ <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">สลับ</translation>
-<translation id="4308131620840579419">เก็บบัตรทุกใบไว้ในที่เดียวไหม</translation>
+<translation id="4308131620840579419">บันทึกบัตรทุกใบไว้ในที่เดียวไหม</translation>
 <translation id="4312866146174492540">บล็อก (ค่าเริ่มต้น)</translation>
 <translation id="4325863107915753736">การค้นหาบทความล้มเหลว</translation>
 <translation id="4326324639298822553">ตรวจสอบวันหมดอายุแล้วลองอีกครั้ง</translation>
@@ -600,7 +600,7 @@
 <translation id="5190835502935405962">แถบบุ๊กมาร์ก</translation>
 <translation id="5201306358585911203">หน้าที่ฝังไว้ในหน้าเว็บนี้บอกว่า</translation>
 <translation id="5205222826937269299">ต้องระบุชื่อ</translation>
-<translation id="5215116848420601511">วิธีการชำระเงินและที่อยู่จาก Google Pay</translation>
+<translation id="5215116848420601511">วิธีการชำระเงินและกรอกที่อยู่โดยใช้ Google Pay</translation>
 <translation id="5222812217790122047">ต้องระบุอีเมล</translation>
 <translation id="5230733896359313003">ที่อยู่ในการจัดส่ง</translation>
 <translation id="5250209940322997802">"เชื่อมต่อกับเครือข่าย"</translation>
@@ -688,6 +688,7 @@
 <translation id="5765072501007116331">หากต้องการดูวิธีการนำส่งสินค้าและข้อกำหนด โปรดเลือกที่อยู่</translation>
 <translation id="5770114862687765385">ดูเหมือนไฟล์จะเสียหาย คลิกปุ่ม "รีเซ็ต" เพื่อรีเซ็ตเซสชัน</translation>
 <translation id="5778550464785688721">การควบคุมอุปกรณ์ MIDI เต็มรูปแบบ</translation>
+<translation id="57838592816432529">ปิดเสียง</translation>
 <translation id="5784606427469807560">เกิดปัญหาในการยืนยันบัตรของคุณ โปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ตและลองอีกครั้ง</translation>
 <translation id="5785756445106461925">นอกจากนี้ หน้านี้ประกอบด้วยทรัพยากรอื่นๆ ซึ่งไม่ปลอดภัย ผู้อื่นสามารถดูทรัพยากรเหล่านี้ขณะถ่ายโอน และผู้บุกรุกสามารถแก้ไขเพื่อเปลี่ยนรูปลักษณ์ของหน้าได้</translation>
 <translation id="5786044859038896871">คุณต้องการกรอกข้อมูลบัตรไหม</translation>
@@ -695,7 +696,7 @@
 <translation id="5810442152076338065">มีการเข้ารหัสการเชื่อมต่อของคุณกับ <ph name="DOMAIN" /> ด้วยชุดการเข้ารหัสที่ล้าสมัยแล้ว</translation>
 <translation id="5813119285467412249">&amp;ทำซ้ำการเพิ่ม</translation>
 <translation id="5838278095973806738">คุณไม่ควรป้อนข้อมูลที่ละเอียดอ่อนบนเว็บไซต์นี้ (ตัวอย่างเช่น รหัสผ่านหรือบัตรเครดิต) เนื่องจากผู้โจมตีอาจขโมยข้อมูลดังกล่าวไปได้</translation>
-<translation id="5863847714970149516">อาจมีการพยายามเรียกเก็บเงินจากคุณในหน้าถัดไป</translation>
+<translation id="5863847714970149516">ระบบอาจพยายามเรียกเก็บเงินจากคุณในหน้าถัดไป</translation>
 <translation id="5866257070973731571">เพิ่มหมายเลขโทรศัพท์</translation>
 <translation id="5869405914158311789">ไม่สามารถเข้าถึงเว็บไซต์นี้</translation>
 <translation id="5869522115854928033">รหัสผ่านที่บันทึกไว้</translation>
@@ -826,7 +827,7 @@
 <translation id="6973656660372572881">มีการระบุทั้งพร็อกซีเซิร์ฟเวอร์แบบคงที่และ URL สคริปต์ .pac ไว้</translation>
 <translation id="6989763994942163495">แสดงการตั้งค่าขั้นสูง...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
-<translation id="7016992613359344582">การเรียกเก็บเงินเหล่านี้อาจเกิดขึ้นครั้งเดียวหรือเป็นประจำ และอาจไม่แสดงอย่างชัดแจ้ง</translation>
+<translation id="7016992613359344582">การเรียกเก็บเงินเหล่านี้อาจเกิดขึ้นครั้งเดียวหรือเป็นเกิดขึ้นซ้ำๆ และอาจไม่แสดงอย่างชัดแจ้ง</translation>
 <translation id="7029809446516969842">รหัสผ่าน</translation>
 <translation id="7050187094878475250">คุณพยายามเข้าถึง <ph name="DOMAIN" /> แต่เซิร์ฟเวอร์ได้แสดงใบรับรองที่มีระยะเวลาที่สามารถใช้ได้นานเกินกว่าที่จะเชื่อถือได้</translation>
 <translation id="7053983685419859001">บล็อก</translation>
@@ -1092,7 +1093,7 @@
 <translation id="8957210676456822347">การให้สิทธิ์แคปทีฟพอร์ทัล</translation>
 <translation id="8971063699422889582">ใบรับรองของเซิร์ฟเวอร์หมดอายุแล้ว</translation>
 <translation id="8978053250194585037">เมื่อเร็วๆ นี้ Google Safe Browsing <ph name="BEGIN_LINK" />ตรวจพบฟิชชิง<ph name="END_LINK" />ใน <ph name="SITE" /> เว็บไซต์ฟิชชิงปลอมเป็นเว็บไซต์อื่นๆ เพื่อหลอกคุณ</translation>
-<translation id="8983003182662520383">วิธีการชำระเงินและที่อยู่จาก Google Pay</translation>
+<translation id="8983003182662520383">วิธีการชำระเงินและกรอกที่อยู่โดยใช้ Google Pay</translation>
 <translation id="8987927404178983737">เดือน</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">ไซต์ที่จะเปิดมีโปรแกรมที่เป็นอันตราย</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb
index 6da1727..18d577e4 100644
--- a/components/strings/components_strings_tr.xtb
+++ b/components/strings/components_strings_tr.xtb
@@ -688,6 +688,7 @@
 <translation id="5765072501007116331">Teslimat yöntemlerini ve gereksinimleri görmek için bir adres seçin</translation>
 <translation id="5770114862687765385">Dosya bozuk gibi görünüyor. Oturumu sıfırlamak için "Sıfırla" düğmesini tıklayın.</translation>
 <translation id="5778550464785688721">MIDI cihazları tam denetimi</translation>
+<translation id="57838592816432529">Sesi kapat</translation>
 <translation id="5784606427469807560">Kartınız onaylanırken bir sorun oluştu. İnternet bağlantınızı kontrol edip tekrar deneyin.</translation>
 <translation id="5785756445106461925">Ayrıca, bu sayfa güvenli olmayan başka kaynaklar içeriyor. Bu kaynaklar, aktarım sırasında başkaları tarafından görülebilir ve bir saldırgan tarafından sayfanın görünüşünü değiştirmek üzere kullanılabilir.</translation>
 <translation id="5786044859038896871">Kart bilgilerinizin doldurulmasını istiyor musunuz?</translation>
@@ -826,7 +827,7 @@
 <translation id="6973656660372572881">Hem sabit proxy sunucular hem de bir .pac komut dosyası URL'si belirtildi.</translation>
 <translation id="6989763994942163495">Gelişmiş ayarları göster...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
-<translation id="7016992613359344582">Bu ödemeler bir defalık alınabileceği gibi yinelenen ödemeler de olabilir ve açıkça belli olmayabilir.</translation>
+<translation id="7016992613359344582">Bu ödemeler bir defalık alınabileceği gibi yinelenen ödemeler de olabilir ve bu durum açıkça belli olmayabilir.</translation>
 <translation id="7029809446516969842">Şifreler</translation>
 <translation id="7050187094878475250"><ph name="DOMAIN" /> alan adına erişmeyi denediniz, ancak sunucu, geçerlilik dönemi güvenilir olmayacak kadar uzun olan bir sertifika sundu.</translation>
 <translation id="7053983685419859001">Engelle</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb
index 4916ce4f..53d142d 100644
--- a/components/strings/components_strings_uk.xtb
+++ b/components/strings/components_strings_uk.xtb
@@ -207,6 +207,7 @@
 <translation id="2359808026110333948">Продовжити</translation>
 <translation id="2365563543831475020">Звіт про аварійне завершення роботи о <ph name="CRASH_TIME" /> не завантажено</translation>
 <translation id="2367567093518048410">Рівень</translation>
+<translation id="2378238891085281592">Ви перейшли в приватний режим</translation>
 <translation id="2384307209577226199">Стандартне корпоративне правило</translation>
 <translation id="2386255080630008482">Сертифікат сервера відкликано.</translation>
 <translation id="2392959068659972793">Показувати правила, для яких не встановлено значення</translation>
@@ -355,6 +356,7 @@
 <translation id="3391030046425686457">Адреса доставки</translation>
 <translation id="3395827396354264108">Спосіб отримання</translation>
 <translation id="3399952811970034796">Адреса доставки</translation>
+<translation id="3409072600744224192">Щоб мати доступ до карток на всіх своїх пристроях, <ph name="SIGN_IN_LINK" />.</translation>
 <translation id="3422248202833853650">Щоб звільнити пам’ять, закрийте інші програми.</translation>
 <translation id="3422472998109090673">Хост <ph name="HOST_NAME" /> зараз недоступний.</translation>
 <translation id="3427092606871434483">Дозволяти (за умовчанням)</translation>
@@ -514,6 +516,7 @@
 <translation id="450710068430902550">Надання інформації адміністратору</translation>
 <translation id="4515275063822566619">Дані картки та список адрес містяться в Chrome і вашому обліковому записі Google (<ph name="ACCOUNT_EMAIL" />). Ними можна керувати в <ph name="BEGIN_LINK" />Налаштуваннях<ph name="END_LINK" />.</translation>
 <translation id="4522570452068850558">Деталі</translation>
+<translation id="4524805452350978254">Керувати картками</translation>
 <translation id="4552089082226364758">Flash</translation>
 <translation id="4558551763791394412">Спробуйте вимкнути розширення.</translation>
 <translation id="457875822857220463">Доставка</translation>
@@ -579,6 +582,7 @@
 <translation id="5045550434625856497">Неправильний пароль</translation>
 <translation id="5056549851600133418">Статті для вас</translation>
 <translation id="5070335125961472645"><ph name="BEGIN_LINK" />перевірити адресу проксі-сервера<ph name="END_LINK" /></translation>
+<translation id="5072538239104292703">Щоб мати доступ до карток на всіх своїх пристроях, увійдіть в обліковий запис і ввімкніть синхронізацію.</translation>
 <translation id="5086888986931078152">Ви можете втратити доступ до захищеного вмісту на деяких сайтах.</translation>
 <translation id="5087286274860437796">Сертифікат сервера зараз недійсний.</translation>
 <translation id="5087580092889165836">Додати картку</translation>
@@ -624,6 +628,7 @@
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> з <ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Вибрати контактну інформацію</translation>
 <translation id="5327248766486351172">Назва</translation>
+<translation id="5327567770033251652">увімкніть синхронізацію</translation>
 <translation id="5332219387342487447">Спосіб доставки</translation>
 <translation id="5355557959165512791">Зараз не можна перейти на сторінку <ph name="SITE" />, оскільки цей сертифікат відкликано. Помилки мережі й атаки зазвичай тимчасові, тому ця сторінка, скоріш за все, запрацює пізніше.</translation>
 <translation id="536296301121032821">Помилка збереження налаштувань правила</translation>
@@ -688,6 +693,7 @@
 <translation id="5765072501007116331">Укажіть адресу, щоб переглянути способи доставки та вимоги.</translation>
 <translation id="5770114862687765385">Схоже, файл пошкоджено. Натисніть кнопку "Скинути", щоб завершити сеанс.</translation>
 <translation id="5778550464785688721">Повний контроль пристроїв MIDI</translation>
+<translation id="57838592816432529">Вимкнути звук</translation>
 <translation id="5784606427469807560">Не вдалося підтвердити дані картки. Перевірте з’єднання з Інтернетом і повторіть спробу.</translation>
 <translation id="5785756445106461925">Окрім цього, сторінка містить незахищені ресурси. Інші особи можуть переглядати їх під час передавання даних, а зловмисники можуть змінювати вигляд сторінки.</translation>
 <translation id="5786044859038896871">Ввести дані кредитної картки?</translation>
@@ -699,6 +705,7 @@
 <translation id="5866257070973731571">Додайте номер телефону</translation>
 <translation id="5869405914158311789">Немає зв’язку із сайтом</translation>
 <translation id="5869522115854928033">Збережені паролі</translation>
+<translation id="5887400589839399685">Картку збережено</translation>
 <translation id="5893752035575986141">Кредитні картки, які приймаються.</translation>
 <translation id="5908541034548427511"><ph name="TYPE_1" /> (синхронізовано)</translation>
 <translation id="5920262536204764679">{NUM_COOKIES,plural, =1{Використовується 1 файл}one{Використовується # файл}few{Використовуються # файли}many{Використовуються # файлів}other{Використовуються # файлу}}</translation>
@@ -816,18 +823,22 @@
 <translation id="6915804003454593391">Користувач:</translation>
 <translation id="6944692733090228304">Ви ввели пароль на сайті, яким не керує <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Щоб захистити свій обліковий запис, не використовуйте цей пароль для інших додатків і сайтів.</translation>
 <translation id="6945221475159498467">Вибрати</translation>
+<translation id="6948540501704460596">Щоб мати доступ до карток на всіх своїх пристроях, <ph name="SYNC_LINK" />.</translation>
 <translation id="6948701128805548767">Укажіть адресу, щоб переглянути способи отримання та вимоги.</translation>
 <translation id="6949872517221025916">Скидання пароля</translation>
 <translation id="6950684638814147129">Сталася помилка під час синтаксичного аналізу значення JSON: <ph name="ERROR" /></translation>
+<translation id="6957624206566198865">Відкрийте сторінку в новій приватній вкладці</translation>
 <translation id="6957887021205513506">Схоже, що сертифікат сервера підроблено.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Пристрій</translation>
 <translation id="6970216967273061347">Район або округ</translation>
 <translation id="6973656660372572881">Указано фіксовані проксі-сервери та URL-адреса сценарію .pac.</translation>
+<translation id="6984479912851154518">Щоб оплатити в зовнішньому додатку, ви вийдете з приватного режиму. Продовжити?</translation>
 <translation id="6989763994942163495">Показати розширені налаштування...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7016992613359344582">Такі стягнення можуть бути одноразовими чи регулярними й неочевидними.</translation>
 <translation id="7029809446516969842">Паролі</translation>
+<translation id="7042837854211185817">Щоб мати доступ до карток на всіх своїх пристроях, увімкніть синхронізацію.</translation>
 <translation id="7050187094878475250">Ви намагалися зв’язатися з доменом <ph name="DOMAIN" />, але сервер надав сертифікат із задовгим терміном дії.</translation>
 <translation id="7053983685419859001">Блокувати</translation>
 <translation id="7064851114919012435">Контактна інформація</translation>
@@ -1075,6 +1086,7 @@
 <translation id="8820817407110198400">Закладки</translation>
 <translation id="883848425547221593">Інші закладки</translation>
 <translation id="884264119367021077">Адреса доставки</translation>
+<translation id="8846319957959474018">Легко відкривайте додатки за допомогою закладок</translation>
 <translation id="884923133447025588">Не знайдено механізм відкликання.</translation>
 <translation id="885730110891505394">Надання інформації службам Google</translation>
 <translation id="8858065207712248076">Chrome радить скинути пароль <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />, якщо ви застосовували його на інших сайтах.</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb
index ad78e75..b3ab7f4e 100644
--- a/components/strings/components_strings_vi.xtb
+++ b/components/strings/components_strings_vi.xtb
@@ -688,6 +688,7 @@
 <translation id="5765072501007116331">Để xem các yêu cầu và phương thức phân phối, hãy chọn một địa chỉ</translation>
 <translation id="5770114862687765385">Tệp dường như bị lỗi. Hãy nhấp vào nút 'Đặt lại' để đặt lại phiên làm việc này.</translation>
 <translation id="5778550464785688721">Điều khiển toàn bộ thiết bị MIDI</translation>
+<translation id="57838592816432529">Tắt tiếng</translation>
 <translation id="5784606427469807560">Đã xảy ra sự cố khi xác nhận thẻ của bạn. Hãy kiểm tra kết nối Internet của bạn và thử lại.</translation>
 <translation id="5785756445106461925">Ngoài ra, trang này bao gồm các tài nguyên khác không an toàn. Những tài nguyên này có thể bị người khác xem khi đang gửi và có thể bị kẻ tấn công sửa đổi nhằm thay đổi giao diện của trang.</translation>
 <translation id="5786044859038896871">Bạn có muốn điền thông tin thẻ của mình không?</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index d2c5f01..e9f482e 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -685,6 +685,7 @@
 <translation id="5765072501007116331">要查看递送方式和要求,请选择相应地址</translation>
 <translation id="5770114862687765385">该文件似乎已受损。请点击“重置”按钮以重置此会话。</translation>
 <translation id="5778550464785688721">完全控制 MIDI 设备</translation>
+<translation id="57838592816432529">静音</translation>
 <translation id="5784606427469807560">确认您的信用卡时出现问题。请检查您的互联网连接,然后重试。</translation>
 <translation id="5785756445106461925">而且,此页中包含其他不安全的资源。他人能在这些资源传输过程中进行查看,攻击者也可以修改这些资源,从而改变此页的外观。</translation>
 <translation id="5786044859038896871">要填充您的信用卡信息吗?</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index a81e4e8..f4fc535f 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -688,6 +688,7 @@
 <translation id="5765072501007116331">如要查看快遞方式和相關規定,請選取一個地址</translation>
 <translation id="5770114862687765385">這個檔案似乎已毀損。按一下 [重設] 按鈕即可重設工作階段。</translation>
 <translation id="5778550464785688721">MIDI 裝置完整控制</translation>
+<translation id="57838592816432529">靜音</translation>
 <translation id="5784606427469807560">驗證您的信用卡時發生問題。請檢查網際網路連線,然後再試一次。</translation>
 <translation id="5785756445106461925">此外,這個網頁含有其他不安全的資源。其他人可能會在資源傳輸期間檢視這些資源,攻擊者也可能會修改這些資源,進而變更網頁外觀。</translation>
 <translation id="5786044859038896871">要填入你的信用卡資訊嗎?</translation>
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.cc b/components/sync_bookmarks/bookmark_model_type_processor.cc
index 6170d3c..033220ec 100644
--- a/components/sync_bookmarks/bookmark_model_type_processor.cc
+++ b/components/sync_bookmarks/bookmark_model_type_processor.cc
@@ -153,13 +153,13 @@
     NudgeForCommitIfNeeded();
     return;
   }
-  // TODO(crbug.com/516866): Set the model type state.
-
   ScopedRemoteUpdateBookmarks update_bookmarks(
       bookmark_model_, bookmark_undo_service_, bookmark_model_observer_.get());
   BookmarkRemoteUpdatesHandler updates_handler(bookmark_model_,
                                                bookmark_tracker_.get());
   updates_handler.Process(updates);
+  bookmark_tracker_->set_model_type_state(
+      std::make_unique<sync_pb::ModelTypeState>(model_type_state));
   // Schedule save just in case one is needed.
   schedule_save_closure_.Run();
 }
diff --git a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
index 7d8acf7..f7239a1 100644
--- a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
+++ b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
@@ -339,6 +339,34 @@
   AssertState(&new_processor, bookmarks);
 }
 
+// Verifies that the model type state stored in the tracker gets
+// updated upon handling remote updates by assigning a new encryption
+// key name.
+TEST_F(BookmarkModelTypeProcessorTest,
+       ShouldUpdateModelTypeStateUponHandlingRemoteUpdates) {
+  // Initialize the process to make sure the tracker has been created.
+  InitWithSyncedBookmarks({}, processor());
+  const SyncedBookmarkTracker* tracker = processor()->GetTrackerForTest();
+  // The encryption key name should be empty.
+  ASSERT_TRUE(tracker->model_type_state().encryption_key_name().empty());
+
+  // Build a model type state with an encryption key name.
+  const std::string kEncryptionKeyName = "new_encryption_key_name";
+  sync_pb::ModelTypeState model_type_state(CreateDummyModelTypeState());
+  model_type_state.set_encryption_key_name(kEncryptionKeyName);
+
+  EXPECT_CALL(*schedule_save_closure(), Run());
+  // Push empty updates list to the processor together with the updated model
+  // type state.
+  processor()->OnUpdateReceived(model_type_state,
+                                syncer::UpdateResponseDataList());
+
+  // The model type state inside the tracker should have been updated, and
+  // carries the new encryption key name.
+  EXPECT_THAT(tracker->model_type_state().encryption_key_name(),
+              Eq(kEncryptionKeyName));
+}
+
 }  // namespace
 
 }  // namespace sync_bookmarks
diff --git a/components/viz/common/frame_sinks/begin_frame_source.cc b/components/viz/common/frame_sinks/begin_frame_source.cc
index da4e915..857aca0c 100644
--- a/components/viz/common/frame_sinks/begin_frame_source.cc
+++ b/components/viz/common/frame_sinks/begin_frame_source.cc
@@ -279,8 +279,9 @@
 
 // ExternalBeginFrameSource -----------------------------------------------
 ExternalBeginFrameSource::ExternalBeginFrameSource(
-    ExternalBeginFrameSourceClient* client)
-    : BeginFrameSource(kNotRestartableId), client_(client) {
+    ExternalBeginFrameSourceClient* client,
+    uint32_t restart_id)
+    : BeginFrameSource(restart_id), client_(client) {
   DCHECK(client_);
 }
 
diff --git a/components/viz/common/frame_sinks/begin_frame_source.h b/components/viz/common/frame_sinks/begin_frame_source.h
index caa1d38..677ed18a 100644
--- a/components/viz/common/frame_sinks/begin_frame_source.h
+++ b/components/viz/common/frame_sinks/begin_frame_source.h
@@ -265,7 +265,8 @@
   // Client lifetime must be preserved by owner for the lifetime of the class.
   // In order to allow derived classes to implement the client interface, no
   // calls to |client| are made during construction / destruction.
-  explicit ExternalBeginFrameSource(ExternalBeginFrameSourceClient* client);
+  explicit ExternalBeginFrameSource(ExternalBeginFrameSourceClient* client,
+                                    uint32_t restart_id = kNotRestartableId);
   ~ExternalBeginFrameSource() override;
 
   // BeginFrameSource implementation.
diff --git a/components/viz/common/frame_sinks/begin_frame_source_unittest.cc b/components/viz/common/frame_sinks/begin_frame_source_unittest.cc
index 9c4beaf..f917015 100644
--- a/components/viz/common/frame_sinks/begin_frame_source_unittest.cc
+++ b/components/viz/common/frame_sinks/begin_frame_source_unittest.cc
@@ -560,9 +560,10 @@
 class ExternalBeginFrameSourceTest : public ::testing::Test {
  public:
   void SetUp() override {
-    client_.reset(new MockExternalBeginFrameSourceClient());
-    source_.reset(new ExternalBeginFrameSource(client_.get()));
-    obs_.reset(new MockBeginFrameObserver);
+    client_ = std::make_unique<MockExternalBeginFrameSourceClient>();
+    source_ = std::make_unique<ExternalBeginFrameSource>(
+        client_.get(), BeginFrameSource::kNotRestartableId);
+    obs_ = std::make_unique<MockBeginFrameObserver>();
   }
 
   void TearDown() override {
diff --git a/components/viz/host/host_gpu_memory_buffer_manager.cc b/components/viz/host/host_gpu_memory_buffer_manager.cc
index c35566c..a9871ba2 100644
--- a/components/viz/host/host_gpu_memory_buffer_manager.cc
+++ b/components/viz/host/host_gpu_memory_buffer_manager.cc
@@ -56,27 +56,6 @@
   DCHECK(task_runner_->BelongsToCurrentThread());
 }
 
-void HostGpuMemoryBufferManager::GpuServiceShutDown() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  gpu_service_version_++;
-
-  // Drop allocated buffers.
-  allocated_buffers_.clear();
-
-  // Retry requesting pending buffer allocations.
-  auto pending_buffers = std::move(pending_buffers_);
-  pending_buffers_.clear();
-  for (auto& client_pair : pending_buffers) {
-    for (auto& buffer_pair : client_pair.second) {
-      auto& buffer = buffer_pair.second;
-      AllocateGpuMemoryBuffer(
-          buffer_pair.first, client_pair.first, buffer.size, buffer.format,
-          buffer.usage, buffer.surface_handle, std::move(buffer.callback));
-    }
-  }
-}
-
 void HostGpuMemoryBufferManager::DestroyGpuMemoryBuffer(
     gfx::GpuMemoryBufferId id,
     int client_id,
@@ -91,7 +70,7 @@
     return;
   DCHECK_NE(gfx::EMPTY_BUFFER, buffer_iter->second.type);
   if (buffer_iter->second.type != gfx::SHARED_MEMORY_BUFFER) {
-    auto* gpu_service = gpu_service_provider_.Run();
+    auto* gpu_service = GetGpuService();
     DCHECK(gpu_service);
     gpu_service->DestroyGpuMemoryBuffer(id, client_id, sync_token);
   }
@@ -107,7 +86,7 @@
     for (const auto& pair : buffers) {
       DCHECK_NE(gfx::EMPTY_BUFFER, pair.second.type);
       if (pair.second.type != gfx::SHARED_MEMORY_BUFFER) {
-        auto* gpu_service = gpu_service_provider_.Run();
+        auto* gpu_service = GetGpuService();
         DCHECK(gpu_service);
         gpu_service->DestroyGpuMemoryBuffer(pair.first, client_id,
                                             gpu::SyncToken());
@@ -140,7 +119,7 @@
     const bool is_native = native_configurations_.find(std::make_pair(
                                format, usage)) != native_configurations_.end();
     if (is_native) {
-      if (auto* gpu_service = gpu_service_provider_.Run()) {
+      if (auto* gpu_service = GetGpuService()) {
         PendingBufferInfo buffer_info;
         buffer_info.size = size;
         buffer_info.format = format;
@@ -271,6 +250,39 @@
   return true;
 }
 
+mojom::GpuService* HostGpuMemoryBufferManager::GetGpuService() {
+  DCHECK(task_runner_->BelongsToCurrentThread());
+
+  if (gpu_service_)
+    return gpu_service_;
+
+  gpu_service_ = gpu_service_provider_.Run(base::BindOnce(
+      &HostGpuMemoryBufferManager::OnConnectionError, weak_ptr_));
+  return gpu_service_;
+}
+
+void HostGpuMemoryBufferManager::OnConnectionError() {
+  DCHECK(task_runner_->BelongsToCurrentThread());
+
+  gpu_service_ = nullptr;
+  gpu_service_version_++;
+
+  // Drop allocated buffers.
+  allocated_buffers_.clear();
+
+  // Retry requesting pending buffer allocations.
+  auto pending_buffers = std::move(pending_buffers_);
+  pending_buffers_.clear();
+  for (auto& client_pair : pending_buffers) {
+    for (auto& buffer_pair : client_pair.second) {
+      auto& buffer = buffer_pair.second;
+      AllocateGpuMemoryBuffer(
+          buffer_pair.first, client_pair.first, buffer.size, buffer.format,
+          buffer.usage, buffer.surface_handle, std::move(buffer.callback));
+    }
+  }
+}
+
 uint64_t HostGpuMemoryBufferManager::ClientIdToTracingId(int client_id) const {
   if (client_id == client_id_) {
     return base::trace_event::MemoryDumpManager::GetInstance()
@@ -298,7 +310,7 @@
     // The client has been destroyed since the allocation request was made. The
     // callback is already called with null handle.
     if (!handle.is_null() && !stale) {
-      auto* gpu_service = gpu_service_provider_.Run();
+      auto* gpu_service = GetGpuService();
       DCHECK(gpu_service);
       gpu_service->DestroyGpuMemoryBuffer(handle.id, client_id,
                                           gpu::SyncToken());
diff --git a/components/viz/host/host_gpu_memory_buffer_manager.h b/components/viz/host/host_gpu_memory_buffer_manager.h
index 20c3b96..edadaf3 100644
--- a/components/viz/host/host_gpu_memory_buffer_manager.h
+++ b/components/viz/host/host_gpu_memory_buffer_manager.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "base/callback_forward.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/single_thread_task_runner.h"
@@ -34,8 +35,11 @@
  public:
   // Callback used to get the current instance of GpuService. The callback
   // should retry launching GPU service if it is not already running, or return
-  // nullptr if it is impossible.
-  using GpuServiceProvider = base::RepeatingCallback<mojom::GpuService*(void)>;
+  // nullptr if it is impossible. |connection_error_handler| will be called when
+  // the GpuService is shut down. The return value will be cached until the GPU
+  // service is shut down.
+  using GpuServiceProvider = base::RepeatingCallback<mojom::GpuService*(
+      base::OnceClosure connection_error_handler)>;
 
   // All function of HostGpuMemoryBufferManager must be called the thread
   // associated with |task_runner|, other than the constructor and the
@@ -48,11 +52,6 @@
       scoped_refptr<base::SingleThreadTaskRunner> task_runner);
   ~HostGpuMemoryBufferManager() override;
 
-  // This is called whenever GPU service is shut down (e.g. GPU process
-  // crashes). It will invalidate any allocated memory buffer and retry
-  // allocation requests for pending memory buffers.
-  void GpuServiceShutDown();
-
   void DestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id,
                               int client_id,
                               const gpu::SyncToken& sync_token);
@@ -111,6 +110,13 @@
                          AllocatedBufferInfo,
                          BASE_HASH_NAMESPACE::hash<gfx::GpuMemoryBufferId>>;
 
+  mojom::GpuService* GetGpuService();
+
+  // This is called whenever GPU service is shut down (e.g. GPU process
+  // crashes). It will invalidate any allocated memory buffer and retry
+  // allocation requests for pending memory buffers.
+  void OnConnectionError();
+
   uint64_t ClientIdToTracingId(int client_id) const;
   void OnGpuMemoryBufferAllocated(int gpu_service_version,
                                   int client_id,
@@ -118,6 +124,7 @@
                                   gfx::GpuMemoryBufferHandle handle);
 
   GpuServiceProvider gpu_service_provider_;
+  mojom::GpuService* gpu_service_ = nullptr;
 
   // This is incremented every time GPU service is shut down in order check
   // whether a buffer is allocated by the most current GPU service or not.
diff --git a/components/viz/host/host_gpu_memory_buffer_manager_unittest.cc b/components/viz/host/host_gpu_memory_buffer_manager_unittest.cc
index 791c19d..7a63389 100644
--- a/components/viz/host/host_gpu_memory_buffer_manager_unittest.cc
+++ b/components/viz/host/host_gpu_memory_buffer_manager_unittest.cc
@@ -26,7 +26,8 @@
 
   HostGpuMemoryBufferManager::GpuServiceProvider CreateProvider() {
     return base::BindRepeating(
-        [](mojom::GpuService* gpu_service) { return gpu_service; },
+        [](mojom::GpuService* gpu_service,
+           base::OnceClosure connection_error_handler) { return gpu_service; },
         base::Unretained(this));
   }
 
diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_android.cc b/components/viz/service/frame_sinks/external_begin_frame_source_android.cc
index 0fff75e..6dfc792 100644
--- a/components/viz/service/frame_sinks/external_begin_frame_source_android.cc
+++ b/components/viz/service/frame_sinks/external_begin_frame_source_android.cc
@@ -9,8 +9,9 @@
 
 namespace viz {
 
-ExternalBeginFrameSourceAndroid::ExternalBeginFrameSourceAndroid()
-    : ExternalBeginFrameSource(this),
+ExternalBeginFrameSourceAndroid::ExternalBeginFrameSourceAndroid(
+    uint32_t restart_id)
+    : ExternalBeginFrameSource(this, restart_id),
       j_object_(Java_ExternalBeginFrameSourceAndroid_Constructor(
           base::android::AttachCurrentThread(),
           reinterpret_cast<jlong>(this))) {}
diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_android.h b/components/viz/service/frame_sinks/external_begin_frame_source_android.h
index dfcd260..49ae2a6 100644
--- a/components/viz/service/frame_sinks/external_begin_frame_source_android.h
+++ b/components/viz/service/frame_sinks/external_begin_frame_source_android.h
@@ -20,7 +20,7 @@
     : public ExternalBeginFrameSource,
       public ExternalBeginFrameSourceClient {
  public:
-  ExternalBeginFrameSourceAndroid();
+  explicit ExternalBeginFrameSourceAndroid(uint32_t restart_id);
   ~ExternalBeginFrameSourceAndroid() override;
 
   void OnVSync(JNIEnv* env,
diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_android_unittest.cc b/components/viz/service/frame_sinks/external_begin_frame_source_android_unittest.cc
index 4907dfa..1b4e644 100644
--- a/components/viz/service/frame_sinks/external_begin_frame_source_android_unittest.cc
+++ b/components/viz/service/frame_sinks/external_begin_frame_source_android_unittest.cc
@@ -36,7 +36,8 @@
 
  private:
   void InitOnThread() {
-    begin_frame_source_ = std::make_unique<ExternalBeginFrameSourceAndroid>();
+    begin_frame_source_ = std::make_unique<ExternalBeginFrameSourceAndroid>(
+        BeginFrameSource::kNotRestartableId);
   }
 
   void AddObserverOnThread(uint32_t frame_count) {
diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_mojo.cc b/components/viz/service/frame_sinks/external_begin_frame_source_mojo.cc
index 1021eb57..00d7015 100644
--- a/components/viz/service/frame_sinks/external_begin_frame_source_mojo.cc
+++ b/components/viz/service/frame_sinks/external_begin_frame_source_mojo.cc
@@ -8,8 +8,9 @@
 
 ExternalBeginFrameSourceMojo::ExternalBeginFrameSourceMojo(
     mojom::ExternalBeginFrameControllerAssociatedRequest controller_request,
-    mojom::ExternalBeginFrameControllerClientPtr client)
-    : ExternalBeginFrameSource(this),
+    mojom::ExternalBeginFrameControllerClientPtr client,
+    uint32_t restart_id)
+    : ExternalBeginFrameSource(this, restart_id),
       binding_(this, std::move(controller_request)),
       client_(std::move(client)) {}
 
diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_mojo.h b/components/viz/service/frame_sinks/external_begin_frame_source_mojo.h
index b489a80..13460b3e 100644
--- a/components/viz/service/frame_sinks/external_begin_frame_source_mojo.h
+++ b/components/viz/service/frame_sinks/external_begin_frame_source_mojo.h
@@ -27,7 +27,8 @@
  public:
   ExternalBeginFrameSourceMojo(
       mojom::ExternalBeginFrameControllerAssociatedRequest controller_request,
-      mojom::ExternalBeginFrameControllerClientPtr client);
+      mojom::ExternalBeginFrameControllerClientPtr client,
+      uint32_t restart_id);
   ~ExternalBeginFrameSourceMojo() override;
 
   // mojom::ExternalBeginFrameController implementation.
diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
index 5777dddb..177753c 100644
--- a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
+++ b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
@@ -34,13 +34,17 @@
   std::unique_ptr<SyntheticBeginFrameSource> synthetic_begin_frame_source;
   ExternalBeginFrameSourceMojo* external_begin_frame_source_mojo = nullptr;
 
+  // BeginFrameSource::source_id component that changes on process restart.
+  uint32_t restart_id = display_provider->GetRestartId();
+
   if (params->external_begin_frame_controller.is_pending() &&
       params->external_begin_frame_controller_client) {
     auto owned_external_begin_frame_source_mojo =
         std::make_unique<ExternalBeginFrameSourceMojo>(
             std::move(params->external_begin_frame_controller),
             mojom::ExternalBeginFrameControllerClientPtr(
-                std::move(params->external_begin_frame_controller_client)));
+                std::move(params->external_begin_frame_controller_client)),
+            restart_id);
     external_begin_frame_source_mojo =
         owned_external_begin_frame_source_mojo.get();
     external_begin_frame_source =
@@ -48,12 +52,12 @@
   } else {
 #if defined(OS_ANDROID)
     external_begin_frame_source =
-        std::make_unique<ExternalBeginFrameSourceAndroid>();
+        std::make_unique<ExternalBeginFrameSourceAndroid>(restart_id);
 #else
     synthetic_begin_frame_source = std::make_unique<DelayBasedBeginFrameSource>(
         std::make_unique<DelayBasedTimeSource>(
             base::ThreadTaskRunnerHandle::Get().get()),
-        display_provider->GetRestartId());
+        restart_id);
 #endif
   }
 
diff --git a/components/viz/service/frame_sinks/surface_synchronization_unittest.cc b/components/viz/service/frame_sinks/surface_synchronization_unittest.cc
index f3f2f32..38c96b232 100644
--- a/components/viz/service/frame_sinks/surface_synchronization_unittest.cc
+++ b/components/viz/service/frame_sinks/surface_synchronization_unittest.cc
@@ -153,8 +153,15 @@
         surface_id);
   }
 
-  Surface* GetLatestInFlightSurface(const SurfaceId& primary_surface_id,
-                                    const SurfaceId& fallback_surface_id) {
+  // Returns true if there is a Persistent reference for |surface_id|.
+  bool HasPersistentReference(const SurfaceId& surface_id) {
+    return frame_sink_manager().surface_manager()->HasPersistentReference(
+        surface_id);
+  }
+
+  Surface* GetLatestInFlightSurface(
+      const SurfaceId& primary_surface_id,
+      const base::Optional<SurfaceId>& fallback_surface_id) {
     return frame_sink_manager().surface_manager()->GetLatestInFlightSurface(
         SurfaceRange(fallback_surface_id, primary_surface_id));
   }
@@ -2197,6 +2204,57 @@
   EXPECT_EQ(nullptr, GetLatestInFlightSurface(child_id2, bogus_child_id));
 }
 
+// This test verifies that GetLatestInFlightSurface will return the primary or
+// nullptr if fallback is not specified.
+// TODO(akaba): this would change after https://crbug.com/861769
+TEST_F(SurfaceSynchronizationTest, LatestInFlightSurfaceWithoutFallback) {
+  SetFrameSinkHierarchy(kParentFrameSink, kChildFrameSink1);
+  const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
+  const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1);
+  const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink1, 2);
+
+  child_support1().SubmitCompositorFrame(child_id1.local_surface_id(),
+                                         MakeDefaultCompositorFrame());
+  // Verify that |child_id1| is active.
+  EXPECT_TRUE(child_surface1()->HasActiveFrame());
+  EXPECT_FALSE(child_surface1()->HasPendingFrame());
+  EXPECT_THAT(child_surface1()->activation_dependencies(), IsEmpty());
+
+  parent_support().SubmitCompositorFrame(
+      parent_id.local_surface_id(),
+      MakeCompositorFrame({child_id2}, {SurfaceRange(child_id1, child_id2)},
+                          std::vector<TransferableResource>()));
+
+  // Verify that the |parent_id| is not active yet.
+  EXPECT_FALSE(parent_surface()->HasActiveFrame());
+  EXPECT_TRUE(parent_surface()->HasPendingFrame());
+  EXPECT_THAT(parent_surface()->activation_dependencies(),
+              UnorderedElementsAre(child_id2));
+
+  // Verify that |child_id1| is the latest active surface.
+  EXPECT_EQ(GetSurfaceForId(child_id1),
+            GetLatestInFlightSurface(child_id2, child_id1));
+
+  // Fallback is not specified and primary doesn't exists so we return nullptr.
+  EXPECT_EQ(nullptr, GetLatestInFlightSurface(child_id2, base::nullopt));
+
+  // Activate |child_id2|
+  child_support1().SubmitCompositorFrame(child_id2.local_surface_id(),
+                                         MakeDefaultCompositorFrame());
+  // Verify that child2 is active.
+  EXPECT_TRUE(child_surface1()->HasActiveFrame());
+  EXPECT_FALSE(child_surface1()->HasPendingFrame());
+  EXPECT_THAT(child_surface1()->activation_dependencies(), IsEmpty());
+
+  // Verify that |child_id2| is the latest active surface.
+  EXPECT_EQ(GetSurfaceForId(child_id2),
+            GetLatestInFlightSurface(child_id2, child_id1));
+
+  // Fallback is not specified but primary exists so we return it.
+  EXPECT_EQ(GetSurfaceForId(child_id2),
+            GetLatestInFlightSurface(child_id2, base::nullopt));
+}
+
 // This test verifies that GetLatestInFlightSurface will not return null if the
 // fallback is garbage collected, but instead returns the latest surface older
 // than primary if that exists.
@@ -2279,32 +2337,44 @@
             GetLatestInFlightSurface(child_id4, child_id1));
 }
 
-// This test verifies that GetLatestInFlightSurface will return the fallback
-// surface if the primary and fallback SurfaceIds have different FrameSinkIds.
-// This is important to preserve the property that that latest in-flight surface
-// is no newer than the primary. If the FrameSinkId changes then we cannot be
-// sure of that so we simply return the fallback surface.
+// This test verifies that in the case of different frame sinks
+// GetLatestInFlightSurface will return the latest surface in the primary's
+// FrameSinkId or the latest in the fallback's FrameSinkId if no surface exists
+// in the primary's.
 TEST_F(SurfaceSynchronizationTest, LatestInFlightSurfaceDifferentFrameSinkIds) {
+  SetFrameSinkHierarchy(kParentFrameSink, kChildFrameSink1);
+  SetFrameSinkHierarchy(kParentFrameSink, kChildFrameSink2);
   const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
   const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1);
-  const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 1);
-  const SurfaceId child_id3 = MakeSurfaceId(kChildFrameSink2, 2);
+  const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink1, 2);
+  const SurfaceId child_id3 = MakeSurfaceId(kChildFrameSink2, 1);
+  const SurfaceId child_id4 = MakeSurfaceId(kChildFrameSink2, 2);
 
+  // Activate |child_id1|.
   child_support1().SubmitCompositorFrame(child_id1.local_surface_id(),
                                          MakeDefaultCompositorFrame());
 
+  // Activate |child_id2|.
+  child_support1().SubmitCompositorFrame(child_id2.local_surface_id(),
+                                         MakeDefaultCompositorFrame());
+
   parent_support().SubmitCompositorFrame(
       parent_id.local_surface_id(),
-      MakeCompositorFrame({child_id2}, {SurfaceRange(child_id1)},
+      MakeCompositorFrame({child_id4}, {SurfaceRange(child_id1, child_id4)},
                           std::vector<TransferableResource>()));
 
-  // Submit a child CompositorFrame without a different FrameSinkId and verify
-  // that if the fallback and primary differ in FrameSinkId then
-  // GetLatestInFlightSurface will always return the specified fallback.
-  child_support2().SubmitCompositorFrame(child_id2.local_surface_id(),
+  // Primary's frame sink id empty and |child_id2| is the latest in fallback's
+  // frame sink.
+  EXPECT_EQ(GetSurfaceForId(child_id2),
+            GetLatestInFlightSurface(child_id4, child_id1));
+
+  // Activate |child_id3| which is in different frame sink.
+  child_support2().SubmitCompositorFrame(child_id3.local_surface_id(),
                                          MakeDefaultCompositorFrame());
-  EXPECT_EQ(GetSurfaceForId(child_id1),
-            GetLatestInFlightSurface(child_id3, child_id1));
+
+  // |child_id3| is the latest in primary's frame sink.
+  EXPECT_EQ(GetSurfaceForId(child_id3),
+            GetLatestInFlightSurface(child_id4, child_id1));
 }
 
 // This test verifies that GetLatestInFlightSurface will return the
@@ -2342,6 +2412,51 @@
             GetLatestInFlightSurface(child_id3, child_id1));
 }
 
+// This test verifies that GetLatestInFlightSurface can use persistent
+// references to compute the latest surface.
+TEST_F(SurfaceSynchronizationTest,
+       LatestInFlightSurfaceUsesPersistentReferences) {
+  SetFrameSinkHierarchy(kParentFrameSink, kChildFrameSink1);
+  const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
+  const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1);
+  const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink1, 2);
+  const SurfaceId child_id3 = MakeSurfaceId(kChildFrameSink1, 3);
+
+  // Activate |child_id1|.
+  child_support1().SubmitCompositorFrame(child_id1.local_surface_id(),
+                                         MakeDefaultCompositorFrame());
+
+  // |child_id1| now should have a temporary reference.
+  EXPECT_TRUE(HasTemporaryReference(child_id1));
+  EXPECT_FALSE(HasPersistentReference(child_id1));
+
+  // Activate |child_id2|.
+  child_support1().SubmitCompositorFrame(child_id2.local_surface_id(),
+                                         MakeDefaultCompositorFrame());
+
+  // |child_id2| now should have a temporary reference.
+  EXPECT_TRUE(HasTemporaryReference(child_id2));
+  EXPECT_FALSE(HasPersistentReference(child_id2));
+
+  // Create a reference from |parent_id| to |child_id2|.
+  parent_support().SubmitCompositorFrame(
+      parent_id.local_surface_id(),
+      MakeCompositorFrame(empty_surface_ids(), {SurfaceRange(child_id2)},
+                          std::vector<TransferableResource>()));
+
+  // |child_id1| have no references and can be garbage collected.
+  EXPECT_FALSE(HasTemporaryReference(child_id1));
+  EXPECT_FALSE(HasPersistentReference(child_id1));
+
+  // |child_id2| has a persistent references now.
+  EXPECT_FALSE(HasTemporaryReference(child_id2));
+  EXPECT_TRUE(HasPersistentReference(child_id2));
+
+  // Verify that GetLatestInFlightSurface returns |child_id2|.
+  EXPECT_EQ(GetSurfaceForId(child_id2),
+            GetLatestInFlightSurface(child_id3, child_id1));
+}
+
 // This test verifies that GetLatestInFlightSurface will skip a surface if
 // its nonce is different.
 TEST_F(SurfaceSynchronizationTest, LatestInFlightSurfaceSkipDifferentNonce) {
diff --git a/components/viz/service/surfaces/surface_manager.cc b/components/viz/service/surfaces/surface_manager.cc
index 5ec96e5..c22da5f 100644
--- a/components/viz/service/surfaces/surface_manager.cc
+++ b/components/viz/service/surfaces/surface_manager.cc
@@ -65,6 +65,7 @@
   // destroyed.
   temporary_references_.clear();
   temporary_reference_ranges_.clear();
+  persistent_references_by_frame_sink_id_.clear();
   // Create a copy of the children set as RemoveSurfaceReferenceImpl below will
   // mutate that set.
   base::flat_set<SurfaceId> children(
@@ -274,6 +275,43 @@
   return parents;
 }
 
+Surface* SurfaceManager::GetLatestInFlightSurfaceForFrameSinkId(
+    const SurfaceRange& surface_range,
+    const FrameSinkId& sink_id) {
+  std::vector<LocalSurfaceId> valid_local_surfaces;
+  // Get all valid temporary references.
+  auto temporary_it = temporary_reference_ranges_.find(sink_id);
+  if (temporary_it != temporary_reference_ranges_.end()) {
+    for (const LocalSurfaceId& local_id : temporary_it->second) {
+      if (surface_range.IsInRangeInclusive(SurfaceId(sink_id, local_id)))
+        valid_local_surfaces.push_back(local_id);
+    }
+  }
+
+  // Get all valid persistent references.
+  auto persistent_it = persistent_references_by_frame_sink_id_.find(sink_id);
+  if (persistent_it != persistent_references_by_frame_sink_id_.end()) {
+    for (const LocalSurfaceId& local_id : persistent_it->second) {
+      if (surface_range.IsInRangeInclusive(SurfaceId(sink_id, local_id)))
+        valid_local_surfaces.push_back(local_id);
+    }
+  }
+
+  // Sort all possible surfaces from newest to oldest, then return the first
+  // surface that has an active frame.
+  std::sort(valid_local_surfaces.begin(), valid_local_surfaces.end(),
+            [](const LocalSurfaceId& first, const LocalSurfaceId& second) {
+              return first > second;
+            });
+
+  for (const LocalSurfaceId& local_surface_id : valid_local_surfaces) {
+    Surface* surface = GetSurfaceForId(SurfaceId(sink_id, local_surface_id));
+    if (surface && surface->HasActiveFrame())
+      return surface;
+  }
+  return nullptr;
+}
+
 SurfaceManager::SurfaceIdSet SurfaceManager::GetLiveSurfacesForReferences() {
   SurfaceIdSet reachable_surfaces;
 
@@ -331,6 +369,10 @@
 
   references_[parent_id].insert(child_id);
 
+  // Add a real reference to child_id.
+  persistent_references_by_frame_sink_id_[child_id.frame_sink_id()].insert(
+      child_id.local_surface_id());
+
   for (auto& observer : observer_list_)
     observer.OnAddedSurfaceReference(parent_id, child_id);
 
@@ -357,12 +399,36 @@
   iter_parent->second.erase(child_iter);
   if (iter_parent->second.empty())
     references_.erase(iter_parent);
+
+  // Remove the presistent reference.
+  const FrameSinkId& sink_id = child_id.frame_sink_id();
+  const LocalSurfaceId& local_id = child_id.local_surface_id();
+
+  auto sink_it = persistent_references_by_frame_sink_id_.find(sink_id);
+  if (sink_it == persistent_references_by_frame_sink_id_.end())
+    return;
+
+  auto local_surface_it = sink_it->second.find(local_id);
+  if (local_surface_it == sink_it->second.end())
+    return;
+
+  sink_it->second.erase(local_surface_it);
+  if (sink_it->second.empty())
+    persistent_references_by_frame_sink_id_.erase(sink_it);
 }
 
 bool SurfaceManager::HasTemporaryReference(const SurfaceId& surface_id) const {
   return temporary_references_.count(surface_id) != 0;
 }
 
+bool SurfaceManager::HasPersistentReference(const SurfaceId& surface_id) const {
+  auto it =
+      persistent_references_by_frame_sink_id_.find(surface_id.frame_sink_id());
+  if (it == persistent_references_by_frame_sink_id_.end())
+    return false;
+  return it->second.count(surface_id.local_surface_id()) != 0;
+}
+
 void SurfaceManager::AddTemporaryReference(const SurfaceId& surface_id) {
   DCHECK(!HasTemporaryReference(surface_id));
 
@@ -429,53 +495,33 @@
 
 Surface* SurfaceManager::GetLatestInFlightSurface(
     const SurfaceRange& surface_range) {
-  const SurfaceId& primary_surface_id = surface_range.end();
-  const base::Optional<SurfaceId>& fallback_surface_id = surface_range.start();
 
   // If primary exists, we return it.
-  Surface* primary_surface = GetSurfaceForId(primary_surface_id);
+  Surface* primary_surface = GetSurfaceForId(surface_range.end());
   if (primary_surface && primary_surface->HasActiveFrame())
     return primary_surface;
 
-  if (!fallback_surface_id)
+  // If fallback is not specified we return nullptr.
+  // TODO(akaba): after fixing https://crbug.com/861769 we need to return
+  // something older than primary.
+  if (!surface_range.start())
     return nullptr;
 
-  DCHECK(fallback_surface_id->is_valid());
+  // If both end of the range exists, we try the primary's FrameSinkId first.
+  Surface* latest_surface = GetLatestInFlightSurfaceForFrameSinkId(
+      surface_range, surface_range.end().frame_sink_id());
 
-  Surface* fallback_surface = GetSurfaceForId(*fallback_surface_id);
-
-  auto it =
-      temporary_reference_ranges_.find(fallback_surface_id->frame_sink_id());
-  if (it == temporary_reference_ranges_.end())
-    return fallback_surface;
-
-  const std::vector<LocalSurfaceId>& temp_surfaces = it->second;
-  for (const LocalSurfaceId& local_surface_id : base::Reversed(temp_surfaces)) {
-    // The in-flight surface must be older than the primary surface ID.
-    if (local_surface_id.parent_sequence_number() >
-            primary_surface_id.local_surface_id().parent_sequence_number() ||
-        local_surface_id.child_sequence_number() >
-            primary_surface_id.local_surface_id().child_sequence_number()) {
-      continue;
-    }
-
-    // If the embed_token doesn't match the primary or fallback's then the
-    // parent does not have permission to embed this surface.
-    if (local_surface_id.embed_token() !=
-            fallback_surface_id->local_surface_id().embed_token() &&
-        local_surface_id.embed_token() !=
-            primary_surface_id.local_surface_id().embed_token()) {
-      continue;
-    }
-
-    SurfaceId surface_id(fallback_surface_id->frame_sink_id(),
-                         local_surface_id);
-    Surface* surface = GetSurfaceForId(surface_id);
-    if (surface && surface->HasActiveFrame())
-      return surface;
+  // If the fallback has a different FrameSinkId, then try that also.
+  if (!latest_surface && surface_range.HasDifferentFrameSinkIds()) {
+    latest_surface = GetLatestInFlightSurfaceForFrameSinkId(
+        surface_range, surface_range.start()->frame_sink_id());
   }
 
-  return fallback_surface;
+  // Fallback might have neither temporary or presistent references, so we
+  // consider it separately.
+  if (!latest_surface)
+    latest_surface = GetSurfaceForId(*surface_range.start());
+  return latest_surface;
 }
 
 void SurfaceManager::ExpireOldTemporaryReferences() {
diff --git a/components/viz/service/surfaces/surface_manager.h b/components/viz/service/surfaces/surface_manager.h
index f9ca07de..024cb9b 100644
--- a/components/viz/service/surfaces/surface_manager.h
+++ b/components/viz/service/surfaces/surface_manager.h
@@ -185,10 +185,9 @@
   base::flat_set<SurfaceId> GetSurfacesThatReferenceChildForTesting(
       const SurfaceId& surface_id) const;
 
-  // Returns the most recent surface associated with the |fallback_surface_id|'s
-  // FrameSinkId that was created prior to the current primary surface and
-  // verified by the viz host to be owned by the fallback surface's parent. If
-  // |fallback_surface_id| doesn't exist then this method will return nullptr.
+  // Returns the primary surface if it exists. Otherwise, this will return the
+  // most recent surface in |surface_range|. If no surface exists, this will
+  // return nullptr.
   Surface* GetLatestInFlightSurface(const SurfaceRange& surface_range);
 
   // Called by SurfaceAggregator notifying us that it will use |surface| in the
@@ -224,6 +223,11 @@
     bool marked_as_old = false;
   };
 
+  // Returns the latest surface in a FrameSinkId that satisfies |is_valid|.
+  Surface* GetLatestInFlightSurfaceForFrameSinkId(
+      const SurfaceRange& surface_range,
+      const FrameSinkId& sink_id);
+
   // Returns set of live surfaces for |lifetime_manager_| is REFERENCES.
   SurfaceIdSet GetLiveSurfacesForReferences();
 
@@ -237,8 +241,12 @@
   // Removes a reference from a |parent_id| to |child_id|.
   void RemoveSurfaceReferenceImpl(const SurfaceReference& reference);
 
+  // Returns whether |surface_id| has a temporary reference or not.
   bool HasTemporaryReference(const SurfaceId& surface_id) const;
 
+  // Returns whether |surface_id| has a Persistent reference or not.
+  bool HasPersistentReference(const SurfaceId& surface_id) const;
+
   // Adds a temporary reference to |surface_id|. The reference will not have an
   // owner initially.
   void AddTemporaryReference(const SurfaceId& surface_id);
@@ -311,6 +319,11 @@
   std::unordered_map<FrameSinkId, std::vector<LocalSurfaceId>, FrameSinkIdHash>
       temporary_reference_ranges_;
 
+  // A list of surfaces with a given FrameSinkId that have a persistent
+  // reference.
+  base::flat_map<FrameSinkId, base::flat_set<LocalSurfaceId>>
+      persistent_references_by_frame_sink_id_;
+
   // Timer to remove old temporary references that aren't removed after an
   // interval of time. The timer will started/stopped so it only runs if there
   // are temporary references. Also the timer isn't used with Android WebView.
diff --git a/content/app/strings/translations/content_strings_bn.xtb b/content/app/strings/translations/content_strings_bn.xtb
index 4cad3eb..43402da 100644
--- a/content/app/strings/translations/content_strings_bn.xtb
+++ b/content/app/strings/translations/content_strings_bn.xtb
@@ -2,7 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="bn">
 <translation id="1018939186200882850">মেনু আইটেম</translation>
-<translation id="1020833440720551630">অডিও ট্র্যাক নিঃশব্দ করুন</translation>
+<translation id="1020833440720551630">অডিও ট্র্যাক মিউট করুন</translation>
 <translation id="10623998915015855">টগল বোতাম</translation>
 <translation id="1088086359088493902">সেকেন্ড</translation>
 <translation id="1171774979989969504">দয়া করে কোন ইমেল ঠিকানা প্রবেশ করান:</translation>
@@ -133,7 +133,7 @@
 <translation id="5643186887447432888">বোতাম</translation>
 <translation id="5677946354068040947">আরও বিকল্প</translation>
 <translation id="576709008726043716">পরিচয়</translation>
-<translation id="57838592816432529">নিঃশব্দ করুন</translation>
+<translation id="57838592816432529">মিউট করুন</translation>
 <translation id="5860033963881614850">বন্ধ করুন</translation>
 <translation id="588258955323874662">সম্পূর্নস্ক্রীণ</translation>
 <translation id="5888666972993069672"><ph name="DEVICE_FRIENDLY_NAME" /> এ কাস্ট করা হচ্ছে</translation>
@@ -163,7 +163,7 @@
 <translation id="6790428901817661496">চালু করুন</translation>
 <translation id="6820355525329141109">প্লাগ ইন লোড করা যায়নি।</translation>
 <translation id="6820615603175220800">বিবলিওগ্রাফি রেফারেন্স</translation>
-<translation id="6843725295806269523">নিঃশব্দ</translation>
+<translation id="6843725295806269523">মিউট</translation>
 <translation id="6853785296079745596">বন্ধ করা পরিচয়লিপিগুলি লুকান</translation>
 <translation id="6885760532393684712">ডিরেক্টরি</translation>
 <translation id="689129560213475294">বইটির সম্পর্কে</translation>
diff --git a/content/browser/accessibility/accessibility_win_browsertest.cc b/content/browser/accessibility/accessibility_win_browsertest.cc
index 943b5c8..3fede92a 100644
--- a/content/browser/accessibility/accessibility_win_browsertest.cc
+++ b/content/browser/accessibility/accessibility_win_browsertest.cc
@@ -683,7 +683,7 @@
   Microsoft::WRL::ComPtr<IAccessible2> accessible2;
   HRESULT hr = QueryIAccessible2(accessible, accessible2.GetAddressOf());
   ASSERT_EQ(S_OK, hr);
-  long ia2_role = 0;
+  LONG ia2_role = 0;
   hr = accessible2->role(&ia2_role);
   ASSERT_EQ(S_OK, hr);
   EXPECT_EQ(ia2_role_, ia2_role)
diff --git a/content/browser/accessibility/browser_accessibility_com_win.cc b/content/browser/accessibility/browser_accessibility_com_win.cc
index 6cf9789..513f7cc 100644
--- a/content/browser/accessibility/browser_accessibility_com_win.cc
+++ b/content/browser/accessibility/browser_accessibility_com_win.cc
@@ -70,12 +70,12 @@
 // IAccessible2 overrides:
 //
 
-STDMETHODIMP BrowserAccessibilityComWin::get_attributes(BSTR* attributes) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_attributes(BSTR* attributes) {
   // This can be removed once ISimpleDOMNode is migrated
   return AXPlatformNodeWin::get_attributes(attributes);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::scrollTo(IA2ScrollType scroll_type) {
+IFACEMETHODIMP BrowserAccessibilityComWin::scrollTo(IA2ScrollType scroll_type) {
   // This can be removed once ISimpleDOMNode is migrated
   return AXPlatformNodeWin::scrollTo(scroll_type);
 }
@@ -84,7 +84,7 @@
 // IAccessibleApplication methods.
 //
 
-STDMETHODIMP BrowserAccessibilityComWin::get_appName(BSTR* app_name) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_appName(BSTR* app_name) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_APP_NAME);
 
   if (!app_name)
@@ -103,7 +103,7 @@
   return *app_name ? S_OK : E_FAIL;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_appVersion(BSTR* app_version) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_appVersion(BSTR* app_version) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_APP_VERSION);
 
   if (!app_version)
@@ -123,7 +123,7 @@
   return *app_version ? S_OK : E_FAIL;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_toolkitName(BSTR* toolkit_name) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_toolkitName(BSTR* toolkit_name) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_TOOLKIT_NAME);
   if (!toolkit_name)
     return E_INVALIDARG;
@@ -136,7 +136,7 @@
   return *toolkit_name ? S_OK : E_FAIL;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_toolkitVersion(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_toolkitVersion(
     BSTR* toolkit_version) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_TOOLKIT_VERSION);
   if (!toolkit_version)
@@ -152,7 +152,7 @@
 // IAccessibleImage methods.
 //
 
-STDMETHODIMP BrowserAccessibilityComWin::get_description(BSTR* desc) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_description(BSTR* desc) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_DESCRIPTION);
   if (!owner())
     return E_FAIL;
@@ -169,7 +169,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_imagePosition(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_imagePosition(
     IA2CoordinateType coordinate_type,
     LONG* x,
     LONG* y) {
@@ -199,8 +199,8 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_imageSize(LONG* height,
-                                                       LONG* width) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_imageSize(LONG* height,
+                                                         LONG* width) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_IMAGE_SIZE);
   if (!owner())
     return E_FAIL;
@@ -217,15 +217,15 @@
 // IAccessibleText methods.
 //
 
-STDMETHODIMP BrowserAccessibilityComWin::get_nCharacters(LONG* n_characters) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_nCharacters(LONG* n_characters) {
   return AXPlatformNodeWin::get_nCharacters(n_characters);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_caretOffset(LONG* offset) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_caretOffset(LONG* offset) {
   return AXPlatformNodeWin::get_caretOffset(offset);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_characterExtents(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_characterExtents(
     LONG offset,
     IA2CoordinateType coordinate_type,
     LONG* out_x,
@@ -267,20 +267,20 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_nSelections(LONG* n_selections) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_nSelections(LONG* n_selections) {
   return AXPlatformNodeWin::get_nSelections(n_selections);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_selection(LONG selection_index,
-                                                       LONG* start_offset,
-                                                       LONG* end_offset) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_selection(LONG selection_index,
+                                                         LONG* start_offset,
+                                                         LONG* end_offset) {
   return AXPlatformNodeWin::get_selection(selection_index, start_offset,
                                           end_offset);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_text(LONG start_offset,
-                                                  LONG end_offset,
-                                                  BSTR* text) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_text(LONG start_offset,
+                                                    LONG end_offset,
+                                                    BSTR* text) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_TEXT);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -313,7 +313,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_textAtOffset(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_textAtOffset(
     LONG offset,
     IA2TextBoundaryType boundary_type,
     LONG* start_offset,
@@ -361,7 +361,7 @@
   return get_text(start, end, text);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_textBeforeOffset(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_textBeforeOffset(
     LONG offset,
     IA2TextBoundaryType boundary_type,
     LONG* start_offset,
@@ -395,7 +395,7 @@
   return get_text(*start_offset, *end_offset, text);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_textAfterOffset(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_textAfterOffset(
     LONG offset,
     IA2TextBoundaryType boundary_type,
     LONG* start_offset,
@@ -429,7 +429,8 @@
   return get_text(*start_offset, *end_offset, text);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_newText(IA2TextSegment* new_text) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_newText(
+    IA2TextSegment* new_text) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_NEW_TEXT);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -448,12 +449,13 @@
 
   base::string16 substr = GetText().substr(start, new_len);
   new_text->text = SysAllocString(substr.c_str());
-  new_text->start = static_cast<long>(start);
-  new_text->end = static_cast<long>(start + new_len);
+  new_text->start = static_cast<LONG>(start);
+  new_text->end = static_cast<LONG>(start + new_len);
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_oldText(IA2TextSegment* old_text) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_oldText(
+    IA2TextSegment* old_text) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_OLD_TEXT);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -473,12 +475,12 @@
   base::string16 old_hypertext = old_hypertext_.hypertext;
   base::string16 substr = old_hypertext.substr(start, old_len);
   old_text->text = SysAllocString(substr.c_str());
-  old_text->start = static_cast<long>(start);
-  old_text->end = static_cast<long>(start + old_len);
+  old_text->start = static_cast<LONG>(start);
+  old_text->end = static_cast<LONG>(start + old_len);
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_offsetAtPoint(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_offsetAtPoint(
     LONG x,
     LONG y,
     IA2CoordinateType coord_type,
@@ -499,7 +501,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::scrollSubstringTo(
+IFACEMETHODIMP BrowserAccessibilityComWin::scrollSubstringTo(
     LONG start_index,
     LONG end_index,
     IA2ScrollType scroll_type) {
@@ -510,7 +512,7 @@
   return scrollTo(scroll_type);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::scrollSubstringToPoint(
+IFACEMETHODIMP BrowserAccessibilityComWin::scrollSubstringToPoint(
     LONG start_index,
     LONG end_index,
     IA2CoordinateType coordinate_type,
@@ -535,16 +537,17 @@
   return scrollToPoint(coordinate_type, x, y);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::addSelection(LONG start_offset,
-                                                      LONG end_offset) {
+IFACEMETHODIMP BrowserAccessibilityComWin::addSelection(LONG start_offset,
+                                                        LONG end_offset) {
   return AXPlatformNodeWin::addSelection(start_offset, end_offset);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::removeSelection(LONG selection_index) {
+IFACEMETHODIMP BrowserAccessibilityComWin::removeSelection(
+    LONG selection_index) {
   return AXPlatformNodeWin::removeSelection(selection_index);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::setCaretOffset(LONG offset) {
+IFACEMETHODIMP BrowserAccessibilityComWin::setCaretOffset(LONG offset) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_SET_CARET_OFFSET);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -553,9 +556,9 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::setSelection(LONG selection_index,
-                                                      LONG start_offset,
-                                                      LONG end_offset) {
+IFACEMETHODIMP BrowserAccessibilityComWin::setSelection(LONG selection_index,
+                                                        LONG start_offset,
+                                                        LONG end_offset) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_SET_SELECTION);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -566,10 +569,11 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_attributes(LONG offset,
-                                                        LONG* start_offset,
-                                                        LONG* end_offset,
-                                                        BSTR* text_attributes) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_attributes(
+    LONG offset,
+    LONG* start_offset,
+    LONG* end_offset,
+    BSTR* text_attributes) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_IATEXT_GET_ATTRIBUTES);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!start_offset || !end_offset || !text_attributes)
@@ -608,8 +612,8 @@
 // IAccessibleHypertext methods.
 //
 
-STDMETHODIMP BrowserAccessibilityComWin::get_nHyperlinks(
-    long* hyperlink_count) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_nHyperlinks(
+    LONG* hyperlink_count) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_HYPERLINKS);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -622,8 +626,8 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_hyperlink(
-    long index,
+IFACEMETHODIMP BrowserAccessibilityComWin::get_hyperlink(
+    LONG index,
     IAccessibleHyperlink** hyperlink) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_HYPERLINK);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
@@ -631,7 +635,7 @@
     return E_FAIL;
 
   if (!hyperlink || index < 0 ||
-      index >= static_cast<long>(hypertext_.hyperlinks.size())) {
+      index >= static_cast<LONG>(hypertext_.hyperlinks.size())) {
     return E_INVALIDARG;
   }
 
@@ -645,9 +649,9 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_hyperlinkIndex(
-    long char_index,
-    long* hyperlink_index) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_hyperlinkIndex(
+    LONG char_index,
+    LONG* hyperlink_index) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_HYPERLINK_INDEX);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -656,7 +660,7 @@
   if (!hyperlink_index)
     return E_INVALIDARG;
 
-  if (char_index < 0 || char_index >= static_cast<long>(GetText().size())) {
+  if (char_index < 0 || char_index >= static_cast<LONG>(GetText().size())) {
     return E_INVALIDARG;
   }
 
@@ -676,8 +680,8 @@
 //
 
 // Currently, only text links are supported.
-STDMETHODIMP BrowserAccessibilityComWin::get_anchor(long index,
-                                                    VARIANT* anchor) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_anchor(LONG index,
+                                                      VARIANT* anchor) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ANCHOR);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner() || !IsHyperlink())
@@ -701,8 +705,8 @@
 }
 
 // Currently, only text links are supported.
-STDMETHODIMP BrowserAccessibilityComWin::get_anchorTarget(
-    long index,
+IFACEMETHODIMP BrowserAccessibilityComWin::get_anchorTarget(
+    LONG index,
     VARIANT* anchor_target) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ANCHOR_TARGET);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
@@ -732,7 +736,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_startIndex(long* index) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_startIndex(LONG* index) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_START_INDEX);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner() || !IsHyperlink())
@@ -751,7 +755,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_endIndex(long* index) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_endIndex(LONG* index) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_END_INDEX);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   LONG start_index;
@@ -762,7 +766,7 @@
 }
 
 // This method is deprecated in the IA2 Spec.
-STDMETHODIMP BrowserAccessibilityComWin::get_valid(boolean* valid) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_valid(boolean* valid) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_VALID);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   return E_NOTIMPL;
@@ -772,7 +776,7 @@
 // IAccessibleAction partly implemented.
 //
 
-STDMETHODIMP BrowserAccessibilityComWin::nActions(long* n_actions) {
+IFACEMETHODIMP BrowserAccessibilityComWin::nActions(LONG* n_actions) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_N_ACTIONS);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -794,7 +798,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::doAction(long action_index) {
+IFACEMETHODIMP BrowserAccessibilityComWin::doAction(LONG action_index) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_DO_ACTION);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -808,25 +812,25 @@
   return S_OK;
 }
 
-STDMETHODIMP
-BrowserAccessibilityComWin::get_description(long action_index,
+IFACEMETHODIMP
+BrowserAccessibilityComWin::get_description(LONG action_index,
                                             BSTR* description) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_IAACTION_GET_DESCRIPTION);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   return E_NOTIMPL;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_keyBinding(long action_index,
-                                                        long n_max_bindings,
-                                                        BSTR** key_bindings,
-                                                        long* n_bindings) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_keyBinding(LONG action_index,
+                                                          LONG n_max_bindings,
+                                                          BSTR** key_bindings,
+                                                          LONG* n_bindings) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_KEY_BINDING);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   return E_NOTIMPL;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_name(long action_index,
-                                                  BSTR* name) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_name(LONG action_index,
+                                                    BSTR* name) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_NAME);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -855,8 +859,8 @@
   return S_OK;
 }
 
-STDMETHODIMP
-BrowserAccessibilityComWin::get_localizedName(long action_index,
+IFACEMETHODIMP
+BrowserAccessibilityComWin::get_localizedName(LONG action_index,
                                               BSTR* localized_name) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_LOCALIZED_NAME);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
@@ -890,7 +894,7 @@
 // IAccessibleValue methods.
 //
 
-STDMETHODIMP BrowserAccessibilityComWin::get_currentValue(VARIANT* value) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_currentValue(VARIANT* value) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_CURRENT_VALUE);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -911,7 +915,7 @@
   return S_FALSE;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_minimumValue(VARIANT* value) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_minimumValue(VARIANT* value) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_MINIMUM_VALUE);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -932,7 +936,7 @@
   return S_FALSE;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_maximumValue(VARIANT* value) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_maximumValue(VARIANT* value) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_MAXIMUM_VALUE);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -953,7 +957,7 @@
   return S_FALSE;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::setCurrentValue(VARIANT new_value) {
+IFACEMETHODIMP BrowserAccessibilityComWin::setCurrentValue(VARIANT new_value) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_SET_CURRENT_VALUE);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   // TODO(dmazzoni): Implement this.
@@ -964,7 +968,7 @@
 // ISimpleDOMDocument methods.
 //
 
-STDMETHODIMP BrowserAccessibilityComWin::get_URL(BSTR* url) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_URL(BSTR* url) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_URL);
   if (!owner())
     return E_FAIL;
@@ -989,7 +993,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_title(BSTR* title) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_title(BSTR* title) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_TITLE);
   if (!owner())
     return E_FAIL;
@@ -1011,7 +1015,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_mimeType(BSTR* mime_type) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_mimeType(BSTR* mime_type) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_MIME_TYPE);
   if (!owner())
     return E_FAIL;
@@ -1033,7 +1037,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_docType(BSTR* doc_type) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_docType(BSTR* doc_type) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_DOC_TYPE);
   if (!owner())
     return E_FAIL;
@@ -1055,14 +1059,14 @@
   return S_OK;
 }
 
-STDMETHODIMP
+IFACEMETHODIMP
 BrowserAccessibilityComWin::get_nameSpaceURIForID(short name_space_id,
                                                   BSTR* name_space_uri) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_NAMESPACE_URI_FOR_ID);
   return E_NOTIMPL;
 }
 
-STDMETHODIMP
+IFACEMETHODIMP
 BrowserAccessibilityComWin::put_alternateViewMediaTypes(
     BSTR* comma_separated_media_types) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_PUT_ALTERNATE_VIEW_MEDIA_TYPES);
@@ -1073,7 +1077,7 @@
 // ISimpleDOMNode methods.
 //
 
-STDMETHODIMP BrowserAccessibilityComWin::get_nodeInfo(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_nodeInfo(
     BSTR* node_name,
     short* name_space_id,
     BSTR* node_value,
@@ -1112,7 +1116,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_attributes(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_attributes(
     unsigned short max_attribs,
     BSTR* attrib_names,
     short* name_space_id,
@@ -1140,7 +1144,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_attributesForNames(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_attributesForNames(
     unsigned short num_attribs,
     BSTR* attrib_names,
     short* name_space_id,
@@ -1172,7 +1176,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_computedStyle(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_computedStyle(
     unsigned short max_style_properties,
     boolean use_alternate_view,
     BSTR* style_properties,
@@ -1203,7 +1207,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_computedStyleForProperties(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_computedStyleForProperties(
     unsigned short num_style_properties,
     boolean use_alternate_view,
     BSTR* style_properties,
@@ -1233,13 +1237,14 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::scrollTo(boolean placeTopLeft) {
+IFACEMETHODIMP BrowserAccessibilityComWin::scrollTo(boolean placeTopLeft) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ISIMPLEDOMNODE_SCROLL_TO);
   return scrollTo(placeTopLeft ? IA2_SCROLL_TYPE_TOP_LEFT
                                : IA2_SCROLL_TYPE_ANYWHERE);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_parentNode(ISimpleDOMNode** node) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_parentNode(
+    ISimpleDOMNode** node) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_PARENT_NODE);
   if (!owner())
     return E_FAIL;
@@ -1252,7 +1257,8 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_firstChild(ISimpleDOMNode** node) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_firstChild(
+    ISimpleDOMNode** node) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_FIRST_CHILD);
   if (!owner())
     return E_FAIL;
@@ -1270,7 +1276,8 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_lastChild(ISimpleDOMNode** node) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_lastChild(
+    ISimpleDOMNode** node) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_LAST_CHILD);
   if (!owner())
     return E_FAIL;
@@ -1289,7 +1296,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_previousSibling(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_previousSibling(
     ISimpleDOMNode** node) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_PREVIOUS_SIBLING);
   if (!owner())
@@ -1310,7 +1317,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_nextSibling(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_nextSibling(
     ISimpleDOMNode** node) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_NEXT_SIBLING);
   if (!owner())
@@ -1334,8 +1341,8 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_childAt(unsigned int child_index,
-                                                     ISimpleDOMNode** node) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_childAt(unsigned int child_index,
+                                                       ISimpleDOMNode** node) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_CHILD_AT);
   if (!owner())
     return E_FAIL;
@@ -1357,7 +1364,7 @@
 }
 
 // We only support this method for retrieving MathML content.
-STDMETHODIMP BrowserAccessibilityComWin::get_innerHTML(BSTR* innerHTML) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_innerHTML(BSTR* innerHTML) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_INNER_HTML);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -1372,14 +1379,14 @@
   return S_OK;
 }
 
-STDMETHODIMP
+IFACEMETHODIMP
 BrowserAccessibilityComWin::get_localInterface(void** local_interface) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_LOCAL_INTERFACE);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   return E_NOTIMPL;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_language(BSTR* language) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_language(BSTR* language) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_LANGUAGE);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!language)
@@ -1403,7 +1410,7 @@
 // ISimpleDOMText methods.
 //
 
-STDMETHODIMP BrowserAccessibilityComWin::get_domText(BSTR* dom_text) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_domText(BSTR* dom_text) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_DOM_TEXT);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!owner())
@@ -1415,7 +1422,7 @@
   return GetStringAttributeAsBstr(ax::mojom::StringAttribute::kName, dom_text);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_clippedSubstringBounds(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_clippedSubstringBounds(
     unsigned int start_index,
     unsigned int end_index,
     int* out_x,
@@ -1431,7 +1438,7 @@
                                       out_width, out_height);
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_unclippedSubstringBounds(
+IFACEMETHODIMP BrowserAccessibilityComWin::get_unclippedSubstringBounds(
     unsigned int start_index,
     unsigned int end_index,
     int* out_x,
@@ -1462,7 +1469,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::scrollToSubstring(
+IFACEMETHODIMP BrowserAccessibilityComWin::scrollToSubstring(
     unsigned int start_index,
     unsigned int end_index) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_SCROLL_TO_SUBSTRING);
@@ -1488,7 +1495,7 @@
   return S_OK;
 }
 
-STDMETHODIMP BrowserAccessibilityComWin::get_fontFamily(BSTR* font_family) {
+IFACEMETHODIMP BrowserAccessibilityComWin::get_fontFamily(BSTR* font_family) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_FONT_FAMILY);
   AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!font_family)
@@ -1512,9 +1519,9 @@
 // IServiceProvider methods.
 //
 
-STDMETHODIMP BrowserAccessibilityComWin::QueryService(REFGUID guid_service,
-                                                      REFIID riid,
-                                                      void** object) {
+IFACEMETHODIMP BrowserAccessibilityComWin::QueryService(REFGUID guid_service,
+                                                        REFIID riid,
+                                                        void** object) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_QUERY_SERVICE);
   if (!owner())
     return E_FAIL;
@@ -1556,7 +1563,7 @@
 //
 
 // static
-HRESULT WINAPI BrowserAccessibilityComWin::InternalQueryInterface(
+STDMETHODIMP BrowserAccessibilityComWin::InternalQueryInterface(
     void* this_ptr,
     const _ATL_INTMAP_ENTRY* entries,
     REFIID iid,
diff --git a/content/browser/accessibility/browser_accessibility_com_win.h b/content/browser/accessibility/browser_accessibility_com_win.h
index 4ce9c39..b6b9250 100644
--- a/content/browser/accessibility/browser_accessibility_com_win.h
+++ b/content/browser/accessibility/browser_accessibility_com_win.h
@@ -100,43 +100,45 @@
   //
   // IAccessible2 methods.
   //
-  CONTENT_EXPORT STDMETHODIMP get_attributes(BSTR* attributes) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_attributes(BSTR* attributes) override;
 
-  CONTENT_EXPORT STDMETHODIMP scrollTo(enum IA2ScrollType scroll_type) override;
+  CONTENT_EXPORT IFACEMETHODIMP
+  scrollTo(enum IA2ScrollType scroll_type) override;
 
   //
   // IAccessibleApplication methods.
   //
-  CONTENT_EXPORT STDMETHODIMP get_appName(BSTR* app_name) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_appName(BSTR* app_name) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_appVersion(BSTR* app_version) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_appVersion(BSTR* app_version) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_toolkitName(BSTR* toolkit_name) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_toolkitName(BSTR* toolkit_name) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_toolkitVersion(BSTR* toolkit_version) override;
 
   //
   // IAccessibleImage methods.
   //
-  CONTENT_EXPORT STDMETHODIMP get_description(BSTR* description) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_description(BSTR* description) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_imagePosition(enum IA2CoordinateType coordinate_type,
                     LONG* x,
                     LONG* y) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_imageSize(LONG* height, LONG* width) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_imageSize(LONG* height,
+                                              LONG* width) override;
 
   //
   // IAccessibleText methods.
   //
 
-  CONTENT_EXPORT STDMETHODIMP get_nCharacters(LONG* n_characters) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_nCharacters(LONG* n_characters) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_caretOffset(LONG* offset) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_caretOffset(LONG* offset) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_characterExtents(LONG offset,
                        enum IA2CoordinateType coord_type,
                        LONG* out_x,
@@ -144,206 +146,209 @@
                        LONG* out_width,
                        LONG* out_height) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_nSelections(LONG* n_selections) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_nSelections(LONG* n_selections) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_selection(LONG selection_index,
-                                            LONG* start_offset,
-                                            LONG* end_offset) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_selection(LONG selection_index,
+                                              LONG* start_offset,
+                                              LONG* end_offset) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_text(LONG start_offset,
-                                       LONG end_offset,
-                                       BSTR* text) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_text(LONG start_offset,
+                                         LONG end_offset,
+                                         BSTR* text) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_textAtOffset(LONG offset,
                    enum IA2TextBoundaryType boundary_type,
                    LONG* start_offset,
                    LONG* end_offset,
                    BSTR* text) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_textBeforeOffset(LONG offset,
                        enum IA2TextBoundaryType boundary_type,
                        LONG* start_offset,
                        LONG* end_offset,
                        BSTR* text) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_textAfterOffset(LONG offset,
                       enum IA2TextBoundaryType boundary_type,
                       LONG* start_offset,
                       LONG* end_offset,
                       BSTR* text) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_newText(IA2TextSegment* new_text) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_newText(IA2TextSegment* new_text) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_oldText(IA2TextSegment* old_text) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_oldText(IA2TextSegment* old_text) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_offsetAtPoint(LONG x,
                     LONG y,
                     enum IA2CoordinateType coord_type,
                     LONG* offset) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   scrollSubstringTo(LONG start_index,
                     LONG end_index,
                     enum IA2ScrollType scroll_type) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   scrollSubstringToPoint(LONG start_index,
                          LONG end_index,
                          enum IA2CoordinateType coordinate_type,
                          LONG x,
                          LONG y) override;
 
-  CONTENT_EXPORT STDMETHODIMP addSelection(LONG start_offset,
-                                           LONG end_offset) override;
+  CONTENT_EXPORT IFACEMETHODIMP addSelection(LONG start_offset,
+                                             LONG end_offset) override;
 
-  CONTENT_EXPORT STDMETHODIMP removeSelection(LONG selection_index) override;
+  CONTENT_EXPORT IFACEMETHODIMP removeSelection(LONG selection_index) override;
 
-  CONTENT_EXPORT STDMETHODIMP setCaretOffset(LONG offset) override;
+  CONTENT_EXPORT IFACEMETHODIMP setCaretOffset(LONG offset) override;
 
-  CONTENT_EXPORT STDMETHODIMP setSelection(LONG selection_index,
-                                           LONG start_offset,
-                                           LONG end_offset) override;
+  CONTENT_EXPORT IFACEMETHODIMP setSelection(LONG selection_index,
+                                             LONG start_offset,
+                                             LONG end_offset) override;
 
   // IAccessibleText methods not implemented.
-  CONTENT_EXPORT STDMETHODIMP get_attributes(LONG offset,
-                                             LONG* start_offset,
-                                             LONG* end_offset,
-                                             BSTR* text_attributes) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_attributes(LONG offset,
+                                               LONG* start_offset,
+                                               LONG* end_offset,
+                                               BSTR* text_attributes) override;
 
   //
   // IAccessibleHypertext methods.
   //
 
-  CONTENT_EXPORT STDMETHODIMP get_nHyperlinks(long* hyperlink_count) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_nHyperlinks(LONG* hyperlink_count) override;
 
-  CONTENT_EXPORT STDMETHODIMP
-  get_hyperlink(long index, IAccessibleHyperlink** hyperlink) override;
+  CONTENT_EXPORT IFACEMETHODIMP
+  get_hyperlink(LONG index, IAccessibleHyperlink** hyperlink) override;
 
-  CONTENT_EXPORT STDMETHODIMP
-  get_hyperlinkIndex(long char_index, long* hyperlink_index) override;
+  CONTENT_EXPORT IFACEMETHODIMP
+  get_hyperlinkIndex(LONG char_index, LONG* hyperlink_index) override;
 
   // IAccessibleHyperlink methods.
-  CONTENT_EXPORT STDMETHODIMP get_anchor(long index, VARIANT* anchor) override;
-  CONTENT_EXPORT STDMETHODIMP get_anchorTarget(long index,
-                                               VARIANT* anchor_target) override;
-  CONTENT_EXPORT STDMETHODIMP get_startIndex(long* index) override;
-  CONTENT_EXPORT STDMETHODIMP get_endIndex(long* index) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_anchor(LONG index,
+                                           VARIANT* anchor) override;
+  CONTENT_EXPORT IFACEMETHODIMP
+  get_anchorTarget(LONG index, VARIANT* anchor_target) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_startIndex(LONG* index) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_endIndex(LONG* index) override;
   // This method is deprecated in the IA2 Spec and so we don't implement it.
-  CONTENT_EXPORT STDMETHODIMP get_valid(boolean* valid) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_valid(boolean* valid) override;
 
   // IAccessibleAction mostly not implemented.
-  CONTENT_EXPORT STDMETHODIMP nActions(long* n_actions) override;
-  CONTENT_EXPORT STDMETHODIMP doAction(long action_index) override;
-  CONTENT_EXPORT STDMETHODIMP get_description(long action_index,
-                                              BSTR* description) override;
-  CONTENT_EXPORT STDMETHODIMP get_keyBinding(long action_index,
-                                             long n_max_bindings,
-                                             BSTR** key_bindings,
-                                             long* n_bindings) override;
-  CONTENT_EXPORT STDMETHODIMP get_name(long action_index, BSTR* name) override;
-  CONTENT_EXPORT STDMETHODIMP get_localizedName(long action_index,
-                                                BSTR* localized_name) override;
+  CONTENT_EXPORT IFACEMETHODIMP nActions(LONG* n_actions) override;
+  CONTENT_EXPORT IFACEMETHODIMP doAction(LONG action_index) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_description(LONG action_index,
+                                                BSTR* description) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_keyBinding(LONG action_index,
+                                               LONG n_max_bindings,
+                                               BSTR** key_bindings,
+                                               LONG* n_bindings) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_name(LONG action_index,
+                                         BSTR* name) override;
+  CONTENT_EXPORT IFACEMETHODIMP
+  get_localizedName(LONG action_index, BSTR* localized_name) override;
 
   //
   // IAccessibleValue methods.
   //
 
-  CONTENT_EXPORT STDMETHODIMP get_currentValue(VARIANT* value) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_currentValue(VARIANT* value) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_minimumValue(VARIANT* value) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_minimumValue(VARIANT* value) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_maximumValue(VARIANT* value) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_maximumValue(VARIANT* value) override;
 
-  CONTENT_EXPORT STDMETHODIMP setCurrentValue(VARIANT new_value) override;
+  CONTENT_EXPORT IFACEMETHODIMP setCurrentValue(VARIANT new_value) override;
 
   //
   // ISimpleDOMDocument methods.
   //
 
-  CONTENT_EXPORT STDMETHODIMP get_URL(BSTR* url) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_URL(BSTR* url) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_title(BSTR* title) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_title(BSTR* title) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_mimeType(BSTR* mime_type) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_mimeType(BSTR* mime_type) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_docType(BSTR* doc_type) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_docType(BSTR* doc_type) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_nameSpaceURIForID(short name_space_id, BSTR* name_space_uri) override;
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   put_alternateViewMediaTypes(BSTR* comma_separated_media_types) override;
 
   //
   // ISimpleDOMNode methods.
   //
 
-  CONTENT_EXPORT STDMETHODIMP get_nodeInfo(BSTR* node_name,
-                                           short* name_space_id,
-                                           BSTR* node_value,
-                                           unsigned int* num_children,
-                                           unsigned int* unique_id,
-                                           unsigned short* node_type) override;
+  CONTENT_EXPORT IFACEMETHODIMP
+  get_nodeInfo(BSTR* node_name,
+               short* name_space_id,
+               BSTR* node_value,
+               unsigned int* num_children,
+               unsigned int* unique_id,
+               unsigned short* node_type) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_attributes(unsigned short max_attribs,
                  BSTR* attrib_names,
                  short* name_space_id,
                  BSTR* attrib_values,
                  unsigned short* num_attribs) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_attributesForNames(unsigned short num_attribs,
                          BSTR* attrib_names,
                          short* name_space_id,
                          BSTR* attrib_values) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_computedStyle(unsigned short max_style_properties,
                     boolean use_alternate_view,
                     BSTR* style_properties,
                     BSTR* style_values,
                     unsigned short* num_style_properties) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_computedStyleForProperties(unsigned short num_style_properties,
                                  boolean use_alternate_view,
                                  BSTR* style_properties,
                                  BSTR* style_values) override;
 
-  CONTENT_EXPORT STDMETHODIMP scrollTo(boolean placeTopLeft) override;
+  CONTENT_EXPORT IFACEMETHODIMP scrollTo(boolean placeTopLeft) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_parentNode(ISimpleDOMNode** node) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_parentNode(ISimpleDOMNode** node) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_firstChild(ISimpleDOMNode** node) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_firstChild(ISimpleDOMNode** node) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_lastChild(ISimpleDOMNode** node) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_lastChild(ISimpleDOMNode** node) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_previousSibling(ISimpleDOMNode** node) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_nextSibling(ISimpleDOMNode** node) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_nextSibling(ISimpleDOMNode** node) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_childAt(unsigned int child_index,
-                                          ISimpleDOMNode** node) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_childAt(unsigned int child_index,
+                                            ISimpleDOMNode** node) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_innerHTML(BSTR* innerHTML) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_innerHTML(BSTR* innerHTML) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_localInterface(void** local_interface) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_language(BSTR* language) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_language(BSTR* language) override;
 
   //
   // ISimpleDOMText methods.
   //
 
-  CONTENT_EXPORT STDMETHODIMP get_domText(BSTR* dom_text) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_domText(BSTR* dom_text) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_clippedSubstringBounds(unsigned int start_index,
                              unsigned int end_index,
                              int* out_x,
@@ -351,7 +356,7 @@
                              int* out_width,
                              int* out_height) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   get_unclippedSubstringBounds(unsigned int start_index,
                                unsigned int end_index,
                                int* out_x,
@@ -359,25 +364,25 @@
                                int* out_width,
                                int* out_height) override;
 
-  CONTENT_EXPORT STDMETHODIMP
+  CONTENT_EXPORT IFACEMETHODIMP
   scrollToSubstring(unsigned int start_index, unsigned int end_index) override;
 
-  CONTENT_EXPORT STDMETHODIMP get_fontFamily(BSTR* font_family) override;
+  CONTENT_EXPORT IFACEMETHODIMP get_fontFamily(BSTR* font_family) override;
 
   //
   // IServiceProvider methods.
   //
 
-  CONTENT_EXPORT STDMETHODIMP QueryService(REFGUID guidService,
-                                           REFIID riid,
-                                           void** object) override;
+  CONTENT_EXPORT IFACEMETHODIMP QueryService(REFGUID guidService,
+                                             REFIID riid,
+                                             void** object) override;
 
   //
   // CComObjectRootEx methods.
   //
 
   // Called by BEGIN_COM_MAP() / END_COM_MAP().
-  static CONTENT_EXPORT HRESULT WINAPI
+  static CONTENT_EXPORT STDMETHODIMP
   InternalQueryInterface(void* this_ptr,
                          const _ATL_INTMAP_ENTRY* entries,
                          REFIID iid,
diff --git a/content/browser/accessibility/browser_accessibility_win_unittest.cc b/content/browser/accessibility/browser_accessibility_win_unittest.cc
index 611d695..2950d2d28 100644
--- a/content/browser/accessibility/browser_accessibility_win_unittest.cc
+++ b/content/browser/accessibility/browser_accessibility_win_unittest.cc
@@ -326,7 +326,7 @@
       ToBrowserAccessibilityWin(root_obj->PlatformGetChild(0))->GetCOM();
   ASSERT_NE(nullptr, text_field_obj);
 
-  long text_len;
+  LONG text_len;
   EXPECT_EQ(S_OK, text_field_obj->get_nCharacters(&text_len));
 
   base::win::ScopedBstr text;
@@ -338,8 +338,8 @@
   EXPECT_STREQ(L"One ", text);
   text.Reset();
 
-  long start;
-  long end;
+  LONG start;
+  LONG end;
   EXPECT_EQ(S_OK, text_field_obj->get_textAtOffset(
       1, IA2_TEXT_BOUNDARY_CHAR, &start, &end, text.Receive()));
   EXPECT_EQ(1, start);
@@ -408,7 +408,7 @@
 TEST_F(BrowserAccessibilityTest, TestSimpleHypertext) {
   const std::string text1_name = "One two three.";
   const std::string text2_name = " Four five six.";
-  const long text_name_len = text1_name.length() + text2_name.length();
+  const LONG text_name_len = text1_name.length() + text2_name.length();
 
   ui::AXNodeData text1;
   text1.id = 11;
@@ -434,7 +434,7 @@
   BrowserAccessibilityComWin* root_obj =
       ToBrowserAccessibilityWin(manager->GetRoot())->GetCOM();
 
-  long text_len;
+  LONG text_len;
   EXPECT_EQ(S_OK, root_obj->get_nCharacters(&text_len));
   EXPECT_EQ(text_name_len, text_len);
 
@@ -442,7 +442,7 @@
   EXPECT_EQ(S_OK, root_obj->get_text(0, text_name_len, text.Receive()));
   EXPECT_EQ(text1_name + text2_name, base::UTF16ToUTF8(base::string16(text)));
 
-  long hyperlink_count;
+  LONG hyperlink_count;
   EXPECT_EQ(S_OK, root_obj->get_nHyperlinks(&hyperlink_count));
   EXPECT_EQ(0, hyperlink_count);
 
@@ -455,7 +455,7 @@
   EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(text_name_len + 1,
                                                   hyperlink.GetAddressOf()));
 
-  long hyperlink_index;
+  LONG hyperlink_index;
   EXPECT_EQ(S_FALSE, root_obj->get_hyperlinkIndex(0, &hyperlink_index));
   EXPECT_EQ(-1, hyperlink_index);
   // Invalid arguments should not be modified.
@@ -486,7 +486,7 @@
   const base::string16 embed(1, BrowserAccessibilityComWin::kEmbeddedCharacter);
   const base::string16 root_hypertext =
       text1_name + embed + text2_name + embed + embed + embed;
-  const long root_hypertext_len = root_hypertext.length();
+  const LONG root_hypertext_len = root_hypertext.length();
 
   ui::AXNodeData text1;
   text1.id = 11;
@@ -547,7 +547,7 @@
   BrowserAccessibilityComWin* root_obj =
       ToBrowserAccessibilityWin(manager->GetRoot())->GetCOM();
 
-  long text_len;
+  LONG text_len;
   EXPECT_EQ(S_OK, root_obj->get_nCharacters(&text_len));
   EXPECT_EQ(root_hypertext_len, text_len);
 
@@ -556,7 +556,7 @@
   EXPECT_STREQ(root_hypertext.c_str(), text);
   text.Reset();
 
-  long hyperlink_count;
+  LONG hyperlink_count;
   EXPECT_EQ(S_OK, root_obj->get_nHyperlinks(&hyperlink_count));
   EXPECT_EQ(4, hyperlink_count);
 
@@ -607,7 +607,7 @@
   hyperlink.Reset();
   hypertext.Reset();
 
-  long hyperlink_index;
+  LONG hyperlink_index;
   EXPECT_EQ(S_FALSE, root_obj->get_hyperlinkIndex(0, &hyperlink_index));
   EXPECT_EQ(-1, hyperlink_index);
   // Invalid arguments should not be modified.
@@ -937,7 +937,7 @@
 }
 
 TEST_F(BrowserAccessibilityTest, TestWordBoundariesInTextControls) {
-  const base::string16 line1(L"This is a very long line of text that ");
+  const base::string16 line1(L"This is a very LONG line of text that ");
   const base::string16 line2(L"should wrap on more than one lines ");
   const base::string16 text(line1 + line2);
 
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc
index ef2d56f4..21171afa 100644
--- a/content/browser/compositor/gpu_process_transport_factory.cc
+++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -568,7 +568,8 @@
     external_begin_frame_source_mojo =
         std::make_unique<viz::ExternalBeginFrameSourceMojo>(
             std::move(request),
-            external_begin_frame_controller_client->GetBoundPtr());
+            external_begin_frame_controller_client->GetBoundPtr(),
+            viz::BeginFrameSource::kNotRestartableId);
     begin_frame_source = external_begin_frame_source_mojo.get();
   } else if (disable_frame_rate_limit_) {
     synthetic_begin_frame_source =
diff --git a/content/browser/dedicated_worker/dedicated_worker_host.cc b/content/browser/dedicated_worker/dedicated_worker_host.cc
index 7eccbe6..9c9271b 100644
--- a/content/browser/dedicated_worker/dedicated_worker_host.cc
+++ b/content/browser/dedicated_worker/dedicated_worker_host.cc
@@ -17,6 +17,7 @@
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "services/service_manager/public/mojom/interface_provider.mojom.h"
+#include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h"
 #include "url/origin.h"
 
 namespace content {
@@ -57,16 +58,16 @@
     registry_.AddInterface(base::BindRepeating(
         &DedicatedWorkerHost::CreateWebSocket, base::Unretained(this)));
     registry_.AddInterface(base::BindRepeating(
-        &DedicatedWorkerHost::CreateUsbDeviceManager, base::Unretained(this)));
+        &DedicatedWorkerHost::CreateWebUsbService, base::Unretained(this)));
     registry_.AddInterface(base::BindRepeating(
         &DedicatedWorkerHost::CreateDedicatedWorker, base::Unretained(this)));
   }
 
-  void CreateUsbDeviceManager(device::mojom::UsbDeviceManagerRequest request) {
+  void CreateWebUsbService(blink::mojom::WebUsbServiceRequest request) {
     auto* host =
         RenderFrameHostImpl::FromID(process_id_, ancestor_render_frame_id_);
-    GetContentClient()->browser()->CreateUsbDeviceManager(host,
-                                                          std::move(request));
+    GetContentClient()->browser()->CreateWebUsbService(host,
+                                                       std::move(request));
   }
 
   void CreateWebSocket(network::mojom::WebSocketRequest request) {
diff --git a/content/browser/frame_host/render_frame_host_delegate.h b/content/browser/frame_host/render_frame_host_delegate.h
index e7971e0..aed7c27a 100644
--- a/content/browser/frame_host/render_frame_host_delegate.h
+++ b/content/browser/frame_host/render_frame_host_delegate.h
@@ -70,6 +70,7 @@
 struct AXLocationChangeNotificationDetails;
 struct ContextMenuParams;
 struct FileChooserParams;
+struct GlobalRequestID;
 
 namespace mojom {
 class CreateNewWindowParams;
@@ -364,6 +365,7 @@
   // associated with |render_frame_host|.
   virtual void ResourceLoadComplete(
       RenderFrameHost* render_frame_host,
+      const GlobalRequestID& request_id,
       mojom::ResourceLoadInfoPtr resource_load_info) {}
 
   // Request to print a frame that is in a different process than its parent.
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 30c6c33..a710cf1 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -168,6 +168,7 @@
 #include "third_party/blink/public/common/frame/frame_policy.h"
 #include "third_party/blink/public/mojom/page/page_visibility_state.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h"
 #include "third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom.h"
 #include "ui/accessibility/ax_tree.h"
 #include "ui/accessibility/ax_tree_id_registry.h"
@@ -1722,6 +1723,12 @@
         validated_params,
     service_manager::mojom::InterfaceProviderRequest
         interface_provider_request) {
+  if (GetNavigationHandle()) {
+    main_frame_request_ids_ = {validated_params->request_id,
+                               GetNavigationHandle()->GetGlobalRequestID()};
+    if (deferred_main_frame_load_info_)
+      ResourceLoadComplete(std::move(deferred_main_frame_load_info_));
+  }
   // DidCommitProvisionalLoad IPC should be associated with the URL being
   // committed (not with the *last* committed URL that most other IPCs are
   // associated with).
@@ -3413,7 +3420,20 @@
 
 void RenderFrameHostImpl::ResourceLoadComplete(
     mojom::ResourceLoadInfoPtr resource_load_info) {
-  delegate_->ResourceLoadComplete(this, std::move(resource_load_info));
+  GlobalRequestID global_request_id;
+  if (main_frame_request_ids_.first == resource_load_info->request_id) {
+    global_request_id = main_frame_request_ids_.second;
+  } else if (resource_load_info->resource_type ==
+             content::RESOURCE_TYPE_MAIN_FRAME) {
+    // The load complete message for the main resource arrived before
+    // |DidCommitProvisionalLoad()|. We save the load info so
+    // |ResourceLoadComplete()| can be called later in
+    // |DidCommitProvisionalLoad()| when we can map to the global request ID.
+    deferred_main_frame_load_info_ = std::move(resource_load_info);
+    return;
+  }
+  delegate_->ResourceLoadComplete(this, global_request_id,
+                                  std::move(resource_load_info));
 }
 
 void RenderFrameHostImpl::RegisterMojoInterfaces() {
@@ -3470,7 +3490,7 @@
       base::Unretained(this)));
 
   registry_->AddInterface(base::BindRepeating(
-      &RenderFrameHostImpl::CreateUsbDeviceManager, base::Unretained(this)));
+      &RenderFrameHostImpl::CreateWebUsbService, base::Unretained(this)));
 
   registry_->AddInterface(base::BindRepeating(
       &RenderFrameHostImpl::CreateUsbChooserService, base::Unretained(this)));
@@ -4925,10 +4945,9 @@
   web_bluetooth_services_.erase(it);
 }
 
-void RenderFrameHostImpl::CreateUsbDeviceManager(
-    device::mojom::UsbDeviceManagerRequest request) {
-  GetContentClient()->browser()->CreateUsbDeviceManager(this,
-                                                        std::move(request));
+void RenderFrameHostImpl::CreateWebUsbService(
+    blink::mojom::WebUsbServiceRequest request) {
+  GetContentClient()->browser()->CreateWebUsbService(this, std::move(request));
 }
 
 void RenderFrameHostImpl::CreateUsbChooserService(
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index d087251..e4231a5 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -108,6 +108,10 @@
 struct FramePolicy;
 struct WebFullscreenOptions;
 struct WebScrollIntoViewParams;
+
+namespace mojom {
+class WebUsbService;
+}
 }
 
 namespace gfx {
@@ -1087,7 +1091,8 @@
       WebBluetoothServiceImpl* web_bluetooth_service);
 
   // Creates connections to WebUSB interfaces bound to this frame.
-  void CreateUsbDeviceManager(device::mojom::UsbDeviceManagerRequest request);
+  void CreateWebUsbService(
+      mojo::InterfaceRequest<blink::mojom::WebUsbService> request);
   void CreateUsbChooserService(device::mojom::UsbChooserServiceRequest request);
 
   void CreateAudioInputStreamFactory(
@@ -1677,6 +1682,18 @@
   network::mojom::URLLoaderFactoryPtr
       network_service_connection_error_handler_holder_;
 
+  // Holds the renderer generated ID and global request ID for the main frame
+  // request.
+  std::pair<int, GlobalRequestID> main_frame_request_ids_;
+
+  // If |ResourceLoadComplete()| is called for the main resource before
+  // |DidCommitProvisionalLoad()|, the load info is saved here to call
+  // |ResourceLoadComplete()| when |DidCommitProvisionalLoad()| is called. This
+  // is necessary so the renderer ID can be mapped to the global ID in
+  // |DidCommitProvisionalLoad()|. This situation should only happen when an
+  // empty document is loaded.
+  mojom::ResourceLoadInfoPtr deferred_main_frame_load_info_;
+
   // NOTE: This must be the last member.
   base::WeakPtrFactory<RenderFrameHostImpl> weak_ptr_factory_;
 
diff --git a/content/browser/gpu/browser_gpu_client_delegate.cc b/content/browser/gpu/browser_gpu_client_delegate.cc
index 4c34ad9..841d81a 100644
--- a/content/browser/gpu/browser_gpu_client_delegate.cc
+++ b/content/browser/gpu/browser_gpu_client_delegate.cc
@@ -4,11 +4,42 @@
 
 #include "content/browser/gpu/browser_gpu_client_delegate.h"
 
+#include "content/browser/gpu/gpu_process_host.h"
 #include "gpu/config/gpu_feature_info.h"
 #include "gpu/config/gpu_info.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 
 namespace content {
+namespace {
+
+void OnEstablishGpuChannel(
+    GpuClientDelegate::EstablishGpuChannelCallback callback,
+    mojo::ScopedMessagePipeHandle channel_handle,
+    const gpu::GPUInfo& gpu_info,
+    const gpu::GpuFeatureInfo& gpu_feature_info,
+    GpuProcessHost::EstablishChannelStatus status) {
+  if (!callback)
+    return;
+
+  GpuClientDelegate::EstablishGpuChannelStatus delegate_status;
+  switch (status) {
+    case GpuProcessHost::EstablishChannelStatus::GPU_ACCESS_DENIED:
+      delegate_status =
+          GpuClientDelegate::EstablishGpuChannelStatus::kGpuAccessDenied;
+      break;
+    case GpuProcessHost::EstablishChannelStatus::GPU_HOST_INVALID:
+      delegate_status =
+          GpuClientDelegate::EstablishGpuChannelStatus::kGpuHostInvalid;
+      break;
+    case GpuProcessHost::EstablishChannelStatus::SUCCESS:
+      delegate_status = GpuClientDelegate::EstablishGpuChannelStatus::kSuccess;
+      break;
+  }
+  std::move(callback).Run(std::move(channel_handle), gpu_info, gpu_feature_info,
+                          delegate_status);
+}
+
+}  // namespace
 
 BrowserGpuClientDelegate::BrowserGpuClientDelegate() = default;
 
@@ -35,35 +66,7 @@
   const bool is_gpu_host = false;
   host->EstablishGpuChannel(
       client_id, client_tracing_id, is_gpu_host,
-      base::BindOnce(&BrowserGpuClientDelegate::OnEstablishGpuChannel,
-                     base::Unretained(this), std::move(callback)));
-}
-
-void BrowserGpuClientDelegate::OnEstablishGpuChannel(
-    GpuClientDelegate::EstablishGpuChannelCallback callback,
-    mojo::ScopedMessagePipeHandle channel_handle,
-    const gpu::GPUInfo& gpu_info,
-    const gpu::GpuFeatureInfo& gpu_feature_info,
-    GpuProcessHost::EstablishChannelStatus status) {
-  if (!callback)
-    return;
-
-  GpuClientDelegate::EstablishGpuChannelStatus delegate_status;
-  switch (status) {
-    case GpuProcessHost::EstablishChannelStatus::GPU_ACCESS_DENIED:
-      delegate_status =
-          GpuClientDelegate::EstablishGpuChannelStatus::kGpuAccessDenied;
-      break;
-    case GpuProcessHost::EstablishChannelStatus::GPU_HOST_INVALID:
-      delegate_status =
-          GpuClientDelegate::EstablishGpuChannelStatus::kGpuHostInvalid;
-      break;
-    case GpuProcessHost::EstablishChannelStatus::SUCCESS:
-      delegate_status = GpuClientDelegate::EstablishGpuChannelStatus::kSuccess;
-      break;
-  }
-  std::move(callback).Run(std::move(channel_handle), gpu_info, gpu_feature_info,
-                          delegate_status);
+      base::BindOnce(&OnEstablishGpuChannel, std::move(callback)));
 }
 
 }  // namespace content
diff --git a/content/browser/gpu/browser_gpu_client_delegate.h b/content/browser/gpu/browser_gpu_client_delegate.h
index 4b3f8557..9917e9d2a2 100644
--- a/content/browser/gpu/browser_gpu_client_delegate.h
+++ b/content/browser/gpu/browser_gpu_client_delegate.h
@@ -6,7 +6,6 @@
 #define CONTENT_BROWSER_GPU_BROWSER_GPU_CLIENT_DELEGATE_H_
 
 #include "content/browser/gpu/gpu_client_delegate.h"
-#include "content/browser/gpu/gpu_process_host.h"
 
 namespace content {
 
@@ -22,13 +21,6 @@
                            EstablishGpuChannelCallback callback) override;
 
  private:
-  void OnEstablishGpuChannel(
-      GpuClientDelegate::EstablishGpuChannelCallback callback,
-      mojo::ScopedMessagePipeHandle channel_handle,
-      const gpu::GPUInfo& gpu_info,
-      const gpu::GpuFeatureInfo& gpu_feature_info,
-      GpuProcessHost::EstablishChannelStatus status);
-
   DISALLOW_COPY_AND_ASSIGN(BrowserGpuClientDelegate);
 };
 
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index c0948b6..e51aedd 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -376,9 +376,13 @@
   }
 
   static uint32_t GetURLLoaderOptions(bool is_main_frame) {
-    uint32_t options = network::mojom::kURLLoadOptionSendSSLInfoWithResponse;
-    if (is_main_frame)
+    uint32_t options = network::mojom::kURLLoadOptionNone;
+    if (is_main_frame) {
+      // SSLInfo is not needed on subframe responses because users can inspect
+      // only the certificate for the main frame when using the info bubble.
+      options |= network::mojom::kURLLoadOptionSendSSLInfoWithResponse;
       options |= network::mojom::kURLLoadOptionSendSSLInfoForCertificateError;
+    }
 
     if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
       options |= network::mojom::kURLLoadOptionSniffMimeType;
diff --git a/content/browser/loader/resource_requester_info.cc b/content/browser/loader/resource_requester_info.cc
index 862ff7f..f692a6fa9 100644
--- a/content/browser/loader/resource_requester_info.cc
+++ b/content/browser/loader/resource_requester_info.cc
@@ -4,6 +4,8 @@
 
 #include "content/browser/loader/resource_requester_info.h"
 
+#include <utility>
+
 #include "base/feature_list.h"
 #include "base/logging.h"
 #include "content/browser/appcache/chrome_appcache_service.h"
@@ -105,23 +107,16 @@
 scoped_refptr<ResourceRequesterInfo>
 ResourceRequesterInfo::CreateForNavigationPreload(
     ResourceRequesterInfo* original_request_info) {
-  GetContextsCallback get_contexts_callback =
-      original_request_info->get_contexts_callback_;
-  if (IsBrowserSideNavigationEnabled()) {
-    DCHECK(original_request_info->IsBrowserSideNavigation());
-    DCHECK(!get_contexts_callback);
-    DCHECK(original_request_info->service_worker_context());
-    // The requester info for browser side navigation doesn't have the
-    // get_contexts_callback. So create the callback here which gets the
-    // ResourceContext and the URLRequestContext form ServiceWorkerContext.
-    get_contexts_callback =
-        base::Bind(&GetContextsCallbackForNavigationPreload,
-                   scoped_refptr<ServiceWorkerContextWrapper>(
-                       original_request_info->service_worker_context()));
-  } else {
-    DCHECK(original_request_info->IsRenderer());
-    DCHECK(get_contexts_callback);
-  }
+  DCHECK(original_request_info->IsBrowserSideNavigation());
+  DCHECK(original_request_info->service_worker_context());
+  DCHECK(!original_request_info->get_contexts_callback_);
+  // The requester info for browser side navigation doesn't have the
+  // get_contexts_callback. So create the callback here which gets the
+  // ResourceContext and the URLRequestContext from ServiceWorkerContext.
+  auto get_contexts_callback =
+      base::BindRepeating(&GetContextsCallbackForNavigationPreload,
+                          scoped_refptr<ServiceWorkerContextWrapper>(
+                              original_request_info->service_worker_context()));
 
   return scoped_refptr<ResourceRequesterInfo>(new ResourceRequesterInfo(
       RequesterType::NAVIGATION_PRELOAD, ChildProcessHost::kInvalidUniqueID,
diff --git a/content/browser/media/media_web_contents_observer.cc b/content/browser/media/media_web_contents_observer.cc
index 8c76962d..1d76fda 100644
--- a/content/browser/media/media_web_contents_observer.cc
+++ b/content/browser/media/media_web_contents_observer.cc
@@ -147,6 +147,9 @@
     IPC_MESSAGE_HANDLER(MediaPlayerDelegateHostMsg_OnPictureInPictureModeEnded,
                         OnPictureInPictureModeEnded)
     IPC_MESSAGE_HANDLER(
+        MediaPlayerDelegateHostMsg_OnSetPictureInPictureCustomControls,
+        OnSetPictureInPictureCustomControls)
+    IPC_MESSAGE_HANDLER(
         MediaPlayerDelegateHostMsg_OnPictureInPictureSurfaceChanged,
         OnPictureInPictureSurfaceChanged)
     IPC_MESSAGE_UNHANDLED(handled = false)
@@ -353,6 +356,17 @@
           render_frame_host->GetRoutingID(), delegate_id, request_id));
 }
 
+void MediaWebContentsObserver::OnSetPictureInPictureCustomControls(
+    RenderFrameHost* render_frame_host,
+    int delegate_id,
+    const std::vector<blink::PictureInPictureControlInfo>& controls) {
+  PictureInPictureWindowControllerImpl* pip_controller =
+      PictureInPictureWindowControllerImpl::FromWebContents(
+          web_contents_impl());
+  if (pip_controller)
+    pip_controller->SetPictureInPictureCustomControls(controls);
+}
+
 void MediaWebContentsObserver::OnPictureInPictureSurfaceChanged(
     RenderFrameHost* render_frame_host,
     int delegate_id,
diff --git a/content/browser/media/media_web_contents_observer.h b/content/browser/media/media_web_contents_observer.h
index d927824..5b5c314 100644
--- a/content/browser/media/media_web_contents_observer.h
+++ b/content/browser/media/media_web_contents_observer.h
@@ -23,6 +23,7 @@
 
 namespace blink {
 enum class WebFullscreenVideoStatus;
+struct PictureInPictureControlInfo;
 }  // namespace blink
 
 namespace media {
@@ -135,6 +136,10 @@
   void OnPictureInPictureModeEnded(RenderFrameHost* render_frame_host,
                                    int delegate_id,
                                    int request_id);
+  void OnSetPictureInPictureCustomControls(
+      RenderFrameHost* render_frame_host,
+      int delegate_id,
+      const std::vector<blink::PictureInPictureControlInfo>& controls);
   void OnPictureInPictureSurfaceChanged(RenderFrameHost*,
                                         int delegate_id,
                                         const viz::SurfaceId&,
diff --git a/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc b/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc
index 7f18562..2f6eba5 100644
--- a/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc
+++ b/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc
@@ -80,6 +80,12 @@
           media_player_id_->delegate_id, control_id));
 }
 
+void PictureInPictureWindowControllerImpl::SetPictureInPictureCustomControls(
+    const std::vector<blink::PictureInPictureControlInfo>& controls) {
+  DCHECK(window_);
+  window_->SetPictureInPictureCustomControls(controls);
+}
+
 void PictureInPictureWindowControllerImpl::Close(bool should_pause_video) {
   if (!window_ || !window_->IsVisible())
     return;
diff --git a/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.h b/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.h
index 7ce6d85..4850577 100644
--- a/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.h
+++ b/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.h
@@ -39,6 +39,8 @@
   CONTENT_EXPORT void OnWindowDestroyed() override;
   CONTENT_EXPORT void ClickCustomControl(
       const std::string& control_id) override;
+  CONTENT_EXPORT void SetPictureInPictureCustomControls(
+      const std::vector<blink::PictureInPictureControlInfo>& controls) override;
   CONTENT_EXPORT void EmbedSurface(const viz::SurfaceId& surface_id,
                                    const gfx::Size& natural_size) override;
   CONTENT_EXPORT OverlayWindow* GetWindowForTesting() override;
diff --git a/content/browser/process_internals/process_internals.mojom b/content/browser/process_internals/process_internals.mojom
index da65f0ff..d8fe859 100644
--- a/content/browser/process_internals/process_internals.mojom
+++ b/content/browser/process_internals/process_internals.mojom
@@ -11,7 +11,6 @@
   // Returns a string containing the currently active isolation modes.
   GetIsolationMode() => (string mode);
 
-  // Returns a list of isolated origins in their serialized to string
-  // format. This avoids duplicating serialization code to JavaScript.
-  GetIsolatedOrigins() => (array<string> isolated_origins);
+  // Returns the number of isolated origins.
+  GetIsolatedOriginsSize() => (uint32 size);
 };
diff --git a/content/browser/process_internals/process_internals_handler_impl.cc b/content/browser/process_internals/process_internals_handler_impl.cc
index ae4fc6d..dbd0e579 100644
--- a/content/browser/process_internals/process_internals_handler_impl.cc
+++ b/content/browser/process_internals/process_internals_handler_impl.cc
@@ -30,15 +30,10 @@
                                         : base::JoinString(modes, ", "));
 }
 
-void ProcessInternalsHandlerImpl::GetIsolatedOrigins(
-    GetIsolatedOriginsCallback callback) {
-  std::vector<url::Origin> origins_list =
-      SiteIsolationPolicy::GetIsolatedOrigins();
-  std::vector<std::string> origins;
-  for (size_t i = 0; i < origins_list.size(); ++i)
-    origins.push_back(origins_list[i].Serialize());
-
-  std::move(callback).Run(origins);
+void ProcessInternalsHandlerImpl::GetIsolatedOriginsSize(
+    GetIsolatedOriginsSizeCallback callback) {
+  int size = SiteIsolationPolicy::GetIsolatedOrigins().size();
+  std::move(callback).Run(size);
 }
 
 }  // namespace content
diff --git a/content/browser/process_internals/process_internals_handler_impl.h b/content/browser/process_internals/process_internals_handler_impl.h
index 3a8ee50..54b7def 100644
--- a/content/browser/process_internals/process_internals_handler_impl.h
+++ b/content/browser/process_internals/process_internals_handler_impl.h
@@ -22,7 +22,7 @@
 
   // mojom::ProcessInternalsHandler overrides:
   void GetIsolationMode(GetIsolationModeCallback callback) override;
-  void GetIsolatedOrigins(GetIsolatedOriginsCallback callback) override;
+  void GetIsolatedOriginsSize(GetIsolatedOriginsSizeCallback callback) override;
 
  private:
   mojo::Binding<::mojom::ProcessInternalsHandler> binding_;
diff --git a/content/browser/renderer_host/media/media_devices_manager.cc b/content/browser/renderer_host/media/media_devices_manager.cc
index ae5dbac..307115c 100644
--- a/content/browser/renderer_host/media/media_devices_manager.cc
+++ b/content/browser/renderer_host/media/media_devices_manager.cc
@@ -829,7 +829,10 @@
   if (old_snapshot.size() != new_snapshot.size() ||
       !std::equal(new_snapshot.begin(), new_snapshot.end(),
                   old_snapshot.begin(),
-                  ignore_group_id ? operator== : EqualDeviceAndGroupID)) {
+                  ignore_group_id
+                      ? [](const MediaDeviceInfo& lhs,
+                           const MediaDeviceInfo& rhs) { return lhs == rhs; }
+                      : EqualDeviceAndGroupID)) {
     // Prevent sending notifications until group IDs are updated using
     // a heuristic in ProcessRequests().
     // TODO(crbug.com/627793): Remove |is_video_with_group_ids| and the
diff --git a/content/browser/resources/process/process_internals.html b/content/browser/resources/process/process_internals.html
index 9e5acb2..9b63631e 100644
--- a/content/browser/resources/process/process_internals.html
+++ b/content/browser/resources/process/process_internals.html
@@ -12,5 +12,5 @@
   <title>Process Model Internals</title>
 </head>
 <div id="site-isolation-mode">Site Isolation mode: <span id='isolation-mode'>unknown</span></div>
-<div id="isolated-origins-container">Isolated origins: <span id='isolated-origins'></span></div>
+<div id="isolated-origins-container">Number of isolated origins: <span id='isolated-origins'></span></div>
 </html>
diff --git a/content/browser/resources/process/process_internals.js b/content/browser/resources/process/process_internals.js
index a745e29..1558474 100644
--- a/content/browser/resources/process/process_internals.js
+++ b/content/browser/resources/process/process_internals.js
@@ -24,9 +24,8 @@
   uiHandler.getIsolationMode().then((response) => {
     document.getElementById('isolation-mode').innerText = response.mode;
   });
-  uiHandler.getIsolatedOrigins().then((response) => {
-    document.getElementById('isolated-origins').innerText =
-        response.isolatedOrigins.join(', ');
+  uiHandler.getIsolatedOriginsSize().then((response) => {
+    document.getElementById('isolated-origins').innerText = response.size;
   });
 });
 
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
index ab15474..9e73a9d 100644
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -611,16 +611,7 @@
   ResourceRequestInfoImpl* original_info =
       ResourceRequestInfoImpl::ForRequest(original_request);
   ResourceRequesterInfo* requester_info = original_info->requester_info();
-  if (IsBrowserSideNavigationEnabled()) {
-    DCHECK(requester_info->IsBrowserSideNavigation());
-  } else {
-    DCHECK(requester_info->IsRenderer());
-    if (!requester_info->filter())
-      return false;
-  }
-
-  DCHECK(!url_loader_assets_);
-
+  DCHECK(requester_info->IsBrowserSideNavigation());
   auto url_loader_factory = std::make_unique<URLLoaderFactoryImpl>(
       ResourceRequesterInfo::CreateForNavigationPreload(requester_info));
 
@@ -681,6 +672,7 @@
 
   preload_handle_->url_loader = url_loader.PassInterface();
 
+  DCHECK(!url_loader_assets_);
   url_loader_assets_ = base::MakeRefCounted<URLLoaderAssets>(
       std::move(url_loader_factory), std::move(url_loader_client));
   return true;
@@ -707,13 +699,11 @@
   resource_request.resource_type = RESOURCE_TYPE_SUB_RESOURCE;
   resource_request.skip_service_worker = true;
   resource_request.do_not_prompt_for_login = true;
+
   DCHECK(net::HttpUtil::IsValidHeaderValue(
       version_->navigation_preload_state().header));
-  // TODO(crbug/762357): Record header size UMA, but not until *all* the
-  // navigation preload metrics are recorded on the S13N path; otherwise the
-  // metrics will get unbalanced.
-  // ServiceWorkerMetrics::RecordNavigationPreloadRequestHeaderSize(
-  //     version_->navigation_preload_state().header.length());
+  ServiceWorkerMetrics::RecordNavigationPreloadRequestHeaderSize(
+      version_->navigation_preload_state().header.length());
   resource_request.headers.SetHeader(
       "Service-Worker-Navigation-Preload",
       version_->navigation_preload_state().header);
diff --git a/content/browser/tracing/tracing_controller_browsertest.cc b/content/browser/tracing/tracing_controller_browsertest.cc
index 2649d7e..94c32a4 100644
--- a/content/browser/tracing/tracing_controller_browsertest.cc
+++ b/content/browser/tracing/tracing_controller_browsertest.cc
@@ -487,7 +487,9 @@
 }
 
 // TODO(crbug.com/871770): Disabled for failing on ASAN.
-#if defined(ADDRESS_SANITIZER)
+// TODO(crbug.com/872631): Disabled on Android as flaky.
+// TODO(crbug.com/873073): Disabled on Linux as flaky.
+#if defined(ADDRESS_SANITIZER) || defined(OS_ANDROID) || defined(OS_LINUX)
 #define MAYBE_EnableAndStopTracingWithEmptyFile \
   DISABLED_EnableAndStopTracingWithEmptyFile
 #else
@@ -515,7 +517,9 @@
 }
 
 // TODO(crbug.com/871770): Disabled for failing on ASAN.
-#if defined(ADDRESS_SANITIZER)
+// TODO(crbug.com/872631): Disabled on Android as flaky.
+// TODO(crbug.com/873073): Disabled on Linux as flaky.
+#if defined(ADDRESS_SANITIZER) || defined(OS_ANDROID) || defined(OS_LINUX)
 #define MAYBE_DoubleStopTracing DISABLED_DoubleStopTracing
 #else
 #define MAYBE_DoubleStopTracing DoubleStopTracing
diff --git a/content/browser/url_loader_factory_getter.cc b/content/browser/url_loader_factory_getter.cc
index d34adb3..abcd580 100644
--- a/content/browser/url_loader_factory_getter.cc
+++ b/content/browser/url_loader_factory_getter.cc
@@ -111,17 +111,17 @@
 
 // -----------------------------------------------------------------------------
 
-URLLoaderFactoryGetter::URLLoaderFactoryGetter() : weak_factory_(this) {}
+URLLoaderFactoryGetter::URLLoaderFactoryGetter() = default;
 
 void URLLoaderFactoryGetter::Initialize(StoragePartitionImpl* partition) {
   DCHECK(partition);
   partition_ = partition;
-  Reinitialize();
-}
 
-void URLLoaderFactoryGetter::Reinitialize() {
-  if (!partition_)
-    return;
+  // Create a URLLoaderFactoryPtr synchronously and push it to the IO thread. If
+  // the pipe errors out later due to a network service crash, the pipe is
+  // created on the IO thread, and the request send back to the UI thread.
+  // TODO(mmenke):  Is one less thread hop on startup worth the extra complexity
+  // of two different pipe creation paths?
   DCHECK(!pending_network_factory_request_.is_pending());
   network::mojom::URLLoaderFactoryPtr network_factory;
   pending_network_factory_request_ = MakeRequest(&network_factory);
@@ -133,8 +133,7 @@
 
   BrowserThread::PostTask(
       BrowserThread::IO, FROM_HERE,
-      base::BindOnce(&URLLoaderFactoryGetter::InitializeOnIOThread,
-                     weak_factory_.GetWeakPtr(),
+      base::BindOnce(&URLLoaderFactoryGetter::InitializeOnIOThread, this,
                      network_factory.PassInterface()));
 }
 
@@ -166,24 +165,29 @@
 network::mojom::URLLoaderFactory*
 URLLoaderFactoryGetter::GetURLLoaderFactory() {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+  // This needs to be done before returning |test_factory_|, as the
+  // |test_factory_| may fall back to |network_factory_|. The |is_bound()| check
+  // is only needed by unit tests.
+  if (network_factory_.encountered_error() || !network_factory_.is_bound()) {
+    network::mojom::URLLoaderFactoryPtr network_factory;
+    BrowserThread::PostTask(
+        BrowserThread::UI, FROM_HERE,
+        base::BindOnce(
+            &URLLoaderFactoryGetter::HandleNetworkFactoryRequestOnUIThread,
+            this, mojo::MakeRequest(&network_factory)));
+    ReinitializeOnIOThread(std::move(network_factory));
+  }
+
   if (g_get_network_factory_callback.Get() && !test_factory_)
     g_get_network_factory_callback.Get().Run(this);
 
   if (test_factory_)
     return test_factory_;
 
-  if (!network_factory_.is_bound())
-    HandleURLLoaderFactoryConnectionError();
   return network_factory_.get();
 }
 
-void URLLoaderFactoryGetter::HandleURLLoaderFactoryConnectionError() {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  BrowserThread::PostTask(
-      BrowserThread::UI, FROM_HERE,
-      base::BindOnce(&URLLoaderFactoryGetter::Reinitialize, this));
-}
-
 void URLLoaderFactoryGetter::CloneNetworkFactory(
     network::mojom::URLLoaderFactoryRequest network_factory_request) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -227,10 +231,22 @@
 
 void URLLoaderFactoryGetter::InitializeOnIOThread(
     network::mojom::URLLoaderFactoryPtrInfo network_factory) {
-  network_factory_.Bind(std::move(network_factory));
-  network_factory_.set_connection_error_handler(base::BindOnce(
-      &URLLoaderFactoryGetter::HandleURLLoaderFactoryConnectionError,
-      weak_factory_.GetWeakPtr()));
+  ReinitializeOnIOThread(
+      network::mojom::URLLoaderFactoryPtr(std::move(network_factory)));
+}
+
+void URLLoaderFactoryGetter::ReinitializeOnIOThread(
+    network::mojom::URLLoaderFactoryPtr network_factory) {
+  DCHECK(network_factory.is_bound());
+  network_factory_ = std::move(network_factory);
+  // Set a connection error handle so that connection errors on the pipes are
+  // noticed, but the class doesn't actually do anything when the error is
+  // observed - instead, a new pipe is created in GetURLLoaderFactory() as
+  // needed. This is to avoid incrementing the reference count of |this| in the
+  // callback, as that could result in increasing the reference count from 0 to
+  // 1 while there's a pending task to delete |this|. See
+  // https://crbug.com/870942 for more details.
+  network_factory_.set_connection_error_handler(base::DoNothing());
 }
 
 void URLLoaderFactoryGetter::HandleNetworkFactoryRequestOnUIThread(
diff --git a/content/browser/url_loader_factory_getter.h b/content/browser/url_loader_factory_getter.h
index af8d381..dc998f3 100644
--- a/content/browser/url_loader_factory_getter.h
+++ b/content/browser/url_loader_factory_getter.h
@@ -99,6 +99,10 @@
   void InitializeOnIOThread(
       network::mojom::URLLoaderFactoryPtrInfo network_factory);
 
+  // Moves |network_factory| to |network_factory_| and sets up an error handler.
+  void ReinitializeOnIOThread(
+      network::mojom::URLLoaderFactoryPtr network_factory);
+
   // Send |network_factory_request| to cached |StoragePartitionImpl|.
   void HandleNetworkFactoryRequestOnUIThread(
       network::mojom::URLLoaderFactoryRequest network_factory_request);
@@ -107,12 +111,6 @@
   // The pointer shouldn't be cached.
   network::mojom::URLLoaderFactory* GetURLLoaderFactory();
 
-  // Called when there is a connection error on |network_factory_|.
-  void HandleURLLoaderFactoryConnectionError();
-
-  // Called either during initialization or when an error occurs.
-  void Reinitialize();
-
   // Call |network_factory_.FlushForTesting()|. For test use only. When the
   // flush is complete, |callback| will be called.
   void FlushNetworkInterfaceForTesting(base::OnceClosure callback);
@@ -129,8 +127,6 @@
   // when it's going away.
   StoragePartitionImpl* partition_ = nullptr;
 
-  base::WeakPtrFactory<URLLoaderFactoryGetter> weak_factory_;
-
   DISALLOW_COPY_AND_ASSIGN(URLLoaderFactoryGetter);
 };
 
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 580a894..495000c 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -4088,9 +4088,13 @@
   if (navigation_handle->IsSameDocument())
     return;
 
-  controller_.ssl_manager()->DidStartResourceResponse(
-      navigation_handle->GetURL(),
-      net::IsCertStatusError(navigation_handle->GetSSLInfo().cert_status));
+  // SSLInfo is not needed on subframe navigations since the main-frame
+  // certificate is the only one that can be inspected (using the info
+  // bubble) without refreshing the page with DevTools open.
+  if (navigation_handle->IsInMainFrame())
+    controller_.ssl_manager()->DidStartResourceResponse(
+        navigation_handle->GetURL(),
+        net::IsCertStatusError(navigation_handle->GetSSLInfo().cert_status));
 
   SetNotWaitingForResponse();
 }
@@ -4422,9 +4426,11 @@
 
 void WebContentsImpl::ResourceLoadComplete(
     RenderFrameHost* render_frame_host,
+    const GlobalRequestID& request_id,
     mojom::ResourceLoadInfoPtr resource_load_info) {
   for (auto& observer : observers_) {
-    observer.ResourceLoadComplete(render_frame_host, *resource_load_info);
+    observer.ResourceLoadComplete(render_frame_host, request_id,
+                                  *resource_load_info);
   }
 }
 
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index ebf4bab..b921c8d0 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -582,6 +582,7 @@
                                   net::CertStatus cert_status) override;
   void ResourceLoadComplete(
       RenderFrameHost* render_frame_host,
+      const GlobalRequestID& request_id,
       mojom::ResourceLoadInfoPtr resource_load_information) override;
   // RenderViewHostDelegate ----------------------------------------------------
   RenderViewHostDelegateView* GetDelegateView() override;
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc
index 6d3dfae2..345f6ff 100644
--- a/content/browser/web_contents/web_contents_impl_browsertest.cc
+++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -744,6 +744,7 @@
   // WebContentsObserver implementation:
   void ResourceLoadComplete(
       content::RenderFrameHost* render_frame_host,
+      const GlobalRequestID& request_id,
       const mojom::ResourceLoadInfo& resource_load_info) override {
     EXPECT_NE(nullptr, render_frame_host);
     resource_load_infos_.push_back(resource_load_info.Clone());
diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc
index c403c39..aa74c714 100644
--- a/content/browser/web_contents/web_contents_impl_unittest.cc
+++ b/content/browser/web_contents/web_contents_impl_unittest.cc
@@ -3415,6 +3415,9 @@
   void Close() override {}
   void Show() override {}
   void Hide() override {}
+  void SetPictureInPictureCustomControls(
+      const std::vector<blink::PictureInPictureControlInfo>& controls)
+      override {}
   bool IsVisible() const override { return false; }
   bool IsAlwaysOnTop() const override { return false; }
   ui::Layer* GetLayer() override { return nullptr; }
diff --git a/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc b/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc
index 9e5ea44..5265a64 100644
--- a/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc
+++ b/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc
@@ -49,7 +49,7 @@
   }
 
   void WillProcessResponse(const GURL& response_url_,
-                           const network::ResourceResponseHead& response_head,
+                           network::ResourceResponseHead* response_head,
                            bool* defer) override {
     will_process_response_called_ = true;
     *defer = true;
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 4d0712eca..c38e5fdd 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -443,6 +443,9 @@
   // identify and discard compositor frames that correspond to now-unloaded
   // web content.
   IPC_STRUCT_MEMBER(uint32_t, content_source_id)
+
+  // Request ID generated by the renderer.
+  IPC_STRUCT_MEMBER(int, request_id)
 IPC_STRUCT_END()
 
 IPC_STRUCT_BEGIN(FrameMsg_PostMessage_Params)
diff --git a/content/common/media/media_player_delegate_messages.h b/content/common/media/media_player_delegate_messages.h
index 0b82193e..e352c27 100644
--- a/content/common/media/media_player_delegate_messages.h
+++ b/content/common/media/media_player_delegate_messages.h
@@ -17,6 +17,7 @@
 #include "content/common/content_export.h"
 #include "ipc/ipc_message_macros.h"
 #include "media/base/media_content_type.h"
+#include "third_party/blink/public/common/picture_in_picture/picture_in_picture_control_info.h"
 #include "third_party/blink/public/platform/web_fullscreen_video_status.h"
 #include "ui/gfx/ipc/geometry/gfx_param_traits.h"
 
@@ -24,6 +25,18 @@
 #define IPC_MESSAGE_EXPORT CONTENT_EXPORT
 #define IPC_MESSAGE_START MediaPlayerDelegateMsgStart
 
+IPC_STRUCT_TRAITS_BEGIN(blink::PictureInPictureControlInfo::Icon)
+  IPC_STRUCT_TRAITS_MEMBER(src)
+  IPC_STRUCT_TRAITS_MEMBER(sizes)
+  IPC_STRUCT_TRAITS_MEMBER(type)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(blink::PictureInPictureControlInfo)
+  IPC_STRUCT_TRAITS_MEMBER(id)
+  IPC_STRUCT_TRAITS_MEMBER(label)
+  IPC_STRUCT_TRAITS_MEMBER(icons)
+IPC_STRUCT_TRAITS_END()
+
 IPC_ENUM_TRAITS_MAX_VALUE(media::MediaContentType, media::MediaContentType::Max)
 IPC_ENUM_TRAITS_MAX_VALUE(blink::WebFullscreenVideoStatus,
                           blink::WebFullscreenVideoStatus::kMax)
@@ -126,4 +139,9 @@
                     viz::SurfaceId /* surface_id */,
                     gfx::Size /* natural_size */)
 
+IPC_MESSAGE_ROUTED2(
+    MediaPlayerDelegateHostMsg_OnSetPictureInPictureCustomControls,
+    int /* delegate id */,
+    std::vector<blink::PictureInPictureControlInfo> /* custom controls */)
+
 #endif  // CONTENT_COMMON_MEDIA_MEDIA_PLAYER_DELEGATE_MESSAGES_H_
diff --git a/content/common/mime_sniffing_throttle.cc b/content/common/mime_sniffing_throttle.cc
index dfeabde..11f3f40 100644
--- a/content/common/mime_sniffing_throttle.cc
+++ b/content/common/mime_sniffing_throttle.cc
@@ -15,23 +15,23 @@
 
 void MimeSniffingThrottle::WillProcessResponse(
     const GURL& response_url,
-    const network::ResourceResponseHead& response_head,
+    network::ResourceResponseHead* response_head,
     bool* defer) {
   // No need to do mime sniffing again.
-  if (response_head.did_mime_sniff)
+  if (response_head->did_mime_sniff)
     return;
 
   bool blocked_sniffing_mime = false;
   std::string content_type_options;
-  if (response_head.headers &&
-      response_head.headers->GetNormalizedHeader("x-content-type-options",
-                                                 &content_type_options)) {
+  if (response_head->headers &&
+      response_head->headers->GetNormalizedHeader("x-content-type-options",
+                                                  &content_type_options)) {
     blocked_sniffing_mime =
         base::LowerCaseEqualsASCII(content_type_options, "nosniff");
   }
 
   if (!blocked_sniffing_mime &&
-      net::ShouldSniffMimeType(response_url, response_head.mime_type)) {
+      net::ShouldSniffMimeType(response_url, response_head->mime_type)) {
     // Pause the response until the mime type becomes ready.
     *defer = true;
 
@@ -42,7 +42,7 @@
     MimeSniffingURLLoader* mime_sniffing_loader;
     std::tie(new_loader, new_loader_request, mime_sniffing_loader) =
         MimeSniffingURLLoader::CreateLoader(weak_factory_.GetWeakPtr(),
-                                            response_url, response_head);
+                                            response_url, *response_head);
     delegate_->InterceptResponse(std::move(new_loader),
                                  std::move(new_loader_request), &source_loader,
                                  &source_client_request);
diff --git a/content/common/mime_sniffing_throttle.h b/content/common/mime_sniffing_throttle.h
index f8f35189..c4940f99 100644
--- a/content/common/mime_sniffing_throttle.h
+++ b/content/common/mime_sniffing_throttle.h
@@ -20,7 +20,7 @@
 
   // Implements URLLoaderThrottle.
   void WillProcessResponse(const GURL& response_url,
-                           const network::ResourceResponseHead& response_head,
+                           network::ResourceResponseHead* response_head,
                            bool* defer) override;
 
   // Called from MimeSniffingURLLoader once mime type is ready.
diff --git a/content/common/mime_sniffing_throttle_unittest.cc b/content/common/mime_sniffing_throttle_unittest.cc
index 7b8bf29..ab74617f 100644
--- a/content/common/mime_sniffing_throttle_unittest.cc
+++ b/content/common/mime_sniffing_throttle_unittest.cc
@@ -196,7 +196,7 @@
 
   network::ResourceResponseHead response_head;
   bool defer = false;
-  throttle->WillProcessResponse(GURL("https://example.com"), response_head,
+  throttle->WillProcessResponse(GURL("https://example.com"), &response_head,
                                 &defer);
   EXPECT_TRUE(defer);
   EXPECT_TRUE(delegate->is_intercepted());
@@ -210,7 +210,7 @@
   network::ResourceResponseHead response_head;
   response_head.mime_type = "text/plain";
   bool defer = false;
-  throttle->WillProcessResponse(GURL("https://example.com"), response_head,
+  throttle->WillProcessResponse(GURL("https://example.com"), &response_head,
                                 &defer);
   EXPECT_TRUE(defer);
   EXPECT_TRUE(delegate->is_intercepted());
@@ -224,7 +224,7 @@
   network::ResourceResponseHead response_head;
   response_head.mime_type = "text/javascript";
   bool defer = false;
-  throttle->WillProcessResponse(GURL("https://example.com"), response_head,
+  throttle->WillProcessResponse(GURL("https://example.com"), &response_head,
                                 &defer);
   EXPECT_FALSE(defer);
   EXPECT_FALSE(delegate->is_intercepted());
@@ -237,7 +237,7 @@
 
   network::ResourceResponseHead response_head;
   bool defer = false;
-  throttle->WillProcessResponse(GURL("wss://example.com"), response_head,
+  throttle->WillProcessResponse(GURL("wss://example.com"), &response_head,
                                 &defer);
   EXPECT_FALSE(defer);
   EXPECT_FALSE(delegate->is_intercepted());
@@ -251,7 +251,7 @@
   network::ResourceResponseHead response_head;
   response_head.mime_type = "text/plain";
   bool defer = false;
-  throttle->WillProcessResponse(GURL("wss://example.com"), response_head,
+  throttle->WillProcessResponse(GURL("wss://example.com"), &response_head,
                                 &defer);
   EXPECT_FALSE(defer);
   EXPECT_FALSE(delegate->is_intercepted());
@@ -265,7 +265,7 @@
   network::ResourceResponseHead response_head;
   response_head.mime_type = "text/javascript";
   bool defer = false;
-  throttle->WillProcessResponse(GURL("wss://example.com"), response_head,
+  throttle->WillProcessResponse(GURL("wss://example.com"), &response_head,
                                 &defer);
   EXPECT_FALSE(defer);
   EXPECT_FALSE(delegate->is_intercepted());
@@ -280,7 +280,7 @@
   response_head.mime_type = "text/plain";
   response_head.did_mime_sniff = true;
   bool defer = false;
-  throttle->WillProcessResponse(GURL("https://example.com"), response_head,
+  throttle->WillProcessResponse(GURL("https://example.com"), &response_head,
                                 &defer);
   EXPECT_FALSE(defer);
   EXPECT_FALSE(delegate->is_intercepted());
@@ -294,7 +294,7 @@
   GURL response_url("https://example.com");
   network::ResourceResponseHead response_head;
   bool defer = false;
-  throttle->WillProcessResponse(response_url, response_head, &defer);
+  throttle->WillProcessResponse(response_url, &response_head, &defer);
   EXPECT_TRUE(defer);
   EXPECT_TRUE(delegate->is_intercepted());
 
@@ -317,7 +317,7 @@
   GURL response_url("https://example.com");
   network::ResourceResponseHead response_head;
   bool defer = false;
-  throttle->WillProcessResponse(response_url, response_head, &defer);
+  throttle->WillProcessResponse(response_url, &response_head, &defer);
   EXPECT_TRUE(defer);
   EXPECT_TRUE(delegate->is_intercepted());
 
@@ -340,7 +340,7 @@
   GURL response_url("https://example.com/hogehoge.docx");
   network::ResourceResponseHead response_head;
   bool defer = false;
-  throttle->WillProcessResponse(response_url, response_head, &defer);
+  throttle->WillProcessResponse(response_url, &response_head, &defer);
   EXPECT_TRUE(defer);
   EXPECT_TRUE(delegate->is_intercepted());
 
@@ -363,7 +363,7 @@
   GURL response_url("https://example.com/hogehoge.docx");
   network::ResourceResponseHead response_head;
   bool defer = false;
-  throttle->WillProcessResponse(response_url, response_head, &defer);
+  throttle->WillProcessResponse(response_url, &response_head, &defer);
   EXPECT_TRUE(defer);
   EXPECT_TRUE(delegate->is_intercepted());
 
@@ -386,7 +386,7 @@
   GURL response_url("https://example.com");
   network::ResourceResponseHead response_head;
   bool defer = false;
-  throttle->WillProcessResponse(response_url, response_head, &defer);
+  throttle->WillProcessResponse(response_url, &response_head, &defer);
   EXPECT_TRUE(defer);
   EXPECT_TRUE(delegate->is_intercepted());
 
@@ -434,7 +434,7 @@
   GURL response_url("https://example.com");
   network::ResourceResponseHead response_head;
   bool defer = false;
-  throttle->WillProcessResponse(response_url, response_head, &defer);
+  throttle->WillProcessResponse(response_url, &response_head, &defer);
   EXPECT_TRUE(defer);
   EXPECT_TRUE(delegate->is_intercepted());
 
diff --git a/content/common/throttling_url_loader.cc b/content/common/throttling_url_loader.cc
index 4ad4b5d3..a4ae95a 100644
--- a/content/common/throttling_url_loader.cc
+++ b/content/common/throttling_url_loader.cc
@@ -384,12 +384,13 @@
   DCHECK(!loader_completed_);
   DCHECK(deferring_throttles_.empty());
 
+  network::ResourceResponseHead response_head_copy = response_head;
   if (!throttles_.empty()) {
     bool deferred = false;
     for (auto& entry : throttles_) {
       auto* throttle = entry.throttle.get();
       bool throttle_deferred = false;
-      throttle->WillProcessResponse(response_url_, response_head,
+      throttle->WillProcessResponse(response_url_, &response_head_copy,
                                     &throttle_deferred);
       if (!HandleThrottleResult(throttle, throttle_deferred, &deferred))
         return;
@@ -397,13 +398,13 @@
 
     if (deferred) {
       deferred_stage_ = DEFERRED_RESPONSE;
-      response_info_ = std::make_unique<ResponseInfo>(response_head);
+      response_info_ = std::make_unique<ResponseInfo>(response_head_copy);
       client_binding_.PauseIncomingMethodCallProcessing();
       return;
     }
   }
 
-  forwarding_client_->OnReceiveResponse(response_head);
+  forwarding_client_->OnReceiveResponse(response_head_copy);
 }
 
 void ThrottlingURLLoader::OnReceiveRedirect(
diff --git a/content/common/throttling_url_loader_unittest.cc b/content/common/throttling_url_loader_unittest.cc
index 5681938..def0011 100644
--- a/content/common/throttling_url_loader_unittest.cc
+++ b/content/common/throttling_url_loader_unittest.cc
@@ -259,7 +259,7 @@
   }
 
   void WillProcessResponse(const GURL& response_url,
-                           const network::ResourceResponseHead& response_head,
+                           network::ResourceResponseHead* response_head,
                            bool* defer) override {
     will_process_response_called_++;
     if (will_process_response_callback_)
diff --git a/content/public/app/mojo/content_browser_manifest.json b/content/public/app/mojo/content_browser_manifest.json
index 62eafade..c5f01ba 100644
--- a/content/public/app/mojo/content_browser_manifest.json
+++ b/content/public/app/mojo/content_browser_manifest.json
@@ -174,6 +174,7 @@
           "blink.mojom.TextSuggestionHost",
           "blink.mojom.UnhandledTapNotifier",
           "blink.mojom.WebBluetoothService",
+          "blink.mojom.WebUsbService",
           "blink.test.mojom.VirtualAuthenticatorManager",
 
 
@@ -192,9 +193,7 @@
           "device.mojom.NFC",
           "device.mojom.SensorProvider",
           "device.mojom.UsbChooserService",
-          "device.mojom.UsbDeviceManager",
           "device.mojom.VibrationManager",
-          "device.mojom.UsbDeviceManager",
           "device.mojom.VRService",
           "device.mojom.WakeLock",
           "discardable_memory.mojom.DiscardableSharedMemoryManager",
@@ -229,7 +228,7 @@
           "blink.mojom.NotificationService",
           "blink.mojom.PermissionService",
           "blink.mojom.QuotaDispatcherHost",
-          "device.mojom.UsbDeviceManager",
+          "blink.mojom.WebUsbService",
           "network.mojom.WebSocket",
           "payments.mojom.PaymentManager",
           "shape_detection.mojom.BarcodeDetectionProvider",
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 2e37d97..7d23f281 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -725,9 +725,9 @@
   return false;
 }
 
-void ContentBrowserClient::CreateUsbDeviceManager(
+void ContentBrowserClient::CreateWebUsbService(
     RenderFrameHost* render_frame_host,
-    device::mojom::UsbDeviceManagerRequest request) {}
+    mojo::InterfaceRequest<blink::mojom::WebUsbService> request) {}
 
 void ContentBrowserClient::CreateUsbChooserService(
     RenderFrameHost* render_frame_host,
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index da7543f..1b8456c 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -31,7 +31,6 @@
 #include "content/public/common/socket_permission_request.h"
 #include "content/public/common/window_container_type.mojom.h"
 #include "device/usb/public/mojom/chooser_service.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
 #include "media/base/video_codecs.h"
 #include "media/cdm/cdm_proxy.h"
 #include "media/media_buildflags.h"
@@ -70,6 +69,12 @@
 class FilePath;
 }
 
+namespace blink {
+namespace mojom {
+class WebUsbService;
+}
+}  // namespace blink
+
 namespace device {
 class LocationProvider;
 }
@@ -1212,9 +1217,9 @@
   virtual bool ShouldForceDownloadResource(const GURL& url,
                                            const std::string& mime_type);
 
-  virtual void CreateUsbDeviceManager(
+  virtual void CreateWebUsbService(
       RenderFrameHost* render_frame_host,
-      device::mojom::UsbDeviceManagerRequest request);
+      mojo::InterfaceRequest<blink::mojom::WebUsbService> request);
 
   virtual void CreateUsbChooserService(
       RenderFrameHost* render_frame_host,
diff --git a/content/public/browser/desktop_capture.h b/content/public/browser/desktop_capture.h
index 30d7bdbe..c90997a 100644
--- a/content/public/browser/desktop_capture.h
+++ b/content/public/browser/desktop_capture.h
@@ -15,7 +15,7 @@
 // Creates a DesktopCaptureOptions with required settings.
 CONTENT_EXPORT webrtc::DesktopCaptureOptions CreateDesktopCaptureOptions();
 
-// Creats specific DesktopCapturer with required settings.
+// Creates specific DesktopCapturer with required settings.
 CONTENT_EXPORT std::unique_ptr<webrtc::DesktopCapturer> CreateScreenCapturer();
 CONTENT_EXPORT std::unique_ptr<webrtc::DesktopCapturer> CreateWindowCapturer();
 
diff --git a/content/public/browser/overlay_window.h b/content/public/browser/overlay_window.h
index 8f04e7e4..04160fd5 100644
--- a/content/public/browser/overlay_window.h
+++ b/content/public/browser/overlay_window.h
@@ -9,6 +9,10 @@
 
 #include "ui/gfx/native_widget_types.h"
 
+namespace blink {
+struct PictureInPictureControlInfo;
+}
+
 namespace gfx {
 class Rect;
 class Size;
@@ -52,6 +56,8 @@
   virtual gfx::Rect GetBounds() const = 0;
   virtual void UpdateVideoSize(const gfx::Size& natural_size) = 0;
   virtual void SetPlaybackState(PlaybackState playback_state) = 0;
+  virtual void SetPictureInPictureCustomControls(
+      const std::vector<blink::PictureInPictureControlInfo>& controls) = 0;
 
   // Retrieves the ui::Layers corresponding to the window and video.
   virtual ui::Layer* GetWindowBackgroundLayer() = 0;
diff --git a/content/public/browser/picture_in_picture_window_controller.h b/content/public/browser/picture_in_picture_window_controller.h
index 6df6f22..d53285a 100644
--- a/content/public/browser/picture_in_picture_window_controller.h
+++ b/content/public/browser/picture_in_picture_window_controller.h
@@ -6,8 +6,13 @@
 #define CONTENT_PUBLIC_BROWSER_PICTURE_IN_PICTURE_WINDOW_CONTROLLER_H_
 
 #include <string>
+#include <vector>
 #include "content/common/content_export.h"
 
+namespace blink {
+struct PictureInPictureControlInfo;
+}  // namespace blink
+
 namespace gfx {
 class Size;
 }  // namespace gfx
@@ -47,6 +52,8 @@
   virtual void OnWindowDestroyed() = 0;
 
   virtual void ClickCustomControl(const std::string& control_id) = 0;
+  virtual void SetPictureInPictureCustomControls(
+      const std::vector<blink::PictureInPictureControlInfo>&) = 0;
   virtual void EmbedSurface(const viz::SurfaceId& surface_id,
                             const gfx::Size& natural_size) = 0;
   virtual OverlayWindow* GetWindowForTesting() = 0;
diff --git a/content/public/browser/web_contents_observer.h b/content/public/browser/web_contents_observer.h
index fcb7fa4..e40d67d 100644
--- a/content/public/browser/web_contents_observer.h
+++ b/content/public/browser/web_contents_observer.h
@@ -264,9 +264,11 @@
       ResourceType resource_type) {}
 
   // This method is invoked when a resource associate with the frame
-  // |render_frame_host| has been loaded, successfully or not.
+  // |render_frame_host| has been loaded, successfully or not. |request_id| will
+  // only be populated for main frame resources.
   virtual void ResourceLoadComplete(
       RenderFrameHost* render_frame_host,
+      const GlobalRequestID& request_id,
       const mojom::ResourceLoadInfo& resource_load_info) {}
 
   // This method is invoked when a new non-pending navigation entry is created.
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 79725fa..6b9dd563 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -255,7 +255,7 @@
 
 // Mojo-based Session Storage.
 const base::Feature kMojoSessionStorage{"MojoSessionStorage",
-                                        base::FEATURE_ENABLED_BY_DEFAULT};
+                                        base::FEATURE_DISABLED_BY_DEFAULT};
 
 // Enables/disables the video capture service.
 const base::Feature kMojoVideoCapture {
diff --git a/content/public/common/url_loader_throttle.cc b/content/public/common/url_loader_throttle.cc
index 891164f..fc17be9 100644
--- a/content/public/common/url_loader_throttle.cc
+++ b/content/public/common/url_loader_throttle.cc
@@ -41,7 +41,7 @@
 
 void URLLoaderThrottle::WillProcessResponse(
     const GURL& response_url,
-    const network::ResourceResponseHead& response_head,
+    network::ResourceResponseHead* response_head,
     bool* defer) {}
 
 URLLoaderThrottle::URLLoaderThrottle() {}
diff --git a/content/public/common/url_loader_throttle.h b/content/public/common/url_loader_throttle.h
index b4a0907..c203d96b 100644
--- a/content/public/common/url_loader_throttle.h
+++ b/content/public/common/url_loader_throttle.h
@@ -109,10 +109,9 @@
 
   // Called when the response headers and meta data are available.
   // TODO(776312): Migrate this URL to ResourceResponseHead.
-  virtual void WillProcessResponse(
-      const GURL& response_url,
-      const network::ResourceResponseHead& response_head,
-      bool* defer);
+  virtual void WillProcessResponse(const GURL& response_url,
+                                   network::ResourceResponseHead* response_head,
+                                   bool* defer);
 
   void set_delegate(Delegate* delegate) { delegate_ = delegate; }
 
diff --git a/content/renderer/loader/web_url_loader_impl.cc b/content/renderer/loader/web_url_loader_impl.cc
index bd0a6e9df..f8aba55 100644
--- a/content/renderer/loader/web_url_loader_impl.cc
+++ b/content/renderer/loader/web_url_loader_impl.cc
@@ -813,7 +813,7 @@
       this, TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
 
   WebURLResponse response;
-  PopulateURLResponse(url_, info, &response, report_raw_headers_);
+  PopulateURLResponse(url_, info, &response, report_raw_headers_, request_id_);
 
   url_ = WebURL(redirect_info.new_url);
   return client_->WillFollowRedirect(
@@ -835,7 +835,7 @@
       this, TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
 
   WebURLResponse response;
-  PopulateURLResponse(url_, info, &response, report_raw_headers_);
+  PopulateURLResponse(url_, info, &response, report_raw_headers_, request_id_);
 
   bool show_raw_listing = false;
   if (info.mime_type == "text/vnd.chromium.ftp-dir") {
@@ -1171,7 +1171,8 @@
     const WebURL& url,
     const network::ResourceResponseInfo& info,
     WebURLResponse* response,
-    bool report_security_info) {
+    bool report_security_info,
+    int request_id) {
   response->SetURL(url);
   response->SetResponseTime(info.response_time);
   response->SetMIMEType(WebString::FromUTF8(info.mime_type));
@@ -1227,6 +1228,7 @@
   extra_data->set_was_alternate_protocol_available(
       info.was_alternate_protocol_available);
   extra_data->set_effective_connection_type(info.effective_connection_type);
+  extra_data->set_request_id(request_id);
 
   // If there's no received headers end time, don't set load timing.  This is
   // the case for non-HTTP requests, requests that don't go over the wire, and
@@ -1337,7 +1339,7 @@
   }
 
   PopulateURLResponse(final_url, sync_load_response.info, &response,
-                      request.ReportRawHeaders());
+                      request.ReportRawHeaders(), context_->request_id());
   encoded_data_length = sync_load_response.info.encoded_data_length;
   encoded_body_length = sync_load_response.info.encoded_body_length;
   if (sync_load_response.downloaded_blob) {
diff --git a/content/renderer/loader/web_url_loader_impl.h b/content/renderer/loader/web_url_loader_impl.h
index 8908938..6844de4 100644
--- a/content/renderer/loader/web_url_loader_impl.h
+++ b/content/renderer/loader/web_url_loader_impl.h
@@ -69,7 +69,8 @@
   static void PopulateURLResponse(const blink::WebURL& url,
                                   const network::ResourceResponseInfo& info,
                                   blink::WebURLResponse* response,
-                                  bool report_security_info);
+                                  bool report_security_info,
+                                  int request_id);
   // WebURLLoader methods:
   void LoadSynchronously(const blink::WebURLRequest& request,
                          blink::WebURLLoaderClient* client,
diff --git a/content/renderer/loader/web_url_loader_impl_unittest.cc b/content/renderer/loader/web_url_loader_impl_unittest.cc
index 9a92c2b..282e2753 100644
--- a/content/renderer/loader/web_url_loader_impl_unittest.cc
+++ b/content/renderer/loader/web_url_loader_impl_unittest.cc
@@ -691,7 +691,7 @@
     network::ResourceResponseInfo info;
     info.socket_address = net::HostPortPair(test.ip, 443);
     blink::WebURLResponse response;
-    WebURLLoaderImpl::PopulateURLResponse(url, info, &response, true);
+    WebURLLoaderImpl::PopulateURLResponse(url, info, &response, true, -1);
     EXPECT_EQ(test.expected, response.RemoteIPAddress().Utf8());
   };
 }
@@ -718,7 +718,7 @@
   network::ResourceResponseInfo info;
   info.ssl_info = ssl_info;
   blink::WebURLResponse web_url_response;
-  WebURLLoaderImpl::PopulateURLResponse(url, info, &web_url_response, true);
+  WebURLLoaderImpl::PopulateURLResponse(url, info, &web_url_response, true, -1);
 
   blink::WebURLResponse::WebSecurityDetails security_details =
       web_url_response.SecurityDetailsForTesting();
@@ -755,7 +755,7 @@
   network::ResourceResponseInfo info;
   info.ssl_info = ssl_info;
   blink::WebURLResponse web_url_response;
-  WebURLLoaderImpl::PopulateURLResponse(url, info, &web_url_response, true);
+  WebURLLoaderImpl::PopulateURLResponse(url, info, &web_url_response, true, -1);
 
   blink::WebURLResponse::WebSecurityDetails security_details =
       web_url_response.SecurityDetailsForTesting();
diff --git a/content/renderer/loader/weburlresponse_extradata_impl.h b/content/renderer/loader/weburlresponse_extradata_impl.h
index aa5e687..9b26d30 100644
--- a/content/renderer/loader/weburlresponse_extradata_impl.h
+++ b/content/renderer/loader/weburlresponse_extradata_impl.h
@@ -62,12 +62,17 @@
     effective_connection_type_ = effective_connection_type;
   }
 
+  // Request ID generated by the renderer.
+  int request_id() const { return request_id_; }
+  void set_request_id(int request_id) { request_id_ = request_id; }
+
  private:
   bool is_ftp_directory_listing_;
   bool was_fetched_via_spdy_;
   bool was_alpn_negotiated_;
   bool was_alternate_protocol_available_;
   net::EffectiveConnectionType effective_connection_type_;
+  int request_id_;
 
   DISALLOW_COPY_AND_ASSIGN(WebURLResponseExtraDataImpl);
 };
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.cc b/content/renderer/media/renderer_webmediaplayer_delegate.cc
index 41936bf..1080b18 100644
--- a/content/renderer/media/renderer_webmediaplayer_delegate.cc
+++ b/content/renderer/media/renderer_webmediaplayer_delegate.cc
@@ -15,6 +15,7 @@
 #include "content/public/renderer/content_renderer_client.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_thread.h"
+#include "third_party/blink/public/common/picture_in_picture/picture_in_picture_control_info.h"
 #include "third_party/blink/public/platform/web_fullscreen_video_status.h"
 #include "third_party/blink/public/platform/web_size.h"
 #include "third_party/blink/public/web/web_scoped_user_gesture.h"
@@ -144,6 +145,13 @@
       routing_id(), delegate_id, request_id));
 }
 
+void RendererWebMediaPlayerDelegate::DidSetPictureInPictureCustomControls(
+    int delegate_id,
+    const std::vector<blink::PictureInPictureControlInfo>& controls) {
+  Send(new MediaPlayerDelegateHostMsg_OnSetPictureInPictureCustomControls(
+      routing_id(), delegate_id, controls));
+}
+
 void RendererWebMediaPlayerDelegate::DidPictureInPictureSurfaceChange(
     int delegate_id,
     const viz::SurfaceId& surface_id,
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.h b/content/renderer/media/renderer_webmediaplayer_delegate.h
index 23a92d0..cb3e7151 100644
--- a/content/renderer/media/renderer_webmediaplayer_delegate.h
+++ b/content/renderer/media/renderer_webmediaplayer_delegate.h
@@ -71,6 +71,9 @@
       const gfx::Size&,
       blink::WebMediaPlayer::PipWindowOpenedCallback) override;
   void DidPictureInPictureModeEnd(int delegate_id, base::OnceClosure) override;
+  void DidSetPictureInPictureCustomControls(
+      int delegate_id,
+      const std::vector<blink::PictureInPictureControlInfo>& controls) override;
   void DidPictureInPictureSurfaceChange(int delegate_id,
                                         const viz::SurfaceId&,
                                         const gfx::Size&) override;
diff --git a/content/renderer/media/stream/webmediaplayer_ms.cc b/content/renderer/media/stream/webmediaplayer_ms.cc
index 02cd78b5..bf6ffa5 100644
--- a/content/renderer/media/stream/webmediaplayer_ms.cc
+++ b/content/renderer/media/stream/webmediaplayer_ms.cc
@@ -645,6 +645,13 @@
   // WebMediaPlayerMS. See http://crbug/746182.
 }
 
+void WebMediaPlayerMS::SetPictureInPictureCustomControls(
+    const std::vector<blink::PictureInPictureControlInfo>& controls) {
+  NOTIMPLEMENTED();
+  // TODO(apacible): Implement after video in surfaces is supported for
+  // WebMediaPlayerMS. See http://crbug/746182.
+}
+
 void WebMediaPlayerMS::RegisterPictureInPictureWindowResizeCallback(
     blink::WebMediaPlayer::PipWindowResizedCallback) {
   NOTIMPLEMENTED();
diff --git a/content/renderer/media/stream/webmediaplayer_ms.h b/content/renderer/media/stream/webmediaplayer_ms.h
index 3e2d6f93..8c0b492f 100644
--- a/content/renderer/media/stream/webmediaplayer_ms.h
+++ b/content/renderer/media/stream/webmediaplayer_ms.h
@@ -101,6 +101,8 @@
       blink::WebMediaPlayer::PipWindowOpenedCallback callback) override;
   void ExitPictureInPicture(
       blink::WebMediaPlayer::PipWindowClosedCallback callback) override;
+  void SetPictureInPictureCustomControls(
+      const std::vector<blink::PictureInPictureControlInfo>&) override;
   void RegisterPictureInPictureWindowResizeCallback(
       blink::WebMediaPlayer::PipWindowResizedCallback) override;
   void SetSinkId(const blink::WebString& sink_id,
diff --git a/content/renderer/media/stream/webmediaplayer_ms_unittest.cc b/content/renderer/media/stream/webmediaplayer_ms_unittest.cc
index 5c1e0ed..8f01703e 100644
--- a/content/renderer/media/stream/webmediaplayer_ms_unittest.cc
+++ b/content/renderer/media/stream/webmediaplayer_ms_unittest.cc
@@ -90,6 +90,12 @@
     EXPECT_EQ(delegate_id_, delegate_id);
   }
 
+  void DidSetPictureInPictureCustomControls(
+      int delegate_id,
+      const std::vector<blink::PictureInPictureControlInfo>&) override {
+    EXPECT_EQ(delegate_id_, delegate_id);
+  }
+
   void DidPictureInPictureSurfaceChange(int delegate_id,
                                         const viz::SurfaceId&,
                                         const gfx::Size&) override {
diff --git a/content/renderer/media_capture_from_element/html_video_element_capturer_source_unittest.cc b/content/renderer/media_capture_from_element/html_video_element_capturer_source_unittest.cc
index aab767c..6fc9103 100644
--- a/content/renderer/media_capture_from_element/html_video_element_capturer_source_unittest.cc
+++ b/content/renderer/media_capture_from_element/html_video_element_capturer_source_unittest.cc
@@ -49,6 +49,8 @@
   void SetVolume(double) override {}
   void EnterPictureInPicture(PipWindowOpenedCallback) override {}
   void ExitPictureInPicture(PipWindowClosedCallback) override {}
+  void SetPictureInPictureCustomControls(
+      const std::vector<blink::PictureInPictureControlInfo>&) override {}
   void RegisterPictureInPictureWindowResizeCallback(
       PipWindowResizedCallback) override {}
   blink::WebTimeRanges Buffered() const override {
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 3f023d0..f53d21b3 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -5607,6 +5607,10 @@
     }
   }
 
+  WebURLResponseExtraDataImpl* extra_data = GetExtraDataFromResponse(response);
+  if (extra_data)
+    params->request_id = extra_data->request_id();
+
   return params;
 }
 
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index 110a0a9..daf3ed4 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -565,7 +565,8 @@
     // TODO(horo): Set report_security_info to true when DevTools is attached.
     const bool report_security_info = false;
     WebURLLoaderImpl::PopulateURLResponse(url_, response_head, response_.get(),
-                                          report_security_info);
+                                          report_security_info,
+                                          -1 /* request_id */);
     MaybeReportResponseToClient();
   }
 
@@ -582,7 +583,8 @@
       return;
     response_ = std::make_unique<blink::WebURLResponse>();
     WebURLLoaderImpl::PopulateURLResponse(url_, response_head, response_.get(),
-                                          false /* report_security_info */);
+                                          false /* report_security_info */,
+                                          -1 /* request_id */);
     client->OnNavigationPreloadResponse(fetch_event_id_, std::move(response_),
                                         nullptr);
     // This will delete |this|.
diff --git a/content/shell/browser/layout_test/layout_test_content_browser_client.cc b/content/shell/browser/layout_test/layout_test_content_browser_client.cc
index fe0e372..2e9ec66 100644
--- a/content/shell/browser/layout_test/layout_test_content_browser_client.cc
+++ b/content/shell/browser/layout_test/layout_test_content_browser_client.cc
@@ -86,6 +86,9 @@
   void Close() override {}
   void Show() override {}
   void Hide() override {}
+  void SetPictureInPictureCustomControls(
+      const std::vector<blink::PictureInPictureControlInfo>& controls)
+      override {}
   bool IsVisible() const override { return false; }
   bool IsAlwaysOnTop() const override { return false; }
   ui::Layer* GetLayer() override { return nullptr; }
diff --git a/content/test/gpu/gpu_tests/pixel_expectations.py b/content/test/gpu/gpu_tests/pixel_expectations.py
index 3913d83..fdbfdcf8 100644
--- a/content/test/gpu/gpu_tests/pixel_expectations.py
+++ b/content/test/gpu/gpu_tests/pixel_expectations.py
@@ -55,6 +55,9 @@
     self.Fail('Pixel_CSSFilterEffects',
         ['mac', ('nvidia', 0xfe9)], bug=690277)
 
+    # Became flaky on 10.13.6.
+    self.Flaky('Pixel_CSSFilterEffects', ['highsierra', 'amd'], bug=872423)
+
     # TODO(kbr): flakily timing out on this configuration.
     self.Flaky('*', ['linux', 'intel', 'debug'], bug=648369)
 
@@ -109,7 +112,8 @@
     self.Fail('Pixel_WorkerRAF_OOPD', ['mac'], bug=851213)
 
     # TODO(kbr): temporary suppression for new test.
-    self.Flaky('Pixel_WebGLSadCanvas', ['linux', 'mac', 'win'], bug=575305)
+    self.Flaky('Pixel_WebGLSadCanvas', ['linux', 'win'], bug=575305)
+    self.Fail('Pixel_WebGLSadCanvas', ['mac'], bug=872423)
     self.Fail('Pixel_WebGLSadCanvas', ['android'], bug=575305)
 
     # Flaky on Android: crbug.com/860548
diff --git a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
index 25ee41f3..5146b36 100644
--- a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
+++ b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
@@ -434,9 +434,9 @@
 
     # Regressions in 10.12.4.
     self.Fail('conformance2/textures/misc/tex-base-level-bug.html',
-        ['sierra'], bug=705865)
+        ['sierra', 'intel'], bug=705865)
     self.Fail('conformance2/textures/misc/tex-mipmap-levels.html',
-        ['sierra'], bug=705865)
+        ['sierra', 'intel'], bug=705865)
 
     # Regressions in 10.13
     self.Fail('deqp/functional/gles3/fbocolorbuffer/tex2d_00.html',
@@ -648,6 +648,13 @@
     #     ['mac', 'amd'], bug=735483)
     # self.Fail('conformance2/rendering/texture-switch-performance.html',
     #     ['mac', 'amd'], bug=735483)
+
+    # The following two flaky failures are regressions in 10.13.6
+    # specifically.
+    self.Flaky('conformance2/textures/misc/tex-mipmap-levels.html',
+        ['mac', 'amd'], bug=870856)
+    self.Flaky('conformance2/textures/misc/tex-base-level-bug.html',
+        ['mac', 'amd'], bug=870856)
     self.Fail('deqp/functional/gles3/shaderoperator/common_functions.html',
         ['mac', 'amd'], bug=820225)
     self.Fail('deqp/functional/gles3/transformfeedback/' +
diff --git a/dbus/object_proxy.cc b/dbus/object_proxy.cc
index 35835fbd..aa5102a 100644
--- a/dbus/object_proxy.cc
+++ b/dbus/object_proxy.cc
@@ -519,6 +519,11 @@
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
   }
 
+  std::string sender = signal->GetSender();
+  // Ignore message from sender we are not interested in.
+  if (service_name_owner_ != sender)
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
   const std::string interface = signal->GetInterface();
   const std::string member = signal->GetMember();
 
@@ -534,12 +539,6 @@
   }
   VLOG(1) << "Signal received: " << signal->ToString();
 
-  std::string sender = signal->GetSender();
-  if (service_name_owner_ != sender) {
-    LOG(ERROR) << "Rejecting a message from a wrong sender.";
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-  }
-
   const base::TimeTicks start_time = base::TimeTicks::Now();
   if (bus_->HasDBusThread()) {
     // Post a task to run the method in the origin thread.
diff --git a/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac.mm b/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac.mm
index c8fe0db..a7b03c84 100644
--- a/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac.mm
+++ b/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac.mm
@@ -32,8 +32,10 @@
   //      powered on.
   //   2. Start advertising a registered advertisement if the adapter is powered
   //      on.
-  // Note that if the adapter is powered off while advertising, macOS will
-  // automatically restart advertising when the adapter is powered back on.
+  //   3. Stop the advertisement when the adapter is powered off.
+  //      Note that if the adapter is powered off while advertising, macOS will
+  //      automatically restart advertising when the adapter is powered back on,
+  //      so we need to explicitly stop advertising in this case.
 
   if (!active_advertisement_) {
     return;
@@ -61,12 +63,22 @@
 
   if (active_advertisement_->is_advertising() &&
       adapter_state == CBPeripheralManagerStateResetting) {
-    DVLOG(1) << "Adapter resetting. Invaldating advertisement.";
+    DVLOG(1) << "Adapter resetting. Invalidating advertisement.";
     active_advertisement_->OnAdapterReset();
     active_advertisement_ = nullptr;
     return;
   }
 
+  if (active_advertisement_->is_advertising() &&
+      adapter_state == CBPeripheralManagerStatePoweredOff) {
+    DVLOG(1) << "Adapter powered off. Stopping advertisement.";
+    // Note: we purposefully don't unregister the active advertisement for
+    // consistency with ChromeOS. The caller must manually unregister
+    // the advertisement themselves.
+    [peripheral_manager_ stopAdvertising];
+    return;
+  }
+
   if (active_advertisement_->is_waiting_for_adapter()) {
     StartAdvertising();
   }
diff --git a/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac_unittest.mm b/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac_unittest.mm
index 49c7ac6..0a85aad2 100644
--- a/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac_unittest.mm
+++ b/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac_unittest.mm
@@ -272,23 +272,6 @@
 }
 
 TEST_F(BluetoothLowEnergyAdvertisementManagerMacTest,
-       AdapterPoweredOff_WhileAdvertising) {
-  // Register advertisement.
-  RegisterAdvertisement(CreateAdvertisementData());
-  advertisement_manager_.DidStartAdvertising(nil);
-  ui_task_runner_->RunPendingTasks();
-  EXPECT_TRUE(advertisement_);
-
-  // Power off the adapter. Advertisement should not be stopped.
-  BluetoothAdvertisementMac* advertisement_mac =
-      static_cast<BluetoothAdvertisementMac*>(advertisement_.get());
-  EXPECT_TRUE(advertisement_mac->is_advertising());
-  peripheral_manager_state_ = CBPeripheralManagerStatePoweredOff;
-  advertisement_manager_.OnPeripheralManagerStateChanged();
-  EXPECT_TRUE(advertisement_mac->is_advertising());
-}
-
-TEST_F(BluetoothLowEnergyAdvertisementManagerMacTest,
        AdapterReset_RestartAdvertising) {
   // Register advertisement.
   RegisterAdvertisement(CreateAdvertisementData());
@@ -311,4 +294,31 @@
   [peripheral_manager_mock_ verifyAtLocation:nil];
 }
 
+TEST_F(BluetoothLowEnergyAdvertisementManagerMacTest,
+       Advertising_ThenAdapterPoweredOff_ThenReregister) {
+  // Register advertisement.
+  RegisterAdvertisement(CreateAdvertisementData());
+  advertisement_manager_.DidStartAdvertising(nil);
+  ui_task_runner_->RunPendingTasks();
+  EXPECT_TRUE(advertisement_);
+
+  // Power off the adapter. Advertisement should be stopped.
+  OCMExpect([peripheral_manager_ stopAdvertising]);
+  peripheral_manager_state_ = CBPeripheralManagerStatePoweredOff;
+  advertisement_manager_.OnPeripheralManagerStateChanged();
+  [peripheral_manager_mock_ verifyAtLocation:nil];
+
+  // Register a new advertisement after powering back on the adapter.
+  // This should fail as the caller needs to manually unregister the
+  // advertisement.
+  peripheral_manager_state_ = CBPeripheralManagerStatePoweredOn;
+  advertisement_ = nullptr;
+  RegisterAdvertisement(CreateAdvertisementData());
+  ui_task_runner_->RunPendingTasks();
+  EXPECT_FALSE(advertisement_);
+  ASSERT_TRUE(registration_error_);
+  EXPECT_EQ(BluetoothAdvertisement::ERROR_ADVERTISEMENT_ALREADY_EXISTS,
+            *registration_error_);
+}
+
 }  // namespace device
diff --git a/device/fido/cable/fido_cable_discovery.cc b/device/fido/cable/fido_cable_discovery.cc
index 0294fad8..0607dc77 100644
--- a/device/fido/cable/fido_cable_discovery.cc
+++ b/device/fido/cable/fido_cable_discovery.cc
@@ -8,6 +8,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/barrier_closure.h"
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/callback_helpers.h"
@@ -189,10 +190,31 @@
   DCHECK(adapter());
 
   base::SequencedTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&FidoCableDiscovery::StartAdvertisement,
+      FROM_HERE, base::BindOnce(&FidoCableDiscovery::StartCableDiscovery,
                                 weak_factory_.GetWeakPtr()));
 }
 
+void FidoCableDiscovery::StartCableDiscovery() {
+  // Error callback OnStartDiscoverySessionError() is defined in the base class
+  // FidoBleDiscoveryBase.
+  adapter()->StartDiscoverySessionWithFilter(
+      std::make_unique<BluetoothDiscoveryFilter>(
+          BluetoothTransport::BLUETOOTH_TRANSPORT_LE),
+      base::AdaptCallbackForRepeating(
+          base::BindOnce(&FidoCableDiscovery::OnStartDiscoverySessionWithFilter,
+                         weak_factory_.GetWeakPtr())),
+      base::AdaptCallbackForRepeating(
+          base::BindOnce(&FidoCableDiscovery::OnStartDiscoverySessionError,
+                         weak_factory_.GetWeakPtr())));
+}
+
+void FidoCableDiscovery::OnStartDiscoverySessionWithFilter(
+    std::unique_ptr<BluetoothDiscoverySession> session) {
+  SetDiscoverySession(std::move(session));
+  DVLOG(2) << "Discovery session started.";
+  StartAdvertisement();
+}
+
 void FidoCableDiscovery::StartAdvertisement() {
   DCHECK(adapter());
 
@@ -208,6 +230,13 @@
   }
 }
 
+void FidoCableDiscovery::StopAdvertisements(base::OnceClosure callback) {
+  auto barrier_closure =
+      base::BarrierClosure(advertisement_success_counter_, std::move(callback));
+  for (auto advertisement : advertisements_)
+    advertisement.second->Unregister(barrier_closure, base::DoNothing());
+}
+
 void FidoCableDiscovery::OnAdvertisementRegistered(
     const EidArray& client_eid,
     scoped_refptr<BluetoothAdvertisement> advertisement) {
@@ -223,32 +252,16 @@
 }
 
 void FidoCableDiscovery::RecordAdvertisementResult(bool is_success) {
-  is_success ? ++advertisement_success_counter_
-             : ++advertisement_failure_counter_;
-
-  // Wait until all advertisements are sent out.
-  if (advertisement_success_counter_ + advertisement_failure_counter_ !=
-      discovery_data_.size()) {
+  // If at least one advertisement succeeds, then notify discovery start.
+  if (is_success) {
+    if (!advertisement_success_counter_++)
+      NotifyDiscoveryStarted(true);
     return;
   }
 
-  // No advertisements succeeded, no point in starting scanning.
-  if (!advertisement_success_counter_) {
+  // No advertisements succeeded, no point in continuing with Cable discovery.
+  if (++advertisement_failure_counter_ == discovery_data_.size())
     NotifyDiscoveryStarted(false);
-    return;
-  }
-
-  // At least one advertisement succeeded and all advertisement has been
-  // processed. Start scanning.
-  adapter()->StartDiscoverySessionWithFilter(
-      std::make_unique<BluetoothDiscoveryFilter>(
-          BluetoothTransport::BLUETOOTH_TRANSPORT_LE),
-      base::AdaptCallbackForRepeating(
-          base::BindOnce(&FidoCableDiscovery::OnStartDiscoverySessionWithFilter,
-                         weak_factory_.GetWeakPtr())),
-      base::AdaptCallbackForRepeating(
-          base::BindOnce(&FidoCableDiscovery::OnStartDiscoverySessionError,
-                         weak_factory_.GetWeakPtr())));
 }
 
 void FidoCableDiscovery::CableDeviceFound(BluetoothAdapter* adapter,
@@ -267,17 +280,20 @@
 
   auto cable_device =
       std::make_unique<FidoCableDevice>(adapter, device->GetAddress());
-  // At most one handshake messages should be exchanged for each Cable device.
-  if (!base::ContainsKey(cable_handshake_handlers_, cable_device->GetId())) {
-    ConductEncryptionHandshake(std::move(cable_device),
-                               found_cable_device_data->session_pre_key, nonce);
-  }
+  StopAdvertisements(
+      base::BindOnce(&FidoCableDiscovery::ConductEncryptionHandshake,
+                     weak_factory_.GetWeakPtr(), std::move(cable_device),
+                     found_cable_device_data->session_pre_key, nonce));
 }
 
 void FidoCableDiscovery::ConductEncryptionHandshake(
     std::unique_ptr<FidoCableDevice> cable_device,
     base::span<const uint8_t, kSessionPreKeySize> session_pre_key,
     base::span<const uint8_t, 8> nonce) {
+  // At most one handshake messages should be exchanged for each Cable device.
+  if (base::ContainsKey(cable_handshake_handlers_, cable_device->GetId()))
+    return;
+
   auto handshake_handler =
       CreateHandshakeHandler(cable_device.get(), session_pre_key, nonce);
   auto* const handshake_handler_ptr = handshake_handler.get();
diff --git a/device/fido/cable/fido_cable_discovery.h b/device/fido/cable/fido_cable_discovery.h
index 02c5cb8..0db3884 100644
--- a/device/fido/cable/fido_cable_discovery.h
+++ b/device/fido/cable/fido_cable_discovery.h
@@ -68,6 +68,8 @@
 
  private:
   FRIEND_TEST_ALL_PREFIXES(FidoCableDiscoveryTest,
+                           TestDiscoveryWithAdvertisementFailures);
+  FRIEND_TEST_ALL_PREFIXES(FidoCableDiscoveryTest,
                            TestUnregisterAdvertisementUponDestruction);
 
   // BluetoothAdapter::Observer:
@@ -79,7 +81,10 @@
 
   // FidoBleDiscoveryBase:
   void OnSetPowered() override;
+  void OnStartDiscoverySessionWithFilter(
+      std::unique_ptr<BluetoothDiscoverySession>) override;
 
+  void StartCableDiscovery();
   void StartAdvertisement();
   void OnAdvertisementRegistered(
       const EidArray& client_eid,
@@ -91,6 +96,10 @@
   // invoke NotifyDiscoveryStarted(false). Otherwise kick off discovery session
   // once all advertisements has been processed.
   void RecordAdvertisementResult(bool is_success);
+  // Attempt to stop all on-going advertisements in best-effort basis.
+  // Once all the callbacks for Unregister() function is received, invoke
+  // |callback|.
+  void StopAdvertisements(base::OnceClosure callback);
   void CableDeviceFound(BluetoothAdapter* adapter, BluetoothDevice* device);
   void ConductEncryptionHandshake(
       std::unique_ptr<FidoCableDevice> device,
diff --git a/device/fido/cable/fido_cable_discovery_unittest.cc b/device/fido/cable/fido_cable_discovery_unittest.cc
index 177ff4d..bcacf5fa 100644
--- a/device/fido/cable/fido_cable_discovery_unittest.cc
+++ b/device/fido/cable/fido_cable_discovery_unittest.cc
@@ -24,6 +24,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::_;
+using ::testing::Sequence;
 using ::testing::NiceMock;
 
 namespace device {
@@ -175,22 +176,26 @@
       bool simulate_success,
       base::span<const uint8_t> expected_client_eid,
       base::StringPiece expected_uuid_formatted_client_eid,
-      scoped_refptr<CableMockBluetoothAdvertisement> advertisement_ptr =
-          nullptr) {
-    if (!advertisement_ptr)
-      advertisement_ptr =
-          base::MakeRefCounted<CableMockBluetoothAdvertisement>();
+      Sequence sequence = Sequence(),
+      scoped_refptr<CableMockBluetoothAdvertisement> advertisement = nullptr) {
+    if (!advertisement) {
+      advertisement = base::MakeRefCounted<CableMockBluetoothAdvertisement>();
+      EXPECT_CALL(*advertisement, Unregister(_, _))
+          .WillRepeatedly(::testing::WithArg<0>(
+              [](const auto& callback) { callback.Run(); }));
+    }
 
     EXPECT_CALL(*this,
                 RegisterAdvertisement(
                     IsAdvertisementContent(expected_client_eid,
                                            expected_uuid_formatted_client_eid),
                     _, _))
+        .InSequence(sequence)
         .WillOnce(::testing::WithArgs<1, 2>(
-            [simulate_success, advertisement_ptr](
-                const auto& success_callback, const auto& failure_callback) {
+            [simulate_success, advertisement](const auto& success_callback,
+                                              const auto& failure_callback) {
               simulate_success
-                  ? success_callback.Run(advertisement_ptr)
+                  ? success_callback.Run(advertisement)
                   : failure_callback.Run(BluetoothAdvertisement::ErrorCode::
                                              INVALID_ADVERTISEMENT_ERROR_CODE);
             }));
@@ -203,6 +208,21 @@
             [](const auto& callback) { callback.Run(); }));
   }
 
+  void ExpectDiscoveryWithScanCallback() {
+    EXPECT_CALL(*this, StartDiscoverySessionWithFilterRaw(_, _, _))
+        .WillOnce(::testing::WithArg<1>(
+            [this](const auto& callback) { callback.Run(nullptr); }));
+  }
+
+  void ExpectDiscoveryWithScanCallback(
+      base::span<const uint8_t, FidoCableDiscovery::kEphemeralIdSize> eid) {
+    EXPECT_CALL(*this, StartDiscoverySessionWithFilterRaw(_, _, _))
+        .WillOnce(::testing::WithArg<1>([this, eid](const auto& callback) {
+          callback.Run(nullptr);
+          AddNewTestBluetoothDevice(eid);
+        }));
+  }
+
  protected:
   ~CableMockAdapter() override = default;
 };
@@ -268,15 +288,10 @@
 
   auto mock_adapter =
       base::MakeRefCounted<::testing::NiceMock<CableMockAdapter>>();
-  ::testing::InSequence testing_sequence;
   mock_adapter->ExpectSuccessCallbackToSetPowered();
+  mock_adapter->ExpectDiscoveryWithScanCallback(kAuthenticatorEid);
   mock_adapter->ExpectRegisterAdvertisementWithResponse(
       true /* simulate_success */, kClientEid, kUuidFormattedClientEid);
-  EXPECT_CALL(*mock_adapter, StartDiscoverySessionWithFilterRaw(_, _, _))
-      .WillOnce(::testing::WithArg<1>([&mock_adapter](const auto& callback) {
-        mock_adapter->AddNewTestBluetoothDevice(kAuthenticatorEid);
-        callback.Run(nullptr);
-      }));
 
   BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter);
   cable_discovery->Start();
@@ -294,15 +309,10 @@
 
   auto mock_adapter =
       base::MakeRefCounted<::testing::NiceMock<CableMockAdapter>>();
-  ::testing::InSequence testing_sequence;
   mock_adapter->ExpectSuccessCallbackToSetPowered();
   mock_adapter->ExpectRegisterAdvertisementWithResponse(
       true /* simulate_success */, kClientEid, kUuidFormattedClientEid);
-  EXPECT_CALL(*mock_adapter, StartDiscoverySessionWithFilterRaw(_, _, _))
-      .WillOnce(::testing::WithArg<1>([&mock_adapter](const auto& callback) {
-        mock_adapter->AddNewTestBluetoothDevice(kInvalidAuthenticatorEid);
-        callback.Run(nullptr);
-      }));
+  mock_adapter->ExpectDiscoveryWithScanCallback(kInvalidAuthenticatorEid);
 
   BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter);
   cable_discovery->Start();
@@ -321,24 +331,22 @@
                               kSecondarySessionPreKey);
   auto cable_discovery =
       std::make_unique<FakeFidoCableDiscovery>(std::move(discovery_data));
+  auto mock_adapter =
+      base::MakeRefCounted<::testing::NiceMock<CableMockAdapter>>();
+  mock_adapter->ExpectSuccessCallbackToSetPowered();
+  mock_adapter->ExpectDiscoveryWithScanCallback(kAuthenticatorEid);
+
   NiceMock<MockFidoDiscoveryObserver> mock_observer;
   EXPECT_CALL(mock_observer, DeviceAdded(_, _));
   cable_discovery->set_observer(&mock_observer);
 
-  auto mock_adapter =
-      base::MakeRefCounted<::testing::NiceMock<CableMockAdapter>>();
-  ::testing::InSequence testing_sequence;
-  mock_adapter->ExpectSuccessCallbackToSetPowered();
+  Sequence sequence;
   mock_adapter->ExpectRegisterAdvertisementWithResponse(
-      true /* simulate_success */, kClientEid, kUuidFormattedClientEid);
+      true /* simulate_success */, kClientEid, kUuidFormattedClientEid,
+      sequence);
   mock_adapter->ExpectRegisterAdvertisementWithResponse(
       true /* simulate_success */, kSecondaryClientEid,
-      kUuidFormattedSecondaryClientEid);
-  EXPECT_CALL(*mock_adapter, StartDiscoverySessionWithFilterRaw(_, _, _))
-      .WillOnce(::testing::WithArg<1>([&mock_adapter](const auto& callback) {
-        mock_adapter->AddNewTestBluetoothDevice(kAuthenticatorEid);
-        callback.Run(nullptr);
-      }));
+      kUuidFormattedSecondaryClientEid, sequence);
 
   BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter);
   cable_discovery->Start();
@@ -363,18 +371,15 @@
 
   auto mock_adapter =
       base::MakeRefCounted<::testing::NiceMock<CableMockAdapter>>();
-  ::testing::InSequence testing_sequence;
   mock_adapter->ExpectSuccessCallbackToSetPowered();
+  Sequence sequence;
   mock_adapter->ExpectRegisterAdvertisementWithResponse(
-      true /* simulate_success */, kClientEid, kUuidFormattedClientEid);
+      true /* simulate_success */, kClientEid, kUuidFormattedClientEid,
+      sequence);
   mock_adapter->ExpectRegisterAdvertisementWithResponse(
       false /* simulate_success */, kSecondaryClientEid,
-      kUuidFormattedSecondaryClientEid);
-  EXPECT_CALL(*mock_adapter, StartDiscoverySessionWithFilterRaw(_, _, _))
-      .WillOnce(::testing::WithArg<1>([&mock_adapter](const auto& callback) {
-        mock_adapter->AddNewTestBluetoothDevice(kAuthenticatorEid);
-        callback.Run(nullptr);
-      }));
+      kUuidFormattedSecondaryClientEid, sequence);
+  mock_adapter->ExpectDiscoveryWithScanCallback(kAuthenticatorEid);
 
   BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter);
   cable_discovery->Start();
@@ -398,19 +403,20 @@
 
   auto mock_adapter =
       base::MakeRefCounted<::testing::NiceMock<CableMockAdapter>>();
-  ::testing::InSequence testing_sequence;
+  Sequence sequence;
   mock_adapter->ExpectSuccessCallbackToSetPowered();
   mock_adapter->ExpectRegisterAdvertisementWithResponse(
-      false /* simulate_success */, kClientEid, kUuidFormattedClientEid);
+      false /* simulate_success */, kClientEid, kUuidFormattedClientEid,
+      sequence);
   mock_adapter->ExpectRegisterAdvertisementWithResponse(
       false /* simulate_success */, kSecondaryClientEid,
-      kUuidFormattedSecondaryClientEid);
-  EXPECT_CALL(*mock_adapter, StartDiscoverySessionWithFilterRaw(_, _, _))
-      .Times(0);
+      kUuidFormattedSecondaryClientEid, sequence);
+  mock_adapter->ExpectDiscoveryWithScanCallback();
 
   BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter);
   cable_discovery->Start();
   scoped_task_environment_.RunUntilIdle();
+  EXPECT_TRUE(cable_discovery->advertisements_.empty());
 }
 
 TEST_F(FidoCableDiscoveryTest, TestUnregisterAdvertisementUponDestruction) {
@@ -419,13 +425,13 @@
       new CableMockBluetoothAdvertisement();
   EXPECT_CALL(*advertisement, Unregister(_, _)).Times(1);
 
-  ::testing::InSequence testing_sequence;
   auto mock_adapter =
       base::MakeRefCounted<::testing::NiceMock<CableMockAdapter>>();
   mock_adapter->ExpectSuccessCallbackToSetPowered();
+  mock_adapter->ExpectDiscoveryWithScanCallback();
   mock_adapter->ExpectRegisterAdvertisementWithResponse(
       true /* simulate_success */, kClientEid, kUuidFormattedClientEid,
-      base::WrapRefCounted(advertisement));
+      Sequence(), base::WrapRefCounted(advertisement));
 
   BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter);
   cable_discovery->Start();
diff --git a/device/fido/ctap_response_unittest.cc b/device/fido/ctap_response_unittest.cc
index 17c58cbb..7b20e1e3 100644
--- a/device/fido/ctap_response_unittest.cc
+++ b/device/fido/ctap_response_unittest.cc
@@ -138,6 +138,65 @@
     0x81, 0x01,
 };
 
+constexpr uint8_t kTestAuthenticatorGetInfoResponseWithIncorrectAaguid[] = {
+    // Success status byte
+    0x00,
+    // Map of 6 elements
+    0xA6,
+    // Key(01) - versions
+    0x01,
+    // Array(01)
+    0x81,
+    // "U2F_V2"
+    0x66, 0x55, 0x32, 0x46, 0x5F, 0x56, 0x32,
+    // Key(02) - extensions
+    0x02,
+    // Array(2)
+    0x82,
+    // "uvm"
+    0x63, 0x75, 0x76, 0x6D,
+    // "hmac-secret"
+    0x6B, 0x68, 0x6D, 0x61, 0x63, 0x2D, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74,
+    // Key(03) - AAGUID
+    0x03,
+    // Bytes(17) - FIDO2 device AAGUID must be 16 bytes long in order to be
+    // correct.
+    0x51, 0xF8, 0xA0, 0x11, 0xF3, 0x8C, 0x0A, 0x4D, 0x15, 0x80, 0x06, 0x17,
+    0x11, 0x1F, 0x9E, 0xDC, 0x7D, 0x00,
+    // Key(04) - options
+    0x04,
+    // Map(05)
+    0xA5,
+    // Key - "rk"
+    0x62, 0x72, 0x6B,
+    // true
+    0xF5,
+    // Key - "up"
+    0x62, 0x75, 0x70,
+    // true
+    0xF5,
+    // Key - "uv"
+    0x62, 0x75, 0x76,
+    // true
+    0xF5,
+    // Key - "plat"
+    0x64, 0x70, 0x6C, 0x61, 0x74,
+    // true
+    0xF5,
+    // Key - "clientPin"
+    0x69, 0x63, 0x6C, 0x69, 0x65, 0x6E, 0x74, 0x50, 0x69, 0x6E,
+    // false
+    0xF4,
+    // Key(05) - Max message size
+    0x05,
+    // 1200
+    0x19, 0x04, 0xB0,
+    // Key(06) - Pin protocols
+    0x06,
+    // Array[1]
+    0x81, 0x01,
+};
+
 // The attested credential data, excluding the public key bytes. Append
 // with kTestECPublicKeyCOSE to get the complete attestation data.
 constexpr uint8_t kTestAttestedCredentialDataPrefix[] = {
@@ -504,11 +563,13 @@
             get_info_response->options().client_pin_availability());
 }
 
-TEST(CTAPResponseTest, TestReadGetInfoResponseWithIncorrectVersionFormat) {
+TEST(CTAPResponseTest, TestReadGetInfoResponseWithIncorrectFormat) {
   EXPECT_FALSE(
       ReadCTAPGetInfoResponse(kTestAuthenticatorGetInfoResponseWithNoVersion));
   EXPECT_FALSE(ReadCTAPGetInfoResponse(
       kTestAuthenticatorGetInfoResponseWithDuplicateVersion));
+  EXPECT_FALSE(ReadCTAPGetInfoResponse(
+      kTestAuthenticatorGetInfoResponseWithIncorrectAaguid));
 }
 
 TEST(CTAPResponseTest, TestSerializeGetInfoResponse) {
diff --git a/device/fido/device_response_converter.cc b/device/fido/device_response_converter.cc
index e39fa693..7751a6b 100644
--- a/device/fido/device_response_converter.cc
+++ b/device/fido/device_response_converter.cc
@@ -181,8 +181,10 @@
     return base::nullopt;
 
   it = response_map.find(CBOR(3));
-  if (it == response_map.end() || !it->second.is_bytestring())
+  if (it == response_map.end() || !it->second.is_bytestring() ||
+      it->second.GetBytestring().size() != kAaguidLength) {
     return base::nullopt;
+  }
 
   AuthenticatorGetInfoResponse response(std::move(protocol_versions),
                                         it->second.GetBytestring());
diff --git a/device/usb/BUILD.gn b/device/usb/BUILD.gn
index 5b183fcc..3248fe6b4 100644
--- a/device/usb/BUILD.gn
+++ b/device/usb/BUILD.gn
@@ -81,6 +81,9 @@
 
   if (is_win || is_mac) {
     sources += [
+      "scoped_libusb_device_handle.cc",
+      "scoped_libusb_device_handle.h",
+      "scoped_libusb_device_ref.cc",
       "scoped_libusb_device_ref.h",
       "usb_context.cc",
       "usb_context.h",
diff --git a/device/usb/public/mojom/BUILD.gn b/device/usb/public/mojom/BUILD.gn
index 1c496ed..c643b53 100644
--- a/device/usb/public/mojom/BUILD.gn
+++ b/device/usb/public/mojom/BUILD.gn
@@ -19,4 +19,18 @@
   # prepackaged redistributable JS bindings. It is therefore not desirable to
   # scramble these messages.
   scramble_message_ids = false
+
+  # The blink variant of the usb mojom is depended on by the blink platform
+  # target. All blink variant mojoms use WTF types, which are part of the
+  # blink platform component. In order to avoid a dependency cycle, these
+  # targets must be part of that component.
+  export_class_attribute_blink = "BLINK_PLATFORM_EXPORT"
+  export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1"
+  export_header_blink = "third_party/blink/public/platform/web_common.h"
+
+  visibility_blink = [
+    "//components/arc/common:common_blink",
+    "//third_party/blink/public/mojom/usb:usb_blink",
+    "//third_party/blink/renderer/modules/webusb",
+  ]
 }
diff --git a/device/usb/scoped_libusb_device_handle.cc b/device/usb/scoped_libusb_device_handle.cc
new file mode 100644
index 0000000..4223a81
--- /dev/null
+++ b/device/usb/scoped_libusb_device_handle.cc
@@ -0,0 +1,37 @@
+// 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 "device/usb/scoped_libusb_device_handle.h"
+
+#include "device/usb/usb_context.h"
+#include "third_party/libusb/src/libusb/libusb.h"
+
+namespace device {
+
+ScopedLibusbDeviceHandle::ScopedLibusbDeviceHandle(
+    libusb_device_handle* handle,
+    scoped_refptr<UsbContext> context)
+    : handle_(handle), context_(std::move(context)) {}
+
+ScopedLibusbDeviceHandle::ScopedLibusbDeviceHandle(
+    ScopedLibusbDeviceHandle&& other)
+    : handle_(other.handle_), context_(std::move(other.context_)) {
+  other.handle_ = nullptr;
+}
+
+ScopedLibusbDeviceHandle::~ScopedLibusbDeviceHandle() {
+  Reset();
+}
+
+void ScopedLibusbDeviceHandle::Reset() {
+  libusb_close(handle_);
+  handle_ = nullptr;
+  context_.reset();
+}
+
+bool ScopedLibusbDeviceHandle::IsValid() const {
+  return handle_ != nullptr;
+}
+
+}  // namespace device
diff --git a/device/usb/scoped_libusb_device_handle.h b/device/usb/scoped_libusb_device_handle.h
new file mode 100644
index 0000000..a4eb378
--- /dev/null
+++ b/device/usb/scoped_libusb_device_handle.h
@@ -0,0 +1,41 @@
+// 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 DEVICE_USB_SCOPED_LIBUSB_DEVICE_HANDLE_H_
+#define DEVICE_USB_SCOPED_LIBUSB_DEVICE_HANDLE_H_
+
+#include "base/macros.h"
+#include "base/memory/scoped_refptr.h"
+
+struct libusb_device_handle;
+
+namespace device {
+
+class UsbContext;
+
+// This class owns a reference to a libusb_device_handle as well as a reference
+// to the libusb_context. The libusb_context must outlive any
+// libusb_device_handle instances created from it.
+class ScopedLibusbDeviceHandle {
+ public:
+  ScopedLibusbDeviceHandle(libusb_device_handle* handle,
+                           scoped_refptr<UsbContext> context);
+  ScopedLibusbDeviceHandle(ScopedLibusbDeviceHandle&& other);
+  ~ScopedLibusbDeviceHandle();
+
+  libusb_device_handle* get() const { return handle_; }
+
+  void Reset();
+  bool IsValid() const;
+
+ private:
+  libusb_device_handle* handle_;
+  scoped_refptr<UsbContext> context_;
+
+  DISALLOW_COPY_AND_ASSIGN(ScopedLibusbDeviceHandle);
+};
+
+}  // namespace device
+
+#endif  // DEVICE_USB_SCOPED_LIBUSB_DEVICE_HANDLE_H_
diff --git a/device/usb/scoped_libusb_device_ref.cc b/device/usb/scoped_libusb_device_ref.cc
new file mode 100644
index 0000000..b3ac5e8
--- /dev/null
+++ b/device/usb/scoped_libusb_device_ref.cc
@@ -0,0 +1,39 @@
+// 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 "device/usb/scoped_libusb_device_ref.h"
+
+#include "device/usb/usb_context.h"
+#include "third_party/libusb/src/libusb/libusb.h"
+
+namespace device {
+
+ScopedLibusbDeviceRef::ScopedLibusbDeviceRef(libusb_device* device,
+                                             scoped_refptr<UsbContext> context)
+    : device_(device), context_(std::move(context)) {}
+
+ScopedLibusbDeviceRef::ScopedLibusbDeviceRef(ScopedLibusbDeviceRef&& other)
+    : device_(other.device_), context_(std::move(other.context_)) {
+  other.device_ = nullptr;
+}
+
+ScopedLibusbDeviceRef::~ScopedLibusbDeviceRef() {
+  Reset();
+}
+
+void ScopedLibusbDeviceRef::Reset() {
+  libusb_unref_device(device_);
+  device_ = nullptr;
+  context_.reset();
+}
+
+bool ScopedLibusbDeviceRef::IsValid() const {
+  return device_ != nullptr;
+}
+
+bool operator==(const ScopedLibusbDeviceRef& ref, libusb_device* device) {
+  return ref.get() == device;
+}
+
+}  // namespace device
diff --git a/device/usb/scoped_libusb_device_ref.h b/device/usb/scoped_libusb_device_ref.h
index 05a21b2..73a3731 100644
--- a/device/usb/scoped_libusb_device_ref.h
+++ b/device/usb/scoped_libusb_device_ref.h
@@ -5,19 +5,40 @@
 #ifndef DEVICE_USB_SCOPED_LIBUSB_DEVICE_REF_H_
 #define DEVICE_USB_SCOPED_LIBUSB_DEVICE_REF_H_
 
-#include "base/scoped_generic.h"
-#include "third_party/libusb/src/libusb/libusb.h"
+#include "base/macros.h"
+#include "base/memory/scoped_refptr.h"
+
+struct libusb_device;
 
 namespace device {
 
-struct LibusbDeviceRefTraits {
-  static libusb_device* InvalidValue() { return nullptr; }
+class UsbContext;
 
-  static void Free(libusb_device* device) { libusb_unref_device(device); }
+// This class owns a reference to a libusb_device as well as a reference to
+// the libusb_context. The libusb_context must outlive any libusb_device
+// instances created from it.
+class ScopedLibusbDeviceRef {
+ public:
+  ScopedLibusbDeviceRef(libusb_device* device,
+                        scoped_refptr<UsbContext> context);
+  ScopedLibusbDeviceRef(ScopedLibusbDeviceRef&& other);
+  ~ScopedLibusbDeviceRef();
+
+  libusb_device* get() const { return device_; }
+
+  scoped_refptr<UsbContext> GetContext() const { return context_; }
+
+  void Reset();
+  bool IsValid() const;
+
+ private:
+  libusb_device* device_;
+  scoped_refptr<UsbContext> context_;
+
+  DISALLOW_COPY_AND_ASSIGN(ScopedLibusbDeviceRef);
 };
 
-using ScopedLibusbDeviceRef =
-    base::ScopedGeneric<libusb_device*, LibusbDeviceRefTraits>;
+bool operator==(const ScopedLibusbDeviceRef& ref, libusb_device* device);
 
 }  // namespace device
 
diff --git a/device/usb/usb_device_handle_impl.cc b/device/usb/usb_device_handle_impl.cc
index cce0691..b8c2307a 100644
--- a/device/usb/usb_device_handle_impl.cc
+++ b/device/usb/usb_device_handle_impl.cc
@@ -311,7 +311,7 @@
   libusb_fill_control_setup(buffer->front(), type, request, value, index,
                             length);
   libusb_fill_control_transfer(transfer->platform_transfer_,
-                               device_handle->handle_, buffer->front(),
+                               device_handle->handle(), buffer->front(),
                                &UsbDeviceHandleImpl::Transfer::PlatformCallback,
                                transfer.get(), timeout);
 
@@ -341,7 +341,7 @@
   }
 
   libusb_fill_bulk_transfer(
-      transfer->platform_transfer_, device_handle->handle_, endpoint,
+      transfer->platform_transfer_, device_handle->handle(), endpoint,
       buffer->front(), length, &UsbDeviceHandleImpl::Transfer::PlatformCallback,
       transfer.get(), timeout);
 
@@ -371,7 +371,7 @@
   }
 
   libusb_fill_interrupt_transfer(
-      transfer->platform_transfer_, device_handle->handle_, endpoint,
+      transfer->platform_transfer_, device_handle->handle(), endpoint,
       buffer->front(), length, &UsbDeviceHandleImpl::Transfer::PlatformCallback,
       transfer.get(), timeout);
 
@@ -401,10 +401,10 @@
     return nullptr;
   }
 
-  libusb_fill_iso_transfer(transfer->platform_transfer_, device_handle->handle_,
-                           endpoint, buffer->front(), static_cast<int>(length),
-                           num_packets, &Transfer::PlatformCallback,
-                           transfer.get(), timeout);
+  libusb_fill_iso_transfer(
+      transfer->platform_transfer_, device_handle->handle(), endpoint,
+      buffer->front(), static_cast<int>(length), num_packets,
+      &Transfer::PlatformCallback, transfer.get(), timeout);
 
   for (size_t i = 0; i < packet_lengths.size(); ++i)
     transfer->platform_transfer_->iso_packet_desc[i].length = packet_lengths[i];
@@ -798,16 +798,14 @@
 }
 
 UsbDeviceHandleImpl::UsbDeviceHandleImpl(
-    scoped_refptr<UsbContext> context,
     scoped_refptr<UsbDeviceImpl> device,
-    PlatformUsbDeviceHandle handle,
+    ScopedLibusbDeviceHandle handle,
     scoped_refptr<base::SequencedTaskRunner> blocking_task_runner)
-    : device_(device),
-      handle_(handle),
-      context_(context),
+    : device_(std::move(device)),
+      handle_(std::move(handle)),
       task_runner_(base::ThreadTaskRunnerHandle::Get()),
       blocking_task_runner_(blocking_task_runner) {
-  DCHECK(handle) << "Cannot create device with NULL handle.";
+  DCHECK(handle_.IsValid()) << "Cannot create device with an invalid handle.";
 }
 
 UsbDeviceHandleImpl::~UsbDeviceHandleImpl() {
@@ -817,17 +815,19 @@
   // any thread. libusb is not safe to reentrancy so be sure not to try to close
   // the device from inside a transfer completion callback.
   if (blocking_task_runner_->RunsTasksInCurrentSequence()) {
-    libusb_close(handle_);
+    handle_.Reset();
   } else {
-    blocking_task_runner_->PostTask(FROM_HERE,
-                                    base::BindOnce(&libusb_close, handle_));
+    blocking_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(base::DoNothing::Once<ScopedLibusbDeviceHandle>(),
+                       std::move(handle_)));
   }
 }
 
 void UsbDeviceHandleImpl::SetConfigurationOnBlockingThread(
     int configuration_value,
     ResultCallback callback) {
-  int rv = libusb_set_configuration(handle_, configuration_value);
+  int rv = libusb_set_configuration(handle(), configuration_value);
   if (rv != LIBUSB_SUCCESS) {
     USB_LOG(EVENT) << "Failed to set configuration " << configuration_value
                    << ": " << ConvertPlatformUsbErrorToString(rv);
@@ -855,7 +855,7 @@
 void UsbDeviceHandleImpl::ClaimInterfaceOnBlockingThread(
     int interface_number,
     ResultCallback callback) {
-  int rv = libusb_claim_interface(handle_, interface_number);
+  int rv = libusb_claim_interface(handle(), interface_number);
   scoped_refptr<InterfaceClaimer> interface_claimer;
   if (rv == LIBUSB_SUCCESS) {
     interface_claimer =
@@ -897,7 +897,7 @@
     int interface_number,
     int alternate_setting,
     ResultCallback callback) {
-  int rv = libusb_set_interface_alt_setting(handle_, interface_number,
+  int rv = libusb_set_interface_alt_setting(handle(), interface_number,
                                             alternate_setting);
   if (rv != LIBUSB_SUCCESS) {
     USB_LOG(EVENT) << "Failed to set interface " << interface_number
@@ -930,7 +930,7 @@
 }
 
 void UsbDeviceHandleImpl::ResetDeviceOnBlockingThread(ResultCallback callback) {
-  int rv = libusb_reset_device(handle_);
+  int rv = libusb_reset_device(handle());
   if (rv != LIBUSB_SUCCESS) {
     USB_LOG(EVENT) << "Failed to reset device: "
                    << ConvertPlatformUsbErrorToString(rv);
@@ -941,7 +941,7 @@
 
 void UsbDeviceHandleImpl::ClearHaltOnBlockingThread(uint8_t endpoint,
                                                     ResultCallback callback) {
-  int rv = libusb_clear_halt(handle_, endpoint);
+  int rv = libusb_clear_halt(handle(), endpoint);
   if (rv != LIBUSB_SUCCESS) {
     USB_LOG(EVENT) << "Failed to clear halt: "
                    << ConvertPlatformUsbErrorToString(rv);
diff --git a/device/usb/usb_device_handle_impl.h b/device/usb/usb_device_handle_impl.h
index acf0332d..32dbe04 100644
--- a/device/usb/usb_device_handle_impl.h
+++ b/device/usb/usb_device_handle_impl.h
@@ -17,6 +17,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread_checker.h"
+#include "device/usb/scoped_libusb_device_handle.h"
 #include "device/usb/usb_device_handle.h"
 #include "third_party/libusb/src/libusb/libusb.h"
 
@@ -34,10 +35,8 @@
   const UsbEndpointDescriptor* endpoint;
 };
 
-class UsbContext;
 class UsbDeviceImpl;
 
-typedef libusb_device_handle* PlatformUsbDeviceHandle;
 typedef libusb_iso_packet_descriptor* PlatformUsbIsoPacketDescriptor;
 typedef libusb_transfer* PlatformUsbTransferHandle;
 
@@ -90,14 +89,13 @@
 
   // This constructor is called by UsbDeviceImpl.
   UsbDeviceHandleImpl(
-      scoped_refptr<UsbContext> context,
       scoped_refptr<UsbDeviceImpl> device,
-      PlatformUsbDeviceHandle handle,
+      ScopedLibusbDeviceHandle handle,
       scoped_refptr<base::SequencedTaskRunner> blocking_task_runner);
 
   ~UsbDeviceHandleImpl() override;
 
-  PlatformUsbDeviceHandle handle() const { return handle_; }
+  libusb_device_handle* handle() const { return handle_.get(); }
 
  private:
   class InterfaceClaimer;
@@ -174,7 +172,7 @@
 
   scoped_refptr<UsbDeviceImpl> device_;
 
-  PlatformUsbDeviceHandle handle_;
+  ScopedLibusbDeviceHandle handle_;
 
   typedef std::map<int, scoped_refptr<InterfaceClaimer>> ClaimedInterfaceMap;
   ClaimedInterfaceMap claimed_interfaces_;
@@ -186,10 +184,6 @@
   typedef std::map<int, EndpointMapValue> EndpointMap;
   EndpointMap endpoint_map_;
 
-  // Retain the UsbContext so that the platform context will not be destroyed
-  // before this handle.
-  scoped_refptr<UsbContext> context_;
-
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
   scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
 
diff --git a/device/usb/usb_device_impl.cc b/device/usb/usb_device_impl.cc
index 056c6c3..ab734eab 100644
--- a/device/usb/usb_device_impl.cc
+++ b/device/usb/usb_device_impl.cc
@@ -28,8 +28,7 @@
 
 namespace device {
 
-UsbDeviceImpl::UsbDeviceImpl(scoped_refptr<UsbContext> context,
-                             ScopedLibusbDeviceRef platform_device,
+UsbDeviceImpl::UsbDeviceImpl(ScopedLibusbDeviceRef platform_device,
                              const libusb_device_descriptor& descriptor)
     : UsbDevice(descriptor.bcdUSB,
                 descriptor.bDeviceClass,
@@ -41,9 +40,8 @@
                 base::string16(),
                 base::string16(),
                 base::string16()),
-      context_(std::move(context)),
       platform_device_(std::move(platform_device)) {
-  CHECK(platform_device_.is_valid()) << "platform_device must be valid";
+  CHECK(platform_device_.IsValid()) << "platform_device must be valid";
   ReadAllConfigurations();
   RefreshActiveConfiguration();
 }
@@ -104,12 +102,15 @@
     scoped_refptr<base::TaskRunner> task_runner,
     scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) {
   base::AssertBlockingAllowed();
-  PlatformUsbDeviceHandle handle;
+  libusb_device_handle* handle = nullptr;
   const int rv = libusb_open(platform_device(), &handle);
   if (LIBUSB_SUCCESS == rv) {
+    ScopedLibusbDeviceHandle scoped_handle(handle,
+                                           platform_device_.GetContext());
     task_runner->PostTask(
-        FROM_HERE, base::BindOnce(&UsbDeviceImpl::Opened, this, handle,
-                                  std::move(callback), blocking_task_runner));
+        FROM_HERE,
+        base::BindOnce(&UsbDeviceImpl::Opened, this, std::move(scoped_handle),
+                       std::move(callback), blocking_task_runner));
   } else {
     USB_LOG(EVENT) << "Failed to open device: "
                    << ConvertPlatformUsbErrorToString(rv);
@@ -119,12 +120,12 @@
 }
 
 void UsbDeviceImpl::Opened(
-    PlatformUsbDeviceHandle platform_handle,
+    ScopedLibusbDeviceHandle platform_handle,
     OpenCallback callback,
     scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) {
   DCHECK(thread_checker_.CalledOnValidThread());
   scoped_refptr<UsbDeviceHandle> device_handle = new UsbDeviceHandleImpl(
-      context_, this, platform_handle, blocking_task_runner);
+      this, std::move(platform_handle), blocking_task_runner);
   handles().push_back(device_handle.get());
   std::move(callback).Run(device_handle);
 }
diff --git a/device/usb/usb_device_impl.h b/device/usb/usb_device_impl.h
index 16ab891..9e3d2c7 100644
--- a/device/usb/usb_device_impl.h
+++ b/device/usb/usb_device_impl.h
@@ -21,9 +21,7 @@
 #include "device/usb/usb_descriptors.h"
 #include "device/usb/usb_device.h"
 
-struct libusb_device;
 struct libusb_device_descriptor;
-struct libusb_device_handle;
 
 namespace base {
 class SequencedTaskRunner;
@@ -31,15 +29,12 @@
 
 namespace device {
 
+class ScopedLibusbDeviceHandle;
 class UsbDeviceHandleImpl;
-class UsbContext;
-
-typedef struct libusb_device_handle* PlatformUsbDeviceHandle;
 
 class UsbDeviceImpl : public UsbDevice {
  public:
-  UsbDeviceImpl(scoped_refptr<UsbContext> context,
-                ScopedLibusbDeviceRef platform_device,
+  UsbDeviceImpl(ScopedLibusbDeviceRef platform_device,
                 const libusb_device_descriptor& descriptor);
 
   // UsbDevice implementation:
@@ -79,15 +74,13 @@
       OpenCallback callback,
       scoped_refptr<base::TaskRunner> task_runner,
       scoped_refptr<base::SequencedTaskRunner> blocking_task_runner);
-  void Opened(PlatformUsbDeviceHandle platform_handle,
+  void Opened(ScopedLibusbDeviceHandle platform_handle,
               OpenCallback callback,
               scoped_refptr<base::SequencedTaskRunner> blocking_task_runner);
 
   base::ThreadChecker thread_checker_;
   bool visited_ = false;
 
-  // The libusb_context must not be released before the libusb_device.
-  const scoped_refptr<UsbContext> context_;
   const ScopedLibusbDeviceRef platform_device_;
 
   DISALLOW_COPY_AND_ASSIGN(UsbDeviceImpl);
diff --git a/device/usb/usb_service_impl.cc b/device/usb/usb_service_impl.cc
index bb26daa..6b7a8036 100644
--- a/device/usb/usb_service_impl.cc
+++ b/device/usb/usb_service_impl.cc
@@ -131,7 +131,7 @@
   std::vector<ScopedLibusbDeviceRef> scoped_devices;
   scoped_devices.reserve(device_count);
   for (ssize_t i = 0; i < device_count; ++i)
-    scoped_devices.emplace_back(platform_devices[i]);
+    scoped_devices.emplace_back(platform_devices[i], usb_context);
 
   // Free the list but don't unref the devices because ownership has been
   // been transfered to the elements of |scoped_devices|.
@@ -231,6 +231,7 @@
       device_observer_(this),
 #endif
       weak_factory_(this) {
+  weak_self_ = weak_factory_.GetWeakPtr();
   base::PostTaskWithTraits(
       FROM_HERE, kBlockingTaskTraits,
       base::Bind(&InitializeUsbContextOnBlockingThread, task_runner(),
@@ -361,7 +362,7 @@
       // Mark the existing device object visited and remove it from the list so
       // it will not be ignored.
       it->second->set_visited(true);
-      device.reset();
+      device.Reset();
     }
   }
 
@@ -382,7 +383,7 @@
   // that have been removed don't remain in |ignored_devices_| indefinitely.
   ignored_devices_.clear();
   for (auto& device : *devices) {
-    if (device.is_valid())
+    if (device.IsValid())
       ignored_devices_.push_back(std::move(device));
   }
 
@@ -441,8 +442,8 @@
 
   devices_being_enumerated_.insert(platform_device.get());
 
-  auto device = base::MakeRefCounted<UsbDeviceImpl>(
-      context_, std::move(platform_device), descriptor);
+  auto device = base::MakeRefCounted<UsbDeviceImpl>(std::move(platform_device),
+                                                    descriptor);
   base::OnceClosure add_device =
       base::BindOnce(&UsbServiceImpl::AddDevice, weak_factory_.GetWeakPtr(),
                      refresh_complete, device);
@@ -458,7 +459,8 @@
     libusb_ref_device(device->platform_device());
     base::OnceClosure enumeration_failed = base::BindOnce(
         &UsbServiceImpl::EnumerationFailed, weak_factory_.GetWeakPtr(),
-        ScopedLibusbDeviceRef(device->platform_device()), refresh_complete);
+        ScopedLibusbDeviceRef(device->platform_device(), context_),
+        refresh_complete);
 
     device->Open(base::BindOnce(
         &OnDeviceOpenedReadDescriptors, descriptor.iManufacturer,
@@ -518,18 +520,18 @@
   // libusb does not transfer ownership of |device_raw| to this function so a
   // reference must be taken here.
   libusb_ref_device(device_raw);
-  ScopedLibusbDeviceRef device(device_raw);
+  ScopedLibusbDeviceRef device(device_raw, self->context_);
 
   switch (event) {
     case LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED:
       self->task_runner()->PostTask(
           FROM_HERE, base::BindOnce(&UsbServiceImpl::OnPlatformDeviceAdded,
-                                    base::Unretained(self), std::move(device)));
+                                    self->weak_self_, std::move(device)));
       break;
     case LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT:
       self->task_runner()->PostTask(
           FROM_HERE, base::BindOnce(&UsbServiceImpl::OnPlatformDeviceRemoved,
-                                    base::Unretained(self), std::move(device)));
+                                    self->weak_self_, std::move(device)));
       break;
     default:
       NOTREACHED();
diff --git a/device/usb/usb_service_impl.h b/device/usb/usb_service_impl.h
index e7e89d0..36f7115 100644
--- a/device/usb/usb_service_impl.h
+++ b/device/usb/usb_service_impl.h
@@ -122,6 +122,10 @@
   ScopedObserver<DeviceMonitorWin, DeviceMonitorWin::Observer> device_observer_;
 #endif  // OS_WIN
 
+  // This WeakPtr is used to safely post hotplug events back to the thread this
+  // object lives on.
+  base::WeakPtr<UsbServiceImpl> weak_self_;
+
   base::WeakPtrFactory<UsbServiceImpl> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(UsbServiceImpl);
diff --git a/extensions/browser/device_local_account_util.cc b/extensions/browser/device_local_account_util.cc
index c4f3fe5b..6f83f202 100644
--- a/extensions/browser/device_local_account_util.cc
+++ b/extensions/browser/device_local_account_util.cc
@@ -98,6 +98,10 @@
     "pjckdjlmdcofkkkocnmhcbehkiapalho",  // Wunderlist demo
     "pbdihpaifchmclcmkfdgffnnpfbobefh",  // YouTube demo
 
+    // New demo mode:
+    "lpmakjfjcconjeehbidjclhdlpjmfjjj",  // Highlights app
+    "iggildboghmjpbjcpmobahnkmoefkike",  // Highlights app
+
     // Testing extensions:
     "ongnjlefhnoajpbodoldndkbkdgfomlp",  // Show Managed Storage
     "ilnpadgckeacioehlommkaafedibdeob",  // Enterprise DeviceAttributes
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 402b3919..5fae30d 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1327,6 +1327,7 @@
   VIRTUALKEYBOARDPRIVATE_SETHITTESTBOUNDS = 1264,
   ARCAPPSPRIVATE_GETLAUNCHABLEAPPS = 1265,
   ARCAPPSPRIVATE_LAUNCHAPP = 1266,
+  AUTOTESTPRIVATE_RUNCROSTINIINSTALLER = 1267,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/common/manifest.h b/extensions/common/manifest.h
index 6b2a8654..d89c245e 100644
--- a/extensions/common/manifest.h
+++ b/extensions/common/manifest.h
@@ -24,13 +24,24 @@
 // properties of the manifest using ManifestFeatureProvider.
 class Manifest {
  public:
-  // What an extension was loaded from.
+  // Historically, where an extension was loaded from, and whether an
+  // extension's files were inside or outside of the profile's directory. In
+  // modern usage, a Location can be thought of as the installation source:
+  // whether an extension was explicitly installed by the user (through the
+  // UI), or implicitly installed by other means. For example, enterprise
+  // policy, being part of Chrome per se (but implemented as an extension), or
+  // installed as a side effect of installing third party software.
+  //
   // NOTE: These values are stored as integers in the preferences and used
   // in histograms so don't remove or reorder existing items.  Just append
   // to the end.
   enum Location {
     INVALID_LOCATION,
-    INTERNAL,           // A crx file from the internal Extensions directory.
+    INTERNAL,  // A crx file from the internal Extensions directory. This
+               // includes extensions explicitly installed by the user. It also
+               // includes installed-by-default extensions that are not part of
+               // Chrome itself (and thus not a COMPONENT), but are part of a
+               // larger system (such as Chrome OS).
     EXTERNAL_PREF,      // A crx file from an external directory (via prefs).
     EXTERNAL_REGISTRY,  // A crx file from an external directory (via eg the
                         // registry on Windows).
diff --git a/extensions/renderer/extension_url_loader_throttle.cc b/extensions/renderer/extension_url_loader_throttle.cc
index cd8ec20..2693271c2 100644
--- a/extensions/renderer/extension_url_loader_throttle.cc
+++ b/extensions/renderer/extension_url_loader_throttle.cc
@@ -43,9 +43,9 @@
 
 void ExtensionURLLoaderThrottle::WillProcessResponse(
     const GURL& response_url,
-    const network::ResourceResponseHead& response_head,
+    network::ResourceResponseHead* response_head,
     bool* defer) {
-  manager_->WillProcessResponse(response_url, response_head);
+  manager_->WillProcessResponse(response_url, *response_head);
 }
 
 void ExtensionURLLoaderThrottle::DetachFromCurrentSequence() {}
diff --git a/extensions/renderer/extension_url_loader_throttle.h b/extensions/renderer/extension_url_loader_throttle.h
index d8e6330..5c76b354 100644
--- a/extensions/renderer/extension_url_loader_throttle.h
+++ b/extensions/renderer/extension_url_loader_throttle.h
@@ -34,7 +34,7 @@
       bool* defer,
       std::vector<std::string>* to_be_removed_request_headers) override;
   void WillProcessResponse(const GURL& response_url,
-                           const network::ResourceResponseHead& response_head,
+                           network::ResourceResponseHead* response_head,
                            bool* defer) override;
 
  private:
diff --git a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc
index fb1a9751..8a70c64 100644
--- a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc
+++ b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.cc
@@ -138,7 +138,7 @@
  private:
   // content::URLLoaderThrottle overrides;
   void WillProcessResponse(const GURL& response_url,
-                           const network::ResourceResponseHead& response_head,
+                           network::ResourceResponseHead* response_head,
                            bool* defer) override {
     network::mojom::URLLoaderPtr dummy_new_loader;
     mojo::MakeRequest(&dummy_new_loader);
@@ -158,7 +158,7 @@
 
     // Make a deep copy of ResourceResponseHead before passing it cross-thread.
     auto resource_response = base::MakeRefCounted<network::ResourceResponse>();
-    resource_response->head = response_head;
+    resource_response->head = *response_head;
     auto deep_copied_response = resource_response->DeepCopy();
     transferrable_loader->head = std::move(deep_copied_response->head);
     container_->SetEmbeddedLoader(std::move(transferrable_loader));
diff --git a/extensions/shell/BUILD.gn b/extensions/shell/BUILD.gn
index 2b5eddd..2a2293db 100644
--- a/extensions/shell/BUILD.gn
+++ b/extensions/shell/BUILD.gn
@@ -87,6 +87,7 @@
   sources = [
     "app/shell_main_delegate.cc",
     "app/shell_main_delegate.h",
+    "app/shell_main_delegate_mac.mm",
     "browser/api/feedback_private/shell_feedback_private_delegate.cc",
     "browser/api/feedback_private/shell_feedback_private_delegate.h",
     "browser/api/identity/identity_api.cc",
@@ -115,8 +116,6 @@
     "browser/shell_browser_main_delegate.h",
     "browser/shell_browser_main_parts.cc",
     "browser/shell_browser_main_parts.h",
-    "browser/shell_browser_main_parts_mac.h",
-    "browser/shell_browser_main_parts_mac.mm",
     "browser/shell_content_browser_client.cc",
     "browser/shell_content_browser_client.h",
     "browser/shell_desktop_controller_mac.h",
@@ -403,10 +402,6 @@
     sources += [ "browser/shell_desktop_controller_aura_browsertest.cc" ]
     deps += [ "//ui/aura" ]
   }
-
-  if (is_mac) {
-    sources += [ "test/test_shell_main_delegate_mac.mm" ]
-  }
 }
 
 source_set("unit_tests") {
diff --git a/extensions/shell/app/DEPS b/extensions/shell/app/DEPS
index 0001870..7b4a9a1f 100644
--- a/extensions/shell/app/DEPS
+++ b/extensions/shell/app/DEPS
@@ -9,4 +9,8 @@
   "+content/public/utility",
   "+sandbox",
   "+services/service_manager/embedder",
+
+  # Pieces of content_shell reused in app_shell.
+  # TODO(jamescook): Eliminate these. http://crbug.com/438283
+  "+content/shell/browser/shell_application_mac.h",
 ]
diff --git a/extensions/shell/app/shell_main_delegate.h b/extensions/shell/app/shell_main_delegate.h
index 4d954fd4..9a07768 100644
--- a/extensions/shell/app/shell_main_delegate.h
+++ b/extensions/shell/app/shell_main_delegate.h
@@ -40,6 +40,9 @@
 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
   void ZygoteForked() override;
 #endif
+#if defined(OS_MACOSX)
+  void PreContentInitialization() override;
+#endif
 
  private:
   // |process_type| is zygote, renderer, utility, etc. Returns true if the
diff --git a/extensions/shell/test/test_shell_main_delegate_mac.mm b/extensions/shell/app/shell_main_delegate_mac.mm
similarity index 75%
rename from extensions/shell/test/test_shell_main_delegate_mac.mm
rename to extensions/shell/app/shell_main_delegate_mac.mm
index 09583cc..a3bb4a33 100644
--- a/extensions/shell/test/test_shell_main_delegate_mac.mm
+++ b/extensions/shell/app/shell_main_delegate_mac.mm
@@ -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 "extensions/shell/test/test_shell_main_delegate.h"
+#include "extensions/shell/app/shell_main_delegate.h"
 
 #include "content/shell/browser/shell_application_mac.h"
 
 namespace extensions {
 
-void TestShellMainDelegate::PreContentInitialization() {
+void ShellMainDelegate::PreContentInitialization() {
   // Force the NSApplication subclass to be used.
   [ShellCrApplication sharedApplication];
 }
diff --git a/extensions/shell/browser/DEPS b/extensions/shell/browser/DEPS
index ac34117..7086c3f 100644
--- a/extensions/shell/browser/DEPS
+++ b/extensions/shell/browser/DEPS
@@ -15,7 +15,6 @@
 
   # Pieces of content_shell reused in app_shell.
   # TODO(jamescook): Eliminate these. http://crbug.com/438283
-  "+content/shell/browser/shell_application_mac.h",
   "+content/shell/browser/shell_browser_context.h",
   "+content/shell/browser/shell_devtools_manager_delegate.h",
   "+content/shell/browser/shell_url_request_context_getter.h",
diff --git a/extensions/shell/browser/shell_browser_main_parts.cc b/extensions/shell/browser/shell_browser_main_parts.cc
index 0f2d390..47d12d3 100644
--- a/extensions/shell/browser/shell_browser_main_parts.cc
+++ b/extensions/shell/browser/shell_browser_main_parts.cc
@@ -66,10 +66,6 @@
 #include "device/bluetooth/dbus/dbus_thread_manager_linux.h"
 #endif
 
-#if defined(OS_MACOSX)
-#include "extensions/shell/browser/shell_browser_main_parts_mac.h"
-#endif
-
 #if BUILDFLAG(ENABLE_NACL)
 #include "components/nacl/browser/nacl_browser.h"
 #include "components/nacl/browser/nacl_process_host.h"
@@ -116,9 +112,6 @@
 #if defined(USE_AURA) && defined(USE_X11)
   ui::TouchFactory::SetTouchDeviceListFromCommandLine();
 #endif
-#if defined(OS_MACOSX)
-  MainPartsPreMainMessageLoopStartMac();
-#endif
 }
 
 void ShellBrowserMainParts::PostMainMessageLoopStart() {
diff --git a/extensions/shell/browser/shell_browser_main_parts_mac.h b/extensions/shell/browser/shell_browser_main_parts_mac.h
deleted file mode 100644
index f250a7a..0000000
--- a/extensions/shell/browser/shell_browser_main_parts_mac.h
+++ /dev/null
@@ -1,15 +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 EXTENSIONS_SHELL_BROWSER_SHELL_BROWSER_MAIN_PARTS_MAC_H_
-#define EXTENSIONS_SHELL_BROWSER_SHELL_BROWSER_MAIN_PARTS_MAC_H_
-
-namespace extensions {
-
-// Called from ShellBrowserMainParts::PreMainMessageLoopStart.
-void MainPartsPreMainMessageLoopStartMac();
-
-}  // namespace extensions
-
-#endif  // EXTENSIONS_SHELL_BROWSER_SHELL_BROWSER_MAIN_PARTS_MAC_H_
diff --git a/extensions/shell/browser/shell_browser_main_parts_mac.mm b/extensions/shell/browser/shell_browser_main_parts_mac.mm
deleted file mode 100644
index 9fe902dc..0000000
--- a/extensions/shell/browser/shell_browser_main_parts_mac.mm
+++ /dev/null
@@ -1,16 +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 "extensions/shell/browser/shell_browser_main_parts.h"
-
-#import "content/shell/browser/shell_application_mac.h"
-
-namespace extensions {
-
-void MainPartsPreMainMessageLoopStartMac() {
-  // Force the NSApplication subclass to be used.
-  [ShellCrApplication sharedApplication];
-}
-
-}  // namespace extensions
diff --git a/extensions/shell/test/test_shell_main_delegate.h b/extensions/shell/test/test_shell_main_delegate.h
index 286c4f9..89014b27c 100644
--- a/extensions/shell/test/test_shell_main_delegate.h
+++ b/extensions/shell/test/test_shell_main_delegate.h
@@ -25,9 +25,6 @@
  protected:
   // content::ContentMainDelegate implementation:
   content::ContentUtilityClient* CreateContentUtilityClient() override;
-#if defined(OS_MACOSX)
-  void PreContentInitialization() override;
-#endif
 
  private:
   std::unique_ptr<content::ContentUtilityClient> utility_client_;
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc
index b2b52ec..df79cc6 100644
--- a/gpu/config/gpu_finch_features.cc
+++ b/gpu/config/gpu_finch_features.cc
@@ -45,4 +45,8 @@
                                              base::FEATURE_DISABLED_BY_DEFAULT};
 #endif
 
+// Overrides preferred overlay format to NV12 instead of YUY2.
+const base::Feature kDirectCompositionPreferNV12Overlays{
+    "DirectCompositionPreferNV12Overlays", base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace features
diff --git a/gpu/config/gpu_finch_features.h b/gpu/config/gpu_finch_features.h
index 3f7aa38..9b064a3 100644
--- a/gpu/config/gpu_finch_features.h
+++ b/gpu/config/gpu_finch_features.h
@@ -28,6 +28,8 @@
 GPU_EXPORT extern const base::Feature kAImageReaderMediaPlayer;
 #endif  // defined(OS_ANDROID)
 
+GPU_EXPORT extern const base::Feature kDirectCompositionPreferNV12Overlays;
+
 }  // namespace features
 
 #endif  // GPU_CONFIG_GPU_FEATURES_H_
diff --git a/gpu/config/gpu_info.cc b/gpu/config/gpu_info.cc
index 1de8bed3..2167245 100644
--- a/gpu/config/gpu_info.cc
+++ b/gpu/config/gpu_info.cc
@@ -66,17 +66,13 @@
 
 const char* OverlayFormatToString(OverlayFormat format) {
   switch (format) {
-    case OverlayFormat::UNKNOWN:
-      return "UNKNOWN";
-    case OverlayFormat::BGRA:
+    case OverlayFormat::kBGRA:
       return "BGRA";
-    case OverlayFormat::YUY2:
+    case OverlayFormat::kYUY2:
       return "YUY2";
-    case OverlayFormat::NV12:
+    case OverlayFormat::kNV12:
       return "NV12";
   }
-  NOTREACHED() << "Unknown overlay format: " << static_cast<int>(format);
-  return "UNKNOWN";
 }
 
 bool OverlayCapability::operator==(const OverlayCapability& other) const {
diff --git a/gpu/config/gpu_info.h b/gpu/config/gpu_info.h
index 21c70eb..651800a 100644
--- a/gpu/config/gpu_info.h
+++ b/gpu/config/gpu_info.h
@@ -90,13 +90,10 @@
 using VideoEncodeAcceleratorSupportedProfiles =
     std::vector<VideoEncodeAcceleratorSupportedProfile>;
 
-// Subset of DXGI_FORMAT that we're interested in.
-enum class OverlayFormat {
-  UNKNOWN,
-  BGRA,  // DXGI_FORMAT_B8G8R8A8_UNORM
-  YUY2,  // DXGI_FORMAT_YUY2
-  NV12,  // DXGI_FORMAT_NV12
-};
+// Common overlay formats that we're interested in. Must match the OverlayFormat
+// enum in //tools/metrics/histograms/enums.xml. Mapped to corresponding DXGI
+// formats in DirectCompositionSurfaceWin.
+enum class OverlayFormat { kBGRA = 0, kYUY2 = 1, kNV12 = 2, kMaxValue = kNV12 };
 
 GPU_EXPORT const char* OverlayFormatToString(OverlayFormat format);
 
diff --git a/gpu/ipc/common/gpu_info.mojom b/gpu/ipc/common/gpu_info.mojom
index bf56d85..cad864d4 100644
--- a/gpu/ipc/common/gpu_info.mojom
+++ b/gpu/ipc/common/gpu_info.mojom
@@ -78,7 +78,6 @@
 
 // gpu::OverlayFormat
 enum OverlayFormat {
-  UNKNOWN,
   BGRA,
   YUY2,
   NV12,
diff --git a/gpu/ipc/common/gpu_info_struct_traits.cc b/gpu/ipc/common/gpu_info_struct_traits.cc
index cd6a8fe..80ebc5f 100644
--- a/gpu/ipc/common/gpu_info_struct_traits.cc
+++ b/gpu/ipc/common/gpu_info_struct_traits.cc
@@ -224,38 +224,30 @@
 EnumTraits<gpu::mojom::OverlayFormat, gpu::OverlayFormat>::ToMojom(
     gpu::OverlayFormat format) {
   switch (format) {
-    case gpu::OverlayFormat::UNKNOWN:
-      return gpu::mojom::OverlayFormat::UNKNOWN;
-    case gpu::OverlayFormat::BGRA:
+    case gpu::OverlayFormat::kBGRA:
       return gpu::mojom::OverlayFormat::BGRA;
-    case gpu::OverlayFormat::YUY2:
+    case gpu::OverlayFormat::kYUY2:
       return gpu::mojom::OverlayFormat::YUY2;
-    case gpu::OverlayFormat::NV12:
+    case gpu::OverlayFormat::kNV12:
       return gpu::mojom::OverlayFormat::NV12;
   }
-  NOTREACHED() << "Unknown overlay format: " << static_cast<int>(format);
-  return gpu::mojom::OverlayFormat::UNKNOWN;
 }
 
 bool EnumTraits<gpu::mojom::OverlayFormat, gpu::OverlayFormat>::FromMojom(
     gpu::mojom::OverlayFormat input,
     gpu::OverlayFormat* out) {
   switch (input) {
-    case gpu::mojom::OverlayFormat::UNKNOWN:
-      *out = gpu::OverlayFormat::UNKNOWN;
-      return true;
     case gpu::mojom::OverlayFormat::BGRA:
-      *out = gpu::OverlayFormat::BGRA;
-      return true;
+      *out = gpu::OverlayFormat::kBGRA;
+      break;
     case gpu::mojom::OverlayFormat::YUY2:
-      *out = gpu::OverlayFormat::YUY2;
-      return true;
+      *out = gpu::OverlayFormat::kYUY2;
+      break;
     case gpu::mojom::OverlayFormat::NV12:
-      *out = gpu::OverlayFormat::NV12;
-      return true;
+      *out = gpu::OverlayFormat::kNV12;
+      break;
   }
-  NOTREACHED() << "Unknown overlay format: " << input;
-  return false;
+  return true;
 }
 
 // static
diff --git a/gpu/ipc/common/struct_traits_unittest.cc b/gpu/ipc/common/struct_traits_unittest.cc
index 691154b..95e18dc3 100644
--- a/gpu/ipc/common/struct_traits_unittest.cc
+++ b/gpu/ipc/common/struct_traits_unittest.cc
@@ -157,7 +157,7 @@
   const bool direct_composition = true;
   const bool supports_overlays = true;
   const gpu::OverlayCapabilities overlay_capabilities = {
-      {OverlayFormat::BGRA, false}, {OverlayFormat::NV12, true}};
+      {OverlayFormat::kBGRA, false}, {OverlayFormat::kNV12, true}};
   const DxDiagNode dx_diagnostics;
 #endif
   const gpu::VideoDecodeAcceleratorCapabilities
diff --git a/gpu/ipc/service/direct_composition_surface_win.cc b/gpu/ipc/service/direct_composition_surface_win.cc
index e6ac830..535564f 100644
--- a/gpu/ipc/service/direct_composition_surface_win.cc
+++ b/gpu/ipc/service/direct_composition_surface_win.cc
@@ -104,26 +104,33 @@
 };
 
 struct OverlaySupportInfo {
-  DXGI_FORMAT dxgi_format;
   OverlayFormat overlay_format;
+  DXGI_FORMAT dxgi_format;
   UINT flags;
 };
 
 bool g_overlay_support_initialized = false;
 
-// These are for YUY2 overlays.
+// These indicate support for either NV12 or YUY2 overlays.
 bool g_supports_overlays = false;
 bool g_supports_scaled_overlays = true;
 gfx::Size g_overlay_monitor_size;
 
-OverlaySupportInfo g_overlay_support_info[] = {
-    {DXGI_FORMAT_B8G8R8A8_UNORM, OverlayFormat::BGRA, 0},
-    {DXGI_FORMAT_YUY2, OverlayFormat::YUY2, 0},
-    {DXGI_FORMAT_NV12, OverlayFormat::NV12, 0},
-};
+// Overridden when NV12 is supported, and kDirectCompositionPreferNV12Overlays
+// finch feature is enabled. Default value is set to YUY2 so that we use a valid
+// format for swap chains when forced to enable overlay code path but hardware
+// overlays are not supported.
+OverlayFormat g_overlay_format_used = OverlayFormat::kYUY2;
+DXGI_FORMAT g_overlay_dxgi_format_used = DXGI_FORMAT_YUY2;
 
 // This is the raw support info, which shouldn't depend on field trial state, or
-// command line flags.
+// command line flags. Ordered by most preferred to least preferred format.
+OverlaySupportInfo g_overlay_support_info[] = {
+    {OverlayFormat::kNV12, DXGI_FORMAT_NV12, 0},
+    {OverlayFormat::kYUY2, DXGI_FORMAT_YUY2, 0},
+    {OverlayFormat::kBGRA, DXGI_FORMAT_B8G8R8A8_UNORM, 0},
+};
+
 void InitializeHardwareOverlaySupport() {
   if (g_overlay_support_initialized)
     return;
@@ -178,13 +185,29 @@
               info.dxgi_format, d3d11_device.Get(), &info.flags))) {
         continue;
       }
+      // Formats are ordered by most preferred to least preferred. Don't choose
+      // a less preferred format, but keep going so that we can record overlay
+      // support for all formats in UMA.
+      if (g_supports_overlays)
+        continue;
+      // Don't use BGRA overlays in any case, but record support in UMA.
+      if (info.overlay_format == OverlayFormat::kBGRA)
+        continue;
+      // Overlays are supported for NV12 only if the feature flag to prefer NV12
+      // over YUY2 is enabled.
+      bool prefer_nv12 = base::FeatureList::IsEnabled(
+          features::kDirectCompositionPreferNV12Overlays);
+      if (info.overlay_format == OverlayFormat::kNV12 && !prefer_nv12)
+        continue;
       // Some new Intel drivers only claim to support unscaled overlays, but
       // scaled overlays still work. Even when scaled overlays aren't actually
       // supported, presentation using the overlay path should be relatively
       // efficient.
-      if (info.dxgi_format == DXGI_FORMAT_YUY2 &&
-          (info.flags & (DXGI_OVERLAY_SUPPORT_FLAG_DIRECT |
-                         DXGI_OVERLAY_SUPPORT_FLAG_SCALING))) {
+      if (info.flags & (DXGI_OVERLAY_SUPPORT_FLAG_DIRECT |
+                        DXGI_OVERLAY_SUPPORT_FLAG_SCALING)) {
+        g_overlay_format_used = info.overlay_format;
+        g_overlay_dxgi_format_used = info.dxgi_format;
+
         g_supports_overlays = true;
         g_supports_scaled_overlays =
             !!(info.flags & DXGI_OVERLAY_SUPPORT_FLAG_SCALING);
@@ -196,17 +219,24 @@
         }
       }
     }
+    // Early out after the first output that reports overlay support. All
+    // outputs are expected to report the same overlay support according to
+    // Microsoft's WDDM documentation:
+    // https://docs.microsoft.com/en-us/windows-hardware/drivers/display/multiplane-overlay-hardware-requirements
+    // TODO(sunnyps): If the above is true, then we can only look at first
+    // output instead of iterating over all outputs.
     if (g_supports_overlays)
       break;
   }
-
   for (const auto& info : g_overlay_support_info) {
     const std::string kOverlaySupportFlagsUmaPrefix =
-        "GPU.DirectComposition.OverlaySupportFlags.";
+        "GPU.DirectComposition.OverlaySupportFlags2.";
     base::UmaHistogramSparse(kOverlaySupportFlagsUmaPrefix +
                                  OverlayFormatToString(info.overlay_format),
                              info.flags);
   }
+  UMA_HISTOGRAM_ENUMERATION("GPU.DirectComposition.OverlayFormatUsed",
+                            g_overlay_format_used);
   UMA_HISTOGRAM_BOOLEAN("GPU.DirectComposition.OverlaysSupported",
                         g_supports_overlays);
 }
@@ -358,19 +388,19 @@
   // Returns true if the video processor changed.
   bool InitializeVideoProcessor(const gfx::Size& in_size,
                                 const gfx::Size& out_size);
-  bool ReallocateSwapChain(bool yuy2, bool protected_video);
-  bool ShouldBeYUY2();
+  bool ReallocateSwapChain(bool yuv, bool protected_video);
+  bool ShouldUseYUVSwapChain();
 
   DCLayerTree* surface_;
 
   gfx::Size swap_chain_size_;
   gfx::Size processor_input_size_;
   gfx::Size processor_output_size_;
-  bool is_yuy2_swapchain_ = false;
+  bool is_yuv_swapchain_ = false;
   bool is_protected_video_ = false;
 
   PresentationHistory presentation_history_;
-  bool failed_to_create_yuy2_swapchain_ = false;
+  bool failed_to_create_yuv_swapchain_ = false;
   int frames_since_color_space_change_ = 0;
 
   // These are the GLImages that were presented in the last frame.
@@ -486,27 +516,27 @@
 
 DCLayerTree::SwapChainPresenter::~SwapChainPresenter() {}
 
-bool DCLayerTree::SwapChainPresenter::ShouldBeYUY2() {
-  // Always prefer YUY2 for protected video for now.
+bool DCLayerTree::SwapChainPresenter::ShouldUseYUVSwapChain() {
+  // Always prefer YUV swap chain for protected video for now.
   // TODO(crbug.com/850799): Assess power/perf impact when protected video
   // swap chain is composited by DWM.
   if (is_protected_video_)
     return true;
 
-  // Start out as YUY2.
+  // Start out as YUV.
   if (!presentation_history_.valid())
     return true;
   int composition_count = presentation_history_.composed_count();
 
-  // It's more efficient to use a BGRA backbuffer instead of YUY2 if overlays
+  // It's more efficient to use a BGRA backbuffer instead of YUV if overlays
   // aren't being used, as otherwise DWM will use the video processor a second
   // time to convert it to BGRA before displaying it on screen.
 
-  if (is_yuy2_swapchain_) {
+  if (is_yuv_swapchain_) {
     // Switch to BGRA once 3/4 of presents are composed.
     return composition_count < (PresentationHistory::kPresentsToStore * 3 / 4);
   } else {
-    // Switch to YUY2 once 3/4 are using overlays (or unknown).
+    // Switch to YUV once 3/4 are using overlays (or unknown).
     return composition_count < (PresentationHistory::kPresentsToStore / 4);
   }
 }
@@ -608,15 +638,15 @@
   if (!InitializeVideoProcessor(video_input_size, swap_chain_size))
     return false;
 
-  bool yuy2_swapchain = ShouldBeYUY2();
+  bool use_yuv_swapchain = ShouldUseYUVSwapChain();
   bool first_present = false;
   if (!swap_chain_ || swap_chain_size_ != swap_chain_size ||
       is_protected_video_ != params.is_protected_video ||
-      ((yuy2_swapchain != is_yuy2_swapchain_) &&
-       !failed_to_create_yuy2_swapchain_)) {
+      ((use_yuv_swapchain != is_yuv_swapchain_) &&
+       !failed_to_create_yuv_swapchain_)) {
     first_present = true;
     swap_chain_size_ = swap_chain_size;
-    ReallocateSwapChain(yuy2_swapchain, params.is_protected_video);
+    ReallocateSwapChain(use_yuv_swapchain, params.is_protected_video);
   } else if (last_gl_images_ == params.image) {
     // The swap chain is presenting the same images as last swap, which means
     // that the images were never returned to the video decoder and should
@@ -686,7 +716,7 @@
   }
 
   gfx::ColorSpace output_color_space =
-      is_yuy2_swapchain_ ? src_color_space : gfx::ColorSpace::CreateSRGB();
+      is_yuv_swapchain_ ? src_color_space : gfx::ColorSpace::CreateSRGB();
   if (base::FeatureList::IsEnabled(kFallbackBT709VideoToBT601) &&
       (output_color_space == gfx::ColorSpace::CreateREC709())) {
     output_color_space = gfx::ColorSpace::CreateREC601();
@@ -697,8 +727,8 @@
     DCHECK(swap_chain3);
     DXGI_COLOR_SPACE_TYPE color_space =
         gfx::ColorSpaceWin::GetDXGIColorSpace(output_color_space);
-    if (is_yuy2_swapchain_) {
-      // Swapchains with YUY2 textures can't have RGB color spaces.
+    if (is_yuv_swapchain_) {
+      // Swapchains with YUV textures can't have RGB color spaces.
       switch (color_space) {
         case DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709:
         case DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709:
@@ -839,7 +869,7 @@
   }
 
   UMA_HISTOGRAM_BOOLEAN("GPU.DirectComposition.SwapchainFormat",
-                        is_yuy2_swapchain_);
+                        is_yuv_swapchain_);
   frames_since_color_space_change_++;
 
   Microsoft::WRL::ComPtr<IDXGISwapChainMedia> swap_chain_media;
@@ -876,7 +906,7 @@
 }
 
 bool DCLayerTree::SwapChainPresenter::ReallocateSwapChain(
-    bool yuy2,
+    bool use_yuv,
     bool protected_video) {
   TRACE_EVENT0("gpu", "DCLayerTree::SwapChainPresenter::ReallocateSwapChain");
   swap_chain_.Reset();
@@ -896,7 +926,7 @@
   DCHECK(!swap_chain_size_.IsEmpty());
   desc.Width = swap_chain_size_.width();
   desc.Height = swap_chain_size_.height();
-  desc.Format = DXGI_FORMAT_YUY2;
+  desc.Format = g_overlay_dxgi_format_used;
   desc.Stereo = FALSE;
   desc.SampleDesc.Count = 1;
   desc.BufferCount = 2;
@@ -917,7 +947,7 @@
 
   swap_chain_handle_.Set(handle);
 
-  if (is_yuy2_swapchain_ != yuy2) {
+  if (is_yuv_swapchain_ != use_yuv) {
     UMA_HISTOGRAM_COUNTS_1000(
         "GPU.DirectComposition.FramesSinceColorSpaceChange",
         frames_since_color_space_change_);
@@ -925,22 +955,24 @@
 
   frames_since_color_space_change_ = 0;
 
-  is_yuy2_swapchain_ = false;
+  is_yuv_swapchain_ = false;
   // The composition surface handle isn't actually used, but
-  // CreateSwapChainForComposition can't create YUY2 swapchains.
-  if (yuy2) {
+  // CreateSwapChainForComposition can't create YUV swapchains.
+  if (use_yuv) {
     HRESULT hr = media_factory->CreateSwapChainForCompositionSurfaceHandle(
         d3d11_device_.Get(), swap_chain_handle_.Get(), &desc, nullptr,
         swap_chain_.GetAddressOf());
-    is_yuy2_swapchain_ = SUCCEEDED(hr);
-    failed_to_create_yuy2_swapchain_ = !is_yuy2_swapchain_;
+    is_yuv_swapchain_ = SUCCEEDED(hr);
+    failed_to_create_yuv_swapchain_ = !is_yuv_swapchain_;
     if (FAILED(hr)) {
-      DLOG(ERROR) << "Failed to create YUY2 swap chain with error " << std::hex
-                  << hr << ". Falling back to BGRA";
+      DLOG(ERROR) << "Failed to create "
+                  << OverlayFormatToString(g_overlay_format_used)
+                  << " swap chain with error " << std::hex << hr
+                  << ". Falling back to BGRA";
     }
   }
 
-  if (!is_yuy2_swapchain_) {
+  if (!is_yuv_swapchain_) {
     desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
     desc.Flags = 0;
     if (protected_video) {
@@ -1118,7 +1150,7 @@
   if (g_supports_scaled_overlays)
     swap_chain_size.SetToMin(ceiled_input_size);
 
-  // YUY2 surfaces must have an even width.
+  // YUV surfaces must have an even width.
   if (swap_chain_size.width() % 2 == 1)
     swap_chain_size.set_width(swap_chain_size.width() + 1);
 
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb
index 4b0bc36..a52f20fa 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb
@@ -16,6 +16,7 @@
 <translation id="2647554856022461007">Chromium የአሰሳ ተሞክሮዎን ለማሻሻል የድር አገልግሎቶችን ሊጠቀም ይችላል። እነዚህን አገልግሎቶች በአማራጭነት ሊያሰናክሏቸው ይችላሉ። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">የGoogle ዘመናዊ ነገሮችን በChromium ውስጥ ያግኙ</translation>
 <translation id="2730884209570016437">ሌላ መተግበሪያ ካሜራዎን እየተጠቀመበት ስለሆነ Chromium ካሜራዎን መጠቀም አይችልም</translation>
+<translation id="2797210818057553964">ይህን በማንኛውም ጊዜ በChromium ቅንብሮች ውስጥ ማበጀት ይችላሉ</translation>
 <translation id="3256316712990552818">ወደ Chromium ተቀድቷል</translation>
 <translation id="3413120535237193088">የእርስዎን ዕልባቶች በሁሉም መሣሪያዎችዎ ላይ ለማግኘት ወደ Chromium ይግቡ።</translation>
 <translation id="3473048256428424907">የChromium ኪውአር መቃኛን ያብሩ</translation>
@@ -44,6 +45,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">የተመረጠው ውሂብ ከChromium እና የሰመሩ መሣሪያዎች ተወግዷል። የGoogle መለያዎ history.google.com ላይ እንደ የሌሎች Google አገልግሎቶች ፍለጋዎች እና እንቅስቃሴ ያለ ሌሎች የአሰሳ ታሪክ ዓይነት ሊኖረው ይችላል።</translation>
 <translation id="7400689562045506105">Chromiumን በሁሉም ቦታ ይጠቀሙ</translation>
+<translation id="7499048969477415415">በChromium ውስጥ ስምረትን፣ ግላዊነት ማላበስን እና ሌሎች የGoogle አገልግሎቶችን የሚቆጣጠሩ ቅንብሮች ተቀይረዋል። ይህ በአሁኑ ቅንብሮችዎ ላይ ተጽዕኖ ሊኖረው ይችላል።</translation>
 <translation id="7674213385180944843">ቅንብሮች &gt; ግላዊነት &gt; ካሜራ &gt; Chromium ይክፈቱ እና ማይክሮፎን ያብሩ።</translation>
 <translation id="7746854981345936341">የChromium ጠቃሚ ምክር። አሁን እንደ ተመለስ፣ ወደፊት እና ፍለጋ ያሉ አንዳንድ አዝራሮች አሁን በማያ ገጽዎ አናት ላይ ነው ያሉት።</translation>
 <translation id="786327964234957808">የስምረት መለያዎችን ከ<ph name="USER_EMAIL1" /> ወደ <ph name="USER_EMAIL2" /> እየቀየሩ ነው። ነባሩ የChromium ውሂብዎ በ<ph name="DOMAIN" /> ነው የሚተዳደረው። ይሄ ውሂብዎን ከዚህ መሣሪያዎ ይሰርዘዋል፣ ነገር ግን ውሂብዎ በ<ph name="USER_EMAIL1" /> ውስጥ እንዳለ ይቀራል።</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
index 4be4106..433640a 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">‏قد يستخدم Chromium خدمات الويب لتحسين تجربة التصفح. يمكنك إيقاف هذه الخدمات بشكل اختياري. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">‏الحصول على ميزات Google الذكية في Chromium</translation>
 <translation id="2730884209570016437">‏يتعذر على Chromium استخدام الكاميرا نظرًا لأنها قيد الاستخدام من قِبل تطبيق آخر</translation>
+<translation id="2797210818057553964">‏يمكنك تخصيص هذا في أي وقت في "إعدادات Chromium".</translation>
 <translation id="3256316712990552818">‏تم النسخ إلى Chromium</translation>
 <translation id="3413120535237193088">‏للحصول على الإشارات المرجعية على جميع أجهزتك، سجِّل الدخول إلى Chromium.</translation>
 <translation id="3473048256428424907">‏تشغيل الماسح الضوئي للاستجابة السريعة في Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">‏تمت إزالة البيانات المُحددة من Chromium والأجهزة التي تمت مزامنتها. قد يحتوي حسابك في Google على نماذج أخرى من سجل التصفح، مثل عمليات البحث والأنشطة من خدمات Google الأخرى في history.google.com.</translation>
 <translation id="7400689562045506105">‏استخدام Chromium في كل مكان</translation>
+<translation id="7499048969477415415">‏تم تغيير الإعدادات التي تتحكَّم في المزامنة والتخصيص وخدمات Google الأخرى في Chromium. وقد يؤثر هذا في إعداداتك الحالية.</translation>
 <translation id="7674213385180944843">‏افتح الإعدادات &gt; الخصوصية &gt; الكاميرا &gt; Chromium وشغِّل الكاميرا.</translation>
 <translation id="7746854981345936341">‏نصيحة لاستخدام Chromium: تظهر حاليًّا بعض الأزرار في أسفل الشاشة، مثل زر "الرجوع" و"التالي" و"البحث".</translation>
 <translation id="786327964234957808">‏أنت تجري تبديلاً لحسابات المزامنة من <ph name="USER_EMAIL1" /> إلى <ph name="USER_EMAIL2" />. تتم إدارة بيانات Chromium الحالية من خلال <ph name="DOMAIN" />. سيؤدي ذلك إلى حذف بياناتك من هذا الجهاز، ولكن ستظل بياناتك في <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb
index 4afffe9e..75b517c 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Chromium може да използва уеб услуги, за да подобри сърфирането ви. Ако искате, можете да ги деактивирате. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Възползвайте се от интелигентните функции на Google в Chromium</translation>
 <translation id="2730884209570016437">Chromium не може да използва камерата ви, защото е заета от друго приложение</translation>
+<translation id="2797210818057553964">Можете да персонализирате това по всяко време от настройките на Chromium</translation>
 <translation id="3256316712990552818">Копирано в Chromium</translation>
 <translation id="3413120535237193088">Влезте в Chromium, за да получите отметките си на всичките си устройства.</translation>
 <translation id="3473048256428424907">Включване на скенера за QR кодове в Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Избраните данни са премахнати от Chromium и синхронизираните устройства. Възможно е в профила ви в Google да има други видове история на сърфиране, съхранявани на адрес history.google.com – например търсения и активност от други наши услуги.</translation>
 <translation id="7400689562045506105">Използвайте Chromium навсякъде</translation>
+<translation id="7499048969477415415">Настройките за контрол върху синхронизирането, персонализирането и други услуги на Google в Chromium се промениха. Това може да повлияе на настоящите ви настройки.</translation>
 <translation id="7674213385180944843">Отворете „Settings“ &gt; „Privacy“ &gt; „Camera“ &gt; „Chromium“ и включете камерата.</translation>
 <translation id="7746854981345936341">Съвет за Chromium. Някои бутони, например тези за връщане назад, преминаване напред и търсене, вече са в долната част на екрана.</translation>
 <translation id="786327964234957808">Заменяте настоящия профил за синхронизиране (<ph name="USER_EMAIL1" />) с друг (<ph name="USER_EMAIL2" />). Съществуващите ви данни в Chromium се управляват от <ph name="DOMAIN" />. Те ще се изтрият от това устройство, но ще останат в профила <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb
index fddb5226..2420920 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Chromium pot utilitzar serveis web per millorar la navegació, però si vols els pots desactivar. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Gaudeix de les eines intel·ligents de Google a Chromium</translation>
 <translation id="2730884209570016437">Chromium no pot utilitzar la càmera perquè l'està utilitzant una altra aplicació</translation>
+<translation id="2797210818057553964">Pots personalitzar aquesta opció en qualsevol moment des de la configuració de Chronium</translation>
 <translation id="3256316712990552818">Copiada a Chromium</translation>
 <translation id="3413120535237193088">Inicia la sessió a Chromium per accedir a les adreces d'interès des de tots els dispositius.</translation>
 <translation id="3473048256428424907">Activa l'escàner QR de Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Les dades seleccionades s'han suprimit de Chromium i dels dispositius sincronitzats. És possible que el teu compte de Google tingui altres formes de l'historial de navegació a history.google.com, com ara les cerques i l'activitat d'altres serveis de Google.</translation>
 <translation id="7400689562045506105">Utilitza Chromium a tot arreu</translation>
+<translation id="7499048969477415415">La configuració que controla la sincronització, la personalització i altres serveis de Google a Chronium ha canviat. Això pot afectar la teva configuració actual.</translation>
 <translation id="7674213385180944843">Obre Configuració &gt; Privacitat &gt; Càmera &gt; Chromium i activa la càmera.</translation>
 <translation id="7746854981345936341">Consell de Chromium. Ara alguns botons són a la part inferior de la pantalla, per exemple, Enrere, Endavant i Cerca.</translation>
 <translation id="786327964234957808">Estàs canviant el compte de sincronització de <ph name="USER_EMAIL1" /> a <ph name="USER_EMAIL2" />. <ph name="DOMAIN" /> gestiona les teves dades de Chromium. Se suprimiran les teves dades d'aquest dispositiu, però continuaran estant disponibles a <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb
index fb3e4ab..050fbde 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb
@@ -16,6 +16,7 @@
 <translation id="2647554856022461007">Chromium vám může usnadnit prohlížení pomocí webových služeb. Tyto služby můžete případně zakázat. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Získejte do prohlížeče Chromium chytré funkce Google</translation>
 <translation id="2730884209570016437">Chromium nemůže použít fotoaparát, protože jej právě používá jiná aplikace</translation>
+<translation id="2797210818057553964">Toto nastavení můžete kdykoliv upravit v nastavení prohlížeče Chromium</translation>
 <translation id="3256316712990552818">Zkopírováno do prohlížeče Chromium</translation>
 <translation id="3413120535237193088">Chcete-li záložky synchronizovat do všech zařízení, přihlaste se do prohlížeče Chromium.</translation>
 <translation id="3473048256428424907">Zapněte čtečku QR kódů prohlížeče Chromium</translation>
@@ -44,6 +45,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Vybraná data byla z prohlížeče Chromium a synchronizovaných zařízení odstraněna. Na stránce history.google.com mohou být k dispozici další druhy historie prohlížení zaznamenané ve vašem účtu Google, například vyhledávací dotazy a aktivita z ostatních služeb Google.</translation>
 <translation id="7400689562045506105">Používejte Chromium všude</translation>
+<translation id="7499048969477415415">Nastavení, která v prohlížeči Chromium ovládají synchronizaci, personalizaci a další služby Google, se změnila. Může to mít dopad na vaše aktuální nastavení.</translation>
 <translation id="7674213385180944843">Otevřete Nastavení &gt; Soukromí &gt; Kamera &gt; Chromium a zapněte fotoaparát.</translation>
 <translation id="7746854981345936341">Tip pro Chromium. Některá tlačítka, například Zpět, Vpřed a Hledat, jsou teď v dolní části obrazovky.</translation>
 <translation id="786327964234957808">Přepínáte účet pro synchronizaci z <ph name="USER_EMAIL1" /> na <ph name="USER_EMAIL2" />. Vaše existující data prohlížeče Chromium jsou spravována doménou <ph name="DOMAIN" />. Touto akcí svá data smažete z tohoto zařízení, v účtu <ph name="USER_EMAIL1" /> však vaše data zůstanou.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb
index 441ed51..ebf4d79 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Chromium bruger muligvis webtjenester for at forbedre din browseroplevelse. Du kan vælge at deaktivere disse tjenester. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Få Googles smarte funktioner i Chromium</translation>
 <translation id="2730884209570016437">Chromium kan ikke bruge dit kamera, da det bruges af en anden app</translation>
+<translation id="2797210818057553964">Du kan til enhver tid tilpasse dette i Chromium-indstillingerne</translation>
 <translation id="3256316712990552818">Kopieret til Chromium</translation>
 <translation id="3413120535237193088">Log ind på Chromium for at se dine bogmærker på alle dine enheder.</translation>
 <translation id="3473048256428424907">Aktivér QR-scanneren fra Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">De valgte data er fjernet fra Chromium og synkroniserede enheder. Din Google-konto kan have andre former for browserhistorik, f.eks. søgninger og aktivitet fra andre Google-tjenester, på history.google.com.</translation>
 <translation id="7400689562045506105">Brug Chromium, uanset hvor du er</translation>
+<translation id="7499048969477415415">De indstillinger, der styrer synkronisering, tilpasning og andre Google-tjenester i Chromium, er blevet ændret. Dette kan påvirke dine aktuelle indstillinger.</translation>
 <translation id="7674213385180944843">Åbn Indstillinger &gt; Privatliv &gt; Kamera &gt; Chromium, og slå kameraet til.</translation>
 <translation id="7746854981345936341">Chromium-tip. Nogle knapper som f.eks. Tilbage, Frem og Søg findes nu nederst på skærmen.</translation>
 <translation id="786327964234957808">Du er ved at skifte synkroniseringskonto fra <ph name="USER_EMAIL1" /> til <ph name="USER_EMAIL2" />. Dine eksisterende Chromium-data administreres af <ph name="DOMAIN" />. Denne handling sletter dine data fra denne enhed, men dine data forbliver gemt på <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb
index f43d10c..034b879 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb
@@ -16,6 +16,7 @@
 <translation id="2647554856022461007">Chromium verwendet möglicherweise Webdienste zur Verbesserung Ihrer Nutzererfahrung beim Surfen im Internet. Sie haben die Möglichkeit, diese Dienste zu deaktivieren. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Chromium intelligent nutzen mit Google</translation>
 <translation id="2730884209570016437">Chromium kann nicht auf die Kamera zugreifen, da diese gerade von einer anderen App verwendet wird</translation>
+<translation id="2797210818057553964">Diese Option lässt sich jederzeit in den Chromium-Einstellungen anpassen</translation>
 <translation id="3256316712990552818">In Chromium kopiert</translation>
 <translation id="3413120535237193088">Melden Sie sich in Chromium an, um Ihre Lesezeichen auf allen Ihren Geräten zu haben.</translation>
 <translation id="3473048256428424907">Chromium QR-Scanner aktivieren</translation>
@@ -44,6 +45,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Die ausgewählten Daten wurden aus Chromium und von allen synchronisierten Geräten entfernt. Eventuell finden Sie unter history.google.com weitere Arten von Browserverlaufsdaten wie Suchanfragen oder Aktivitäten anderer Google-Dienste für Ihr Google-Konto.</translation>
 <translation id="7400689562045506105">Chromium überall nutzen</translation>
+<translation id="7499048969477415415">Die Einstellungen für die Synchronisierung, Personalisierung und andere Google-Dienste in Chromium wurden geändert. Dadurch könnten sich auch Ihre aktuellen Einstellungen geändert haben.</translation>
 <translation id="7674213385180944843">Öffnen Sie "Einstellungen" &gt; "Datenschutz" &gt; "Kamera" &gt; "Chromium" und aktivieren Sie die Kamera.</translation>
 <translation id="7746854981345936341">Chromium-Tipp: Manche Schaltflächen wie "Zurück", "Weiter" und "Suche" befinden sich jetzt unten auf dem Bildschirm.</translation>
 <translation id="786327964234957808">Sie stellen die Kontosynchronisierung von <ph name="USER_EMAIL1" /> auf <ph name="USER_EMAIL2" /> um. Ihre bestehenden Chromium-Daten werden von <ph name="DOMAIN" /> verwaltet. Dadurch werden Ihre Daten von diesem Gerät gelöscht, bleiben jedoch in <ph name="USER_EMAIL1" /> erhalten.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb
index 394e34a..c17ff3d 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Το Chromium ενδέχεται να χρησιμοποιεί υπηρεσίες ιστού για να βελτιώσει την εμπειρία περιήγησής σας. Μπορείτε, εάν θέλετε, να απενεργοποιήσετε αυτές τις υπηρεσίες. <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Έξυπνες λειτουργίες Google στο Chromium</translation>
 <translation id="2730884209570016437">Το Chromium δεν μπορεί να χρησιμοποιήσει την κάμερά σας επειδή χρησιμοποιείται από μια άλλη εφαρμογή</translation>
+<translation id="2797210818057553964">Μπορείτε να προσαρμόσετε αυτό το στοιχείο ανά πάσα στιγμή από τις ρυθμίσεις του Chromium</translation>
 <translation id="3256316712990552818">Αντιγράφηκε στο Chromium</translation>
 <translation id="3413120535237193088">Για να εμφανίζονται οι σελιδοδείκτες σε όλες τις συσκευές σας, συνδεθείτε στο Chromium.</translation>
 <translation id="3473048256428424907">Ενεργοποίηση σαρωτή QR Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Τα επιλεγμένα δεδομένα καταργήθηκαν από το Chromium και από τις συγχρονισμένες συσκευές. Ο Λογαριασμός σας Google ενδέχεται να διαθέτει άλλες μορφές ιστορικού περιήγησης, όπως αναζητήσεις και δραστηριότητα από άλλες υπηρεσίες Google στη διεύθυνση history.google.com.</translation>
 <translation id="7400689562045506105">Χρησιμοποιήστε το Chromium παντού</translation>
+<translation id="7499048969477415415">Οι ρυθμίσεις που ελέγχουν τον συγχρονισμό, την εξατομίκευση και άλλες υπηρεσίες Google στο Chromium άλλαξαν. Αυτό μπορεί να επηρεάσει τις τρέχουσες ρυθμίσεις σας.</translation>
 <translation id="7674213385180944843">Ανοίξτε το μενού Ρυθμίσεις &gt; Απόρρητο &gt; Κάμερα &gt; Chromium και ενεργοποιήστε την κάμερα.</translation>
 <translation id="7746854981345936341">Συμβουλή για το Chromium. Ορισμένα κουμπιά είναι πλέον διαθέσιμα στο κάτω τμήμα της οθόνης σας, όπως τα κουμπιά "Προηγούμενο", "Επόμενο" και "Αναζήτηση".</translation>
 <translation id="786327964234957808">Πραγματοποιείτε εναλλαγή στους λογαριασμούς συγχρονισμού από <ph name="USER_EMAIL1" /> σε <ph name="USER_EMAIL2" />. Η διαχείριση των υπαρχόντων δεδομένων του Chromium γίνεται από <ph name="DOMAIN" />. Αυτό θα διαγράψει τα δεδομένα σας από αυτήν τη συσκευή, αλλά τα δεδομένα θα διατηρηθούν στη διεύθυνση <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb
index fad5da7b..d3ae270f 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
@@ -17,6 +17,7 @@
 <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="2687023731466035790">Get Google smarts in Chromium</translation>
 <translation id="2730884209570016437">Chromium can't use your camera because it's in use by another application</translation>
+<translation id="2797210818057553964">You can customise this at any time in Chromium Settings</translation>
 <translation id="3256316712990552818">Copied to Chromium</translation>
 <translation id="3413120535237193088">To get your bookmarks on all your devices, sign in to Chromium.</translation>
 <translation id="3473048256428424907">Turn on Chromium QR Scanner</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">The selected data has been removed from Chromium and synced devices. Your Google account may have other forms of browsing history such as searches and activity from other Google services at history.google.com.</translation>
 <translation id="7400689562045506105">Use Chromium Everywhere</translation>
+<translation id="7499048969477415415">The settings that control sync, personalisation and other Google services in Chromium have changed. This may affect your current settings.</translation>
 <translation id="7674213385180944843">Open Settings &gt; Privacy &gt; Camera &gt; Chromium and turn on the camera.</translation>
 <translation id="7746854981345936341">Chromium tip. Some buttons are now at the bottom of your screen, such as Back, Forward and Search.</translation>
 <translation id="786327964234957808">You are switching sync accounts from <ph name="USER_EMAIL1" /> to <ph name="USER_EMAIL2" />. Your existing Chromium data is managed by <ph name="DOMAIN" />. This will delete your data from this device, but your data will remain in <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
index 9b534bd7..8da88b1 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Chromium puede utilizar los servicios web para mejorar la experiencia de navegación. Puedes inhabilitar estos servicios. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Obtener funciones inteligentes de Google en Chromium</translation>
 <translation id="2730884209570016437">Chromium no puede utilizar la cámara porque la está usando otra aplicación</translation>
+<translation id="2797210818057553964">Puedes personalizarla en cualquier momento en la configuración de Chromium</translation>
 <translation id="3256316712990552818">Copiada a Chromium</translation>
 <translation id="3413120535237193088">Inicia sesión en Chromium para ver tus marcadores en todos tus dispositivos.</translation>
 <translation id="3473048256428424907">Activar el escáner de QR de Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Los datos seleccionados se han eliminado de Chromium y de los dispositivos sincronizados. Es posible que tu cuenta de Google haya registrado otros datos del historial de navegación, como las búsquedas o la actividad en otros servicios de Google, en la página history.google.com.</translation>
 <translation id="7400689562045506105">Usar Chromium en todas partes</translation>
+<translation id="7499048969477415415">Las opciones que controlan la sincronización, la personalización y otros servicios de Google en Chromium han cambiado. Es posible que esto afecte a tu configuración actual.</translation>
 <translation id="7674213385180944843">Abre Ajustes &gt; Privacidad &gt; Cámara &gt; Chromium y activa la cámara.</translation>
 <translation id="7746854981345936341">Consejo sobre Chromium. Algunos botones ahora se encuentran en la parte inferior de la pantalla, como Atrás, Adelante y Buscar.</translation>
 <translation id="786327964234957808">Estás cambiando las cuentas de sincronización de <ph name="USER_EMAIL1" /> a <ph name="USER_EMAIL2" />. Tus datos actuales de Chromium están administrados por <ph name="DOMAIN" />. Tus datos se eliminarán de este dispositivo, pero permanecerán en <ph name="USER_EMAIL1" />.</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 3326ea4..f3abc93c 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb
@@ -17,6 +17,7 @@
 <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="2687023731466035790">Tooge Google'i nutikad funktsioonid Chromiumi</translation>
 <translation id="2730884209570016437">Chromium ei saa kaamerat kasutada, kuna seda kasutab muu rakendus</translation>
+<translation id="2797210818057553964">Seda saate Chromiumi seadetes igal ajal kohandada</translation>
 <translation id="3256316712990552818">Kopeeritud Chromiumi</translation>
 <translation id="3413120535237193088">Kõikidesse seadmetesse järjehoidjate hankimiseks logige Chromiumisse sisse.</translation>
 <translation id="3473048256428424907">Chromiumi QR-skanneri sisselülitamine</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Valitud andmed eemaldati Chromiumist ja sünkroonitud seadmetest. Aadressil history.google.com võib teie Google'i kontol olla muus vormis sirvimisajalugu, nagu otsingud ja tegevused muudes Google'i teenustes.</translation>
 <translation id="7400689562045506105">Kasutage Chromiumit kõikjal</translation>
+<translation id="7499048969477415415">Sünkroonimist, isikupärastamist ja muid Chromiumis saadaolevaid Google'i teenuseid juhtivad seaded on muutunud. See võib teie praegusi seadeid mõjutada.</translation>
 <translation id="7674213385180944843">Avage menüü Seaded &gt; Privaatsus &gt; Kaamera &gt; Chromium ja lülitage kaamera sisse.</translation>
 <translation id="7746854981345936341">Chromiumi nõuanne. Mõned nupud, näiteks Tagasi, Edasi ja Otsing, asuvad nüüd ekraani alaosas.</translation>
 <translation id="786327964234957808">Vahetate sünkroonitavad kontod aadressilt <ph name="USER_EMAIL1" /> aadressile <ph name="USER_EMAIL2" />. Teie olemasolevaid Chromiumi andmeid haldab domeen <ph name="DOMAIN" />. Teie andmed kustutatakse sellest seadmest, kuid need jäävad alles kontole <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb
index c5e2e95e..b6cdb9c 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">‏ممکن است Chromium برای بهبود تجربه مرور شما از سرویس‌های وب استفاده کند. می‌توانید به‌صورت اختیاری این سرویس‌ها را غیرفعال کنید. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">‏هوشمندی‌های Google را در Chromium دریافت کنید</translation>
 <translation id="2730884209570016437">‏Chromium نمی‌تواند از دوربین استفاده کند زیرا برنامه دیگری از آن استفاده می‌کند</translation>
+<translation id="2797210818057553964">‏هرزمان بخواهید، می‌توانید این گزینه را در «تنظیمات Chromium» سفارشی کنید</translation>
 <translation id="3256316712990552818">‏به Chromium کپی شد</translation>
 <translation id="3413120535237193088">‏برای اینکه نشانک‌ها را در همه دستگاه‌هایتان دریافت کنید، به سیستم Chromium وارد شوید.</translation>
 <translation id="3473048256428424907">‏اسکنر QR در Chromium را روشن کنید</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">‏داده‌های انتخاب‌‌شده از Chromium و دستگاه‌های همگام‌سازی‌شده حذف شده‌اند. ممکن است اشکال دیگری از سابقه مرورتان (مانند جستجو‌ها و فعالیت دیگر سرویس‌های Google در history.google.com) در حساب Google شما وجود داشته باشد.</translation>
 <translation id="7400689562045506105">‏استفاده از Chromium در همه‌جا</translation>
+<translation id="7499048969477415415">‏تنظیماتی که همگام‌سازی، شخصی‌سازی، و سایر سرویس‌های Google در Chromium را کنترل می‌کند، تغییر کرده است. این تغییر ممکن است روی تنظیمات فعلی تأثیر بگذارد.</translation>
 <translation id="7674213385180944843">‏Settings (تنظیمات) &gt; Privacy (حریم خصوصی) &gt; Camera (دوربین) &gt; Chromium را باز کنید و دوربین را روشن کنید.</translation>
 <translation id="7746854981345936341">‏نکته Chromium. بعضی از دکمه‌ها مثل Back (برگشت)، Forward (به جلو) و Search (جستجو) اکنون در پایین صفحه هستند.</translation>
 <translation id="786327964234957808">‏هم‌اکنون درحال تغییر حساب‌های همگام‌سازی از <ph name="USER_EMAIL1" /> به <ph name="USER_EMAIL2" /> هستید. داده‌های موجود Chromium شما توسط <ph name="DOMAIN" /> مدیریت می‌شوند. با این کار، داده‌هایتان از این دستگاه حذف می‌شود اما همچنان در <ph name="USER_EMAIL1" /> باقی می‌ماند.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb
index 366c48b..75a14db 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Chromium peut utiliser des services Web pour améliorer votre confort de navigation. Vous pouvez choisir de désactiver ces services. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Bénéficiez des fonctionnalités intelligentes de Google dans Chromium</translation>
 <translation id="2730884209570016437">Chromium ne peut pas utiliser l'appareil photo, car celui-ci est utilisé par une autre application</translation>
+<translation id="2797210818057553964">Vous pouvez personnaliser cette option à tout moment dans les paramètres Chromium</translation>
 <translation id="3256316712990552818">Copié dans Chromium</translation>
 <translation id="3413120535237193088">Connectez-vous à Chromium pour synchroniser vos favoris sur tous vos appareils.</translation>
 <translation id="3473048256428424907">Activer le lecteur de code QR Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Les données sélectionnées ont été supprimées de Chromium et des appareils synchronisés. Votre compte Google conserve peut-être d'autres formes d'historique de navigation sur la page history.google.com concernant, par exemple, vos recherches ou vos activités via d'autres services Google.</translation>
 <translation id="7400689562045506105">Utilisez Chromium où que vous soyez</translation>
+<translation id="7499048969477415415">Les paramètres relatifs à la synchronisation, à la personnalisation et à d'autres services Google dans Chromium ont été modifiés, ce qui peut avoir une incidence sur votre configuration actuelle.</translation>
 <translation id="7674213385180944843">Ouvrez Paramètres &gt; Confidentialité &gt; Appareil photo &gt; Chromium, puis activez l'appareil photo.</translation>
 <translation id="7746854981345936341">Astuce Chromium. Certains boutons sont désormais affichés au bas de l'écran tels que "Arrière", "Avant" et "Rechercher".</translation>
 <translation id="786327964234957808">Vous changez de compte synchronisé pour passer de <ph name="USER_EMAIL1" /> à <ph name="USER_EMAIL2" />. Vos données Chromium actuelles sont gérées par <ph name="DOMAIN" />. Cette opération entraînera la suppression de vos données de cet appareil, mais celles-ci seront conservées dans le compte <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
index 2b59661..08791ced 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
@@ -16,13 +16,14 @@
 <translation id="2647554856022461007">क्रोमियम आपके ब्राउज़िंग अनुभव को बेहतर बनाने के लिए वेब सेवाओं का उपयोग कर सकता है. आपके पास इन सेवाओं को बंद करने का विकल्प है. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">'क्रोमियम' में Google की स्मार्ट सुविधाएं पाएं</translation>
 <translation id="2730884209570016437">क्रोमियम आपके कैमरे का उपयोग नहीं कर सकता क्योंकि दूसरा ऐप्लिकेशन उसका उपयोग कर रहा है</translation>
+<translation id="2797210818057553964">आप किसी भी समय Chromium सेटिंग में जाकर इसे अपनी पसंद के मुताबिक बना सकते हैं</translation>
 <translation id="3256316712990552818">क्रोमियम पर कॉपी किया गया</translation>
 <translation id="3413120535237193088">अपने सभी डिवाइस पर अपने बुकमार्क पाने के लिए, क्रोमियम में प्रवेश करें.</translation>
 <translation id="3473048256428424907">क्रोमियम QR स्कैनर चालू करें</translation>
 <translation id="3605252743693911722">अपने सभी डिवाइस पर अपने बुकमार्क, पासवर्ड आदि पाने के लिए क्रोमियम में प्रवेश करें.</translation>
 <translation id="3805899903892079518">Chromium के पास आपकी फ़ोटो या वीडियो का एक्सेस नहीं है. iOS सेटिंग &gt; निजता &gt; फ़ोटो में एक्सेस सक्षम करें.</translation>
 <translation id="4024541897090868497">अपने सभी डिवाइस पर अपने टैब पाने के लिए, क्रोमियम में प्रवेश करें.</translation>
-<translation id="4157467675761413638">क्रोमियम सलाह. ज़्यादा टैब विकल्पोंं के लिए, टूलबार में 'टैब दिखाएं' बटन को दबाकर रखें, जो आपकी स्क्रीन में सबसे नीचे या सबसे ऊपर होगा.</translation>
+<translation id="4157467675761413638">क्रोमियम के लिए सलाह. ज़्यादा टैब विकल्पोंं के लिए, टूलबार में 'टैब दिखाएं' बटन को दबाकर रखें, जो आपकी स्क्रीन में सबसे नीचे या सबसे ऊपर होगा.</translation>
 <translation id="4241912885070669028">आप <ph name="SIGNOUT_MANAGED_DOMAIN" /> द्वारा प्रबंधित खाते से प्रस्थान कर रहे हैं. इससे आपका क्रोमियम डेटा इस डिवाइस से हट जाएगा, लेकिन आपका डेटा आपके Google खाते में बना रहेगा.</translation>
 <translation id="4272892696084633551">क्रोमियम की सुविधाओं और प्रदर्शन को बेहतर बनाने में सहायता करें</translation>
 <translation id="4555020257205549924">जब यह सुविधा चालू होती है, तो क्रोमियम अन्य भाषा में लिखे पृष्ठों को Google अनुवाद का उपयोग करके अनुवाद करने के लिए ऑफ़र करेगा. <ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" /></translation>
@@ -44,8 +45,9 @@
 <translation id="7337881442233988129">क्रोमियम</translation>
 <translation id="7357211569052832586">चयनित डेटा को क्रोमियम और सिंक किए हुए डिवाइस से निकाल दिया गया है. आपके Google खाते में history.google.com पर की जाने वाली खोजों अन्य Google सेवाओं की गतिविधि जैसेे ब्राउज़िंग इतिहास के अन्य प्रारूप हो सकते हैं.</translation>
 <translation id="7400689562045506105">क्रोमियम का उपयोग हर जगह करें</translation>
+<translation id="7499048969477415415">Chromium में 'सिंक करें', 'मनमुताबिक बनाएं' और दूसरी 'Google सेवाओं' को नियंत्रित करने वाली सेटिंग बदल गई हैं. आपकी मौजूदा सेटिंग पर इसका असर पड़ सकता है.</translation>
 <translation id="7674213385180944843">सेटिंग &gt; निजता &gt; कैमरा &gt; क्रोमियम खोलें और कैमरा चालू करें.</translation>
-<translation id="7746854981345936341">क्रोमियम सलाह. 'वापस जाएं', 'आगे जाएं' और 'खोजें' जैसे कुछ बटन अब आपकी स्क्रीन के सबसे नीचे मिलेंगे.</translation>
+<translation id="7746854981345936341">क्रोमियम के लिए सलाह. 'वापस जाएं', 'आगे जाएं' और 'खोजें' जैसे कुछ बटन अब आपकी स्क्रीन के सबसे नीचे मिलेंगे.</translation>
 <translation id="786327964234957808">आप सिंक खातों को <ph name="USER_EMAIL1" /> से <ph name="USER_EMAIL2" /> में बदल रहे हैं. आपका मौजूदा क्रोमियम डेटा <ph name="DOMAIN" /> द्वारा प्रबंधित होता है. इससे इस डिवाइस से आपका डेटा हट जाएगा, लेकिन आपका डेटा <ph name="USER_EMAIL1" /> में बना रहेगा.</translation>
 <translation id="8175055321229419309">टिप्स: <ph name="BEGIN_LINK" />क्रोमियम को अपने डॉक में ले जाएं<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">अपने स्थान के आधार पर क्रोमियम में एक बेहतर Google अनुभव प्राप्त करें.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb
index 01a83a3..77d57b1f 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb
@@ -17,13 +17,14 @@
 <translation id="2647554856022461007">Chromium može upotrebljavati web-usluge za poboljšanje vašeg doživljaja pregledavanja. Ako želite, možete onemogućiti te usluge. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Iskoristite pametne Googleove značajke u Chromiumu</translation>
 <translation id="2730884209570016437">Chromium ne može upotrebljavati vaš fotoaparat jer ga upotrebljava neka druga aplikacija</translation>
+<translation id="2797210818057553964">To možete prilagoditi u bilo kojem trenutku u postavkama Chromiuma</translation>
 <translation id="3256316712990552818">Kopirano na Chromium</translation>
 <translation id="3413120535237193088">Da biste imali svoje oznake na svim svojim uređajima, prijavite se na Chromium.</translation>
 <translation id="3473048256428424907">Uključite Chromiumov QR skener</translation>
 <translation id="3605252743693911722">Prijavite se na Chromium kako bi ste mogli pristupati oznakama, zaporkama i ostalom na svim svojim uređajima.</translation>
 <translation id="3805899903892079518">Chromium nema pristup fotografijama ni videozapisima. Omogućite pristup u Postavkama iOS-a &gt; Privatnost &gt; Fotografije.</translation>
 <translation id="4024541897090868497">Da biste imali svoje kartice na svim svojim uređajima, prijavite se na Chromium.</translation>
-<translation id="4157467675761413638">Savjet za Chromium. Za više opcija kartice pritisnite i zadržite gumb Prikaži kartice na alatnoj traci pri dnu ili vrhu zaslona.</translation>
+<translation id="4157467675761413638">Savjet za Chromium. Za više opcija kartice pritisnite i držite gumb Prikaži kartice na alatnoj traci pri dnu ili vrhu zaslona.</translation>
 <translation id="4241912885070669028">Odjavljujete se s računa kojim upravlja <ph name="SIGNOUT_MANAGED_DOMAIN" />. Vaši podaci na Chromiumu izbrisat će se s ovog uređaja, no ostat će na vašem Google računu.</translation>
 <translation id="4272892696084633551">Pomozite poboljšati Chromiumove značajke i izvedbu</translation>
 <translation id="4555020257205549924">Kada je ta značajka uključena, Chromium će ponuditi prijevod stranica napisanih na drugim jezicima pomoću Google prevoditelja. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Odabrani podaci uklonjeni su iz Chromiuma i sa sinkroniziranih uređaja. Na Google računu možda postoje drugi oblici povijesti pregledavanja, primjerice pretraživanja i aktivnosti s drugih Googleovih usluga, na stranici history.google.com.</translation>
 <translation id="7400689562045506105">Upotrebljavajte Chromium svugdje</translation>
+<translation id="7499048969477415415">Promijenjene su postavke koje upravljaju sinkronizacijom, prilagodbom i drugim Googleovim uslugama u Chromiumu. To može utjecati na vaše trenutačne postavke.</translation>
 <translation id="7674213385180944843">Otvorite Postavke &gt; Privatnost &gt; Fotoaparat &gt; Chromium i uključite fotoaparat.</translation>
 <translation id="7746854981345936341">Savjet za Chromium. Neki se gumbi sada nalaze pri dnu zaslona, primjerice za natrag, naprijed i pretraživanje.</translation>
 <translation id="786327964234957808">Prebacujete sinkronizirane račune s korisnika <ph name="USER_EMAIL1" /> na korisnika <ph name="USER_EMAIL2" />. Vašim postojećim podacima na Chromiumu upravlja <ph name="DOMAIN" />. Ovime će se izbrisati vaši podaci s vašeg uređaja, no oni će ostati na računu <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
index 2cb92e5..b4d53f958 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Chromium dapat mengunakan layanan web agar pengalaman mengakses internet lebih menyenangkan. Anda dapat memilih untuk menonaktifkan layanan ini. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Dapatkan kecanggihan Google di Chromium</translation>
 <translation id="2730884209570016437">Chromium tidak dapat menggunakan kamera karena sedang digunakan aplikasi lain</translation>
+<translation id="2797210818057553964">Anda dapat menyesuaikan ini kapan saja di Setelan Chromium</translation>
 <translation id="3256316712990552818">Disalin ke Chromium</translation>
 <translation id="3413120535237193088">Agar bookmark tersedia di semua perangkat Anda, masuk ke Chromium.</translation>
 <translation id="3473048256428424907">Aktifkan pemindai QR Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Data yang dipilih telah dihapus dari Chromium dan perangkat yang disinkronkan. Akun Google Anda mungkin memiliki bentuk histori pencarian lain seperti penelusuran dan aktivitas dari layanan Google lainnya di history.google.com.</translation>
 <translation id="7400689562045506105">Gunakan Chromium di Mana Saja</translation>
+<translation id="7499048969477415415">Setelan yang mengontrol sinkronisasi, personalisasi, dan layanan Google lainnya di Chromium telah berubah. Ini dapat memengaruhi setelan saat ini.</translation>
 <translation id="7674213385180944843">Buka Setelan &gt; Privasi &gt; Kamera &gt; Chromium, lalu aktifkan kamera.</translation>
 <translation id="7746854981345936341">Tips Chromium. Beberapa tombol sekarang terdapat di bagian bawah layar, seperti Kembali, Teruskan, dan Telusuri.</translation>
 <translation id="786327964234957808">Anda beralih akun sinkronisasi dari <ph name="USER_EMAIL1" /> ke <ph name="USER_EMAIL2" />. Data Chromium Anda yang sudah ada dikelola oleh <ph name="DOMAIN" />. Tindakan ini akan menghapus data dari perangkat, namun data Anda akan tetap tersedia di <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb
index 54db85b2..12d717b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Chromium potrebbe utilizzare servizi web per migliorare la tua esperienza di navigazione. Se preferisci, puoi disattivare questi servizi. <ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Sfrutta l'intelligenza di Google in Chromium</translation>
 <translation id="2730884209570016437">Chromium non può utilizzare la videocamera perché è attualmente utilizzata da un'altra applicazione</translation>
+<translation id="2797210818057553964">Puoi personalizzare questa opzione in qualsiasi momento nelle Impostazioni di Chromium</translation>
 <translation id="3256316712990552818">Copiata in Chromium</translation>
 <translation id="3413120535237193088">Accedi a Chromium per trovare i tuoi preferiti su tutti i dispositivi.</translation>
 <translation id="3473048256428424907">Attiva lo scanner QR di Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">I dati selezionati sono stati rimossi da Chromium e dai dispositivi sincronizzati. Il tuo account Google potrebbe avere altre forme di cronologia di navigazione, ad esempio ricerche e attività, di altri servizi Google alla pagina history.google.com.</translation>
 <translation id="7400689562045506105">Utilizza Chromium ovunque</translation>
+<translation id="7499048969477415415">Le impostazioni che controllano sincronizzazione, personalizzazione e altri servizi Google in Chromium sono cambiate. Questo cambiamento potrebbe incidere sulle impostazioni attuali.</translation>
 <translation id="7674213385180944843">Apri impostazioni &gt; Privacy &gt; Fotocamera &gt; Chromium e attiva la fotocamera.</translation>
 <translation id="7746854981345936341">Suggerimento per Chromium. Alcuni pulsanti si trovano ora nella parte inferiore della schermata, ad esempio Indietro, Avanti e Cerca.</translation>
 <translation id="786327964234957808">Stai cambiando account di sincronizzazione, passando dall'account <ph name="USER_EMAIL1" /> all'account <ph name="USER_EMAIL2" />. I dati di Chromium esistenti sono gestiti da <ph name="DOMAIN" />. I dati verranno cancellati dal dispositivo, ma rimarranno memorizzati nell'account <ph name="USER_EMAIL1" />.</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 0528823b..9e8d5be 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
@@ -17,13 +17,14 @@
 <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="2687023731466035790">Google viedās tehnoloģijas pārlūkā Chromium</translation>
 <translation id="2730884209570016437">Chromium nevar izmantot kameru, jo to izmanto cita lietojumprogramma.</translation>
+<translation id="2797210818057553964">Varat to jebkurā laikā pielāgot Chromium iestatījumos</translation>
 <translation id="3256316712990552818">Nokopēta pārlūkā Chromium</translation>
 <translation id="3413120535237193088">Pierakstieties pārlūkā Chromium, lai grāmatzīmes būtu pieejamas visās jūsu ierīcēs.</translation>
 <translation id="3473048256428424907">Chromium QR skenera ieslēgšana</translation>
 <translation id="3605252743693911722">Pierakstieties pārlūkā Chromium, lai iegūtu savas grāmatzīmes, paroles un citu saturu visās savās ierīcēs.</translation>
 <translation id="3805899903892079518">Chromium nevar piekļūt jūsu fotoattēliem un videoklipiem. Iespējojiet piekļuvi: iOS Settings &gt; Privacy &gt; Photos.</translation>
 <translation id="4024541897090868497">Pierakstieties pārlūkā Chromium, lai jūsu cilnes būtu pieejamas visās jūsu ierīcēs.</translation>
-<translation id="4157467675761413638">Chromium padoms. Lai iegūtu vairāk ciļņu iespējas, rīkjoslā, kas atrodas ekrāna apakšdaļā vai augšdaļā, nospiediet un turiet pogu Rādīt cilnes.</translation>
+<translation id="4157467675761413638">Chromium padoms. Lai iegūtu vairāk ciļņu iespēju, rīkjoslā, kas atrodas ekrāna apakšdaļā vai augšdaļā, nospiediet un turiet pogu Rādīt cilnes.</translation>
 <translation id="4241912885070669028">Jūs izrakstāties no konta, kas tiek pārvaldīts domēnā <ph name="SIGNOUT_MANAGED_DOMAIN" />. Izrakstoties Chromium dati tiks dzēsti no šīs ierīces, taču tie paliks jūsu Google kontā.</translation>
 <translation id="4272892696084633551">Palīdzēt uzlabot Chromium funkcijas un veiktspēju</translation>
 <translation id="4555020257205549924">Ja šī funkcija ir ieslēgta, Chromium piedāvā tulkot citās valodās rakstītas lapas, izmantojot Google tulkotāju. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Atlasītie dati ir noņemti no pārlūka Chromium un sinhronizētajām ierīcēm. Jūsu Google kontam vietnē history.google.com var būt citu veidu pārlūkošanas vēstures dati, piemēram, meklēšanas vaicājumi un darbības citos Google pakalpojumos.</translation>
 <translation id="7400689562045506105">Chromium lietošana visur</translation>
+<translation id="7499048969477415415">Ir mainīti sinhronizācijas, personalizācijas un citu Google pakalpojumu pārvaldības iestatījumi pārlūkā Chromium. Tas var ietekmēt jūsu pašreizējos iestatījumus.</translation>
 <translation id="7674213385180944843">Atveriet sadaļu Iestatījumi &gt; Konfidencialitāte &gt; Kamera &gt; Chromium un ieslēdziet kameru.</translation>
 <translation id="7746854981345936341">Chromium padoms. Tagad dažas pogas ir ekrāna apakšdaļā, piemēram, Atpakaļ, Pārsūtīt un Meklēt.</translation>
 <translation id="786327964234957808">Jūs pārslēdzat sinhronizējamos kontus no konta <ph name="USER_EMAIL1" /> uz kontu <ph name="USER_EMAIL2" />. Jūsu pašreizējos Chromium datus pārvalda <ph name="DOMAIN" />. Šādi jūsu dati tiks dzēsti no šīs ierīces, bet dati joprojām būs pieejami kontā <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
index e7a530a3..7692826 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
@@ -23,7 +23,7 @@
 <translation id="3605252743693911722">നിങ്ങളുടെ ബുക്ക്‌മാർക്കുകളും  ‌പാസ്‌വേഡുകളും മറ്റും എല്ലാ ഉപകരണങ്ങളിലും ലഭ്യമാക്കുന്നതിന് Chromium-ത്തിൽ സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="3805899903892079518">Chromium-ത്തിന് നിങ്ങളുടെ ഫോട്ടോകളിലേക്കോ വീഡിയോകളിലേക്കോ ആക്‌സസ്സ് ഇല്ല. iOS ക്രമീകരണം &gt; സ്വകാര്യത &gt; ഫോട്ടോകൾ എന്നതിൽ ആക്‌സസ്സ് പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="4024541897090868497">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ടാബുകൾ ലഭിക്കാൻ, Chromium-ത്തിൽ സൈൻ ഇൻ ചെയ്യുക.</translation>
-<translation id="4157467675761413638">Chromium നുറുങ്ങ്. കൂടുതൽ ടാബ് ഓപ്ഷനുകൾക്കായി, നിങ്ങളുടെ സ്‌ക്രീനിന്റെ താഴെയോ മുകളിലോ ഉള്ള, ടൂൾബാറിലെ ബട്ടൺ ഷോ ടാബുകൾ, അമർത്തിപ്പിടിക്കുക.</translation>
+<translation id="4157467675761413638">Chromium നുറുങ്ങ്. കൂടുതൽ ടാബ് ഓപ്ഷനുകൾക്കായി, നിങ്ങളുടെ സ്‌ക്രീനിന്റെ താഴെയോ മുകളിലോ ഉള്ള, ടൂൾബാറിലെ 'ടാബ് കാണിക്കുക' ബട്ടൺ അമർത്തിപ്പിടിക്കുക.</translation>
 <translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> മാനേജുചെയ്യുന്ന ഒരു അക്കൗണ്ടിൽ നിന്നും നിങ്ങൾ സൈൻ ഔട്ട് ചെയ്യുകയാണ്. ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ Chromium വിവരങ്ങൾ ഇല്ലാതാക്കുമെങ്കിലും, Google അക്കൗണ്ടിൽ തുടർന്നും അവ ഉണ്ടായിരിക്കുന്നതാണ്.</translation>
 <translation id="4272892696084633551">Chromium-ത്തിന്റെ ഫീച്ചറുകളും പ്രകടനവും മെച്ചപ്പെടുത്താൻ സഹായിക്കുക</translation>
 <translation id="4555020257205549924">ഈ ഫീച്ചർ ഓണായിരിക്കുമ്പോൾ, മറ്റ് ഭാഷകളിൽ എഴുതിയിരിക്കുന്ന പേജുകൾ Google വിവർത്തനം ഉപയോഗിച്ച് വിവർത്തനം ചെയ്യുന്നത് Chromium ഓഫർ ചെയ്യും. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
@@ -46,7 +46,7 @@
 <translation id="7357211569052832586">തിരഞ്ഞെടുത്ത വിവരങ്ങൾ Chromium-ത്തിൽ നിന്നും സമന്വയിപ്പിച്ച ഉപകരണങ്ങളിൽ നിന്നും നീക്കംചെയ്‌തു. നിങ്ങളുടെ Google അക്കൗണ്ടിന് history.google.com എന്നതിൽ മറ്റ് Google സേവനങ്ങളിൽ നിന്നുള്ള തിരയലുകൾ, പ്രവൃത്തി എന്നിങ്ങനെ മറ്റ് തരത്തിലുള്ള ബ്രൗസിംഗ് ചരിത്രമുണ്ടായിരിക്കാം.</translation>
 <translation id="7400689562045506105">എല്ലായിടത്തും Chromium ഉപയോഗിക്കുക</translation>
 <translation id="7674213385180944843">ക്രമീകരണം &gt; സ്വകാര്യത &gt; ക്യാമറ &gt; Chromium തുറന്ന് ക്യാമറ ഓണാക്കുക.</translation>
-<translation id="7746854981345936341">Chromium നുറുങ്ങ്. ബാക്ക്, മുമ്പോട്ട് പോകാനുള്ളത് തുടങ്ങിയ ചില ബട്ടണുകൾ, ഇപ്പോൾ നിങ്ങളുടെ സ്‌ക്രീനിന്റെ താഴെയാണ്.</translation>
+<translation id="7746854981345936341">Chromium നുറുങ്ങ്. മടങ്ങുക, മുമ്പോട്ട് പോകുക, തിരയൽ എന്നീ ചില ബട്ടണുകൾ, ഇപ്പോൾ നിങ്ങളുടെ സ്‌ക്രീനിന്റെ താഴെയാണ്.</translation>
 <translation id="786327964234957808">നിങ്ങൾ <ph name="USER_EMAIL1" /> എന്നതിൽ നിന്ന് <ph name="USER_EMAIL2" /> എന്നതിലേക്ക് സമന്വയ അക്കൗണ്ടുകൾ മാറ്റുകയാണ്. <ph name="DOMAIN" /> ഡൊമെയ്‌നാണ് നിങ്ങളുടെ നിലവിലുള്ള Chromium വിവരങ്ങൾ മാനേജുചെയ്യുന്നത്. ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് വിവരങ്ങൾ ഇല്ലാതാക്കുമെങ്കിലും <ph name="USER_EMAIL1" /> എന്നതിൽ തുടർന്നും അവ ഉണ്ടായിരിക്കുന്നതാണ്.</translation>
 <translation id="8175055321229419309">നുറുങ്ങ്: <ph name="BEGIN_LINK" />Chromium-ത്തെ നിങ്ങളുടെ ഡോക്കിലേക്ക് നീക്കുക<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Chromium-ത്തിൽ നിങ്ങളുടെ ലൊക്കേഷൻ അടിസ്ഥാനമാക്കിയുള്ള ഒരു മികച്ച Google അനുഭവം സ്വന്തമാക്കുക.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb
index 6777f1bbd..1fe45cd 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Chromium boleh menggunakan perkhidmatan web untuk meningkatkan pengalaman penyemakan imbas anda. Anda boleh memilih untuk melumpuhkan perkhidmatan ini. <ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Dapatkan ciri-ciri pintar Google di Chromium</translation>
 <translation id="2730884209570016437">Chromium tidak dapat menggunakan kamera anda kerana kamera sedang digunakan oleh aplikasi lain</translation>
+<translation id="2797210818057553964">Anda boleh menyesuaikan pilihan ini pada bila-bila masa dalam Tetapan Chromium</translation>
 <translation id="3256316712990552818">Disalin ke Chromium</translation>
 <translation id="3413120535237193088">Log masuk ke Chromium untuk mendapatkan penanda halaman pada semua peranti anda.</translation>
 <translation id="3473048256428424907">Hidupkan pengimbas QR Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Data yang dipilih telah dialih keluar daripada Chromium dan peranti yang disegerakkan. Akaun Google anda mungkin mempunyai sejarah penyemakan imbas dalam bentuk lain seperti carian dan aktiviti daripada perkhidmatan Google yang lain di history.google.com.</translation>
 <translation id="7400689562045506105">Gunakan Chromium Di Mana-mana Sahaja</translation>
+<translation id="7499048969477415415">Tetapan yang mengawal penyegerakan, pemperibadian dan perkhidmatan Google yang lain dalam Chromium telah berubah. Perubahan ini mungkin mempengaruhi tetapan semasa anda.</translation>
 <translation id="7674213385180944843">Buka Tetapan &gt; Privasi &gt; Kamera &gt; Chromium dan hidupkan kamera.</translation>
 <translation id="7746854981345936341">Petua Chromium. Sesetengah butang kini terletak di bahagian bawah skrin anda, seperti Kembali, Ke Hadapan dan Carian.</translation>
 <translation id="786327964234957808">Anda sedang menukar akaun penyegerakan daripada <ph name="USER_EMAIL1" /> kepada <ph name="USER_EMAIL2" />. Data Chromium sedia ada diurus oleh <ph name="DOMAIN" />. Tindakan ini akan memadamkan data anda daripada peranti ini, tetapi data itu akan kekal disimpan dalam <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb
index 17517ae2..3d3abc5 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb
@@ -17,13 +17,14 @@
 <translation id="2647554856022461007">Chromium kan webservices gebruiken om de browsefunctionaliteit te verbeteren. Je kunt deze services eventueel uitschakelen. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Gebruik slimme Google-functies in Chromium</translation>
 <translation id="2730884209570016437">Chromium kan je camera niet gebruiken omdat deze wordt gebruikt door een andere app</translation>
+<translation id="2797210818057553964">Je kunt dit op elk gewenst moment aanpassen in de Chromium-instellingen</translation>
 <translation id="3256316712990552818">Gekopieerd naar Chromium</translation>
 <translation id="3413120535237193088">Log in bij Chromium om al je bladwijzers op al je apparaten te bekijken.</translation>
 <translation id="3473048256428424907">QR-scanner van Chromium inschakelen</translation>
 <translation id="3605252743693911722">Log in bij Chromium om je bladwijzers, wachtwoorden en meer op al je apparaten op te halen.</translation>
 <translation id="3805899903892079518">Chromium heeft geen toegang tot je foto's of video's. Schakel toegang in via iOS-instellingen &gt; Privacy &gt; Foto's.</translation>
 <translation id="4024541897090868497">Log in bij Chromium om al je tabbladen op al je apparaten te bekijken</translation>
-<translation id="4157467675761413638">Chromium-tip. Voor meer tabbladopties tik je op de werkbalk onder- of bovenaan het scherm op de knop 'Tabbladen weergeven' en houd je deze knop vast.</translation>
+<translation id="4157467675761413638">Chromium-tip. Voor meer tabbladopties tik je, op de werkbalk onder- of bovenaan het scherm, op de knop 'Tabbladen weergeven' en houd je deze knop vast.</translation>
 <translation id="4241912885070669028">Je logt uit van een account dat wordt beheerd door <ph name="SIGNOUT_MANAGED_DOMAIN" />. Hierdoor worden je Chromium-gegevens verwijderd van dit apparaat. Je gegevens blijven echter opgeslagen in je Google-account.</translation>
 <translation id="4272892696084633551">Help de functies en prestaties van Chromium te verbeteren</translation>
 <translation id="4555020257205549924">Als deze functie is ingeschakeld, biedt Chromium aan pagina's die zijn geschreven in andere talen te vertalen met Google Translate. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">De geselecteerde gegevens zijn verwijderd uit Chromium en van gesynchroniseerde apparaten. Voor je Google-account kunnen andere vormen van browsegeschiedenis (zoals zoekopdrachten en activiteit uit andere Google-services) beschikbaar zijn via history.google.com.</translation>
 <translation id="7400689562045506105">Chromium overal gebruiken</translation>
+<translation id="7499048969477415415">De instellingen waarmee je synchronisatie, personalisatie en andere Google-services in Chromium beheert, zijn gewijzigd. Dit is mogelijk van invloed op je huidige instellingen.</translation>
 <translation id="7674213385180944843">Open Instellingen &gt; Privacy &gt; Camera &gt; Chromium en zet de camera aan.</translation>
 <translation id="7746854981345936341">Chromium-tip. Sommige knoppen zoals Terug, Vooruit en Zoeken worden nu onderaan het scherm weergegeven.</translation>
 <translation id="786327964234957808">Je wijzigt het synchronisatieaccount van <ph name="USER_EMAIL1" /> in <ph name="USER_EMAIL2" />. Je bestaande Chromium-gegevens worden beheerd door <ph name="DOMAIN" />. Hierdoor worden je gegevens van dit apparaat verwijderd. Je gegevens blijven echter opgeslagen in <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
index 647df6b..4d59d0d 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
@@ -23,7 +23,7 @@
 <translation id="3605252743693911722">Logg på Chromium for å hente blant annet bokmerkene og passordene dine på alle enhetene du bruker.</translation>
 <translation id="3805899903892079518">Chromium har ikke tilgang til bildene eller videoene dine. Slå på tilgangen i iOS-innstillingene &gt; Personvern &gt; Bilder.</translation>
 <translation id="4024541897090868497">For å få fanene dine på alle enhetene du bruker, logg på Chromium.</translation>
-<translation id="4157467675761413638">Chromium tips. For flere fanealternativer, trykk og hold ned Vis fane-knappen i verktøylinjen, som du finner nederst eller øverst på skjermen.</translation>
+<translation id="4157467675761413638">Chromium-tips. For flere fanealternativer, trykk og hold Vis fane-knappen i verktøylinjen, som du finner nederst eller øverst på skjermen.</translation>
 <translation id="4241912885070669028">Du logger av en konto som administreres av <ph name="SIGNOUT_MANAGED_DOMAIN" />. Dette fører til at Chromium-dataene dine slettes fra denne enheten, men de blir værende i Google-kontoen din.</translation>
 <translation id="4272892696084633551">Bidra til å gjøre Chromium bedre og raskere</translation>
 <translation id="4555020257205549924">Når denne funksjonen er slått på, tilbyr Chromium å oversette sider som er skrevet på andre språk, ved hjelp av Google Oversetter. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
@@ -46,7 +46,7 @@
 <translation id="7357211569052832586">De valgte dataene er fjernet fra Chromium og alle synkroniserte enheter. Det kan hende Google-kontoen din har andre typer nettlesingslogger, for eksempel for søk og aktivitet fra andre Google-tjenester, på history.google.com.</translation>
 <translation id="7400689562045506105">Bruk Chromium overalt</translation>
 <translation id="7674213385180944843">Åpne Innstillinger &gt; Personvern &gt; Kamera &gt; Chromium, og slå på kameraet.</translation>
-<translation id="7746854981345936341">Chromium tips. Noen knapper, slik som Nedover, Forover og Søke, er nå nederst på skjermen.</translation>
+<translation id="7746854981345936341">Chromium-tips. Noen knapper, slik som Tilbake, Frem og Søk, er nå nederst på skjermen.</translation>
 <translation id="786327964234957808">Du bytter synkroniseringskonto fra <ph name="USER_EMAIL1" /> til <ph name="USER_EMAIL2" />. De eksisterende Chromium-dataene dine administreres av <ph name="DOMAIN" />. Dette fører til at dataene dine slettes fra denne enheten, men de blir værende i <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Tips: <ph name="BEGIN_LINK" />Flytt Chromium til dokken<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Få en bedre Google-opplevelse i Chromium basert på hvor du er.</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 16a30fe..da6dbfe570 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
@@ -17,6 +17,7 @@
 <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="2687023731466035790">Inteligentne rozwiązania Google w Chromium</translation>
 <translation id="2730884209570016437">Chromium nie może użyć aparatu, bo używa go już inna aplikacja</translation>
+<translation id="2797210818057553964">Możesz w każdej chwili zmienić tę opcję w Ustawieniach Chromium</translation>
 <translation id="3256316712990552818">Skopiowana do Chromium</translation>
 <translation id="3413120535237193088">Aby korzystać ze swoich zakładek na wszystkich urządzeniach, zaloguj się w Chromium.</translation>
 <translation id="3473048256428424907">Włączanie skanera QR w Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Wybrane dane zostały usunięte z Chromium i synchronizowanych urządzeń. Inne rodzaje historii przeglądania, takie jak wyszukiwania i aktywność w innych usługach Google, mogą być nadal dostępne na Twoim koncie Google na history.google.com</translation>
 <translation id="7400689562045506105">Korzystaj z Chromium w dowolnym miejscu</translation>
+<translation id="7499048969477415415">Zmieniono ustawienia synchronizacji, personalizacji i innych usług Google w Chromium. Może to wpłynąć na Twoje bieżące ustawienia.</translation>
 <translation id="7674213385180944843">Wybierz Ustawienia &gt; Prywatność &gt; Aparat &gt; Chromium i włącz aparat.</translation>
 <translation id="7746854981345936341">Wskazówka dla użytkowników Chromium. Niektóre przyciski (na przykład Wstecz, Dalej i Szukaj) znajdują się teraz na dole ekranu.</translation>
 <translation id="786327964234957808">Przełączasz synchronizację kont z <ph name="USER_EMAIL1" /> na <ph name="USER_EMAIL2" />. Twoimi istniejącymi danymi Chromium zarządza <ph name="DOMAIN" />. Dane zostaną usunięte z tego urządzenia, ale pozostaną na koncie <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb
index 5a3af75..42b791f5 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">O Chromium pode usar serviços da Web para melhorar sua experiência de navegação. Se preferir, você pode desativar esses serviços. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Use a tecnologia do Google no Chromium</translation>
 <translation id="2730884209570016437">O Chromium não pode usar a câmera porque ela está sendo usada por outro app</translation>
+<translation id="2797210818057553964">Você pode personalizar isso a qualquer momento nas configurações do Chromium</translation>
 <translation id="3256316712990552818">Copiado no Chromium</translation>
 <translation id="3413120535237193088">Para ter seus favoritos em todos os seus dispositivos, faça login no Chromium.</translation>
 <translation id="3473048256428424907">Ativar o leitor de QR do Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Os dados selecionados foram removidos do Chromium e dos dispositivos sincronizados. É possível que sua Conta do Google tenha outras formas de histórico de navegação, como pesquisas e atividades de outros serviços do Google em history.google.com.</translation>
 <translation id="7400689562045506105">Use o Chromium em qualquer lugar</translation>
+<translation id="7499048969477415415">As configurações que controlam sincronização, personalização e outros serviços do Google no Chromium foram alteradas. Isso pode afetar suas configurações atuais.</translation>
 <translation id="7674213385180944843">Abra Ajustes &gt; Privacidade &gt; Câmera &gt; Chromium e ative a câmera.</translation>
 <translation id="7746854981345936341">Dica do Chromium. Alguns botões agora estão na parte inferior da tela, como "Voltar", "Avançar" e "Pesquisar".</translation>
 <translation id="786327964234957808">Você está trocando a conta de sincronização de <ph name="USER_EMAIL1" /> para <ph name="USER_EMAIL2" />. Os dados do Chromium são gerenciados por <ph name="DOMAIN" />. Eles serão excluídos deste dispositivo, mas permanecerão no <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb
index 4dcf4eb..91aaf27a 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">O Chromium poderá utilizar serviços Web para melhorar a sua experiência de navegação. Poderá optar por desativar estes serviços. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">A inteligência da Google no Chromium</translation>
 <translation id="2730884209570016437">O Chromium não pode utilizar a câmara porque está a ser utilizada por outra aplicação</translation>
+<translation id="2797210818057553964">Pode personalizar esta opção em qualquer altura nas Definições do Chromium.</translation>
 <translation id="3256316712990552818">Copiado para o Chromium</translation>
 <translation id="3413120535237193088">Para obter os seus marcadores em todos os dispositivos, inicie sessão no Chromium.</translation>
 <translation id="3473048256428424907">Ativar o leitor de QR do Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Os dados selecionados foram removidos do Chromium e dos dispositivos sincronizados. A sua Conta Google pode ter outras formas do histórico de navegação, como pesquisas e atividade de outros serviços Google, em history.google.com.</translation>
 <translation id="7400689562045506105">Utilizar o Chromium em todas as plataformas</translation>
+<translation id="7499048969477415415">As definições que controlam a sincronização, a personalização e outros serviços Google no Chromium foram alteradas. Isto pode afetar as suas definições atuais.</translation>
 <translation id="7674213385180944843">Abra Definições &gt; Privacidade &gt; Câmara &gt; Chromium e ative a câmara.</translation>
 <translation id="7746854981345936341">Sugestão para o Chromium: alguns botões encontram-se agora na parte inferior do ecrã, como Retroceder, Avançar e Pesquisar.</translation>
 <translation id="786327964234957808">Está a mudar a sincronização de contas de <ph name="USER_EMAIL1" /> para <ph name="USER_EMAIL2" />. Os seus dados do Chromium existentes são geridos por <ph name="DOMAIN" />. Esta ação eliminará os dados deste dispositivo, mas os dados permanecerão em <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
index c81a9ea..397140f4 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Este posibil ca Chromium să folosească servicii web pentru a-ți îmbunătăți experiența de navigare. Poți să dezactivezi aceste servicii. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Profită de ingeniozitatea Google în Chromium</translation>
 <translation id="2730884209570016437">Chromium nu poate folosi camera foto, deoarece este folosită de o altă aplicație</translation>
+<translation id="2797210818057553964">Poți personaliza oricând această setare din setările Chromium</translation>
 <translation id="3256316712990552818">Copiat în Chromium</translation>
 <translation id="3413120535237193088">Pentru a accesa marcajele pe toate dispozitivele, conectează-te la Chromium.</translation>
 <translation id="3473048256428424907">Activează scanerul QR din Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Datele selectate au fost eliminate din Chromium și de pe dispozitivele sincronizate. Contul Google poate să ofere alte forme ale istoricului de navigare, cum ar fi căutările și activitatea din alte servicii Google, la history.google.com.</translation>
 <translation id="7400689562045506105">Folosește Chromium pretutindeni</translation>
+<translation id="7499048969477415415">Setările care controlează sincronizarea, personalizarea și alte servicii Google din Chromium s-au modificat. Această acțiune poate afecta setările curente.</translation>
 <translation id="7674213385180944843">Deschide Setări &gt; Confidențialitate &gt; Cameră foto &gt; Chromium și activează camera foto.</translation>
 <translation id="7746854981345936341">Sfat pentru Chromium: unele butoane se află acum în partea de jos a ecranului, cum ar fi Înapoi, Înainte și Caută.</translation>
 <translation id="786327964234957808">Comuți contul pentru sincronizare de la <ph name="USER_EMAIL1" /> la <ph name="USER_EMAIL2" />. Datele Chromium existente sunt gestionate de <ph name="DOMAIN" />. Astfel, datele vor fi șterse de pe acest dispozitiv, dar vor rămâne în <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb
index c57ae31e7..86fd288af 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Chromium vám môže uľahčiť prehliadanie pomocou webových služieb. Vybrané webové služby môžete podľa potreby vypnúť. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Získajte inteligentné doplnky Googlu v prehliadači Chromium</translation>
 <translation id="2730884209570016437">Chromium nemôže použiť váš fotoaparát, pretože ho práve používa iná aplikácia</translation>
+<translation id="2797210818057553964">Môžete to kedykoľvek prispôsobiť v Nastaveniach prehliadača Chromium</translation>
 <translation id="3256316712990552818">Skopírovaná do prehliadača Chromium</translation>
 <translation id="3413120535237193088">Ak chcete mať záložky na všetkých zariadeniach, prihláste sa do prehliadača Chromium.</translation>
 <translation id="3473048256428424907">Zapnite čítačku kódov QR Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Vybraté údaje boli odstránené z prehliadača Chromium a synchronizovaných zariadení. Váš účet Google môže mať na adrese history.google.com ďalšie formy histórie prehliadania, ako napríklad vyhľadávania a aktivity v iných službách Google.</translation>
 <translation id="7400689562045506105">Používajte Chromium kdekoľvek</translation>
+<translation id="7499048969477415415">Boli zmenené nastavenia, ktoré ovládajú synchronizáciu, prispôsobenie a ďalšie služby Googlu v prehliadači Chromium. Môže to ovplyvniť aktuálne nastavenia.</translation>
 <translation id="7674213385180944843">Otvorte Nastavenia &gt; Súkromie &gt; Fotoaparát &gt; Chromium a zapnite fotoaparát.</translation>
 <translation id="7746854981345936341">Tip pre Chromium: niektoré tlačidlá sa teraz nachádzajú v dolnej časti obrazovky, napríklad Dopredu, Späť a Hľadať.</translation>
 <translation id="786327964234957808">Účet na synchronizáciu <ph name="USER_EMAIL1" /> prepínate na <ph name="USER_EMAIL2" />. Vaše existujúce údaje prehliadača Chromium spravuje doména <ph name="DOMAIN" />. Touto akciou odstránite údaje z vášho zariadenia, avšak zostanú naďalej v účte <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
index 5e664ba..2a9c7db 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
@@ -18,6 +18,7 @@
 Te storitve lahko po želji onemogočite. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Prejmite Googlove pametne rešitve v Chromiumu</translation>
 <translation id="2730884209570016437">Chromium ne more uporabljati fotoaparata, ker ga uporablja druga aplikacija</translation>
+<translation id="2797210818057553964">To je mogoče kadar koli prilagoditi v nastavitvah za Chromium</translation>
 <translation id="3256316712990552818">Kopirano v Chromium</translation>
 <translation id="3413120535237193088">Če želite dostopati do zaznamkov v vseh napravah, se prijavite v Chromium.</translation>
 <translation id="3473048256428424907">Vklop bralnika kod QR Chromiuma</translation>
@@ -46,6 +47,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Izbrani podatki so bili odstranjeni iz Chromiuma in sinhroniziranih naprav. V Google Računu so morda druge vrste zgodovine brskanja, kot so iskanja in dejavnosti iz drugih Googlovih storitev, na history.google.com.</translation>
 <translation id="7400689562045506105">Uporaba Chromiuma povsod</translation>
+<translation id="7499048969477415415">Nastavitve, ki nadzirajo sinhronizacijo, prilagajanje in druge Googlove storitve v Chromiumu, so se spremenile. To lahko vpliva na vaše trenutne nastavitve.</translation>
 <translation id="7674213385180944843">Odprite Settings &gt; Privacy &gt; Camera &gt; Chromium in vklopite fotoaparat.</translation>
 <translation id="7746854981345936341">Nasvet za Chromium. Nekateri gumbi, na primer gumbi za nazaj, naprej in iskanje, so zdaj na dnu zaslona.</translation>
 <translation id="786327964234957808">Z računa za sinhronizacijo <ph name="USER_EMAIL1" /> boste preklopili na račun <ph name="USER_EMAIL2" />. Obstoječe podatke v Chromiumu upravlja <ph name="DOMAIN" />. S tem boste izbrisali podatke iz te naprave, vendar bodo vaši podatki še vedno na voljo v računu <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb
index c4d3fa4..eac11f6 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Chromium може да користи веб-услуге да би побољшао доживљај прегледања. Можете опционално да онемогућите те услуге. <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Набавите паметне Google функције у Chromium-у</translation>
 <translation id="2730884209570016437">Chromium не може да користи камеру зато што је већ користи друга апликација</translation>
+<translation id="2797210818057553964">Ово увек можете да прилагодите у подешавањима Chromium-а</translation>
 <translation id="3256316712990552818">Копирана у Chromium</translation>
 <translation id="3413120535237193088">Да би вам обележивачи били доступни на свим уређајима, пријавите се у Chromium.</translation>
 <translation id="3473048256428424907">Укључите Chromium QR скенер</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Изабрани подаци су уклоњени из Chromium-а и са синхронизованих уређаја. Google налог можда има друге облике историје прегледања, попут претрага и активности у другим Google услугама на history.google.com.</translation>
 <translation id="7400689562045506105">Користите Chromium свуда</translation>
+<translation id="7499048969477415415">Променила су се подешавања која контролишу синхронизацију, персонализацију и друге Google услуге у Chromium-у. То може да утиче на тренутна подешавања.</translation>
 <translation id="7674213385180944843">Отворите Подешавања &gt; Приватност &gt; Камера &gt; Chromium и укључите камеру.</translation>
 <translation id="7746854981345936341">Савет за Chromium. Нека дугмад се сада налазе у дну екрана, попут дугмади Назад, Напред и Претражи.</translation>
 <translation id="786327964234957808">Мењате налог за синхронизацију из <ph name="USER_EMAIL1" /> у <ph name="USER_EMAIL2" />. Постојећим Chromium подацима управља <ph name="DOMAIN" />. На овај начин бришете податке са овог уређаја, али подаци остају на <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb
index e0281173..b19a35d 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Chromium kan använda webbtjänster för att förbättra din upplevelse på webben. Du kan inaktivera dessa tjänster om du vill. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Få Google-teknik i Chromium</translation>
 <translation id="2730884209570016437">Chromium kan inte använda kameran eftersom den används av en annan app</translation>
+<translation id="2797210818057553964">Du kan när som helst ändra detta i Chromium-inställningarna</translation>
 <translation id="3256316712990552818">Kopierat till Chromium</translation>
 <translation id="3413120535237193088">Logga in i Chromium om du vill få tillgång till samma bokmärken på alla enheter.</translation>
 <translation id="3473048256428424907">Aktivera Chromium som QR-skanner</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Den data som markerades har tagits bort från Chromium och från synkroniserade enheter. Det kan finnas andra former av webbhistorik i Google-kontot på history.google.com, t.ex. sökningar och aktivitet på andra tjänster från Google.</translation>
 <translation id="7400689562045506105">Använd Chromium överallt</translation>
+<translation id="7499048969477415415">Inställningarna som styr synkronisering, anpassning och andra tjänster från Google i Chromium har ändrats. Detta kan påverka dina nuvarande inställningar.</translation>
 <translation id="7674213385180944843">Öppna Inställningar &gt; Sekretess &gt; Kamera &gt; Chromium och aktivera kameran.</translation>
 <translation id="7746854981345936341">Tips för Chromium. Vissa knappar finns nu längst ned på skärmen, till exempel bakåtknappen, framåtknappen och Sök.</translation>
 <translation id="786327964234957808">Du håller på att byta synkroniseringskonto från <ph name="USER_EMAIL1" /> till <ph name="USER_EMAIL2" />. Befintlig data i Chromium hanteras av <ph name="DOMAIN" />. Åtgärden raderar din data från den här enheten men den finns kvar på <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb
index be0edae0..e938d95 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Chromium inaweza kutumia huduma za wavuti kuboresha hali yako ya kuvinjari. Unaweza kuzima huduma hizi kwa hiari. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Pata programu mahiri za Google kwenye Chromium</translation>
 <translation id="2730884209570016437">Chromium imeshindwa kutumia kamera yako kwa sababu inatumiwa na programu nyingine</translation>
+<translation id="2797210818057553964">Unaweza kuweka mapendeleo kwenye chaguo hili wakati wowote katika Mipangilio ya Chromium</translation>
 <translation id="3256316712990552818">Imenakiliwa kwenye Chromium</translation>
 <translation id="3413120535237193088">Ingia katika Chromium ili upate alamisho zako kwenye vifaa vyako vyote.</translation>
 <translation id="3473048256428424907">Washa kichanganuzi cha QR cha Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Data uliyochagua imeondolewa kwenye Chromium na kwenye vifaa vilivyosawazishwa. Huenda Akaunti yako ya Google ina aina nyingine za historia ya mambo uliyovinjari kama vile mambo uliyotafuta na shughuli kutoka huduma nyingine za Google katika history.google.com.</translation>
 <translation id="7400689562045506105">Tumia Chromium Kila mahali</translation>
+<translation id="7499048969477415415">Mipangilio inayodhibiti usawazishaji, mapendeleo na huduma nyingine za Google katika Chromium imebadilika. Huenda hali hii ikaathiri mipangilio yako ya sasa.</translation>
 <translation id="7674213385180944843">Fungua Mipangilio &gt; Faragha &gt; Kamera &gt; Chromium na uwashe kamera.</translation>
 <translation id="7746854981345936341">Kidokezo cha Chromium. Baadhi ya vitufe sasa vinapatikana katika sehemu ya chini ya skrini yako, kama vile kitufe cha Nyuma, Mbele na Tafuta.</translation>
 <translation id="786327964234957808">Unabadilisha akaunti za kusawazisha kutoka <ph name="USER_EMAIL1" /> kuwa <ph name="USER_EMAIL2" />. Data yako iliyopo ya Chromium inadhibitiwa na <ph name="DOMAIN" />. Hatua hii itafuta data yako kwenye kifaa hiki, lakini data yako itasalia katika <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb
index ced8655..ab87264a 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb
@@ -23,7 +23,7 @@
 <translation id="3605252743693911722">మీ పరికరాలన్నింటిలో మీ బుక్‌మార్క్‌లు, పాస్‌వర్డ్‌లు మరియు మరిన్నింటిని పొందడం కోసం Chromiumకు సైన్ ఇన్ చేయండి.</translation>
 <translation id="3805899903892079518">Chromium మీ ఫోటోలు లేదా వీడియోలకు ప్రాప్యతను కలిగి లేదు. iOS సెట్టింగ్‌లు &gt; గోప్యత &gt; ఫోటోల్లో ప్రాప్యతను ప్రారంభించండి.</translation>
 <translation id="4024541897090868497">మీ అన్ని పరికరాల్లో మీ ట్యాబ్‌లను పొందడం కోసం, Chromiumకి సైన్ ఇన్ చేయండి.</translation>
-<translation id="4157467675761413638">Chromium చిట్కా. మరిన్ని ట్యాబ్ ఎంపికల కోసం, మీ స్క్రీన్‌లో పైన కాని దిగువన కాని ఉండే సాధనాల బార్‌లో ట్యాబ్‌లను చూపు బటన్‌ను నొక్కి పట్టుకోండి.</translation>
+<translation id="4157467675761413638">Chromium చిట్కా. మరిన్ని ట్యాబ్ ఎంపికల కోసం, మీ స్క్రీన్‌లో పైన కానీ దిగువన కానీ ఉండే సాధనాల బార్‌లో ట్యాబ్‌లను చూపు బటన్‌ను నొక్కి పట్టుకోండి.</translation>
 <translation id="4241912885070669028">మీరు <ph name="SIGNOUT_MANAGED_DOMAIN" /> నిర్వహణలో ఉన్న ఖాతా నుండి సైన్ అవుట్ చేస్తున్నారు. దీని వలన మీ Chromium డేటా ఈ పరికరం నుండి తొలగించబడుతుంది, కానీ మీ డేటా మీ Google ఖాతాలో అలాగే ఉంటుంది.</translation>
 <translation id="4272892696084633551">Chromium ఫీచర్‌లు మరియు పనితీరును మెరుగుపరచడంలో సహాయపడండి</translation>
 <translation id="4555020257205549924">ఈ లక్షణం ప్రారంభించినప్పుడు, Chromium ఇతర భాషల్లో వ్రాసిన పేజీలకు Google అనువాదం ఉపయోగించి అనువాదాన్ని ఆఫర్ చేస్తుంది. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation>
@@ -46,7 +46,7 @@
 <translation id="7357211569052832586">ఎంచుకోబడిన డేటా Chromium మరియు సమకాలీకరించిన పరికరాల నుండి తీసివేయబడింది. మీ Google ఖాతా history.google.comలో ఇతర Google సేవలకు సంబంధించిన శోధనలు మరియు కార్యాచరణ వంటి ఇతర రకాల బ్రౌజింగ్ చరిత్రను కలిగి ఉండవచ్చు.</translation>
 <translation id="7400689562045506105">Chromiumని అంతటా ఉపయోగించండి</translation>
 <translation id="7674213385180944843">సెట్టింగ్‌లు &gt; గోప్యత &gt; కెమెరా &gt; Chromium తెరిచి, కెమెరాను ఆన్ చేయండి.</translation>
-<translation id="7746854981345936341">Chromium చిట్కా. ఇప్పుడు కొన్ని బటన్‌లు మీ స్క్రీన్ దిగువున ఉన్నాయి, వెనకకు, ముందుకు మరియు శోధన వంటి బటన్‌లు.</translation>
+<translation id="7746854981345936341">Chromium చిట్కా. వెనకకు, ముందుకు మరియు శోధన వంటి కొన్ని బటన్‌లు ఇప్పుడు మీ స్క్రీన్ దిగువన ఉన్నాయి.</translation>
 <translation id="786327964234957808">మీరు సమకాలీకరణ ఖాతాలను <ph name="USER_EMAIL1" /> నుండి <ph name="USER_EMAIL2" />కి మారుస్తున్నారు. ఇప్పటికే ఉన్న మీ Chromium డేటా <ph name="DOMAIN" /> నిర్వహణలో ఉంది. దీని వలన మీ డేటా ఈ పరికరం నుండి తొలగించబడుతుంది, కానీ మీ డేటా <ph name="USER_EMAIL1" />లో అలాగే ఉంటుంది.</translation>
 <translation id="8175055321229419309">చిట్కా: <ph name="BEGIN_LINK" />Chromiumని మీ డాక్‌కి తరలించండి<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">మీ స్థానం ఆధారంగా Chromiumలో మెరుగైన Google అనుభవాన్ని పొందండి.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb
index 1a1498e..10b7c8e 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb
@@ -17,6 +17,7 @@
 <translation id="2647554856022461007">Chromium може покращувати веб-перегляд за допомогою веб-служб. Ви можете вимкнути ці служби. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation>
 <translation id="2687023731466035790">Отримайте розумні функції Google у Chromium</translation>
 <translation id="2730884209570016437">Chromium не може використовувати камеру, оскільки її використовує інший додаток</translation>
+<translation id="2797210818057553964">Це можна будь-коли змінити в налаштуваннях Chromium</translation>
 <translation id="3256316712990552818">Скопійовано в Chromium</translation>
 <translation id="3413120535237193088">Щоб мати доступ до закладок на всіх своїх пристроях, увійдіть в обліковий запис Chromium.</translation>
 <translation id="3473048256428424907">Увімкнути сканер QR-кодів у Chromium</translation>
@@ -45,6 +46,7 @@
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Вибрані дані видалено з Chromium і синхронізованих пристроїв. У вашому обліковому записі Google на сторінці history.google.com може зберігатись історія веб-перегляду (як-от пошукові запити й активність) з інших служб Google.</translation>
 <translation id="7400689562045506105">Користуйтеся Chromium будь-де</translation>
+<translation id="7499048969477415415">Змінилися налаштування, які керують синхронізацією, персоналізацією й іншими сервісами Google у Chromium. Це може вплинути на поточні налаштування.</translation>
 <translation id="7674213385180944843">Відкрийте меню "Параметри" &gt; "Приватність" &gt; "Камера" &gt; "Chromium" і ввімкніть камеру.</translation>
 <translation id="7746854981345936341">Порада щодо Chromium. Деякі кнопки зараз розташовані внизу екрана, як-от "Назад", "Уперед" і "Пошук".</translation>
 <translation id="786327964234957808">Ви переходите з облікового запису <ph name="USER_EMAIL1" /> в обліковий запис <ph name="USER_EMAIL2" />. Наявними даними Chromium керує домен <ph name="DOMAIN" />. Ваші дані буде видалено з пристрою, але вони залишаться в обліковому записі <ph name="USER_EMAIL1" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
index 8e328f3..484a759f 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
@@ -39,7 +39,7 @@
 <translation id="5639704535586432836">सेटिंग &gt; निजता &gt; कैमरा &gt; Google Chrome खोलें और कैमरा चालू करें.</translation>
 <translation id="5642200033778930880">Google Chrome विभाजित दृश्य मोड में आपके कैमरे का उपयोग नहीं कर सकता</translation>
 <translation id="5703130498371792817">Chrome का आनंद ले रहे हैं? <ph name="BEGIN_LINK" />इस ऐप्लिकेशन को रेट करें<ph name="END_LINK" /></translation>
-<translation id="5854621639439811139">Chrome सलाह. 'वापस जाएं', 'आगे जाएं' और 'खोजें' जैसे कुछ बटन अब आपकी स्क्रीन के सबसे नीचे मिलेंगे.</translation>
+<translation id="5854621639439811139">Chrome के लिए सलाह. 'वापस जाएं', 'आगे जाएं' और 'खोजें' जैसे कुछ बटन अब आपकी स्क्रीन के सबसे नीचे मिलेंगे.</translation>
 <translation id="6036420186814142909">Google Chrome में ऐसी सुविधाएं हैं जो आपको अपने इंटरनेट डेटा को प्रबंधित करने और वेबपृष्ठों को तेज़ी से लोड करने में आपकी सहायता करती हैं. <ph name="BEGIN_LINK" />और जानें<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">आपके द्वारा अपने अन्य डिवाइस पर खोले गए टैब यहां दिखाई देंगे.</translation>
 <translation id="6600954340915313787">Chrome पर कॉपी किया गया</translation>
@@ -57,5 +57,5 @@
 <translation id="8459495907675268833">चयनित डेटा Chrome और समन्वयित डिवाइस से निकाल दिया गया है. हो सकता है कि आपके Google खाते में अन्य प्रकार के ब्राउज़िंग इतिहास जैसे खोज और history.google.com पर अन्य Google सेवाओं की गतिविधि हो.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">आपके ब्राउज़िंग अनुभव को बेहतर बनाने के लिए Google Chrome, वेब सेवाओं का उपयोग कर सकता है. आप इन सेवाओं को वैकल्‍पिक रूप से बंद कर सकते हैं. <ph name="BEGIN_LINK" />और जानें<ph name="END_LINK" /></translation>
-<translation id="96145293669295453">Chrome सलाह. ज़्यादा टैब विकल्पों के लिए, टूलबार में 'टेब दिखाएं' बटन को दबाकर रखें, जो आपकी स्क्रीन के सबसे नीचे या सबसे ऊपर मिलेगा.</translation>
+<translation id="96145293669295453">Chrome के लिए सलाह. ज़्यादा टैब विकल्पों के लिए, टूलबार में 'टेब दिखाएं' बटन को दबाकर रखें, जो आपकी स्क्रीन के सबसे नीचे या सबसे ऊपर मिलेगा.</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hr.xtb
index cfb23240..ca292c9 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hr.xtb
@@ -58,5 +58,5 @@
 <translation id="8459495907675268833">Odabrani podaci uklonjeni su iz Chromea i sa sinkroniziranih uređaja. Na Google računu možda postoje drugi oblici povijesti pregledavanja, primjerice pretraživanja i aktivnosti s drugih Googleovih usluga, na stranici history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome može upotrebljavati web-usluge za poboljšanje pregledavanja. Ako želite, možete onemogućiti te usluge. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
-<translation id="96145293669295453">Savjet za Chrome. Za više opcija kartice pritisnite i zadržite gumb Prikaži kartice na alatnoj traci pri dnu ili vrhu zaslona.</translation>
+<translation id="96145293669295453">Savjet za Chrome. Za više opcija kartice pritisnite i držite gumb Prikaži kartice na alatnoj traci pri dnu ili vrhu zaslona.</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb
index 8853020..5e45e8e 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb
@@ -58,5 +58,5 @@
 <translation id="8459495907675268833">ಆಯ್ಕೆಮಾಡಲಾದ ಡೇಟಾವನ್ನು Chrome ಮತ್ತು ಸಿಂಕ್ ಮಾಡಲ್ಪಟ್ಟ ಸಾಧನಗಳಿಂದ ತೆಗೆದುಹಾಕಲಾಗಿದೆ. ನಿಮ್ಮ Google ಖಾತೆಯು history.google.com ನಲ್ಲಿ ಇತರ Google ಸೇವೆಗಳಿಂದ ಹುಡುಕಾಟಗಳು ಮತ್ತು ಚಟುವಟಿಕೆಯಂತಹ ಬ್ರೌಸಿಂಗ್ ಹುಡುಕಾಟಗಳ ಇತರ ಪ್ರಕಾರಗಳನ್ನು ಹೊಂದಿರಬಹುದು.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಅನುಭವವನ್ನು ಉತ್ತಮಗೊಳಿಸಲು ವೆಬ್‍ ಸೇವೆಗಳನ್ನು ಬಳಸಬಹುದು. ನಿಮಗೆ ಬೇಡವೆಂದಾಗ ಈ ಸೇವೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು. <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation>
-<translation id="96145293669295453">Chrome ಸಲಹೆ. ಇನ್ನಷ್ಟು ಟ್ಯಾಬ್ ಆಯ್ಕೆಗಳಿಗಾಗಿ, ನಿಮ್ಮ ಪರದೆಯ ಕೆಳಭಾಗ ಅಥವಾ ಮೇಲ್ಭಾಗದಲ್ಲಿರುವ ಟ್ಯಾಬ್‌ಗಳನ್ನು ತೋರಿಸಿ ಬಟನ್ ಅನ್ನು ಒತ್ತಿಹಿಡಿಯಿರಿ.</translation>
+<translation id="96145293669295453">Chrome ಸಲಹೆ. ಇನ್ನಷ್ಟು ಟ್ಯಾಬ್ ಆಯ್ಕೆಗಳಿಗಾಗಿ, ನಿಮ್ಮ ಪರದೆಯ ಕೆಳಭಾಗ ಅಥವಾ ಮೇಲ್ಭಾಗದಲ್ಲಿರುವ ಪರಿಕರ ಪಟ್ಟಿಯಲ್ಲಿರುವ "ಟ್ಯಾಬ್‌ಗಳನ್ನು ತೋರಿಸಿ" ಬಟನ್ ಅನ್ನು ಒತ್ತಿಹಿಡಿಯಿರಿ.</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
index 646df21..87b1865 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
@@ -39,7 +39,7 @@
 <translation id="5639704535586432836">ക്രമീകരണം &gt; സ്വകാര്യത &gt; ക്യാമറ &gt; Google Chrome തുറന്ന് ക്യാമറ ഓണാക്കുക.</translation>
 <translation id="5642200033778930880">വിഭജിത കാഴ്‌ച മോഡിൽ Google Chrome-ന് നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാനാവില്ല</translation>
 <translation id="5703130498371792817">Chrome ആസ്വദിക്കുന്നുണ്ടോ? <ph name="BEGIN_LINK" />ഈ ആപ്പ് റേറ്റുചെയ്യുക<ph name="END_LINK" /></translation>
-<translation id="5854621639439811139">Chrome നുറുങ്ങ്. ബാക്ക്, മുമ്പോട്ട് പോകാനുള്ളത് തുടങ്ങിയ ചില ബട്ടണുകൾ, ഇപ്പോൾ നിങ്ങളുടെ സ്‌ക്രീനിന്റെ താഴെയാണ്.</translation>
+<translation id="5854621639439811139">Chrome നുറുങ്ങ്. മടങ്ങുക, മുമ്പോട്ട് പോകുക, തിരയൽ, എന്നീ ചില ബട്ടണുകൾ ഇപ്പോൾ നിങ്ങളുടെ സ്‌ക്രീനിന്റെ താഴെയാണ്.</translation>
 <translation id="6036420186814142909">നിങ്ങളുടെ ഇന്റർനെറ്റ് ഡാറ്റ നിയന്ത്രിക്കുന്നതിനെയും വെബ്‌പേജുകൾ നിങ്ങൾക്ക് എങ്ങനെ വേഗത്തിൽ ലോഡുചെയ്യാനാകുമെന്നതിനെയും സഹായിക്കുന്ന സവിശേഷതകൾ Google Chrome-നുണ്ട്.
 <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">നിങ്ങളുടെ മറ്റ് ഉപകരണങ്ങളിലെ Chrome-ൽ തുറന്ന ടാബുകൾ ഇവിടെ ദൃശ്യമാകും.</translation>
@@ -58,5 +58,5 @@
 <translation id="8459495907675268833">തിരഞ്ഞെടുത്ത ഡാറ്റയെ Chrome-ൽ നിന്നും സമന്വയിപ്പിച്ച ഉപകരണങ്ങളിൽ നിന്നും നീക്കംചെയ്‌തു. നിങ്ങളുടെ Google അക്കൗണ്ടിന് history.google.com എന്നതിൽ മറ്റ് Google സേവനങ്ങളിൽ നിന്നുള്ള തിരയലുകൾ, പ്രവൃത്തി എന്നിങ്ങനെ മറ്റ് തരത്തിലുള്ള ബ്രൗസിംഗ് ചരിത്രമുണ്ടായിരിക്കാം.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">നിങ്ങളുടെ ബ്രൗസിംഗ് അനുഭവം മെച്ചപ്പെടുത്താൻ Google Chrome വെബ് സേവനങ്ങൾ ഉപയോഗിക്കാനിടയുണ്ട്. നിങ്ങൾക്ക് ഈ സേവനങ്ങൾ ഓപ്‌ഷണലായി പ്രവർത്തനരഹിതമാക്കാം. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
-<translation id="96145293669295453">Chrome നുറുങ്ങ്. കൂടുതൽ ടാബ് ഓപ്ഷനുകൾക്കായി, നിങ്ങളുടെ സ്‌ക്രീനിന്റെ താഴെയോ മുകളിലോ ഉള്ള, ടൂൾബാറിലെ ബട്ടൺ ഷോ ടാബുകൾ, അമർത്തിപ്പിടിക്കുക.</translation>
+<translation id="96145293669295453">Chrome നുറുങ്ങ്. കൂടുതൽ ടാബ് ഓപ്ഷനുകൾക്കായി, നിങ്ങളുടെ സ്‌ക്രീനിന്റെ താഴെയോ മുകളിലോ ഉള്ള, ടൂൾബാറിലെ 'ടാബ് കാണിക്കുക' ബട്ടൺ അമർത്തിപ്പിടിക്കുക.</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb
index 87c0477..3d50eb0 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb
@@ -58,5 +58,5 @@
 <translation id="8459495907675268833">De geselecteerde gegevens zijn verwijderd uit Chrome en van gesynchroniseerde apparaten. Voor je Google-account kunnen andere vormen van browsegeschiedenis (zoals zoekopdrachten en activiteit uit andere Google-services) beschikbaar zijn via history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome kan webservices gebruiken om je browse-ervaring te verbeteren. Je kunt deze services eventueel uitschakelen. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation>
-<translation id="96145293669295453">Chrome-tip. Voor meer tabbladopties tik je op de werkbalk onder- of bovenaan het scherm op de knop 'Tabbladen weergeven' en houd je deze knop vast.</translation>
+<translation id="96145293669295453">Chrome-tip. Voor meer tabbladopties tik je, op de werkbalk onder- of bovenaan het scherm, op de knop 'Tabbladen weergeven' en houd je deze knop vast.</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
index bc5eb308..578d813 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
@@ -39,7 +39,7 @@
 <translation id="5639704535586432836">Åpne Innstillinger &gt; Personvern &gt; Kamera &gt; Google Chrome, og slå på kameraet.</translation>
 <translation id="5642200033778930880">Google Chrome kan ikke bruke kameraet i modus for delt visning</translation>
 <translation id="5703130498371792817">Liker du Chrome? <ph name="BEGIN_LINK" />Vurder denne appen<ph name="END_LINK" /></translation>
-<translation id="5854621639439811139">Chrome tips. Noen knapper, som Tilbake, Fremover og Søk, er nå nederst på skjermen.</translation>
+<translation id="5854621639439811139">Chrome-tips. Noen knapper, slik som Tilbake, Frem og Søk, er nå nederst på skjermen.</translation>
 <translation id="6036420186814142909">Google Chrome har funksjoner som hjelper deg med å administrere dataforbruket ditt og hastigheten for innlasting av nettsider.
 <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Faner du har åpnet i Chrome på de andre enhetene dine, vises her.</translation>
@@ -58,5 +58,5 @@
 <translation id="8459495907675268833">De valgte dataene er fjernet fra Chrome og alle synkroniserte enheter. Det kan hende Google-kontoen din har andre typer nettlesingslogger, for eksempel for søk og aktivitet fra andre Google-tjenester, på history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome bruker nettjenester for å forbedre nettopplevelsen din. Du kan deaktivere disse tjenestene. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
-<translation id="96145293669295453">Chrome tips. For flere fanealternativer, trykk og hold ned Vis fane-knappen i verktøylinjen, som du finner nederst eller øverst på skjermen.</translation>
+<translation id="96145293669295453">Chrome-tips. For flere fanealternativer, trykk og hold Vis fane-knappen i verktøylinjen, som du finner nederst eller øverst på skjermen.</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb
index 52a49599..b496b846 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb
@@ -39,7 +39,7 @@
 <translation id="5639704535586432836">సెట్టింగ్‌లు &gt; గోప్యత &gt; కెమెరా &gt; Google Chromeని తెరిచి, కెమెరాను ఆన్ చేయండి.</translation>
 <translation id="5642200033778930880">Google Chrome విభజన వీక్షణ మోడ్‌లో మీ కెమెరాను ఉపయోగించలేదు</translation>
 <translation id="5703130498371792817">Chromeని ఆస్వాదిస్తున్నారా? <ph name="BEGIN_LINK" />ఈ అనువర్తనాన్ని రేట్ చేయండి<ph name="END_LINK" /></translation>
-<translation id="5854621639439811139">Chrome చిట్కా. ఇప్పుడు కొన్ని బటన్‌లు మీ స్క్రీన్ దిగువున ఉన్నాయి, వెనకకు, ముందుకు మరియు శోధన వంటి బటన్‌లు.</translation>
+<translation id="5854621639439811139">Chrome చిట్కా. వెనకకు, ముందుకు మరియు శోధన వంటి కొన్ని బటన్‌లు ఇప్పుడు మీ స్క్రీన్ దిగువున ఉన్నాయి.</translation>
 <translation id="6036420186814142909">మీ ఇంటర్నెట్ డేటాను నిర్వహించడంలో మరియు మీరు వెబ్ పేజీలను త్వరగా లోడ్ చేయగలగడంలో మీకు సహాయపడే లక్షణాలను Google Chrome కలిగి ఉంది.
 <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">మీరు మీ ఇతర పరికరాల్లోని Chromeలో తెరిచిన ట్యాబ్‌లు ఇక్కడ చూపబడతాయి.</translation>
@@ -58,5 +58,5 @@
 <translation id="8459495907675268833">ఎంచుకోబడిన డేటా Chrome మరియు సమకాలీకరించిన పరికరాల నుండి తీసివేయబడింది. మీ Google ఖాతా history.google.comలో ఇతర Google సేవలకు సంబంధించిన శోధనలు మరియు కార్యాచరణ వంటి ఇతర రకాల బ్రౌజింగ్ చరిత్రను కలిగి ఉండవచ్చు.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome మీ బ్రౌజింగ్ అనుభవాన్ని మెరుగుపరచడానికి వెబ్ సేవలను ఉపయోగించవచ్చు. మీరు ఈ సేవలను ఐచ్ఛికంగా నిలిపివేయవచ్చు. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation>
-<translation id="96145293669295453">Chrome చిట్కా. మరిన్ని ట్యాబ్ ఎంపికల కోసం, మీ స్క్రీన్‌లో పైన కాని దిగువన కాని ఉండే సాధనాల బార్‌లో ట్యాబ్‌లను చూపు బటన్‌ను నొక్కి పట్టుకోండి.</translation>
+<translation id="96145293669295453">Chrome చిట్కా. మరిన్ని ట్యాబ్ ఎంపికల కోసం, మీ స్క్రీన్‌లో పైన కానీ దిగువన కానీ ఉండే సాధనాల బార్‌లో ట్యాబ్‌లను చూపు బటన్‌ను నొక్కి పట్టుకోండి.</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index 8d3e64f..f650523a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">ምስሉን በአዲስ ትር ውስጥ ክፈት</translation>
 <translation id="3603009562372709545">የአገናኝ ዩአርኤል ገልብጥ</translation>
 <translation id="3607167657931203000">የራስ-ሙላ ውሂብ</translation>
+<translation id="360930808415985584">ስምረትን፣ ግላዊነት ማላበስን እና ተጨማሪ ነገሮችን ይቆጣጠሩ</translation>
 <translation id="3609785682760573515">በማመሳሰል ላይ...</translation>
 <translation id="3628119975092896051">የንባብ ዝርዝርዎ ከመስመር ውጭ ይገኛል። አንድ ገጽ ወደ የእርስዎ የንባብ ዝርዝር ለማከል <ph name="SHARE_OPENING_ICON" />ን መታ ያድርጉ።</translation>
 <translation id="3638472932233958418">ድረ-ገጾችን አስቀድመው ይጫኑ</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">የመግቢያ ማስተዋወቂያን ዝጋ</translation>
 <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> ላይ የተቀመጡ የይለፍ ቃሎችን ይመልከቱ እና ያስተዳድሩ</translation>
 <translation id="4536418791685807335">እንደገና ወደ መለያ ለመግባት ይሞክሩ።</translation>
+<translation id="4541241553780729349">ከGoogle ጋር የሚሰመረው ውሂብ እና ባህሪያት አይቀየሩም</translation>
 <translation id="457386861538956877">ተጨማሪ...</translation>
 <translation id="461440297010471931">በGoogle መፈለግ</translation>
 <translation id="4619615317237390068">ከሌሎች መሣሪያዎች የመጡ ትሮች</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index 618f96e6..415b6aa 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">فتح صورة في علامة تبويب جديدة</translation>
 <translation id="3603009562372709545">‏نسخ عنوان URL للرابط</translation>
 <translation id="3607167657931203000">ملء البيانات تلقائيًا</translation>
+<translation id="360930808415985584">التحكُّم في المزامنة والتخصيص والمزيد</translation>
 <translation id="3609785682760573515">جارٍ المزامنة...</translation>
 <translation id="3628119975092896051">قائمة القراءة متاحة بلا اتصال بالإنترنت. لإضافة صفحة إلى قائمة القراءة، انقر على <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">تحميل صفحات الويب مسبقًا</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">إغلاق عرض ترويجي لتسجيل الدخول</translation>
 <translation id="4526249700380860531">‏عرض كلمات المرور المحفوظة وإدارتها في <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">حاول تسجيل الدخول مرة أخرى.</translation>
+<translation id="4541241553780729349">‏لن تتغير البيانات التي تتزامن مع Google والميزات التي تستخدمها</translation>
 <translation id="457386861538956877">المزيد...</translation>
 <translation id="461440297010471931">‏البحث من خلال Google</translation>
 <translation id="4619615317237390068">علامات التبويب من الأجهزة الأخرى</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
index aae3cb3..1aa24d4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Отваряне на изображението в нов раздел</translation>
 <translation id="3603009562372709545">Копиране на URL адреса на връзката</translation>
 <translation id="3607167657931203000">Автоматично попълване на данни</translation>
+<translation id="360930808415985584">Контрол върху синхронизирането, персонализирането и др.</translation>
 <translation id="3609785682760573515">Синхронизира се...</translation>
 <translation id="3628119975092896051">Списъкът ви за четене е налице офлайн. За да добавите страница към него, докоснете „<ph name="SHARE_OPENING_ICON" />“.</translation>
 <translation id="3638472932233958418">Предв. зареждане на уеб стр.</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Затваряне на подканата за вход</translation>
 <translation id="4526249700380860531">Преглед и управление на запазените пароли на адрес <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Опитайте да влезете отново.</translation>
+<translation id="4541241553780729349">Данните, които синхронизирате с Google, и използваните от вас функции няма да се променят</translation>
 <translation id="457386861538956877">Още...</translation>
 <translation id="461440297010471931">Търсене с Google</translation>
 <translation id="4619615317237390068">Раздели от други устройства</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
index 97225e6d..4b24548d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Obre la imatge en una pestanya nova</translation>
 <translation id="3603009562372709545">Copia l'URL de l'enllaç</translation>
 <translation id="3607167657931203000">Dades d'Emplenament automàtic</translation>
+<translation id="360930808415985584">Controla la sincronització i la personalització, entre d'altres</translation>
 <translation id="3609785682760573515">S'està sincronitzant...</translation>
 <translation id="3628119975092896051">La llista de lectura està disponible sense connexió. Per afegir-hi una pàgina, toca <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Càrrega prèvia de pàgines web</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Tanca la promoció d'inici de sessió</translation>
 <translation id="4526249700380860531">Consulta i gestiona les contrasenyes desades a <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Torna a iniciar la sessió.</translation>
+<translation id="4541241553780729349">Les dades que se sincronitzen a Google i les funcions que utilitzis no canviaran</translation>
 <translation id="457386861538956877">Més...</translation>
 <translation id="461440297010471931">S'està cercant amb Google</translation>
 <translation id="4619615317237390068">Pestanyes d'altres dispositius</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
index bb765fd6..33610f8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Otevřít obrázek na nové kartě</translation>
 <translation id="3603009562372709545">Kopírovat adresu URL odkazu</translation>
 <translation id="3607167657931203000">Data automatického vyplňování</translation>
+<translation id="360930808415985584">Ovládání synchronizace, personalizace apod.</translation>
 <translation id="3609785682760573515">Synchronizace...</translation>
 <translation id="3628119975092896051">Seznam obsahu k přečtení je k dispozici offline. Chcete-li na něj přidat stránku, klepněte na <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Přednačítat stránky</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Zavřít propagační zprávu ohledně přihlášení</translation>
 <translation id="4526249700380860531">Uložená hesla můžete zobrazit a upravit na adrese <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Zkuste se přihlásit znovu.</translation>
+<translation id="4541241553780729349">Data synchronizovaná do Googlu ani používané funkce se nezmění</translation>
 <translation id="457386861538956877">Další...</translation>
 <translation id="461440297010471931">Vyhledává se pomocí Googlu</translation>
 <translation id="4619615317237390068">Karty z ostatních zařízení</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index 71fee54..dafb2208 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Åbn billede på ny fane</translation>
 <translation id="3603009562372709545">Kopiér linkets webadresse</translation>
 <translation id="3607167657931203000">AutoFyld-data</translation>
+<translation id="360930808415985584">Styr synkronisering, tilpasning og meget mere</translation>
 <translation id="3609785682760573515">Synkroniserer…</translation>
 <translation id="3628119975092896051">Din læseliste er tilgængelig offline. Du kan føje en side til din læseliste ved at trykke på <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Forudindlæs websider</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Luk loginkampagne</translation>
 <translation id="4526249700380860531">Se og administrer gemte adgangskoder på <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Prøv at logge ind igen.</translation>
+<translation id="4541241553780729349">De data, du synkroniserer med Google, og de funktioner, du bruger, ændres ikke</translation>
 <translation id="457386861538956877">Flere...</translation>
 <translation id="461440297010471931">Søgning via Google</translation>
 <translation id="4619615317237390068">Faner fra andre enheder</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index 42f661c..108de8a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Bild in neuem Tab öffnen</translation>
 <translation id="3603009562372709545">Link-URL kopieren</translation>
 <translation id="3607167657931203000">AutoFill-Daten</translation>
+<translation id="360930808415985584">Funktionen wie Synchronisierung und Personalisierung verwalten</translation>
 <translation id="3609785682760573515">Synchronisieren...</translation>
 <translation id="3628119975092896051">Ihre Leseliste ist offline verfügbar. Um Ihrer Leseliste eine Seite hinzuzufügen, tippen Sie auf <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Webseiten vorabladen</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Anmeldeangebot schließen</translation>
 <translation id="4526249700380860531">Unter <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> gespeicherte Passwörter aufrufen und verwalten</translation>
 <translation id="4536418791685807335">Melden Sie sich noch einmal an.</translation>
+<translation id="4541241553780729349">Die mit Google synchronisierten Daten und die verwendeten Funktionen werden nicht geändert</translation>
 <translation id="457386861538956877">Mehr...</translation>
 <translation id="461440297010471931">Mit Google suchen</translation>
 <translation id="4619615317237390068">Tabs von anderen Geräten</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb
index a29acf1..447c8a1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Άνοιγμα εικόνας σε νέα καρτέλα</translation>
 <translation id="3603009562372709545">Αντιγραφή διεύθυνσης URL συνδέσμου</translation>
 <translation id="3607167657931203000">Δεδομένα Αυτόματης συμπλήρωσης</translation>
+<translation id="360930808415985584">Έλεγχος συγχρονισμού, εξατομίκευσης και άλλων</translation>
 <translation id="3609785682760573515">Συγχρονισμός…</translation>
 <translation id="3628119975092896051">Η λίστα ανάγνωσης είναι διαθέσιμη εκτός σύνδεσης. Για να προσθέσετε μια σελίδα στη λίστα ανάγνωσης, πατήστε το εικονίδιο <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Προφόρτ. ιστοσελίδων</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Κλείσιμο προσφοράς σύνδεσης</translation>
 <translation id="4526249700380860531">Προβολή και διαχείριση των αποθηκευμένων κωδικών πρόσβασης στη διεύθυνση <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Δοκιμάστε να συνδεθείτε ξανά.</translation>
+<translation id="4541241553780729349">Τα δεδομένα που συγχρονίζετε στο Google και οι λειτουργίες που χρησιμοποιείτε δεν θα αλλάξουν</translation>
 <translation id="457386861538956877">Περισσότερα...</translation>
 <translation id="461440297010471931">Αναζήτηση με το Google</translation>
 <translation id="4619615317237390068">Καρτέλες από άλλες συσκευές</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 a90b31c..43b73260 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Open Image in New Tab</translation>
 <translation id="3603009562372709545">Copy Link URL</translation>
 <translation id="3607167657931203000">Autofill Data</translation>
+<translation id="360930808415985584">Control Sync, Personalisation and More</translation>
 <translation id="3609785682760573515">Syncing...</translation>
 <translation id="3628119975092896051">Your reading list is available offline. To add a page to your reading list, tap <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Pre-load Web Pages</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Close sign-in promo</translation>
 <translation id="4526249700380860531">View and manage saved passwords at <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Try signing in again.</translation>
+<translation id="4541241553780729349">The data sync to Google and the features you use will not change</translation>
 <translation id="457386861538956877">More...</translation>
 <translation id="461440297010471931">Searching with Google</translation>
 <translation id="4619615317237390068">Tabs from other devices</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index a2fd011..7ea21a9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Abrir imagen en una pestaña nueva</translation>
 <translation id="3603009562372709545">Copiar URL de enlace</translation>
 <translation id="3607167657931203000">Datos de la función Autocompletar</translation>
+<translation id="360930808415985584">Controlar la sincronización, la personalización y mucho más</translation>
 <translation id="3609785682760573515">Sincronizando...</translation>
 <translation id="3628119975092896051">Tu lista de lectura está disponible sin conexión. Para añadir una página a la lista, toca <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Precargar páginas web</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Cierra el inicio de sesión en la promoción</translation>
 <translation id="4526249700380860531">Consulta y administra contraseñas guardadas en la página <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Prueba a iniciar sesión de nuevo.</translation>
+<translation id="4541241553780729349">Los datos que sincronizas con Google y las funciones que utilizas no cambiarán</translation>
 <translation id="457386861538956877">Más...</translation>
 <translation id="461440297010471931">Buscar con Google</translation>
 <translation id="4619615317237390068">Pestañas de otros dispositivos</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index 9c09c62d..10326d0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Ava kujutis uuel vahelehel</translation>
 <translation id="3603009562372709545">Kopeeri lingi URL</translation>
 <translation id="3607167657931203000">Automaattäite andmed</translation>
+<translation id="360930808415985584">Sünkroonimise, isikupärastamise jms juhtimine</translation>
 <translation id="3609785682760573515">Sünkroonimine ...</translation>
 <translation id="3628119975092896051">Teie lugemisloend on võrguühenduseta saadaval. Lugemisloendisse lehe lisamiseks puudutage ikooni <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Lehtede eellaadimine</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Sule sisselogimisviip</translation>
 <translation id="4526249700380860531">Vaadake ja hallake salvestatud paroole saidil <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Proovige uuesti sisse logida.</translation>
+<translation id="4541241553780729349">Google'iga sünkroonitavad andmed ja teie kasutatavad funktsioonid ei muutu</translation>
 <translation id="457386861538956877">Rohkem ...</translation>
 <translation id="461440297010471931">Otsimine Google'iga</translation>
 <translation id="4619615317237390068">Muudest seadmetest pärinevad vahelehed</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index 931a2d8..8cbb232 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -168,6 +168,7 @@
 <translation id="3588820906588687999">باز کردن تصویر در برگه جدید</translation>
 <translation id="3603009562372709545">‏کپی URL پیوند</translation>
 <translation id="3607167657931203000">داده‌های تکمیل خودکار</translation>
+<translation id="360930808415985584">کنترل همگام‌سازی، شخصی‌سازی، و موارد دیگر</translation>
 <translation id="3609785682760573515">در حال همگام‌سازی...</translation>
 <translation id="3628119975092896051">فهرست خواندن شما در حالت آفلاین در دسترس است. برای افزودن صفحه‌ای به فهرست خواندنتان، روی <ph name="SHARE_OPENING_ICON" /> ضربه بزنید.</translation>
 <translation id="3638472932233958418">صفحات وب از پیش بارگیری شده</translation>
@@ -214,6 +215,7 @@
 <translation id="4508750114462689118">بستن تبلیغ ورود به سیستم</translation>
 <translation id="4526249700380860531">‏مشاهده و مدیریت گذرواژه‌های ذخیره شده در <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">دوباره برای ورود به سیستم تلاش کنید.</translation>
+<translation id="4541241553780729349">‏داده‌هایی که با Google همگام‌سازی می‌کنید و قابلیت‌هایی که استفاده می‌کنید، تغییر نخواهد کرد</translation>
 <translation id="457386861538956877">بیشتر...</translation>
 <translation id="461440297010471931">‏درحال جستجو با Google</translation>
 <translation id="4619615317237390068">برگه‌ها از دستگاه‌های دیگر</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index b700d72..b5fa50a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Ouvrir l'image dans un nouvel onglet</translation>
 <translation id="3603009562372709545">Copier l'URL du lien</translation>
 <translation id="3607167657931203000">Saisie automatique</translation>
+<translation id="360930808415985584">Contrôler les paramètres de synchronisation et de personnalisation, et bien plus</translation>
 <translation id="3609785682760573515">Synchronisation en cours…</translation>
 <translation id="3628119975092896051">Votre liste de lecture est disponible hors connexion. Pour ajouter une page à cette liste, appuyez sur <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Précharger pages Web</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Fermer la promo de connexion</translation>
 <translation id="4526249700380860531">Afficher et gérer les mots de passe enregistrés sur <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Veuillez essayer de vous reconnecter.</translation>
+<translation id="4541241553780729349">Les données que vous synchronisez avec Google et les fonctionnalités que vous utilisez ne changeront pas</translation>
 <translation id="457386861538956877">Autres...</translation>
 <translation id="461440297010471931">Recherche sur Google</translation>
 <translation id="4619615317237390068">Onglets d'autres appareils</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index 514b55b..ae1d2629 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">चित्र नए टैब में खोलें</translation>
 <translation id="3603009562372709545">लिंक URL कॉपी करें</translation>
 <translation id="3607167657931203000">ऑटोमैटिक भरना</translation>
+<translation id="360930808415985584">'सिंक करें', 'मनमुताबिक बनाएं' वगैरह नियंत्रित करें</translation>
 <translation id="3609785682760573515">समन्वयित हो रहा है...</translation>
 <translation id="3628119975092896051">आपकी पढ़ने की सूची ऑफ़लाइन उपलब्ध है. अपनी पढ़ने की सूची में कोई पेज जोड़ने के लिए, <ph name="SHARE_OPENING_ICON" /> पर टैप करें.</translation>
 <translation id="3638472932233958418">पहले से लोड वेबपेज</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">प्रवेश प्रोमो बंद करें</translation>
 <translation id="4526249700380860531">सहेजे गए पासवर्ड <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> पर देखें और प्रबंधित करें</translation>
 <translation id="4536418791685807335">फिर से प्रवेश करके देखें.</translation>
+<translation id="4541241553780729349">Google में आपके सिंक किए गए डेटा और आपकी इस्तेमाल की जा रही सुविधाओं में कोई बदलाव नहीं होगा</translation>
 <translation id="457386861538956877">अधिक...</translation>
 <translation id="461440297010471931">Google से खोजना</translation>
 <translation id="4619615317237390068">अन्य डिवाइस के टैब</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
index 3b971f8..12841205 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Otvori sliku u novoj kartici</translation>
 <translation id="3603009562372709545">Kopiraj URL veze</translation>
 <translation id="3607167657931203000">Podaci automatskog popunjavanja</translation>
+<translation id="360930808415985584">Upravljanje sinkronizacijom, prilagodbom i još mnogo toga</translation>
 <translation id="3609785682760573515">Sinkronizacija...</translation>
 <translation id="3628119975092896051">Vaš popis za čitanje dostupan je offline. Da biste dodali stranicu na popis za čitanje, dodirnite <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Već učitane stranice</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Zatvori promociju za prijavu</translation>
 <translation id="4526249700380860531">Prikaz spremljenih zaporki i upravljanje njima na <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Pokušajte se ponovo prijaviti.</translation>
+<translation id="4541241553780729349">Podaci koje sinkronizirate s Googleom i značajke koje upotrebljavate neće se promijeniti</translation>
 <translation id="457386861538956877">Više...</translation>
 <translation id="461440297010471931">Pretraživanje putem Googlea</translation>
 <translation id="4619615317237390068">Kartice s drugih uređaja</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index 00447c2..4044a79 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Buka Gambar di Tab Baru</translation>
 <translation id="3603009562372709545">Salin URL Tautan</translation>
 <translation id="3607167657931203000">Data Isi-Otomatis</translation>
+<translation id="360930808415985584">Mengontrol Sinkronisasi, Personalisasi, dan Lainnya</translation>
 <translation id="3609785682760573515">Menyinkronkan...</translation>
 <translation id="3628119975092896051">Daftar bacaan Anda tersedia secara offline. Untuk menambahkan halaman ke daftar bacaan, tap <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Pramuat Halaman Web</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Tutup promo login</translation>
 <translation id="4526249700380860531">Melihat dan mengelola sandi yang tersimpan di <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Coba masuk lagi.</translation>
+<translation id="4541241553780729349">Sinkronisasi data ke Google dan fitur yang Anda gunakan tidak akan berubah</translation>
 <translation id="457386861538956877">Lainnya...</translation>
 <translation id="461440297010471931">Menelusuri dengan Google</translation>
 <translation id="4619615317237390068">Tab dari perangkat lain</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb
index 40de82f9..39f6c66 100644
--- a/ios/chrome/app/strings/resources/ios_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Apri immagine in un'altra scheda</translation>
 <translation id="3603009562372709545">Copia URL link</translation>
 <translation id="3607167657931203000">Dati della Compilazione automatica</translation>
+<translation id="360930808415985584">Controlla la sincronizzazione, la personalizzazione e non solo</translation>
 <translation id="3609785682760573515">Sincronizzazione in corso...</translation>
 <translation id="3628119975092896051">Il tuo elenco di lettura è disponibile offline. Per aggiungere una pagina all'elenco di lettura, tocca <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Precarica pagine web</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Chiudi promo accesso</translation>
 <translation id="4526249700380860531">Controlla e gestisci le password salvate all'indirizzo <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Prova ad accedere nuovamente.</translation>
+<translation id="4541241553780729349">I dati sincronizzati con Google e le funzionalità che utilizzi non cambieranno</translation>
 <translation id="457386861538956877">Altro...</translation>
 <translation id="461440297010471931">Ricerca con Google</translation>
 <translation id="4619615317237390068">Schede di altri dispositivi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index 8e8f93c..f9aa1e30 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -167,6 +167,7 @@
 <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>
+<translation id="360930808415985584">Sinhronizāciju, personalizācijas un citu iespēju pārvaldība</translation>
 <translation id="3609785682760573515">Notiek sinhronizēšana...</translation>
 <translation id="3628119975092896051">Jūsu lasīšanas saraksts ir pieejams bezsaistē. Lai tam pievienotu kādu lapu, pieskarieties ikonai <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Pirmsiel. tīm. lapas</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Aizvērt pierakstīšanās piedāvājumu</translation>
 <translation id="4526249700380860531">Skatīt un pārvaldīt saglabātās paroles vietnē <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Mēģiniet pierakstīties vēlreiz.</translation>
+<translation id="4541241553780729349">Ar Google pakalpojumiem sinhronizētie dati un jūsu izmantotās funkcijas nemainīsies</translation>
 <translation id="457386861538956877">Vēl...</translation>
 <translation id="461440297010471931">Google meklēšana</translation>
 <translation id="4619615317237390068">Cilnes no citām ierīcēm</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
index 367cb44..68eeca8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Buka Imej dalam Tab Baharu</translation>
 <translation id="3603009562372709545">Salin URL Paut</translation>
 <translation id="3607167657931203000">Autolengkap Data</translation>
+<translation id="360930808415985584">Kawal Penyegerakan, Pemperibadian dan Pelbagai Lagi</translation>
 <translation id="3609785682760573515">Menyegerakkan...</translation>
 <translation id="3628119975092896051">Senarai bacaan anda tersedia di luar talian. Untuk menambahkan halaman pada senarai bacaan anda, ketik <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Pramuat Halaman Web</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Tutup promosi log masuk</translation>
 <translation id="4526249700380860531">Lihat dan urus kata laluan yang disimpan di <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Cuba log masuk semula.</translation>
+<translation id="4541241553780729349">Data yang disegerakkan ke Google dan ciri yang anda gunakan tidak akan berubah</translation>
 <translation id="457386861538956877">Lagi...</translation>
 <translation id="461440297010471931">Mencari dengan Google</translation>
 <translation id="4619615317237390068">Tab daripada peranti lain</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index f3dabc9..7b245b6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Afbeelding openen op nieuw tabblad</translation>
 <translation id="3603009562372709545">Link-URL kopiëren</translation>
 <translation id="3607167657931203000">Gegevens van Automatisch aanvullen</translation>
+<translation id="360930808415985584">Synchronisatie, personalisatie en meer beheren</translation>
 <translation id="3609785682760573515">Synchroniseren...</translation>
 <translation id="3628119975092896051">Je leeslijst is offline beschikbaar. Als je een pagina aan je leeslijst wilt toevoegen, tik je op <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Webpagina's vooraf laden</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Inlogpromo sluiten</translation>
 <translation id="4526249700380860531">Opgeslagen wachtwoorden bekijken en beheren via <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Probeer opnieuw in te loggen.</translation>
+<translation id="4541241553780729349">De gegevenssynchronisatie met Google en de functies die je gebruikt, veranderen niet</translation>
 <translation id="457386861538956877">Meer...</translation>
 <translation id="461440297010471931">Zoeken met Google</translation>
 <translation id="4619615317237390068">Tabbladen van andere apparaten</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
index cfea143..b246da9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Otwórz grafikę w nowej karcie</translation>
 <translation id="3603009562372709545">Kopiuj URL linku</translation>
 <translation id="3607167657931203000">Autouzupełnianie</translation>
+<translation id="360930808415985584">Konfiguracja synchronizacji, personalizacji i innych opcji</translation>
 <translation id="3609785682760573515">Synchronizuję...</translation>
 <translation id="3628119975092896051">Twoja lista Do przeczytania jest dostępna offline. Aby dodać do niej stronę, kliknij <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Wstępne wczytywanie stron</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Zamknij okno zachęcające do logowania</translation>
 <translation id="4526249700380860531">Wyświetlaj zapisane hasła i zarządzaj nimi na <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Spróbuj zalogować się jeszcze raz.</translation>
+<translation id="4541241553780729349">Dane, które synchronizujesz z Google, i funkcje, których używasz, nie zostaną zmienione</translation>
 <translation id="457386861538956877">Więcej</translation>
 <translation id="461440297010471931">Wyszukiwanie z Google</translation>
 <translation id="4619615317237390068">Karty z innych urządzeń</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
index 1a296067..3a61f5a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -168,6 +168,7 @@
 <translation id="3588820906588687999">Abrir imagem em "Nova guia"</translation>
 <translation id="3603009562372709545">Copiar URL do link</translation>
 <translation id="3607167657931203000">Dados de preenchimento automático</translation>
+<translation id="360930808415985584">Controlar a sincronização, personalização e muito mais</translation>
 <translation id="3609785682760573515">Sincronizando...</translation>
 <translation id="3628119975092896051">Sua lista de leitura está disponível off-line. Para adicionar uma página à lista, toque em <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Pré-carregar páginas da web</translation>
@@ -214,6 +215,7 @@
 <translation id="4508750114462689118">Fechar promoção de login</translation>
 <translation id="4526249700380860531">Ver e gerenciar as senhas salvas em <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Tente fazer login novamente.</translation>
+<translation id="4541241553780729349">Os dados são sincronizados com o Google, e os recursos usados não serão alterados</translation>
 <translation id="457386861538956877">Mais...</translation>
 <translation id="461440297010471931">Pesquisando com o Google</translation>
 <translation id="4619615317237390068">Guias de outros dispositivos</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
index 2b582863..ee02cf8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Abrir imagem num novo separador</translation>
 <translation id="3603009562372709545">Copiar URL do Link</translation>
 <translation id="3607167657931203000">Dados de preenchimento automático</translation>
+<translation id="360930808415985584">Controlar a sincronização, a personalização e muito mais</translation>
 <translation id="3609785682760573515">A sincronizar…</translation>
 <translation id="3628119975092896051">A sua lista de leitura está disponível offline. Para adicionar uma página à mesma, toque em <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Pré-carregar Páginas Web</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Fechar a promoção de início de sessão</translation>
 <translation id="4526249700380860531">Ver e gerir as palavras-passe guardadas em <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Experimente iniciar sessão novamente.</translation>
+<translation id="4541241553780729349">Os dados que sincroniza com o Google e as funcionalidades que utiliza não serão alterados.</translation>
 <translation id="457386861538956877">Mais...</translation>
 <translation id="461440297010471931">Pesquisar com o Google</translation>
 <translation id="4619615317237390068">Separadores de outros dispositivos</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index 1bb5e416..8a980df 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Deschide imaginea într-o filă nouă</translation>
 <translation id="3603009562372709545">Copiază adresa URL a linkului</translation>
 <translation id="3607167657931203000">Datele de completare automată</translation>
+<translation id="360930808415985584">Gestionează sincronizarea, personalizarea și altele</translation>
 <translation id="3609785682760573515">Se sincronizează...</translation>
 <translation id="3628119975092896051">Lista de lectură este disponibilă offline. Pentru a adăuga o pagină în lista de lectură, atinge <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Preîncarcă pagini</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Închide mesajul promoțional de conectare</translation>
 <translation id="4526249700380860531">Vezi și gestionează parolele salvate la <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Încearcă să te conectezi din nou.</translation>
+<translation id="4541241553780729349">Datele pe care le sincronizezi cu Google și funcțiile pe care le folosești nu se vor schimba</translation>
 <translation id="457386861538956877">Mai multe...</translation>
 <translation id="461440297010471931">Căutare cu Google</translation>
 <translation id="4619615317237390068">File de pe alte dispozitive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
index 70e360c..b747a75 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Otvoriť obrázok na novej karte</translation>
 <translation id="3603009562372709545">Kopírovať webovú adresu odkazu</translation>
 <translation id="3607167657931203000">Údaje automatického dopĺňania</translation>
+<translation id="360930808415985584">Ovládanie synchronizácie, prispôsobenia a ďalších funkcií</translation>
 <translation id="3609785682760573515">Prebieha synchronizácia...</translation>
 <translation id="3628119975092896051">Váš čitateľský zoznam je k dispozícii offline. Ak chcete pridať stránku do čitateľského zoznamu, klepnite na položku <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Predbežne načítavať webové stránky</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Zavrieť propagáciu prihlásenia</translation>
 <translation id="4526249700380860531">Zobrazte si a spravujte uložené heslá na stránke <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Skúste sa znova prihlásiť.</translation>
+<translation id="4541241553780729349">Dáta synchronizované do Googlu a používané funkcie sa nezmenia</translation>
 <translation id="457386861538956877">Viac...</translation>
 <translation id="461440297010471931">Vyhľadávate pomocou Googlu</translation>
 <translation id="4619615317237390068">Karty z iných zariadení</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index ee6cdeb..d580c04b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Odpri sliko na novem zavihku</translation>
 <translation id="3603009562372709545">Kopiraj URL povezave</translation>
 <translation id="3607167657931203000">Autofill Data</translation>
+<translation id="360930808415985584">Nadziranje sinhronizacije, prilagajanja in drugega</translation>
 <translation id="3609785682760573515">Sinhroniziranje ...</translation>
 <translation id="3628119975092896051">Bralni seznam je na voljo brez povezave. Če želite dodati stran na bralni seznam, se dotaknite <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Vnaprej naloži spletne strani</translation>
@@ -211,6 +212,7 @@
 <translation id="4508750114462689118">Zapri predstavitev prijave</translation>
 <translation id="4526249700380860531">Ogled in upravljanje shranjenih gesel na <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Try signing in again.</translation>
+<translation id="4541241553780729349">Podatki, ki jih sinhronizirate z Googlom, in funkcije, ki jih uporabljate, se ne bodo spremenili</translation>
 <translation id="457386861538956877">Več ...</translation>
 <translation id="461440297010471931">Iskanje z Googlom</translation>
 <translation id="4619615317237390068">Zavihki iz drugih naprav</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index fa6dd4a..29a7ca4c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Отвори слику у новој картици</translation>
 <translation id="3603009562372709545">Копирај URL адресу линка</translation>
 <translation id="3607167657931203000">Подаци аутоматског попуњавања</translation>
+<translation id="360930808415985584">Контролишите синхронизацију, персонализацију и још много тога</translation>
 <translation id="3609785682760573515">Синхронизовање...</translation>
 <translation id="3628119975092896051">Листа за читање је доступна офлајн. Да бисте додали страницу на листу за читање, додирните <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Унап. учитај веб-странице</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Затвори промоцију за пријављивање</translation>
 <translation id="4526249700380860531">Прегледајте сачуване лозинке и управљајте њима на <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Пробајте поново да се пријавите.</translation>
+<translation id="4541241553780729349">Подаци које синхронизујете са Google-ом и функције које користите неће се мењати</translation>
 <translation id="457386861538956877">Још...</translation>
 <translation id="461440297010471931">Претражујете помоћу Google-а</translation>
 <translation id="4619615317237390068">Картице са других уређаја</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
index 72dee693..d64233b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Öppna bild på ny flik</translation>
 <translation id="3603009562372709545">Kopiera länkens webbadress</translation>
 <translation id="3607167657931203000">Autofyll uppgifter</translation>
+<translation id="360930808415985584">Styr synkronisering, anpassning med mera</translation>
 <translation id="3609785682760573515">Synkroniserar ...</translation>
 <translation id="3628119975092896051">Läslistan är tillgänglig offline. Om du vill lägga till en sida i läslistan trycker du på <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Läs in webbsidor i förväg</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Stäng inloggningskampanj</translation>
 <translation id="4526249700380860531">Visa och hantera sparade lösenord på <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Försök att logga in igen.</translation>
+<translation id="4541241553780729349">Ingenting ändras i fråga om vilken data som synkroniseras med Google eller vilka funktioner du använder</translation>
 <translation id="457386861538956877">Mer...</translation>
 <translation id="461440297010471931">Söker med Google</translation>
 <translation id="4619615317237390068">Flikar från andra enheter</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
index 5d44539..d12d378 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Fungua Picha Katika Kichupo Kipya</translation>
 <translation id="3603009562372709545">Nakili URL ya Kiungo</translation>
 <translation id="3607167657931203000">Jaza Data Kiotomatiki</translation>
+<translation id="360930808415985584">Dhibiti Usawazishaji, Mapendeleo na Mengineyo</translation>
 <translation id="3609785682760573515">Inasawazisha...</translation>
 <translation id="3628119975092896051">Orodha yako ya kusoma inapatikana nje ya mtandao. Ili kuongeza ukurasa kwenye orodha yako ya kusoma, gusa <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Pakia Kurasa za wavuti Mapema</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Funga matangazo ya kuingia kwenye akaunti</translation>
 <translation id="4526249700380860531">Angalia na udhibiti manenosiri yaliyohifadhiwa kwenye <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Jaribu kuingia katika akaunti tena.</translation>
+<translation id="4541241553780729349">Haitabadilisha data itakayosawazishwa kwenye Google na vipengele utakavyotumia</translation>
 <translation id="457386861538956877">Zaidi...</translation>
 <translation id="461440297010471931">Inatafuta kwa kutumia Google</translation>
 <translation id="4619615317237390068">Vichupo kutoka kwenye vifaa vingine</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index 9e235cf..1a63271 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -167,6 +167,7 @@
 <translation id="3588820906588687999">Відкрити зображення в новій вкладці</translation>
 <translation id="3603009562372709545">Копіювати URL-адресу посилання</translation>
 <translation id="3607167657931203000">Дані автозаповнення</translation>
+<translation id="360930808415985584">Керування синхронізацією, персоналізацією тощо</translation>
 <translation id="3609785682760573515">Синхронізація…</translation>
 <translation id="3628119975092896051">Ваш список читання доступний офлайн. Щоб додати до нього сторінку, торкніться опції <ph name="SHARE_OPENING_ICON" />.</translation>
 <translation id="3638472932233958418">Попер.завантаж.стор.</translation>
@@ -213,6 +214,7 @@
 <translation id="4508750114462689118">Закрити заклик до входу</translation>
 <translation id="4526249700380860531">Переглядайте збережені паролі та керуйте ними на сторінці <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="4536418791685807335">Спробуйте ввійти ще раз.</translation>
+<translation id="4541241553780729349">Синхронізація даних із Google і використовувані функції не зміняться</translation>
 <translation id="457386861538956877">Інші...</translation>
 <translation id="461440297010471931">Пошук у Google</translation>
 <translation id="4619615317237390068">Вкладки з інших пристроїв</translation>
diff --git a/ios/chrome/browser/autofill/BUILD.gn b/ios/chrome/browser/autofill/BUILD.gn
index 491d6e4a..a078a38 100644
--- a/ios/chrome/browser/autofill/BUILD.gn
+++ b/ios/chrome/browser/autofill/BUILD.gn
@@ -7,11 +7,15 @@
   sources = [
     "address_normalizer_factory.cc",
     "address_normalizer_factory.h",
+    "form_input_accessory_consumer.h",
     "form_input_accessory_view.h",
     "form_input_accessory_view.mm",
     "form_input_accessory_view_controller.h",
     "form_input_accessory_view_controller.mm",
     "form_input_accessory_view_delegate.h",
+    "form_input_accessory_view_handler.h",
+    "form_input_accessory_view_handler.mm",
+    "form_input_accessory_view_provider.h",
     "form_suggestion_controller.h",
     "form_suggestion_controller.mm",
     "form_suggestion_label.h",
@@ -48,7 +52,6 @@
     "//base:i18n",
     "//components/autofill/core/browser",
     "//components/autofill/ios/browser",
-    "//components/autofill/ios/form_util",
     "//components/keyed_service/core",
     "//components/keyed_service/ios",
     "//components/prefs",
@@ -474,6 +477,7 @@
     ":autofill",
     "//base",
     "//base/test:test_support",
+    "//components/autofill/ios/browser:browser",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/ui",
     "//ios/chrome/test/app:test_support",
diff --git a/ios/chrome/browser/autofill/autofill_controller_unittest.mm b/ios/chrome/browser/autofill/autofill_controller_unittest.mm
index 263a6c2..0beb679e 100644
--- a/ios/chrome/browser/autofill/autofill_controller_unittest.mm
+++ b/ios/chrome/browser/autofill/autofill_controller_unittest.mm
@@ -9,6 +9,7 @@
 
 #include "base/guid.h"
 #include "base/ios/ios_util.h"
+#include "base/mac/foundation_util.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/task_scheduler/task_scheduler.h"
@@ -19,17 +20,18 @@
 #import "components/autofill/ios/browser/autofill_agent.h"
 #include "components/autofill/ios/browser/autofill_driver_ios.h"
 #import "components/autofill/ios/browser/form_suggestion.h"
+#import "components/autofill/ios/browser/js_suggestion_manager.h"
 #include "components/infobars/core/confirm_infobar_delegate.h"
 #include "components/infobars/core/infobar.h"
 #include "components/infobars/core/infobar_manager.h"
 #include "components/keyed_service/core/service_access_type.h"
 #include "components/security_state/ios/ssl_status_input_event_data.h"
-#import "ios/chrome/browser/autofill/form_input_accessory_view_controller.h"
 #import "ios/chrome/browser/autofill/form_suggestion_controller.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
 #include "ios/chrome/browser/infobars/infobar_manager_impl.h"
 #include "ios/chrome/browser/ssl/ios_security_state_tab_helper.h"
 #import "ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h"
+#import "ios/chrome/browser/ui/autofill/form_input_accessory_mediator.h"
 #include "ios/chrome/browser/ui/settings/personal_data_manager_data_changed_observer.h"
 #include "ios/chrome/browser/web/chrome_web_client.h"
 #import "ios/chrome/browser/web/chrome_web_test.h"
@@ -37,6 +39,7 @@
 #import "ios/web/public/navigation_item.h"
 #import "ios/web/public/navigation_manager.h"
 #include "ios/web/public/ssl_status.h"
+#import "ios/web/public/web_state/js/crw_js_injection_receiver.h"
 #import "ios/web/public/web_state/web_state.h"
 #import "testing/gtest_mac.h"
 #include "ui/base/test/ios/ui_view_test_utils.h"
@@ -192,7 +195,7 @@
   TestSuggestionController* suggestion_controller_;
 
   // Retrieves accessory views according to form events.
-  FormInputAccessoryViewController* accessory_controller_;
+  FormInputAccessoryMediator* accessory_mediator_;
 
   // Manages autofill for a single page.
   AutofillController* autofill_controller_;
@@ -222,9 +225,17 @@
   suggestion_controller_ = [[TestSuggestionController alloc]
       initWithWebState:web_state()
              providers:@[ [autofill_controller_ suggestionProvider] ]];
-  accessory_controller_ = [[FormInputAccessoryViewController alloc]
-      initWithWebState:web_state()
-             providers:@[ [suggestion_controller_ accessoryViewProvider] ]];
+  accessory_mediator_ =
+      [[FormInputAccessoryMediator alloc] initWithConsumer:nil
+                                              webStateList:NULL];
+  [accessory_mediator_ injectWebState:web_state()];
+  [accessory_mediator_
+      injectProviders:@[ [suggestion_controller_ accessoryViewProvider] ]];
+  auto suggestionManager = base::mac::ObjCCastStrict<JsSuggestionManager>(
+      [web_state()->GetJSInjectionReceiver()
+          instanceOfClass:[JsSuggestionManager class]]);
+  [accessory_mediator_ injectSuggestionManager:suggestionManager];
+
   histogram_tester_.reset(new base::HistogramTester());
 }
 
diff --git a/ios/chrome/browser/autofill/form_input_accessory_consumer.h b/ios/chrome/browser/autofill/form_input_accessory_consumer.h
new file mode 100644
index 0000000..ce88124c
--- /dev/null
+++ b/ios/chrome/browser/autofill/form_input_accessory_consumer.h
@@ -0,0 +1,26 @@
+// 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 IOS_CHROME_BROWSER_AUTOFILL_FORM_INPUT_ACCESSORY_CONSUMER_H_
+#define IOS_CHROME_BROWSER_AUTOFILL_FORM_INPUT_ACCESSORY_CONSUMER_H_
+
+#import <UIKit/UIKit.h>
+
+@protocol FormInputAccessoryViewDelegate;
+
+@protocol FormInputAccessoryConsumer<NSObject>
+
+// Restores the default input accessory view, removing (if necessary) any
+// previously-added custom view.
+- (void)restoreDefaultInputAccessoryView;
+
+// Hides the default input accessory view and replaces it with one that shows
+// |customView| and form navigation controls.
+- (void)showCustomInputAccessoryView:(UIView*)view
+                  navigationDelegate:
+                      (id<FormInputAccessoryViewDelegate>)navigationDelegate;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_AUTOFILL_FORM_INPUT_ACCESSORY_CONSUMER_H_
diff --git a/ios/chrome/browser/autofill/form_input_accessory_view_controller.h b/ios/chrome/browser/autofill/form_input_accessory_view_controller.h
index 7eaeed7..9aa9c48 100644
--- a/ios/chrome/browser/autofill/form_input_accessory_view_controller.h
+++ b/ios/chrome/browser/autofill/form_input_accessory_view_controller.h
@@ -7,16 +7,9 @@
 
 #import <UIKit/UIKit.h>
 
-#import "ios/chrome/browser/autofill/form_input_accessory_view_delegate.h"
-#import "ios/web/public/web_state/web_state_observer_bridge.h"
-
-@protocol CRWWebViewProxy;
-@protocol FormInputAccessoryViewProvider;
+#import "ios/chrome/browser/autofill/form_input_accessory_consumer.h"
 
 namespace autofill {
-extern NSString* const kFormSuggestionAssistButtonPreviousElement;
-extern NSString* const kFormSuggestionAssistButtonNextElement;
-extern NSString* const kFormSuggestionAssistButtonDone;
 extern CGFloat const kInputAccessoryHeight;
 }  // namespace autofill
 
@@ -24,33 +17,7 @@
 // interacting with a form. Also handles hiding and showing the default
 // accessory view elements.
 @interface FormInputAccessoryViewController
-    : NSObject<CRWWebStateObserver, FormInputAccessoryViewDelegate>
-
-// The current web view proxy.
-// TODO(crbug.com/727716): This property should not be a part of the public
-// interface, it is used in tests as a backdoor.
-@property(nonatomic, readonly) id<CRWWebViewProxy> webViewProxy;
-
-// The current web state that this view controller is observing.
-@property(nonatomic) web::WebState* webState;
-
-// Initializes a new controller with the specified |providers| of input
-// accessory views.
-- (instancetype)initWithWebState:(web::WebState*)webState
-                       providers:(NSArray<id<FormInputAccessoryViewProvider>>*)
-                                     providers;
-
-// Instructs the controller to detach itself from the WebState.
-- (void)detachFromWebState;
-
-// Hides the default input accessory view and replaces it with one that shows
-// |customView| and form navigation controls.
-- (void)showCustomInputAccessoryView:(UIView*)customView;
-
-// Restores the default input accessory view, removing (if necessary) any
-// previously-added custom view.
-- (void)restoreDefaultInputAccessoryView;
-
+    : NSObject<FormInputAccessoryConsumer>
 @end
 
 #endif  // IOS_CHROME_BROWSER_AUTOFILL_FORM_INPUT_ACCESSORY_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm b/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm
index d0db084..855a963 100644
--- a/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm
+++ b/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm
@@ -4,297 +4,91 @@
 
 #import "ios/chrome/browser/autofill/form_input_accessory_view_controller.h"
 
-#include <memory>
-
-#include "base/ios/block_types.h"
 #include "base/mac/foundation_util.h"
-#include "base/mac/scoped_block.h"
-#import "components/autofill/core/browser/keyboard_accessory_metrics_logger.h"
-#import "components/autofill/ios/browser/js_suggestion_manager.h"
-#import "components/autofill/ios/form_util/form_activity_observer_bridge.h"
 #import "ios/chrome/browser/autofill/form_input_accessory_view.h"
-#import "ios/chrome/browser/autofill/form_input_accessory_view_provider.h"
-#import "ios/chrome/browser/autofill/form_suggestion_tab_helper.h"
 #import "ios/chrome/browser/autofill/form_suggestion_view.h"
-#import "ios/chrome/browser/passwords/password_generation_utils.h"
 #include "ios/chrome/browser/ui/ui_util.h"
+#import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/common/ui_util/constraints_ui_util.h"
-#import "ios/web/public/url_scheme_util.h"
-#include "ios/web/public/web_state/form_activity_params.h"
-#import "ios/web/public/web_state/js/crw_js_injection_receiver.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
-#include "ios/web/public/web_state/url_verification_constants.h"
-#include "ios/web/public/web_state/web_state.h"
-#include "url/gurl.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
 namespace autofill {
-NSString* const kFormSuggestionAssistButtonPreviousElement = @"previousTap";
-NSString* const kFormSuggestionAssistButtonNextElement = @"nextTap";
-NSString* const kFormSuggestionAssistButtonDone = @"done";
 CGFloat const kInputAccessoryHeight = 44.0f;
 }  // namespace autofill
 
-namespace {
-
-// Finds all views of a particular kind if class |klass| in the subview
-// hierarchy of the given |root| view.
-NSArray* FindDescendantsOfClass(UIView* root, Class klass) {
-  DCHECK(root);
-  NSMutableArray* viewsToExamine = [NSMutableArray arrayWithObject:root];
-  NSMutableArray* descendants = [NSMutableArray array];
-
-  while ([viewsToExamine count]) {
-    UIView* view = [viewsToExamine lastObject];
-    if ([view isKindOfClass:klass])
-      [descendants addObject:view];
-
-    [viewsToExamine removeLastObject];
-    [viewsToExamine addObjectsFromArray:[view subviews]];
-  }
-
-  return descendants;
-}
-
-// Returns true if |item|'s action name contains |actionName|.
-bool ItemActionMatchesName(UIBarButtonItem* item, NSString* actionName) {
-  SEL itemAction = [item action];
-  if (!itemAction)
-    return false;
-  NSString* itemActionName = NSStringFromSelector(itemAction);
-
-  // We don't do a strict string match for the action name.
-  return [itemActionName rangeOfString:actionName].location != NSNotFound;
-}
-
-// Finds all UIToolbarItems associated with a given UIToolbar |toolbar| with
-// action selectors with a name that containts the action name specified by
-// |actionName|.
-NSArray* FindToolbarItemsForActionName(UIToolbar* toolbar,
-                                       NSString* actionName) {
-  NSMutableArray* toolbarItems = [NSMutableArray array];
-
-  for (UIBarButtonItem* item in [toolbar items]) {
-    if (ItemActionMatchesName(item, actionName))
-      [toolbarItems addObject:item];
-  }
-
-  return toolbarItems;
-}
-
-// Finds all UIToolbarItem(s) with action selectors of the name specified by
-// |actionName| in any UIToolbars in the view hierarchy below |root|.
-NSArray* FindDescendantToolbarItemsForActionName(UIView* root,
-                                                 NSString* actionName) {
-  NSMutableArray* descendants = [NSMutableArray array];
-
-  NSArray* toolbars = FindDescendantsOfClass(root, [UIToolbar class]);
-  for (UIToolbar* toolbar in toolbars) {
-    [descendants
-        addObjectsFromArray:FindToolbarItemsForActionName(toolbar, actionName)];
-  }
-
-  return descendants;
-}
-
-NSArray* FindDescendantToolbarItemsForActionName(
-    UITextInputAssistantItem* inputAssistantItem,
-    NSString* actionName) {
-  NSMutableArray* toolbarItems = [NSMutableArray array];
-
-  NSMutableArray* buttonGroupsGroup = [[NSMutableArray alloc] init];
-  if (inputAssistantItem.leadingBarButtonGroups)
-    [buttonGroupsGroup addObject:inputAssistantItem.leadingBarButtonGroups];
-  if (inputAssistantItem.trailingBarButtonGroups)
-    [buttonGroupsGroup addObject:inputAssistantItem.trailingBarButtonGroups];
-  for (NSArray* buttonGroups in buttonGroupsGroup) {
-    for (UIBarButtonItemGroup* group in buttonGroups) {
-      NSArray* items = group.barButtonItems;
-      for (UIBarButtonItem* item in items) {
-        if (ItemActionMatchesName(item, actionName))
-          [toolbarItems addObject:item];
-      }
-    }
-  }
-
-  return toolbarItems;
-}
-
-}  // namespace
-
-@interface FormInputAccessoryViewController ()<FormActivityObserver>
-
-// Allows injection of the JsSuggestionManager.
-- (instancetype)initWithWebState:(web::WebState*)webState
-             JSSuggestionManager:(JsSuggestionManager*)JSSuggestionManager
-                       providers:(NSArray*)providers;
-
-// Called when the keyboard will or did change frame.
-- (void)keyboardWillOrDidChangeFrame:(NSNotification*)notification;
-
-// Called when the keyboard is dismissed.
-- (void)keyboardDidHide:(NSNotification*)notification;
-
-// Hides the subviews in |accessoryView|.
-- (void)hideSubviewsInOriginalAccessoryView:(UIView*)accessoryView;
-
-// Attempts to execute/tap/send-an-event-to the iOS built-in "next" and
-// "previous" form assist controls. Returns NO if this attempt failed, YES
-// otherwise. [HACK]
-- (BOOL)executeFormAssistAction:(NSString*)actionName;
-
-// Asynchronously retrieves an accessory view from |_providers|.
-- (void)retrieveAccessoryViewForForm:(const web::FormActivityParams&)params
-                            webState:(web::WebState*)webState;
-
-// Clears the current custom accessory view and restores the default.
-- (void)reset;
+@interface FormInputAccessoryViewController ()
 
 // Grey view used as the background of the keyboard to fix
 // http://crbug.com/847523
 @property(nonatomic, strong) UIView* grayBackgroundView;
 
+// Called when the keyboard will or did change frame.
+- (void)keyboardWillOrDidChangeFrame:(NSNotification*)notification;
+
+// Hides the subviews in |accessoryView|.
+- (void)hideSubviewsInOriginalAccessoryView:(UIView*)accessoryView;
+
 @end
 
 @implementation FormInputAccessoryViewController {
-  // The WebState this instance is observing. Will be null after
-  // -webStateDestroyed: has been called.
-  web::WebState* _webState;
-
-  // Bridge to observe the web state from Objective-C.
-  std::unique_ptr<web::WebStateObserverBridge> _webStateObserverBridge;
-
   // Last registered keyboard rectangle.
   CGRect _keyboardFrame;
 
   // The custom view that should be shown in the input accessory view.
   FormInputAccessoryView* _customAccessoryView;
 
-  // The JS manager for interacting with the underlying form.
-  JsSuggestionManager* _JSSuggestionManager;
-
   // The original subviews in keyboard accessory view that were originally not
   // hidden but were hidden when showing Autofill suggestions.
   NSMutableArray* _hiddenOriginalSubviews;
 
-  // The objects that can provide a custom input accessory view while filling
-  // forms.
-  NSArray* _providers;
-
   // Whether suggestions have previously been shown.
   BOOL _suggestionsHaveBeenShown;
-
-  // The object that manages the currently-shown custom accessory view.
-  __weak id<FormInputAccessoryViewProvider> _currentProvider;
-
-  // Logs UMA metrics for the keyboard accessory.
-  std::unique_ptr<autofill::KeyboardAccessoryMetricsLogger>
-      _keyboardAccessoryMetricsLogger;
-
-  // Bridge to observe form activity in |_webState|.
-  std::unique_ptr<autofill::FormActivityObserverBridge>
-      _formActivityObserverBridge;
 }
 
 @synthesize grayBackgroundView = _grayBackgroundView;
-@synthesize webState = _webState;
 
 #pragma mark - Life Cycle
 
-- (instancetype)initWithWebState:(web::WebState*)webState
-                       providers:(NSArray*)providers {
-  JsSuggestionManager* suggestionManager =
-      base::mac::ObjCCastStrict<JsSuggestionManager>(
-          [webState->GetJSInjectionReceiver()
-              instanceOfClass:[JsSuggestionManager class]]);
-  return [self initWithWebState:webState
-            JSSuggestionManager:suggestionManager
-                      providers:providers];
-}
-
-- (instancetype)initWithWebState:(web::WebState*)webState
-             JSSuggestionManager:(JsSuggestionManager*)JSSuggestionManager
-                       providers:(NSArray*)providers {
+- (instancetype)init {
   self = [super init];
   if (self) {
-    DCHECK(webState);
-    _webState = webState;
-    _JSSuggestionManager = JSSuggestionManager;
     _hiddenOriginalSubviews = [[NSMutableArray alloc] init];
-    _webStateObserverBridge =
-        std::make_unique<web::WebStateObserverBridge>(self);
-    _webState->AddObserver(_webStateObserverBridge.get());
-    _formActivityObserverBridge =
-        std::make_unique<autofill::FormActivityObserverBridge>(_webState, self);
-    _providers = [providers copy];
     _suggestionsHaveBeenShown = NO;
-    _keyboardAccessoryMetricsLogger.reset(
-        new autofill::KeyboardAccessoryMetricsLogger());
+
     if (IsIPadIdiom()) {
       _grayBackgroundView = [[UIView alloc] init];
+      _grayBackgroundView.translatesAutoresizingMaskIntoConstraints = NO;
       // This color was obtained by try and error.
       _grayBackgroundView.backgroundColor =
           [[UIColor alloc] initWithRed:206 / 255.f
                                  green:212 / 255.f
                                   blue:217 / 255.f
                                  alpha:1];
+
+      [[NSNotificationCenter defaultCenter]
+          addObserver:self
+             selector:@selector(keyboardWillOrDidChangeFrame:)
+                 name:UIKeyboardWillChangeFrameNotification
+               object:nil];
     }
+    [[NSNotificationCenter defaultCenter]
+        addObserver:self
+           selector:@selector(keyboardWillOrDidChangeFrame:)
+               name:UIKeyboardDidChangeFrameNotification
+             object:nil];
+    [[NSNotificationCenter defaultCenter]
+        addObserver:self
+           selector:@selector(keyboardWillShow:)
+               name:UIKeyboardWillShowNotification
+             object:nil];
   }
   return self;
 }
 
-- (void)dealloc {
-  if (_webState) {
-    _formActivityObserverBridge.reset();
-    _webState->RemoveObserver(_webStateObserverBridge.get());
-    _webStateObserverBridge.reset();
-    _webState = nullptr;
-  }
-}
-
-#pragma mark - Public
-
-- (void)setWebState:(web::WebState*)webState {
-  if (webState == _webState) {
-    return;
-  }
-  [self detachFromWebState];
-
-  _webState = webState;
-  if (_webState) {
-    _webStateObserverBridge =
-        std::make_unique<web::WebStateObserverBridge>(self);
-    _webState->AddObserver(_webStateObserverBridge.get());
-    _formActivityObserverBridge =
-        std::make_unique<autofill::FormActivityObserverBridge>(_webState, self);
-
-    _providers = @[ FormSuggestionTabHelper::FromWebState(_webState)
-                        ->GetAccessoryViewProvider() ];
-    _suggestionsHaveBeenShown = NO;
-    _JSSuggestionManager = base::mac::ObjCCastStrict<JsSuggestionManager>(
-        [_webState->GetJSInjectionReceiver()
-            instanceOfClass:[JsSuggestionManager class]]);
-  }
-}
-
-- (void)detachFromWebState {
-  [self reset];
-  if (_webState) {
-    _formActivityObserverBridge.reset();
-    _webState->RemoveObserver(_webStateObserverBridge.get());
-    _webStateObserverBridge.reset();
-    _webState = nullptr;
-    _providers = @[];
-    _JSSuggestionManager = nullptr;
-  }
-}
-
-- (id<CRWWebViewProxy>)webViewProxy {
-  return _webState ? _webState->GetWebViewProxy() : nil;
-}
+#pragma mark - Private
 
 - (void)hideSubviewsInOriginalAccessoryView:(UIView*)accessoryView {
   for (UIView* subview in [accessoryView subviews]) {
@@ -305,7 +99,81 @@
   }
 }
 
-- (void)showCustomInputAccessoryView:(UIView*)view {
+- (UIView*)getKeyboardView {
+  NSArray* windows = [UIApplication sharedApplication].windows;
+  if (windows.count < 2)
+    return nil;
+
+  UIWindow* window = windows[1];
+  for (UIView* subview in window.subviews) {
+    if ([NSStringFromClass([subview class]) rangeOfString:@"PeripheralHost"]
+            .location != NSNotFound) {
+      return subview;
+    }
+    if ([NSStringFromClass([subview class]) rangeOfString:@"SetContainer"]
+            .location != NSNotFound) {
+      for (UIView* subsubview in subview.subviews) {
+        if ([NSStringFromClass([subsubview class]) rangeOfString:@"SetHost"]
+                .location != NSNotFound) {
+          return subsubview;
+        }
+      }
+    }
+  }
+
+  return nil;
+}
+
+- (void)keyboardWillShow:(NSNotification*)notification {
+  // [iPhone, iOS 10] If the customAccessoryView has not been added to the
+  // hierarchy, do it here. This can happen is the view is provided before the
+  // keyboard view is created by the system, i.e. the first time the keyboard
+  // will appear.
+  if (!IsIPadIdiom()) {
+    [self addCustomAccessoryViewIfNeeded];
+  }
+}
+
+- (void)keyboardWillOrDidChangeFrame:(NSNotification*)notification {
+  CGRect keyboardFrame =
+      [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
+  UIView* keyboardView = [self getKeyboardView];
+  CGRect windowRect = keyboardView.window.bounds;
+  // On iPad when the keyboard is undocked, on iOS 10 and 11,
+  // `UIKeyboard*HideNotification` or `UIKeyboard*ShowNotification` are not
+  // being sent. So the check is done here.
+  if (CGRectContainsRect(windowRect, keyboardFrame)) {
+    _keyboardFrame = keyboardFrame;
+  } else {
+    _keyboardFrame = CGRectZero;
+  }
+  // On ipad we hide the views so they don't stick around at the bottom. Only
+  // needed on iPad because we add the view directly to the keyboard view.
+  if (IsIPadIdiom() && _customAccessoryView) {
+    if (@available(iOS 11, *)) {
+    } else {
+      // [iPad iOS 10] There is a bug when constraining something to the
+      // keyboard view. So this updates the frame instead.
+      CGFloat height = autofill::kInputAccessoryHeight;
+      _customAccessoryView.frame =
+          CGRectMake(keyboardView.frame.origin.x, -height,
+                     keyboardView.frame.size.width, height);
+    }
+    if (CGRectEqualToRect(_keyboardFrame, CGRectZero)) {
+      _customAccessoryView.hidden = true;
+      self.grayBackgroundView.hidden = true;
+    } else {
+      _customAccessoryView.hidden = false;
+      self.grayBackgroundView.hidden = false;
+    }
+  }
+}
+
+#pragma mark - FormInputAccessoryConsumer
+
+- (void)showCustomInputAccessoryView:(UIView*)view
+                  navigationDelegate:
+                      (id<FormInputAccessoryViewDelegate>)navigationDelegate {
   DCHECK(view);
   if (IsIPadIdiom()) {
     // On iPad, there's no inputAccessoryView available, so we attach the custom
@@ -336,32 +204,59 @@
 
     _customAccessoryView = [[FormInputAccessoryView alloc] init];
     [_customAccessoryView setUpWithCustomView:view];
-
-    CGFloat height = autofill::kInputAccessoryHeight;
-    CGRect contentFrame = self.webViewProxy.frame;
-    _customAccessoryView.frame = CGRectMake(contentFrame.origin.x, -height,
-                                            contentFrame.size.width, height);
-
-    UIView* keyboardView = [self getKeyboardView];
-    DCHECK(keyboardView);
-    [keyboardView addSubview:_customAccessoryView];
-
-    if (!self.grayBackgroundView.superview) {
-      [keyboardView addSubview:self.grayBackgroundView];
-      [keyboardView sendSubviewToBack:self.grayBackgroundView];
-    }
-    self.grayBackgroundView.frame = keyboardView.bounds;
+    [self addCustomAccessoryViewIfNeeded];
   } else {
     // On iPhone, the custom view replaces the default UI of the
     // inputAccessoryView.
     [self restoreDefaultInputAccessoryView];
-    UIView* inputAccessoryView = [self.webViewProxy keyboardAccessory];
-    if (inputAccessoryView) {
-      [self hideSubviewsInOriginalAccessoryView:inputAccessoryView];
-      _customAccessoryView = [[FormInputAccessoryView alloc] init];
-      [_customAccessoryView setUpWithNavigationDelegate:self customView:view];
-      [inputAccessoryView addSubview:_customAccessoryView];
-      AddSameConstraints(_customAccessoryView, inputAccessoryView);
+    _customAccessoryView = [[FormInputAccessoryView alloc] init];
+    [_customAccessoryView setUpWithNavigationDelegate:navigationDelegate
+                                           customView:view];
+    [self addCustomAccessoryViewIfNeeded];
+  }
+}
+
+// Adds the customAccessoryView and the backgroundView (on iPads), if those are
+// not already in the hierarchy.
+- (void)addCustomAccessoryViewIfNeeded {
+  if (_customAccessoryView && !_customAccessoryView.superview) {
+    if (IsIPadIdiom()) {
+      UIView* keyboardView = [self getKeyboardView];
+      // [iPad iOS 10] There is a bug when constraining something to the
+      // keyboard view. So this sets the frame instead.
+      if (@available(iOS 11, *)) {
+        _customAccessoryView.translatesAutoresizingMaskIntoConstraints = NO;
+        [keyboardView addSubview:_customAccessoryView];
+        [NSLayoutConstraint activateConstraints:@[
+          [_customAccessoryView.leadingAnchor
+              constraintEqualToAnchor:keyboardView.leadingAnchor],
+          [_customAccessoryView.trailingAnchor
+              constraintEqualToAnchor:keyboardView.trailingAnchor],
+          [_customAccessoryView.bottomAnchor
+              constraintEqualToAnchor:keyboardView.topAnchor],
+          [_customAccessoryView.heightAnchor
+              constraintEqualToConstant:autofill::kInputAccessoryHeight]
+        ]];
+      } else {
+        CGFloat height = autofill::kInputAccessoryHeight;
+        _customAccessoryView.frame =
+            CGRectMake(keyboardView.frame.origin.x, -height,
+                       keyboardView.frame.size.width, height);
+        [keyboardView addSubview:_customAccessoryView];
+      }
+      if (!self.grayBackgroundView.superview) {
+        [keyboardView addSubview:self.grayBackgroundView];
+        [keyboardView sendSubviewToBack:self.grayBackgroundView];
+        AddSameConstraints(self.grayBackgroundView, keyboardView);
+      }
+    } else {
+      UIResponder* firstResponder = GetFirstResponder();
+      UIView* inputAccessoryView = firstResponder.inputAccessoryView;
+      if (inputAccessoryView) {
+        [self hideSubviewsInOriginalAccessoryView:inputAccessoryView];
+        [inputAccessoryView addSubview:_customAccessoryView];
+        AddSameConstraints(_customAccessoryView, inputAccessoryView);
+      }
     }
   }
 }
@@ -377,283 +272,4 @@
   [_hiddenOriginalSubviews removeAllObjects];
 }
 
-- (void)closeKeyboardWithButtonPress {
-  [self closeKeyboardWithoutButtonPress];
-  _keyboardAccessoryMetricsLogger->OnCloseButtonPressed();
-}
-
-- (void)closeKeyboardWithoutButtonPress {
-  BOOL performedAction =
-      [self executeFormAssistAction:autofill::kFormSuggestionAssistButtonDone];
-
-  if (!performedAction) {
-    // We could not find the built-in form assist controls, so try to focus
-    // the next or previous control using JavaScript.
-    [_JSSuggestionManager closeKeyboard];
-  }
-}
-
-- (BOOL)executeFormAssistAction:(NSString*)actionName {
-  NSArray* descendants = nil;
-  if (IsIPadIdiom()) {
-    UITextInputAssistantItem* inputAssistantItem =
-        [self.webViewProxy inputAssistantItem];
-    if (!inputAssistantItem)
-      return NO;
-    descendants =
-        FindDescendantToolbarItemsForActionName(inputAssistantItem, actionName);
-  } else {
-    UIView* inputAccessoryView = [self.webViewProxy keyboardAccessory];
-    if (!inputAccessoryView)
-      return NO;
-    descendants =
-        FindDescendantToolbarItemsForActionName(inputAccessoryView, actionName);
-  }
-
-  if (![descendants count])
-    return NO;
-
-  UIBarButtonItem* item = descendants[0];
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
-  [[item target] performSelector:[item action] withObject:item];
-#pragma clang diagnostic pop
-  return YES;
-}
-
-#pragma mark -
-#pragma mark FormInputAccessoryViewDelegate
-
-- (void)selectPreviousElementWithButtonPress {
-  [self selectPreviousElementWithoutButtonPress];
-  _keyboardAccessoryMetricsLogger->OnPreviousButtonPressed();
-}
-
-- (void)selectPreviousElementWithoutButtonPress {
-  BOOL performedAction =
-      [self executeFormAssistAction:
-                autofill::kFormSuggestionAssistButtonPreviousElement];
-  if (!performedAction) {
-    // We could not find the built-in form assist controls, so try to focus
-    // the next or previous control using JavaScript.
-    [_JSSuggestionManager selectPreviousElement];
-  }
-}
-
-- (void)selectNextElementWithButtonPress {
-  [self selectNextElementWithoutButtonPress];
-  _keyboardAccessoryMetricsLogger->OnNextButtonPressed();
-}
-
-- (void)selectNextElementWithoutButtonPress {
-  BOOL performedAction = [self
-      executeFormAssistAction:autofill::kFormSuggestionAssistButtonNextElement];
-
-  if (!performedAction) {
-    // We could not find the built-in form assist controls, so try to focus
-    // the next or previous control using JavaScript.
-    [_JSSuggestionManager selectNextElement];
-  }
-}
-
-- (void)fetchPreviousAndNextElementsPresenceWithCompletionHandler:
-        (void (^)(BOOL, BOOL))completionHandler {
-  DCHECK(completionHandler);
-  [_JSSuggestionManager
-      fetchPreviousAndNextElementsPresenceWithCompletionHandler:
-          completionHandler];
-}
-
-#pragma mark -
-#pragma mark FormActivityObserver
-
-- (void)webState:(web::WebState*)webState
-    registeredFormActivity:(const web::FormActivityParams&)params {
-  DCHECK_EQ(_webState, webState);
-  web::URLVerificationTrustLevel trustLevel;
-  const GURL pageURL(webState->GetCurrentURL(&trustLevel));
-  if (params.input_missing ||
-      trustLevel != web::URLVerificationTrustLevel::kAbsolute ||
-      !web::UrlHasWebScheme(pageURL) || !webState->ContentIsHTML()) {
-    [self reset];
-    return;
-  }
-
-  if (params.type == "blur" || params.type == "change" ||
-      params.type == "form_changed") {
-    return;
-  }
-
-  [self retrieveAccessoryViewForForm:params webState:webState];
-}
-
-#pragma mark -
-#pragma mark CRWWebStateObserver
-
-- (void)webStateWasShown:(web::WebState*)webState {
-  // There is no defined relation on the timing of JavaScript events and
-  // keyboard showing up. So it is necessary to listen to the keyboard
-  // notification to make sure the keyboard is updated.
-  if (IsIPadIdiom()) {
-    // On iPad, there's no inputAccessoryView available, so we attach the custom
-    // view to the keyboard. Because of this and the different keyboards on iPad
-    // we need to listen to these extra notifications.
-    [[NSNotificationCenter defaultCenter]
-        addObserver:self
-           selector:@selector(keyboardWillOrDidChangeFrame:)
-               name:UIKeyboardWillChangeFrameNotification
-             object:nil];
-    [[NSNotificationCenter defaultCenter]
-        addObserver:self
-           selector:@selector(textInputDidBeginEditing:)
-               name:UITextFieldTextDidBeginEditingNotification
-             object:nil];
-    [[NSNotificationCenter defaultCenter]
-        addObserver:self
-           selector:@selector(textInputDidBeginEditing:)
-               name:UITextViewTextDidBeginEditingNotification
-             object:nil];
-  }
-  [[NSNotificationCenter defaultCenter]
-      addObserver:self
-         selector:@selector(keyboardWillOrDidChangeFrame:)
-             name:UIKeyboardDidChangeFrameNotification
-           object:nil];
-  [[NSNotificationCenter defaultCenter]
-      addObserver:self
-         selector:@selector(keyboardDidHide:)
-             name:UIKeyboardDidHideNotification
-           object:nil];
-}
-
-- (void)webStateWasHidden:(web::WebState*)webState {
-  [_customAccessoryView removeFromSuperview];
-  [self.grayBackgroundView removeFromSuperview];
-  [[NSNotificationCenter defaultCenter] removeObserver:self];
-}
-
-- (void)webState:(web::WebState*)webState didLoadPageWithSuccess:(BOOL)success {
-  DCHECK_EQ(_webState, webState);
-  [self reset];
-}
-
-- (void)webStateDestroyed:(web::WebState*)webState {
-  DCHECK_EQ(_webState, webState);
-  [self detachFromWebState];
-}
-
-- (void)reset {
-  if (_currentProvider) {
-    [_currentProvider inputAccessoryViewControllerDidReset:self];
-    _currentProvider = nil;
-  }
-  [self restoreDefaultInputAccessoryView];
-
-  _keyboardAccessoryMetricsLogger.reset(
-      new autofill::KeyboardAccessoryMetricsLogger());
-}
-
-- (void)retrieveAccessoryViewForForm:(const web::FormActivityParams&)params
-                            webState:(web::WebState*)webState {
-  __weak FormInputAccessoryViewController* weakSelf = self;
-  web::FormActivityParams strongParams = params;
-
-  // Build a block for each provider that will invoke its completion with YES
-  // if the provider can provide an accessory view for the specified form/field
-  // and NO otherwise.
-  NSMutableArray* findProviderBlocks = [[NSMutableArray alloc] init];
-  for (id<FormInputAccessoryViewProvider> provider in _providers) {
-    passwords::PipelineBlock block = ^(void (^completion)(BOOL success)) {
-      AccessoryViewReadyCompletion accessoryViewReadyCompletion =
-          ^(UIView* view, id<FormInputAccessoryViewProvider> provider) {
-            if (!view) {
-              // View is nil, tell the pipeline to continue searching.
-              completion(NO);
-              return;
-            }
-            // Once the view is retrieved, tell the pipeline to stop and
-            // update the UI.
-            completion(YES);
-            FormInputAccessoryViewController* strongSelf = weakSelf;
-            if (!strongSelf) {
-              return;
-            }
-            if (strongSelf->_currentProvider != provider) {
-              [strongSelf->_currentProvider
-                  inputAccessoryViewControllerDidReset:strongSelf];
-            }
-            strongSelf->_currentProvider = provider;
-            [provider setAccessoryViewDelegate:strongSelf];
-            [strongSelf showCustomInputAccessoryView:view];
-          };
-      [provider retrieveAccessoryViewForForm:strongParams
-                                    webState:webState
-                    accessoryViewUpdateBlock:accessoryViewReadyCompletion];
-    };
-    [findProviderBlocks addObject:block];
-  }
-
-  // Run all the blocks in |findProviderBlocks| until one invokes its
-  // completion with YES. The first one to do so will be passed to
-  // |onProviderFound|.
-  passwords::RunSearchPipeline(findProviderBlocks, ^(NSUInteger providerIndex) {
-    // If no view was retrieved, reset self.
-    if (providerIndex == NSNotFound) {
-      [weakSelf reset];
-    }
-  });
-}
-
-- (UIView*)getKeyboardView {
-  NSArray* windows = [UIApplication sharedApplication].windows;
-  if (windows.count < 2)
-    return nil;
-
-  UIWindow* window = windows[1];
-  for (UIView* subview in window.subviews) {
-    if ([NSStringFromClass([subview class]) rangeOfString:@"PeripheralHost"]
-            .location != NSNotFound) {
-      return subview;
-    }
-    if ([NSStringFromClass([subview class]) rangeOfString:@"SetContainer"]
-            .location != NSNotFound) {
-      for (UIView* subsubview in subview.subviews) {
-        if ([NSStringFromClass([subsubview class]) rangeOfString:@"SetHost"]
-                .location != NSNotFound) {
-          return subsubview;
-        }
-      }
-    }
-  }
-
-  return nil;
-}
-
-- (void)keyboardWillOrDidChangeFrame:(NSNotification*)notification {
-  if (!_webState || !_currentProvider)
-    return;
-  CGRect keyboardFrame =
-      [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
-  // With iOS8 (beta) this method can be called even when the rect has not
-  // changed. When this is detected we exit early.
-  if (CGRectEqualToRect(CGRectIntegral(_keyboardFrame),
-                        CGRectIntegral(keyboardFrame))) {
-    return;
-  }
-  _keyboardFrame = keyboardFrame;
-  self.grayBackgroundView.frame.size = keyboardFrame.size;
-  [_currentProvider resizeAccessoryView];
-}
-
-// On iPads running iOS 9 or later, when any text field or text view (e.g.
-// omnibox, settings, card unmask dialog) begins editing, reset ourselves so
-// that we don't present our custom view over the keyboard.
-- (void)textInputDidBeginEditing:(NSNotification*)notification {
-  [self reset];
-}
-
-- (void)keyboardDidHide:(NSNotification*)notification {
-  _keyboardFrame = CGRectZero;
-}
-
 @end
diff --git a/ios/chrome/browser/autofill/form_input_accessory_view_handler.h b/ios/chrome/browser/autofill/form_input_accessory_view_handler.h
new file mode 100644
index 0000000..6b1edc4
--- /dev/null
+++ b/ios/chrome/browser/autofill/form_input_accessory_view_handler.h
@@ -0,0 +1,24 @@
+// 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 IOS_CHROME_BROWSER_AUTOFILL_FORM_INPUT_ACCESSORY_VIEW_HANDLER_H_
+#define IOS_CHROME_BROWSER_AUTOFILL_FORM_INPUT_ACCESSORY_VIEW_HANDLER_H_
+
+#import "ios/chrome/browser/autofill/form_input_accessory_view_delegate.h"
+
+@class JsSuggestionManager;
+
+// This handles user actions in the default keyboard accessory view buttons.
+@interface FormInputAccessoryViewHandler
+    : NSObject<FormInputAccessoryViewDelegate>
+
+// The JS manager for interacting with the underlying form.
+@property(nonatomic, weak) JsSuggestionManager* JSSuggestionManager;
+
+// Resets the metrics logger of the instance.
+- (void)reset;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_AUTOFILL_FORM_INPUT_ACCESSORY_VIEW_HANDLER_H_
diff --git a/ios/chrome/browser/autofill/form_input_accessory_view_handler.mm b/ios/chrome/browser/autofill/form_input_accessory_view_handler.mm
new file mode 100644
index 0000000..3d9aafa
--- /dev/null
+++ b/ios/chrome/browser/autofill/form_input_accessory_view_handler.mm
@@ -0,0 +1,258 @@
+// 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.
+
+#import "ios/chrome/browser/autofill/form_input_accessory_view_handler.h"
+
+#import <UIKit/UIKit.h>
+
+#include "base/mac/foundation_util.h"
+#import "components/autofill/core/browser/keyboard_accessory_metrics_logger.h"
+#import "components/autofill/ios/browser/js_suggestion_manager.h"
+#import "ios/chrome/browser/ui/uikit_ui_util.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace autofill {
+NSString* const kFormSuggestionAssistButtonPreviousElement = @"previousTap";
+NSString* const kFormSuggestionAssistButtonNextElement = @"nextTap";
+NSString* const kFormSuggestionAssistButtonDone = @"done";
+}  // namespace autofill
+
+namespace {
+
+// Finds all views of a particular kind if class |aClass| in the subview
+// hierarchy of the given |root| view.
+NSArray* SubviewsWithClass(UIView* root, Class aClass) {
+  DCHECK(root);
+  NSMutableArray* viewsToExamine = [NSMutableArray arrayWithObject:root];
+  NSMutableArray* subviews = [NSMutableArray array];
+
+  while ([viewsToExamine count]) {
+    UIView* view = [viewsToExamine lastObject];
+    if ([view isKindOfClass:aClass])
+      [subviews addObject:view];
+
+    [viewsToExamine removeLastObject];
+    [viewsToExamine addObjectsFromArray:[view subviews]];
+  }
+
+  return subviews;
+}
+
+// Returns true if |item|'s action name contains |actionName|.
+BOOL ItemActionMatchesName(UIBarButtonItem* item, NSString* actionName) {
+  SEL itemAction = [item action];
+  if (!itemAction)
+    return false;
+  NSString* itemActionName = NSStringFromSelector(itemAction);
+
+  // This doesn't do a strict string match for the action name.
+  return [itemActionName rangeOfString:actionName].location != NSNotFound;
+}
+
+// Finds all UIToolbarItems associated with a given UIToolbar |toolbar| with
+// action selectors with a name that contains the action name specified by
+// |actionName|.
+NSArray* FindToolbarItemsForActionName(UIToolbar* toolbar,
+                                       NSString* actionName) {
+  NSMutableArray* toolbarItems = [NSMutableArray array];
+
+  for (UIBarButtonItem* item in [toolbar items]) {
+    if (ItemActionMatchesName(item, actionName))
+      [toolbarItems addObject:item];
+  }
+
+  return toolbarItems;
+}
+
+// Finds all UIToolbarItem(s) with action selectors of the name specified by
+// |actionName| in any UIToolbars in the view hierarchy below |root|.
+NSArray* FindDescendantToolbarItemsForActionName(UIView* root,
+                                                 NSString* actionName) {
+  NSMutableArray* descendants = [NSMutableArray array];
+
+  NSArray* toolbars = SubviewsWithClass(root, [UIToolbar class]);
+  for (UIToolbar* toolbar in toolbars) {
+    [descendants
+        addObjectsFromArray:FindToolbarItemsForActionName(toolbar, actionName)];
+  }
+
+  return descendants;
+}
+
+// Finds all UIBarButtonItem(s) with action selectors of the name specified by
+// |actionName| in the UITextInputAssistantItem passed.
+NSArray* FindDescendantToolbarItemsForActionName(
+    UITextInputAssistantItem* inputAssistantItem,
+    NSString* actionName) {
+  NSMutableArray* toolbarItems = [NSMutableArray array];
+
+  NSMutableArray* buttonGroupsGroup = [[NSMutableArray alloc] init];
+  if (inputAssistantItem.leadingBarButtonGroups)
+    [buttonGroupsGroup addObject:inputAssistantItem.leadingBarButtonGroups];
+  if (inputAssistantItem.trailingBarButtonGroups)
+    [buttonGroupsGroup addObject:inputAssistantItem.trailingBarButtonGroups];
+  for (NSArray* buttonGroups in buttonGroupsGroup) {
+    for (UIBarButtonItemGroup* group in buttonGroups) {
+      NSArray* items = group.barButtonItems;
+      for (UIBarButtonItem* item in items) {
+        if (ItemActionMatchesName(item, actionName))
+          [toolbarItems addObject:item];
+      }
+    }
+  }
+
+  return toolbarItems;
+}
+
+}  // namespace
+
+@implementation FormInputAccessoryViewHandler {
+  // Logs UMA metrics for the keyboard accessory.
+  std::unique_ptr<autofill::KeyboardAccessoryMetricsLogger>
+      _keyboardAccessoryMetricsLogger;
+}
+
+@synthesize JSSuggestionManager = _JSSuggestionManager;
+
+- (instancetype)init {
+  self = [super init];
+  if (self) {
+    _keyboardAccessoryMetricsLogger.reset(
+        new autofill::KeyboardAccessoryMetricsLogger());
+  }
+  return self;
+}
+
+// Attempts to execute/tap/send-an-event-to the iOS built-in "next" and
+// "previous" form assist controls. Returns NO if this attempt failed, YES
+// otherwise. [HACK] Because the buttons on the assist controls can change any
+// time, this can break with any new iOS version.
+- (BOOL)executeFormAssistAction:(NSString*)actionName {
+  NSArray* descendants = nil;
+  if (IsIPadIdiom()) {
+    // There is no input accessory view for iPads, instead Apple adds the assist
+    // controls to the UITextInputAssistantItem.
+    UIResponder* firstResponder = GetFirstResponder();
+    UITextInputAssistantItem* inputAssistantItem =
+        firstResponder.inputAssistantItem;
+    if (!inputAssistantItem)
+      return NO;
+    descendants =
+        FindDescendantToolbarItemsForActionName(inputAssistantItem, actionName);
+  } else {
+    UIResponder* firstResponder = GetFirstResponder();
+    UIView* inputAccessoryView = firstResponder.inputAccessoryView;
+    if (!inputAccessoryView)
+      return NO;
+    descendants =
+        FindDescendantToolbarItemsForActionName(inputAccessoryView, actionName);
+  }
+
+  if (![descendants count])
+    return NO;
+
+  UIBarButtonItem* item = descendants.firstObject;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
+  [[item target] performSelector:[item action] withObject:item];
+#pragma clang diagnostic pop
+  return YES;
+}
+
+- (void)reset {
+  _keyboardAccessoryMetricsLogger.reset(
+      new autofill::KeyboardAccessoryMetricsLogger());
+}
+
+#pragma mark - FormInputAccessoryViewDelegate
+
+- (void)closeKeyboardWithButtonPress {
+  [self closeKeyboardLoggingButtonPressed:YES];
+}
+
+- (void)closeKeyboardWithoutButtonPress {
+  [self closeKeyboardLoggingButtonPressed:NO];
+}
+
+- (void)selectPreviousElementWithButtonPress {
+  [self selectPreviousElementLoggingButtonPressed:YES];
+}
+
+- (void)selectPreviousElementWithoutButtonPress {
+  [self selectPreviousElementLoggingButtonPressed:NO];
+}
+
+- (void)selectNextElementWithButtonPress {
+  [self selectNextElementLoggingButtonPressed:YES];
+}
+
+- (void)selectNextElementWithoutButtonPress {
+  [self selectNextElementLoggingButtonPressed:NO];
+}
+
+- (void)fetchPreviousAndNextElementsPresenceWithCompletionHandler:
+    (void (^)(BOOL, BOOL))completionHandler {
+  DCHECK(completionHandler);
+  [_JSSuggestionManager
+      fetchPreviousAndNextElementsPresenceWithCompletionHandler:
+          completionHandler];
+}
+
+#pragma mark - Private
+
+// Tries to close the keyboard sendind an action to the default accessory bar
+// if that fails, fallbacks on JavaScript. Logs metrics if loggingButtonPressed
+// is YES.
+- (void)closeKeyboardLoggingButtonPressed:(BOOL)loggingButtonPressed {
+  NSString* actionName = autofill::kFormSuggestionAssistButtonDone;
+  BOOL performedAction = [self executeFormAssistAction:actionName];
+
+  if (!performedAction) {
+    // We could not find the built-in form assist controls, so try to focus
+    // the next or previous control using JavaScript.
+    [_JSSuggestionManager closeKeyboard];
+  }
+  if (loggingButtonPressed) {
+    _keyboardAccessoryMetricsLogger->OnCloseButtonPressed();
+  }
+}
+
+// Tries to focus on the next element sendind an action to the default accessory
+// bar if that fails, fallbacks on JavaScript. Logs metrics if
+// loggingButtonPressed is YES.
+- (void)selectPreviousElementLoggingButtonPressed:(BOOL)loggingButtonPressed {
+  NSString* actionName = autofill::kFormSuggestionAssistButtonPreviousElement;
+  BOOL performedAction = [self executeFormAssistAction:actionName];
+
+  if (!performedAction) {
+    // We could not find the built-in form assist controls, so try to focus
+    // the next or previous control using JavaScript.
+    [_JSSuggestionManager selectPreviousElement];
+  }
+  if (loggingButtonPressed) {
+    _keyboardAccessoryMetricsLogger->OnPreviousButtonPressed();
+  }
+}
+
+// Tries to focus on the previous element sendind an action to the default
+// accessory bar if that fails, fallbacks on JavaScript. Logs metrics if
+// loggingButtonPressed is YES.
+- (void)selectNextElementLoggingButtonPressed:(BOOL)loggingButtonPressed {
+  NSString* actionName = autofill::kFormSuggestionAssistButtonNextElement;
+  BOOL performedAction = [self executeFormAssistAction:actionName];
+
+  if (!performedAction) {
+    // We could not find the built-in form assist controls, so try to focus
+    // the next or previous control using JavaScript.
+    [_JSSuggestionManager selectNextElement];
+  }
+  if (loggingButtonPressed) {
+    _keyboardAccessoryMetricsLogger->OnNextButtonPressed();
+  }
+}
+
+@end
diff --git a/ios/chrome/browser/autofill/form_input_accessory_view_provider.h b/ios/chrome/browser/autofill/form_input_accessory_view_provider.h
index f20d299..d8b2a18 100644
--- a/ios/chrome/browser/autofill/form_input_accessory_view_provider.h
+++ b/ios/chrome/browser/autofill/form_input_accessory_view_provider.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_AUTOFILL_FORM_INPUT_ACCESSORY_VIEW_PROVIDER_H_
 #define IOS_CHROME_BROWSER_AUTOFILL_FORM_INPUT_ACCESSORY_VIEW_PROVIDER_H_
 
+#import <UIKit/UIKit.h>
+
 namespace web {
 struct FormActivityParams;
 class WebState;
@@ -12,9 +14,6 @@
 
 @protocol FormInputAccessoryViewDelegate;
 @protocol FormInputAccessoryViewProvider;
-@class FormInputAccessoryViewController;
-
-#import <UIKit/UIKit.h>
 
 // Block type to provide an accessory view asynchronously.
 typedef void (^AccessoryViewReadyCompletion)(
@@ -37,13 +36,7 @@
                 (AccessoryViewReadyCompletion)accessoryViewUpdateBlock;
 
 // Notifies this provider that the accessory view is going away.
-- (void)inputAccessoryViewControllerDidReset:
-    (FormInputAccessoryViewController*)controller;
-
-// Notifies this provider that the accessory view frame is changing. If the
-// view provided by this provider needs to change, the updated view should be
-// set using |accessoryViewUpdateBlock|.
-- (void)resizeAccessoryView;
+- (void)inputAccessoryViewControllerDidReset;
 
 @end
 
diff --git a/ios/chrome/browser/autofill/form_input_egtest.mm b/ios/chrome/browser/autofill/form_input_egtest.mm
index 005a416..c207968 100644
--- a/ios/chrome/browser/autofill/form_input_egtest.mm
+++ b/ios/chrome/browser/autofill/form_input_egtest.mm
@@ -4,9 +4,11 @@
 
 #import <EarlGrey/EarlGrey.h>
 
+#include "base/mac/foundation_util.h"
 #include "base/strings/sys_string_conversions.h"
 #import "base/test/ios/wait_util.h"
-#import "ios/chrome/browser/autofill/form_input_accessory_view_controller.h"
+#import "components/autofill/ios/browser/js_suggestion_manager.h"
+#import "ios/chrome/browser/autofill/form_input_accessory_view_handler.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
@@ -19,6 +21,7 @@
 #include "ios/web/public/test/element_selector.h"
 #import "ios/web/public/test/http_server/http_server.h"
 #include "ios/web/public/test/http_server/http_server_util.h"
+#import "ios/web/public/web_state/js/crw_js_injection_receiver.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -154,14 +157,17 @@
 // Tests that trying to programmatically dismiss the keyboard when it isn't
 // visible doesn't crash the browser.
 - (void)testCloseKeyboardWhenNotVisible {
-  FormInputAccessoryViewController* viewController =
-      [[FormInputAccessoryViewController alloc] init];
-  GREYAssertNotNil(
-      viewController,
-      @"The input accessory view controller should not be non nil.");
-  [viewController closeKeyboardWithoutButtonPress];
-  viewController.webState = chrome_test_util::GetCurrentWebState();
-  [viewController closeKeyboardWithoutButtonPress];
+  FormInputAccessoryViewHandler* accessoryViewDelegate =
+      [[FormInputAccessoryViewHandler alloc] init];
+  GREYAssertNotNil(accessoryViewDelegate,
+                   @"The Accessory View Delegate should not be non nil.");
+  [accessoryViewDelegate closeKeyboardWithoutButtonPress];
+  CRWJSInjectionReceiver* injectionReceiver =
+      chrome_test_util::GetCurrentWebState()->GetJSInjectionReceiver();
+  accessoryViewDelegate.JSSuggestionManager =
+      base::mac::ObjCCastStrict<JsSuggestionManager>(
+          [injectionReceiver instanceOfClass:[JsSuggestionManager class]]);
+  [accessoryViewDelegate closeKeyboardWithoutButtonPress];
 }
 
 @end
diff --git a/ios/chrome/browser/autofill/form_suggestion_controller.mm b/ios/chrome/browser/autofill/form_suggestion_controller.mm
index cb7d1a1..ab29966 100644
--- a/ios/chrome/browser/autofill/form_suggestion_controller.mm
+++ b/ios/chrome/browser/autofill/form_suggestion_controller.mm
@@ -16,6 +16,7 @@
 #import "components/autofill/ios/browser/form_suggestion.h"
 #import "components/autofill/ios/browser/form_suggestion_provider.h"
 #import "ios/chrome/browser/autofill/form_input_accessory_view_controller.h"
+#import "ios/chrome/browser/autofill/form_input_accessory_view_delegate.h"
 #import "ios/chrome/browser/autofill/form_input_accessory_view_provider.h"
 #import "ios/chrome/browser/autofill/form_suggestion_view.h"
 #import "ios/chrome/browser/passwords/password_generation_utils.h"
@@ -350,7 +351,6 @@
         completionHandler:^{
           [[weakSelf accessoryViewDelegate] closeKeyboardWithoutButtonPress];
         }];
-  _provider = nil;
 }
 
 - (id<FormInputAccessoryViewProvider>)accessoryViewProvider {
@@ -379,14 +379,9 @@
   [self retrieveSuggestionsForForm:params webState:webState];
 }
 
-- (void)inputAccessoryViewControllerDidReset:
-    (FormInputAccessoryViewController*)controller {
+- (void)inputAccessoryViewControllerDidReset {
   accessoryViewUpdateBlock_ = nil;
   [self resetSuggestionState];
 }
 
-- (void)resizeAccessoryView {
-  [self updateKeyboard:_suggestionState.get()];
-}
-
 @end
diff --git a/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm b/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm
index 3e93425..285bd6f 100644
--- a/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm
+++ b/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm
@@ -14,8 +14,9 @@
 #import "components/autofill/ios/browser/form_suggestion_provider.h"
 #import "components/autofill/ios/form_util/form_activity_observer_bridge.h"
 #include "components/autofill/ios/form_util/test_form_activity_tab_helper.h"
-#import "ios/chrome/browser/autofill/form_input_accessory_view_controller.h"
+#import "ios/chrome/browser/autofill/form_input_accessory_consumer.h"
 #import "ios/chrome/browser/autofill/form_suggestion_view.h"
+#import "ios/chrome/browser/ui/autofill/form_input_accessory_mediator.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/web/public/navigation_manager.h"
 #import "ios/web/public/test/fakes/test_web_state.h"
@@ -31,12 +32,6 @@
 #error "This file requires ARC support."
 #endif
 
-@interface FormInputAccessoryViewController (Testing)
-- (instancetype)initWithWebState:(web::WebState*)webState
-             JSSuggestionManager:(JsSuggestionManager*)JSSuggestionManager
-                       providers:(NSArray*)providers;
-@end
-
 // Test provider that records invocations of its interface methods.
 @interface TestSuggestionProvider : NSObject<FormSuggestionProvider>
 
@@ -181,51 +176,37 @@
                   providers:providers
         JsSuggestionManager:mock_js_suggestion_manager_];
     [suggestion_controller_ setWebViewProxy:mock_web_view_proxy_];
-    @autoreleasepool {
-      accessory_controller_ = [[FormInputAccessoryViewController alloc]
-             initWithWebState:&test_web_state_
-          JSSuggestionManager:mock_js_suggestion_manager_
-                    providers:@[
-                      [suggestion_controller_ accessoryViewProvider]
-                    ]];
-    }
-    // Mock out the FormInputAccessoryViewController so it can use the fake
-    // CRWWebViewProxy
-    id mock_accessory_controller =
-        [OCMockObject partialMockForObject:accessory_controller_];
-    [[[mock_accessory_controller stub] andReturn:mock_web_view_proxy_]
-        webViewProxy];
 
-    // On iPad devices, the suggestion view is added directly to the
-    // keyboard view instead of to the input accessory view which is no longer
-    // available on iPad devices. The following code mocks out the methods on
-    // FormInputAccessoryViewController that add and remove the suggestion view.
-    // The mocks now just add and remove it directly to and from
-    // input_accessory_view_ so that the tests can locate it with
-    // GetSuggestionView (defined above).
-    // TODO(crbug.com/661622): Revisit this to see if there's a better way to
-    // test the iPad case. At a minimum, the name 'input_accessory_view_' should
-    // be made more generic.
-    if (IsIPadIdiom()) {
-      void (^mockShow)(NSInvocation*) = ^(NSInvocation* invocation) {
-        __unsafe_unretained UIView* view;
-        [invocation getArgument:&view atIndex:2];
-        for (UIView* view in [input_accessory_view_ subviews]) {
-          [view removeFromSuperview];
-        }
-        [input_accessory_view_ addSubview:view];
-      };
-      [[[mock_accessory_controller stub] andDo:mockShow]
-          showCustomInputAccessoryView:[OCMArg any]];
+    id mock_consumer_ = [OCMockObject
+        niceMockForProtocol:@protocol(FormInputAccessoryConsumer)];
+    accessory_mediator_ =
+        [[FormInputAccessoryMediator alloc] initWithConsumer:mock_consumer_
+                                                webStateList:NULL];
+    [accessory_mediator_ injectWebState:&test_web_state_];
+    [accessory_mediator_
+        injectProviders:@[ [suggestion_controller_ accessoryViewProvider] ]];
+    [accessory_mediator_ injectSuggestionManager:mock_js_suggestion_manager_];
 
-      void (^mockRestore)(NSInvocation*) = ^(NSInvocation* invocation) {
-        for (UIView* view in [input_accessory_view_ subviews]) {
-          [view removeFromSuperview];
-        }
-      };
-      [[[mock_accessory_controller stub] andDo:mockRestore]
-          restoreDefaultInputAccessoryView];
-    }
+    // Mock the mediator consumer used to verify the suggestion views.
+    void (^mockShow)(NSInvocation*) = ^(NSInvocation* invocation) {
+      for (UIView* view in [input_accessory_view_ subviews]) {
+        [view removeFromSuperview];
+      }
+      __unsafe_unretained UIView* view;
+      [invocation getArgument:&view atIndex:2];
+      [input_accessory_view_ addSubview:view];
+    };
+    [[[mock_consumer_ stub] andDo:mockShow]
+        showCustomInputAccessoryView:[OCMArg any]
+                  navigationDelegate:[OCMArg any]];
+
+    void (^mockRestore)(NSInvocation*) = ^(NSInvocation* invocation) {
+      for (UIView* view in [input_accessory_view_ subviews]) {
+        [view removeFromSuperview];
+      }
+    };
+    [[[mock_consumer_ stub] andDo:mockRestore]
+        restoreDefaultInputAccessoryView];
   }
 
   // The FormSuggestionController under test.
@@ -241,7 +222,7 @@
   id mock_web_view_proxy_;
 
   // Accessory view controller.
-  FormInputAccessoryViewController* accessory_controller_;
+  FormInputAccessoryMediator* accessory_mediator_;
 
   // The fake WebState to simulate navigation and JavaScript events.
   web::TestWebState test_web_state_;
diff --git a/ios/chrome/browser/passwords/BUILD.gn b/ios/chrome/browser/passwords/BUILD.gn
index 130363b..99982a8 100644
--- a/ios/chrome/browser/passwords/BUILD.gn
+++ b/ios/chrome/browser/passwords/BUILD.gn
@@ -137,6 +137,7 @@
     "//ios/chrome/browser/autofill",
     "//ios/chrome/browser/browser_state:test_support",
     "//ios/chrome/browser/ssl",
+    "//ios/chrome/browser/ui/autofill:autofill",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/web:test_support",
     "//ios/chrome/browser/web:web_internal",
diff --git a/ios/chrome/browser/passwords/password_controller_unittest.mm b/ios/chrome/browser/passwords/password_controller_unittest.mm
index c1082895..5c44598c 100644
--- a/ios/chrome/browser/passwords/password_controller_unittest.mm
+++ b/ios/chrome/browser/passwords/password_controller_unittest.mm
@@ -27,10 +27,10 @@
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
 #include "components/security_state/ios/ssl_status_input_event_data.h"
-#import "ios/chrome/browser/autofill/form_input_accessory_view_controller.h"
 #import "ios/chrome/browser/autofill/form_suggestion_controller.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
 #import "ios/chrome/browser/passwords/password_form_filler.h"
+#import "ios/chrome/browser/ui/autofill/form_input_accessory_mediator.h"
 #include "ios/chrome/browser/web/chrome_web_client.h"
 #import "ios/chrome/browser/web/chrome_web_test.h"
 #import "ios/web/public/navigation_item.h"
@@ -207,9 +207,12 @@
       suggestionController_ = [[PasswordsTestSuggestionController alloc]
           initWithWebState:web_state()
                  providers:@[ [passwordController_ suggestionProvider] ]];
-      accessoryViewController_ = [[FormInputAccessoryViewController alloc]
-          initWithWebState:web_state()
-                 providers:@[ [suggestionController_ accessoryViewProvider] ]];
+      accessoryMediator_ =
+          [[FormInputAccessoryMediator alloc] initWithConsumer:nil
+                                                  webStateList:NULL];
+      [accessoryMediator_ injectWebState:web_state()];
+      [accessoryMediator_
+          injectProviders:@[ [suggestionController_ accessoryViewProvider] ]];
     }
   }
 
@@ -275,8 +278,8 @@
   // SuggestionController for testing.
   PasswordsTestSuggestionController* suggestionController_;
 
-  // FormInputAccessoryViewController for testing.
-  FormInputAccessoryViewController* accessoryViewController_;
+  // FormInputAccessoryMediatorfor testing.
+  FormInputAccessoryMediator* accessoryMediator_;
 
   // PasswordController for testing.
   PasswordController* passwordController_;
diff --git a/ios/chrome/browser/ui/authentication/BUILD.gn b/ios/chrome/browser/ui/authentication/BUILD.gn
index c5afa910..b188d4b6 100644
--- a/ios/chrome/browser/ui/authentication/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/BUILD.gn
@@ -42,7 +42,6 @@
     "//components/signin/core/browser",
     "//components/signin/ios/browser",
     "//components/strings",
-    "//components/unified_consent",
     "//google_apis",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser",
diff --git a/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm b/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm
index ab76c9a..3ac9fad 100644
--- a/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm
+++ b/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm
@@ -22,7 +22,6 @@
 #include "components/signin/core/browser/profile_management_switches.h"
 #include "components/signin/core/browser/signin_metrics.h"
 #include "components/strings/grit/components_strings.h"
-#include "components/unified_consent/unified_consent_service.h"
 #import "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
 #include "ios/chrome/browser/signin/account_tracker_service_factory.h"
@@ -46,7 +45,6 @@
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/util/label_link_controller.h"
 #include "ios/chrome/browser/unified_consent/feature.h"
-#include "ios/chrome/browser/unified_consent/unified_consent_service_factory.h"
 #include "ios/chrome/common/string_util.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
@@ -298,14 +296,6 @@
 
 - (void)acceptSignInAndCommitSyncChanges {
   DCHECK(_didSignIn);
-  if (_unifiedConsentEnabled) {
-    // The consent has to be given as soon as the user is signed in. Even when
-    // they open the settings through the link.
-    unified_consent::UnifiedConsentService* unifiedConsentService =
-        UnifiedConsentServiceFactory::GetForBrowserState(_browserState);
-    DCHECK(unifiedConsentService);
-    unifiedConsentService->SetUnifiedConsentGiven(true);
-  }
   SyncSetupServiceFactory::GetForBrowserState(_browserState)->CommitChanges();
   [self acceptSignInAndShowAccountsSettings:_unifiedConsentCoordinator
                                                 .settingsLinkWasTapped];
diff --git a/ios/chrome/browser/ui/autofill/BUILD.gn b/ios/chrome/browser/ui/autofill/BUILD.gn
index 6b09f6850..eb8c0b38 100644
--- a/ios/chrome/browser/ui/autofill/BUILD.gn
+++ b/ios/chrome/browser/ui/autofill/BUILD.gn
@@ -13,6 +13,8 @@
     "chrome_autofill_client_ios.mm",
     "form_input_accessory_coordinator.h",
     "form_input_accessory_coordinator.mm",
+    "form_input_accessory_mediator.h",
+    "form_input_accessory_mediator.mm",
   ]
   deps = [
     ":autofill_ui",
@@ -20,6 +22,7 @@
     "//components/autofill/core/browser",
     "//components/autofill/core/common",
     "//components/autofill/ios/browser",
+    "//components/autofill/ios/form_util",
     "//components/browser_sync",
     "//components/infobars/core",
     "//components/keyed_service/core",
@@ -32,6 +35,7 @@
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/infobars",
     "//ios/chrome/browser/metrics",
+    "//ios/chrome/browser/passwords:passwords_generation_utils",
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/ssl",
     "//ios/chrome/browser/sync",
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory_coordinator.mm b/ios/chrome/browser/ui/autofill/form_input_accessory_coordinator.mm
index 24c86eb..5f71dfa 100644
--- a/ios/chrome/browser/ui/autofill/form_input_accessory_coordinator.mm
+++ b/ios/chrome/browser/ui/autofill/form_input_accessory_coordinator.mm
@@ -4,33 +4,30 @@
 
 #import "ios/chrome/browser/ui/autofill/form_input_accessory_coordinator.h"
 
+#include "base/mac/foundation_util.h"
+#import "components/autofill/ios/browser/js_suggestion_manager.h"
 #import "ios/chrome/browser/autofill/form_input_accessory_view_controller.h"
-#import "ios/chrome/browser/web_state_list/web_state_list.h"
-#import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
-#include "ios/web/public/web_state/web_state.h"
+#import "ios/chrome/browser/ui/autofill/form_input_accessory_mediator.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
-@interface FormInputAccessoryCoordinator ()<WebStateListObserving>
+@interface FormInputAccessoryCoordinator ()
 
 // The View Controller for the input accessory view.
 @property FormInputAccessoryViewController* formInputAccessoryViewController;
 
+// The Mediator for the input accessory view controller.
+@property FormInputAccessoryMediator* formInputAccessoryMediator;
+
 @end
 
-@implementation FormInputAccessoryCoordinator {
-  // The WebStateList this instance is observing in order to update the
-  // active WebState.
-  WebStateList* _webStateList;
-
-  // Bridge to observe the web state list from Objective-C.
-  std::unique_ptr<WebStateListObserverBridge> _webStateListObserver;
-}
+@implementation FormInputAccessoryCoordinator
 
 @synthesize formInputAccessoryViewController =
     _formInputAccessoryViewController;
+@synthesize formInputAccessoryMediator = _formInputAccessoryMediator;
 
 - (instancetype)initWithBaseViewController:(UIViewController*)viewController
                               browserState:
@@ -40,46 +37,13 @@
                               browserState:browserState];
   if (self) {
     DCHECK(webStateList);
-    _webStateList = webStateList;
-    _webStateListObserver = std::make_unique<WebStateListObserverBridge>(self);
-    _webStateList->AddObserver(_webStateListObserver.get());
+    _formInputAccessoryViewController =
+        [[FormInputAccessoryViewController alloc] init];
+    _formInputAccessoryMediator = [[FormInputAccessoryMediator alloc]
+        initWithConsumer:self.formInputAccessoryViewController
+            webStateList:webStateList];
   }
   return self;
 }
 
-- (void)dealloc {
-  if (_webStateList) {
-    _webStateList->RemoveObserver(_webStateListObserver.get());
-    _webStateListObserver.reset();
-    _webStateList = nullptr;
-  }
-}
-
-- (void)start {
-  self.formInputAccessoryViewController =
-      [[FormInputAccessoryViewController alloc] init];
-  [self updateFormInputAccessoryViewController];
-}
-
-- (void)stop {
-  self.formInputAccessoryViewController = nil;
-}
-
-#pragma mark - Private
-
-- (void)updateFormInputAccessoryViewController {
-  web::WebState* activeWebState = _webStateList->GetActiveWebState();
-  self.formInputAccessoryViewController.webState = activeWebState;
-}
-
-#pragma mark - CRWWebStateListObserver
-
-- (void)webStateList:(WebStateList*)webStateList
-    didChangeActiveWebState:(web::WebState*)newWebState
-                oldWebState:(web::WebState*)oldWebState
-                    atIndex:(int)atIndex
-                     reason:(int)reason {
-  self.formInputAccessoryViewController.webState = newWebState;
-}
-
 @end
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory_mediator.h b/ios/chrome/browser/ui/autofill/form_input_accessory_mediator.h
new file mode 100644
index 0000000..c7905b53
--- /dev/null
+++ b/ios/chrome/browser/ui/autofill/form_input_accessory_mediator.h
@@ -0,0 +1,52 @@
+// 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 IOS_CHROME_BROWSER_UI_AUTOFILL_FORM_INPUT_ACCESSORY_MEDIATOR_H_
+#define IOS_CHROME_BROWSER_UI_AUTOFILL_FORM_INPUT_ACCESSORY_MEDIATOR_H_
+
+#import <Foundation/Foundation.h>
+
+#import "ios/chrome/browser/autofill/form_input_accessory_view_delegate.h"
+#import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
+#import "ios/web/public/web_state/web_state_observer_bridge.h"
+
+@protocol FormInputAccessoryConsumer;
+@protocol FormInputAccessoryViewProvider;
+@class JsSuggestionManager;
+class WebStateList;
+namespace web {
+class WebState;
+}
+
+// This class contains all the logic to get and provide keyboard input accessory
+// views to its consumer. As well as telling the consumer when the default
+// accessory view shoeuld be restored to the system default.
+@interface FormInputAccessoryMediator : NSObject
+
+// Returns a mediator observing the passed `WebStateList` and associated with
+// the passed consumer. `webSateList` can be nullptr and `consumer` can be nil.
+- (instancetype)initWithConsumer:(id<FormInputAccessoryConsumer>)consumer
+                    webStateList:(WebStateList*)webStateList;
+
+// Unavailable, use initWithConsumer:webStateList: instead.
+- (instancetype)init NS_UNAVAILABLE;
+
+@end
+
+// Methods to allow injection in tests.
+@interface FormInputAccessoryMediator (Tests)
+
+// The WebState this instance is observing. Can be null.
+- (void)injectWebState:(web::WebState*)webState;
+
+// The JS manager for interacting with the underlying form.
+- (void)injectSuggestionManager:(JsSuggestionManager*)JSSuggestionManager;
+
+// The objects that can provide a custom input accessory view while filling
+// forms.
+- (void)injectProviders:(NSArray<id<FormInputAccessoryViewProvider>>*)providers;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_AUTOFILL_FORM_INPUT_ACCESSORY_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory_mediator.mm b/ios/chrome/browser/ui/autofill/form_input_accessory_mediator.mm
new file mode 100644
index 0000000..ac934ac
--- /dev/null
+++ b/ios/chrome/browser/ui/autofill/form_input_accessory_mediator.mm
@@ -0,0 +1,332 @@
+// 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.
+
+#import "ios/chrome/browser/ui/autofill/form_input_accessory_mediator.h"
+
+#include "base/ios/block_types.h"
+#include "base/mac/foundation_util.h"
+#include "base/mac/scoped_block.h"
+#import "components/autofill/ios/browser/js_suggestion_manager.h"
+#import "components/autofill/ios/form_util/form_activity_observer_bridge.h"
+#import "ios/chrome/browser/autofill/form_input_accessory_consumer.h"
+#import "ios/chrome/browser/autofill/form_input_accessory_view_handler.h"
+#import "ios/chrome/browser/autofill/form_input_accessory_view_provider.h"
+#import "ios/chrome/browser/autofill/form_suggestion_tab_helper.h"
+#import "ios/chrome/browser/passwords/password_generation_utils.h"
+#include "ios/chrome/browser/ui/ui_util.h"
+#import "ios/chrome/browser/web_state_list/web_state_list.h"
+#import "ios/web/public/url_scheme_util.h"
+#include "ios/web/public/web_state/form_activity_params.h"
+#import "ios/web/public/web_state/js/crw_js_injection_receiver.h"
+#include "ios/web/public/web_state/web_state.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface FormInputAccessoryMediator ()<FormActivityObserver,
+                                         CRWWebStateObserver,
+                                         WebStateListObserving>
+@property(nonatomic, strong)
+    FormInputAccessoryViewHandler* formInputAccessoryHandler;
+
+// The WebState this instance is observing. Can be null.
+@property(nonatomic, assign) web::WebState* webState;
+
+// The JS manager for interacting with the underlying form.
+@property(nonatomic, weak) JsSuggestionManager* JSSuggestionManager;
+
+// The main consumer for this mediator.
+@property(nonatomic, weak) id<FormInputAccessoryConsumer> consumer;
+
+// The object that manages the currently-shown custom accessory view.
+@property(nonatomic, weak) id<FormInputAccessoryViewProvider> currentProvider;
+
+// The objects that can provide a custom input accessory view while filling
+// forms.
+@property(nonatomic, copy)
+    NSArray<id<FormInputAccessoryViewProvider>>* providers;
+
+@end
+
+@implementation FormInputAccessoryMediator {
+  // The WebStateList this instance is observing in order to update the
+  // active WebState.
+  WebStateList* _webStateList;
+
+  // Bridge to observe the web state list from Objective-C.
+  std::unique_ptr<WebStateListObserverBridge> _webStateListObserver;
+
+  // Bridge to observe the web state from Objective-C.
+  std::unique_ptr<web::WebStateObserverBridge> _webStateObserverBridge;
+
+  // Bridge to observe form activity in |_webState|.
+  std::unique_ptr<autofill::FormActivityObserverBridge>
+      _formActivityObserverBridge;
+
+  // Whether suggestions have previously been shown.
+  BOOL _suggestionsHaveBeenShown;
+}
+
+@synthesize consumer = _consumer;
+@synthesize currentProvider = _currentProvider;
+@synthesize formInputAccessoryHandler = _formInputAccessoryHandler;
+@synthesize JSSuggestionManager = _JSSuggestionManager;
+@synthesize providers = _providers;
+@synthesize webState = _webState;
+
+- (instancetype)initWithConsumer:(id<FormInputAccessoryConsumer>)consumer
+                    webStateList:(WebStateList*)webStateList {
+  self = [super init];
+  if (self) {
+    _consumer = consumer;
+    if (webStateList) {
+      _webStateList = webStateList;
+      _webStateListObserver =
+          std::make_unique<WebStateListObserverBridge>(self);
+      _webStateList->AddObserver(_webStateListObserver.get());
+      web::WebState* webState = webStateList->GetActiveWebState();
+      if (webState) {
+        _webState = webState;
+        CRWJSInjectionReceiver* injectionReceiver =
+            webState->GetJSInjectionReceiver();
+        _JSSuggestionManager = base::mac::ObjCCastStrict<JsSuggestionManager>(
+            [injectionReceiver instanceOfClass:[JsSuggestionManager class]]);
+        _providers = @[ FormSuggestionTabHelper::FromWebState(webState)
+                            ->GetAccessoryViewProvider() ];
+        _formActivityObserverBridge =
+            std::make_unique<autofill::FormActivityObserverBridge>(_webState,
+                                                                   self);
+      }
+    }
+    _formInputAccessoryHandler = [[FormInputAccessoryViewHandler alloc] init];
+    _formInputAccessoryHandler.JSSuggestionManager = _JSSuggestionManager;
+
+    NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter];
+    [defaultCenter addObserver:self
+                      selector:@selector(handleTextInputDidBeginEditing:)
+                          name:UITextFieldTextDidBeginEditingNotification
+                        object:nil];
+  }
+  return self;
+}
+
+- (void)dealloc {
+  if (_webState) {
+    _webState->RemoveObserver(_webStateObserverBridge.get());
+    _webStateObserverBridge.reset();
+    _webState = nullptr;
+    _formActivityObserverBridge.reset();
+  }
+  if (_webStateList) {
+    _webStateList->RemoveObserver(_webStateListObserver.get());
+    _webStateListObserver.reset();
+    _webStateList = nullptr;
+  }
+  _formActivityObserverBridge.reset();
+}
+
+- (void)detachFromWebState {
+  [self reset];
+  if (_webState) {
+    _webState->RemoveObserver(_webStateObserverBridge.get());
+    _webStateObserverBridge.reset();
+    _webState = nullptr;
+    _formActivityObserverBridge.reset();
+  }
+}
+
+#pragma mark - FormActivityObserver
+
+- (void)webState:(web::WebState*)webState
+    registeredFormActivity:(const web::FormActivityParams&)params {
+  DCHECK_EQ(_webState, webState);
+  web::URLVerificationTrustLevel trustLevel;
+  const GURL pageURL(webState->GetCurrentURL(&trustLevel));
+  if (params.input_missing ||
+      trustLevel != web::URLVerificationTrustLevel::kAbsolute ||
+      !web::UrlHasWebScheme(pageURL) || !webState->ContentIsHTML()) {
+    [self reset];
+    return;
+  }
+
+  if (params.type == "blur" || params.type == "change" ||
+      params.type == "form_changed") {
+    return;
+  }
+
+  [self retrieveAccessoryViewForForm:params webState:webState];
+}
+
+#pragma mark - CRWWebStateObserver
+
+- (void)webStateWasHidden:(web::WebState*)webState {
+  DCHECK_EQ(_webState, webState);
+  [self reset];
+}
+
+- (void)webState:(web::WebState*)webState didLoadPageWithSuccess:(BOOL)success {
+  DCHECK_EQ(_webState, webState);
+  [self reset];
+}
+
+- (void)webStateDestroyed:(web::WebState*)webState {
+  DCHECK_EQ(_webState, webState);
+  [self detachFromWebState];
+}
+
+#pragma mark - CRWWebStateListObserver
+
+- (void)webStateList:(WebStateList*)webStateList
+    didChangeActiveWebState:(web::WebState*)newWebState
+                oldWebState:(web::WebState*)oldWebState
+                    atIndex:(int)atIndex
+                     reason:(int)reason {
+  [self updateWithNewWebState:newWebState];
+}
+
+#pragma mark - Private
+
+// Updates the accessory mediator with the passed web state, its JS suggestion
+// manager and the registered providers. If NULL is passed it will instead clear
+// those properties in the mediator.
+- (void)updateWithNewWebState:(web::WebState*)webState {
+  [self detachFromWebState];
+  if (webState) {
+    self.webState = webState;
+    _webStateObserverBridge =
+        std::make_unique<web::WebStateObserverBridge>(self);
+    webState->AddObserver(_webStateObserverBridge.get());
+    _formActivityObserverBridge =
+        std::make_unique<autofill::FormActivityObserverBridge>(webState, self);
+    CRWJSInjectionReceiver* injectionReceiver =
+        webState->GetJSInjectionReceiver();
+    self.JSSuggestionManager = base::mac::ObjCCastStrict<JsSuggestionManager>(
+        [injectionReceiver instanceOfClass:[JsSuggestionManager class]]);
+    self.providers = @[ FormSuggestionTabHelper::FromWebState(webState)
+                            ->GetAccessoryViewProvider() ];
+    _formInputAccessoryHandler.JSSuggestionManager = self.JSSuggestionManager;
+  } else {
+    self.webState = NULL;
+    self.JSSuggestionManager = nil;
+    self.providers = @[];
+  }
+}
+
+// Resets the current provider, the handler and the consumer to a clean state.
+- (void)reset {
+  [self.consumer restoreDefaultInputAccessoryView];
+
+  [self.currentProvider inputAccessoryViewControllerDidReset];
+  self.currentProvider = nil;
+
+  [self.formInputAccessoryHandler reset];
+}
+
+// Asynchronously queries the providers for an accessory view. Sends it to
+// the consumer if found.
+- (void)retrieveAccessoryViewForForm:(const web::FormActivityParams&)params
+                            webState:(web::WebState*)webState {
+  DCHECK_EQ(webState, self.webState);
+  // Build a block for each provider that will invoke its completion with YES
+  // if the provider can provide an accessory view for the specified form/field
+  // and NO otherwise.
+  NSMutableArray* findProviderBlocks = [[NSMutableArray alloc] init];
+  for (id<FormInputAccessoryViewProvider> provider in _providers) {
+    passwords::PipelineBlock findProviderBlock =
+        [self queryViewBlockForProvider:provider params:params];
+    [findProviderBlocks addObject:findProviderBlock];
+  }
+
+  // Run all the blocks in |findProviderBlocks| until one invokes its
+  // completion with YES. The first one to do so will be passed to
+  // |onProviderFound|.
+  __weak __typeof(self) weakSelf = self;
+  passwords::RunSearchPipeline(findProviderBlocks, ^(NSUInteger providerIndex) {
+    // If no view was retrieved, reset self.
+    if (providerIndex == NSNotFound) {
+      [weakSelf reset];
+    }
+  });
+}
+
+// Returns a pipeline block used to search for a provider with the current form
+// params.
+- (passwords::PipelineBlock)
+queryViewBlockForProvider:(id<FormInputAccessoryViewProvider>)provider
+                   params:(web::FormActivityParams)params {
+  __weak __typeof(self) weakSelf = self;
+  return ^(void (^completion)(BOOL success)) {
+    FormInputAccessoryMediator* strongSelf = weakSelf;
+    if (!strongSelf) {
+      return;
+    }
+    AccessoryViewReadyCompletion accessoryViewReadyCompletion =
+        [self accessoryViewReadyBlockWithCompletion:completion];
+    [provider retrieveAccessoryViewForForm:params
+                                  webState:strongSelf.webState
+                  accessoryViewUpdateBlock:accessoryViewReadyCompletion];
+  };
+}
+
+// Returns a block setting up the provider and the view returned. It calls the
+// passed completion with NO if the view found is invalid. With YES otherwise.
+- (AccessoryViewReadyCompletion)accessoryViewReadyBlockWithCompletion:
+    (void (^)(BOOL success))completion {
+  __weak __typeof(self) weakSelf = self;
+  return ^(UIView* accessoryView, id<FormInputAccessoryViewProvider> provider) {
+    // View is nil, tell the pipeline to continue searching.
+    if (!accessoryView) {
+      completion(NO);
+      return;
+    }
+    // Once the view is retrieved, tell the pipeline to stop and
+    // update the UI.
+    completion(YES);
+    FormInputAccessoryMediator* strongSelf = weakSelf;
+    if (!strongSelf) {
+      return;
+    }
+    if (strongSelf.currentProvider != provider) {
+      [strongSelf.currentProvider inputAccessoryViewControllerDidReset];
+    }
+    strongSelf.currentProvider = provider;
+    [provider setAccessoryViewDelegate:strongSelf.formInputAccessoryHandler];
+    [strongSelf.consumer
+        showCustomInputAccessoryView:accessoryView
+                  navigationDelegate:strongSelf.formInputAccessoryHandler];
+  };
+}
+// When any text field or text view (e.g. omnibox, settings, card unmask dialog)
+// begins editing, reset ourselves so that we don't present our custom view over
+// the keyboard.
+- (void)handleTextInputDidBeginEditing:(NSNotification*)notification {
+  [self reset];
+}
+
+#pragma mark - Tests
+
+- (void)injectWebState:(web::WebState*)webState {
+  [self detachFromWebState];
+  _webState = webState;
+  if (!_webState) {
+    return;
+  }
+  _webStateObserverBridge = std::make_unique<web::WebStateObserverBridge>(self);
+  _webState->AddObserver(_webStateObserverBridge.get());
+  _formActivityObserverBridge =
+      std::make_unique<autofill::FormActivityObserverBridge>(_webState, self);
+}
+
+- (void)injectSuggestionManager:(JsSuggestionManager*)JSSuggestionManager {
+  _JSSuggestionManager = JSSuggestionManager;
+  _formInputAccessoryHandler.JSSuggestionManager = _JSSuggestionManager;
+}
+
+- (void)injectProviders:
+    (NSArray<id<FormInputAccessoryViewProvider>>*)providers {
+  self.providers = providers;
+}
+
+@end
diff --git a/ios/chrome/browser/ui/settings/google_services_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services_settings_coordinator.mm
index 287a2b5..2fccaf2 100644
--- a/ios/chrome/browser/ui/settings/google_services_settings_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/google_services_settings_coordinator.mm
@@ -16,7 +16,6 @@
 #import "ios/chrome/browser/ui/settings/google_services_settings_local_commands.h"
 #import "ios/chrome/browser/ui/settings/google_services_settings_mediator.h"
 #import "ios/chrome/browser/ui/settings/google_services_settings_view_controller.h"
-#include "ios/chrome/browser/unified_consent/unified_consent_service_factory.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -51,13 +50,10 @@
       SyncSetupServiceFactory::GetForBrowserState(self.browserState);
   browser_sync::ProfileSyncService* syncService =
       ProfileSyncServiceFactory::GetForBrowserState(self.browserState);
-  unified_consent::UnifiedConsentService* unifiedConsentService =
-      UnifiedConsentServiceFactory::GetForBrowserState(self.browserState);
   self.mediator = [[GoogleServicesSettingsMediator alloc]
-        initWithPrefService:self.browserState->GetPrefs()
-                syncService:syncService
-           syncSetupService:syncSetupService
-      unifiedConsentService:unifiedConsentService];
+      initWithPrefService:self.browserState->GetPrefs()
+              syncService:syncService
+         syncSetupService:syncSetupService];
   self.mediator.consumer = viewController;
   self.mediator.authService =
       AuthenticationServiceFactory::GetForBrowserState(self.browserState);
diff --git a/ios/chrome/browser/ui/settings/google_services_settings_egtest.mm b/ios/chrome/browser/ui/settings/google_services_settings_egtest.mm
index b043652..0011139c 100644
--- a/ios/chrome/browser/ui/settings/google_services_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/google_services_settings_egtest.mm
@@ -98,8 +98,7 @@
     EARL_GREY_TEST_SKIPPED(@"This test is UIRefresh only.");
   [SigninEarlGreyUI signinWithIdentity:[SigninEarlGreyUtils fakeIdentity1]];
   PrefService* prefService = GetOriginalBrowserState()->GetPrefs();
-  GREYAssert(prefService->GetBoolean(kUnifiedConsentGiven),
-             @"Unified consent should be given");
+  prefService->SetBoolean(kUnifiedConsentGiven, true);
   [self openGoogleServicesSettings];
   [self assertSyncEverythingSection];
   [self assertPersonalizedServicesCollapsed:YES];
diff --git a/ios/chrome/browser/ui/settings/google_services_settings_mediator.h b/ios/chrome/browser/ui/settings/google_services_settings_mediator.h
index 7f0955b..4a7461fe 100644
--- a/ios/chrome/browser/ui/settings/google_services_settings_mediator.h
+++ b/ios/chrome/browser/ui/settings/google_services_settings_mediator.h
@@ -20,9 +20,6 @@
 namespace browser_sync {
 class ProfileSyncService;
 };
-namespace unified_consent {
-class UnifiedConsentService;
-}  // namespace unified_consent
 
 // Mediator for the Google services settings.
 @interface GoogleServicesSettingsMediator
@@ -40,8 +37,6 @@
                         syncService:
                             (browser_sync::ProfileSyncService*)syncService
                    syncSetupService:(SyncSetupService*)syncSetupService
-              unifiedConsentService:
-                  (unified_consent::UnifiedConsentService*)unifiedConsentService
     NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/settings/google_services_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services_settings_mediator.mm
index af64b70..2bf95d0 100644
--- a/ios/chrome/browser/ui/settings/google_services_settings_mediator.mm
+++ b/ios/chrome/browser/ui/settings/google_services_settings_mediator.mm
@@ -11,7 +11,6 @@
 #include "components/prefs/pref_change_registrar.h"
 #include "components/prefs/pref_service.h"
 #include "components/unified_consent/pref_names.h"
-#include "components/unified_consent/unified_consent_service.h"
 #import "ios/chrome/browser/signin/authentication_service.h"
 #import "ios/chrome/browser/signin/authentication_service_factory.h"
 #include "ios/chrome/browser/sync/sync_observer_bridge.h"
@@ -85,9 +84,6 @@
   std::unique_ptr<SyncObserverBridge> _syncObserver;
 }
 
-// Unified consent service.
-@property(nonatomic, assign)
-    unified_consent::UnifiedConsentService* unifiedConsentService;
 // Returns YES if the user is authenticated.
 @property(nonatomic, assign, readonly) BOOL isAuthenticated;
 // Returns YES if the user has given his consent to use Google services.
@@ -120,7 +116,6 @@
 
 @implementation GoogleServicesSettingsMediator
 
-@synthesize unifiedConsentService = _unifiedConsentService;
 @synthesize consumer = _consumer;
 @synthesize authService = _authService;
 @synthesize prefService = _prefService;
@@ -137,21 +132,17 @@
 
 #pragma mark - Load model
 
-- (instancetype)
-  initWithPrefService:(PrefService*)prefService
-          syncService:(browser_sync::ProfileSyncService*)syncService
-     syncSetupService:(SyncSetupService*)syncSetupService
-unifiedConsentService:
-    (unified_consent::UnifiedConsentService*)unifiedConsentService {
+- (instancetype)initWithPrefService:(PrefService*)prefService
+                        syncService:
+                            (browser_sync::ProfileSyncService*)syncService
+                   syncSetupService:(SyncSetupService*)syncSetupService {
   self = [super init];
   if (self) {
     DCHECK(prefService);
     DCHECK(syncService);
     DCHECK(syncSetupService);
-    DCHECK(unifiedConsentService);
     _prefService = prefService;
     _syncSetupService = syncSetupService;
-    _unifiedConsentService = unifiedConsentService;
     _syncObserver.reset(new SyncObserverBridge(self, syncService));
     prefObserverBridge_ = std::make_unique<PrefObserverBridge>(self);
     prefChangeRegistrar_.Init(prefService);
@@ -216,7 +207,7 @@
 }
 
 - (BOOL)isConsentGiven {
-  return self.unifiedConsentService->IsUnifiedConsentGiven();
+  return self.prefService->GetBoolean(kUnifiedConsentGiven);
 }
 
 - (CollectionViewItem*)syncEverythingItem {
@@ -512,7 +503,7 @@
     return;
   // Mark the switch has being animated to avoid being reloaded.
   base::AutoReset<BOOL> autoReset(&_syncEverythingSwitchBeingAnimated, YES);
-  self.unifiedConsentService->SetUnifiedConsentGiven(value);
+  self.prefService->SetBoolean(kUnifiedConsentGiven, value);
 }
 
 - (void)toggleSyncDataSync:(NSInteger)dataTypeInt withValue:(BOOL)value {
diff --git a/ios/chrome/browser/ui/util/manual_text_framer.mm b/ios/chrome/browser/ui/util/manual_text_framer.mm
index 29ea76b7..9ab3e1caa 100644
--- a/ios/chrome/browser/ui/util/manual_text_framer.mm
+++ b/ios/chrome/browser/ui/util/manual_text_framer.mm
@@ -340,6 +340,7 @@
     NSMutableCharacterSet* lineEndSet =
         [NSMutableCharacterSet whitespaceAndNewlineCharacterSet];
     [lineEndSet addCharactersInString:@"-\u2013\u2014"];
+    [lineEndSet removeCharactersInString:@"\u00A0"];
     _lineEndSet = lineEndSet;
   }
   return _lineEndSet;
diff --git a/ios/chrome/browser/ui/util/manual_text_framer_unittest.mm b/ios/chrome/browser/ui/util/manual_text_framer_unittest.mm
index 4da9712..a973a700 100644
--- a/ios/chrome/browser/ui/util/manual_text_framer_unittest.mm
+++ b/ios/chrome/browser/ui/util/manual_text_framer_unittest.mm
@@ -108,6 +108,20 @@
   CheckForLineCountAndFramedRange(0, NSMakeRange(0, 0));
 }
 
+// Tests that unbreakable spaces are accounted for.
+TEST_F(ManualTextFramerTest, UnbreakableSpace) {
+  SetText(@"This is a long text with\u00A0unbreakable\u00A0spaces");
+  attributes()[NSFontAttributeName] = TypographyFontWithSize(16.0);
+  attributes()[NSParagraphStyleAttributeName] = CreateParagraphStyle(
+      20.0, NSTextAlignmentNatural, NSLineBreakByWordWrapping);
+  ApplyAttributesForRange(text_range());
+  CGRect bounds = CGRectMake(0, 0, 200, 60);
+  FrameTextInBounds(bounds);
+  ASSERT_EQ(2UL, text_frame().lines.count);
+  FramedLine* line = text_frame().lines[1];
+  EXPECT_TRUE(NSEqualRanges(NSMakeRange(20, 23), line.stringRange));
+}
+
 // Tests that multiple newlines are accounted for.  Only the first three
 // newlines should be added to |lines_|.
 TEST_F(ManualTextFramerTest, MultipleNewlineTest) {
diff --git a/ios/chrome/browser/voice/voice_search_navigations_tab_helper.mm b/ios/chrome/browser/voice/voice_search_navigations_tab_helper.mm
index 47889696..7ddf294 100644
--- a/ios/chrome/browser/voice/voice_search_navigations_tab_helper.mm
+++ b/ios/chrome/browser/voice/voice_search_navigations_tab_helper.mm
@@ -55,7 +55,6 @@
   if (item && (item == pending_item || item == transient_item))
     return will_navigate_to_voice_search_result_;
   // Check if the marker exists if it's a committed navigation.
-  DCHECK_NE(manager->GetIndexOfItem(item), -1);
   return item->GetUserData(kNavigationMarkerKey) != nullptr;
 }
 
diff --git a/ios/chrome/browser/web/image_fetch_tab_helper.h b/ios/chrome/browser/web/image_fetch_tab_helper.h
index cb183b68e..dd592fda 100644
--- a/ios/chrome/browser/web/image_fetch_tab_helper.h
+++ b/ios/chrome/browser/web/image_fetch_tab_helper.h
@@ -8,6 +8,7 @@
 #include <unordered_map>
 
 #include "base/macros.h"
+#include "base/memory/weak_ptr.h"
 #include "ios/web/public/web_state/web_state_observer.h"
 #import "ios/web/public/web_state/web_state_user_data.h"
 
@@ -29,8 +30,11 @@
   //   cache.
   // This method should only be called from UI thread, and |url| should be equal
   // to the resolved "src" attribute of <img>, otherwise the method 1 would
-  // fail. |callback| will be called on UI thread.
-  void GetImageData(const GURL& url, ImageDataCallback&& callback);
+  // fail. |callback| will be called on UI thread. If the JavaScript does not
+  // response after |timeout|, the |callback| will be invoked with nullptr.
+  void GetImageData(const GURL& url,
+                    base::TimeDelta timeout,
+                    ImageDataCallback&& callback);
 
  private:
   friend class web::WebStateUserData<ImageFetchTabHelper>;
@@ -43,10 +47,10 @@
   void WebStateDestroyed(web::WebState* web_state) override;
 
   // Handler for messages sent back from injected JavaScript.
-  bool OnImageDataReceived(const base::DictionaryValue& message,
-                           const GURL& page_url,
-                           bool has_user_gesture,
-                           bool form_in_main_frame);
+  bool OnImageDataReceived(const base::DictionaryValue& message);
+
+  // Handler for timeout on GetImageData.
+  void OnImageDataTimeout(int call_id);
 
   // WebState this tab helper is attached to.
   web::WebState* web_state_ = nullptr;
@@ -60,6 +64,8 @@
   // |OnImageDataReceived| and used to invoke the corresponding callback.
   int call_id_ = 0;
 
+  base::WeakPtrFactory<ImageFetchTabHelper> weak_ptr_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(ImageFetchTabHelper);
 };
 
diff --git a/ios/chrome/browser/web/image_fetch_tab_helper.mm b/ios/chrome/browser/web/image_fetch_tab_helper.mm
index 994bc4966..89f5099 100644
--- a/ios/chrome/browser/web/image_fetch_tab_helper.mm
+++ b/ios/chrome/browser/web/image_fetch_tab_helper.mm
@@ -9,6 +9,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #import "ios/web/public/web_state/navigation_context.h"
+#include "ios/web/public/web_thread.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -22,11 +23,18 @@
 }
 
 ImageFetchTabHelper::ImageFetchTabHelper(web::WebState* web_state)
-    : web_state_(web_state) {
+    : web_state_(web_state), weak_ptr_factory_(this) {
   web_state->AddObserver(this);
+  // BindRepeating cannot work on WeakPtr and function with return value, use
+  // lambda as mediator.
   web_state->AddScriptCommandCallback(
-      base::BindRepeating(&ImageFetchTabHelper::OnImageDataReceived,
-                          base::Unretained(this)),
+      base::BindRepeating(
+          [](base::WeakPtr<ImageFetchTabHelper> ptr,
+             const base::DictionaryValue& message, const GURL& page_url,
+             bool has_user_gesture, bool form_in_main_frame) {
+            return ptr ? ptr->OnImageDataReceived(message) : true;
+          },
+          weak_ptr_factory_.GetWeakPtr()),
       kCommandPrefix);
 }
 
@@ -52,15 +60,22 @@
 }
 
 void ImageFetchTabHelper::GetImageData(const GURL& url,
+                                       base::TimeDelta timeout,
                                        ImageDataCallback&& callback) {
   ++call_id_;
   DCHECK_EQ(callbacks_.count(call_id_), 0UL);
   callbacks_.insert({call_id_, std::move(callback)});
+
+  web::WebThread::PostDelayedTask(
+      web::WebThread::UI, FROM_HERE,
+      base::BindRepeating(&ImageFetchTabHelper::OnImageDataTimeout,
+                          weak_ptr_factory_.GetWeakPtr(), call_id_),
+      timeout);
+
   std::string js =
       base::StringPrintf("__gCrWeb.imageFetch.getImageData(%d, '%s')", call_id_,
                          url.spec().c_str());
-  // TODO(crbug.com/163201): Add timeout for callback in case JavaScript does
-  // not return.
+
   web_state_->ExecuteJavaScript(base::UTF8ToUTF16(js));
 }
 
@@ -75,17 +90,14 @@
 //   {'command': 'image.getImageData',
 //    'id': id_sent_to_gCrWeb_image_getImageData}
 bool ImageFetchTabHelper::OnImageDataReceived(
-    const base::DictionaryValue& message,
-    const GURL& page_url,
-    bool has_user_gesture,
-    bool form_in_main_frame) {
+    const base::DictionaryValue& message) {
   const base::Value* id_key = message.FindKey("id");
   if (!id_key || !id_key->is_double()) {
     return false;
   }
   int id_value = static_cast<int>(id_key->GetDouble());
   if (!callbacks_.count(id_value)) {
-    return false;
+    return true;
   }
   ImageDataCallback callback = std::move(callbacks_[id_value]);
   callbacks_.erase(id_value);
@@ -100,3 +112,11 @@
   }
   return true;
 }
+
+void ImageFetchTabHelper::OnImageDataTimeout(int call_id) {
+  if (callbacks_.count(call_id)) {
+    ImageDataCallback callback = std::move(callbacks_[call_id]);
+    callbacks_.erase(call_id);
+    std::move(callback).Run(nullptr);
+  }
+}
diff --git a/ios/chrome/browser/web/image_fetch_tab_helper_unittest.mm b/ios/chrome/browser/web/image_fetch_tab_helper_unittest.mm
index ff148f4..64a92cf 100644
--- a/ios/chrome/browser/web/image_fetch_tab_helper_unittest.mm
+++ b/ios/chrome/browser/web/image_fetch_tab_helper_unittest.mm
@@ -59,6 +59,7 @@
 
   image_fetch_tab_helper()->GetImageData(
       GURL("http://a.com/"),
+      base::TimeDelta::FromSeconds(kWaitForJSCompletionTimeout),
       base::BindOnce(&ImageFetchTabHelperTest::OnImageData,
                      base::Unretained(this)));
 
@@ -82,6 +83,7 @@
 
   image_fetch_tab_helper()->GetImageData(
       GURL("http://a.com/"),
+      base::TimeDelta::FromSeconds(kWaitForJSCompletionTimeout),
       base::BindOnce(&ImageFetchTabHelperTest::OnImageData,
                      base::Unretained(this)));
 
@@ -93,10 +95,34 @@
 }
 
 // Tests that ImageFetchTabHelper::GetImageData returns nullptr in callback when
+// JavaScript does not send a message back.
+TEST_F(ImageFetchTabHelperTest, GetImageDataJsTimeout) {
+  // Replaces __gCrWeb.imageFetch.getImageData with empty function to trigger a
+  // timeout.
+  id script_result = ExecuteJavaScript(
+      @"__gCrWeb.imageFetch = {}; __gCrWeb.imageFetch.getImageData = "
+      @"function(id, url){}; true;");
+  ASSERT_NSEQ(@YES, script_result);
+
+  image_fetch_tab_helper()->GetImageData(
+      GURL("http://a.com/"), base::TimeDelta::FromMilliseconds(100),
+      base::BindOnce(&ImageFetchTabHelperTest::OnImageData,
+                     base::Unretained(this)));
+
+  ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{
+    base::RunLoop().RunUntilIdle();
+    return on_image_data_called_;
+  }));
+
+  EXPECT_FALSE(image_data_);
+}
+
+// Tests that ImageFetchTabHelper::GetImageData returns nullptr in callback when
 // WebState is destroyed.
 TEST_F(ImageFetchTabHelperTest, GetImageDataWebStateDestroy) {
   image_fetch_tab_helper()->GetImageData(
       GURL("http://a.com/"),
+      base::TimeDelta::FromSeconds(kWaitForJSCompletionTimeout),
       base::BindOnce(&ImageFetchTabHelperTest::OnImageData,
                      base::Unretained(this)));
 
@@ -114,6 +140,7 @@
 TEST_F(ImageFetchTabHelperTest, GetImageDataWebStateNavigate) {
   image_fetch_tab_helper()->GetImageData(
       GURL("http://a.com/"),
+      base::TimeDelta::FromSeconds(kWaitForJSCompletionTimeout),
       base::BindOnce(&ImageFetchTabHelperTest::OnImageData,
                      base::Unretained(this)));
 
diff --git a/ios/chrome/test/earl_grey/chrome_test_case.mm b/ios/chrome/test/earl_grey/chrome_test_case.mm
index 42a0d5ca..b4b25ad5 100644
--- a/ios/chrome/test/earl_grey/chrome_test_case.mm
+++ b/ios/chrome/test/earl_grey/chrome_test_case.mm
@@ -57,7 +57,8 @@
   @"testErrorPage",                             // ErrorPageTestCase
   @"testFindInPage",                            // FindInPageTestCase
   @"testDismissFirstRun",                       // FirstRunTestCase
-  @"testLongPDFScroll",                         // FullscreenTestCase
+  // TODO(crbug.com/872788) Failing after move to Xcode 10.
+  // @"testLongPDFScroll",                         // FullscreenTestCase
   @"testDeleteHistory",                         // HistoryUITestCase
   @"testInfobarsDismissOnNavigate",             // InfobarTestCase
   @"testShowJavaScriptAlert",                   // JavaScriptDialogTestCase
diff --git a/ios/web/navigation/wk_based_navigation_manager_impl.h b/ios/web/navigation/wk_based_navigation_manager_impl.h
index dd1969a..debb475 100644
--- a/ios/web/navigation/wk_based_navigation_manager_impl.h
+++ b/ios/web/navigation/wk_based_navigation_manager_impl.h
@@ -238,6 +238,17 @@
 
   WKWebViewCache web_view_cache_;
 
+  // Whether this navigation manager is in the process of restoring session
+  // history into WKWebView. It is set in Restore() and unset in the first
+  // OnNavigationItemCommitted() callback.
+  bool is_restore_session_in_progress_ = false;
+
+  // The active navigation entry in the restored session. GetVisibleItem()
+  // returns this item when |is_restore_session_in_progress_| is true so that
+  // clients of this navigation manager gets sane values for visible title and
+  // URL.
+  std::unique_ptr<NavigationItem> restored_visible_item_;
+
   DISALLOW_COPY_AND_ASSIGN(WKBasedNavigationManagerImpl);
 };
 
diff --git a/ios/web/navigation/wk_based_navigation_manager_impl.mm b/ios/web/navigation/wk_based_navigation_manager_impl.mm
index d91997d..c7a9a6f 100644
--- a/ios/web/navigation/wk_based_navigation_manager_impl.mm
+++ b/ios/web/navigation/wk_based_navigation_manager_impl.mm
@@ -86,6 +86,12 @@
   LoadCommittedDetails details;
   details.item = GetLastCommittedItem();
   DCHECK(details.item);
+
+  if (!wk_navigation_util::IsRestoreSessionUrl(details.item->GetURL())) {
+    is_restore_session_in_progress_ = false;
+    restored_visible_item_.reset();
+  }
+
   details.previous_item_index = GetPreviousItemIndex();
   NavigationItem* previous_item = GetItemAtIndex(details.previous_item_index);
   details.is_in_page =
@@ -279,6 +285,9 @@
 }
 
 NavigationItem* WKBasedNavigationManagerImpl::GetVisibleItem() const {
+  if (is_restore_session_in_progress_)
+    return restored_visible_item_.get();
+
   NavigationItem* transient_item = GetTransientItem();
   if (transient_item) {
     return transient_item;
@@ -319,9 +328,8 @@
 
 int WKBasedNavigationManagerImpl::GetIndexOfItem(
     const NavigationItem* item) const {
-  if (item == empty_window_open_item_.get()) {
+  if (item == empty_window_open_item_.get())
     return 0;
-  }
 
   for (size_t index = 0; index < web_view_cache_.GetBackForwardListItemCount();
        index++) {
@@ -467,6 +475,15 @@
   // This pending item will become the first item in the restored history.
   params.virtual_url = items[0]->GetVirtualURL();
 
+  // Ordering is important. Cache the visible item of the restored session
+  // before starting the new navigation, which may trigger client lookup of
+  // visible item. The visible item of the restored session is the last
+  // committed item, because a restored session has no pending or transient
+  // item.
+  is_restore_session_in_progress_ = true;
+  if (last_committed_item_index > -1)
+    restored_visible_item_ = std::move(items[last_committed_item_index]);
+
   LoadURLWithParams(params);
 }
 
diff --git a/ios/web/navigation/wk_based_navigation_manager_impl_unittest.mm b/ios/web/navigation/wk_based_navigation_manager_impl_unittest.mm
index 4fb634ba..85a69e9 100644
--- a/ios/web/navigation/wk_based_navigation_manager_impl_unittest.mm
+++ b/ios/web/navigation/wk_based_navigation_manager_impl_unittest.mm
@@ -620,6 +620,9 @@
       "{\"offset\":0,\"titles\":[\"Test Website 0\",\"\"],"
       "\"urls\":[\"http://www.0.com/\",\"http://www.1.com/\"]}",
       ExtractRestoredSession(pending_url));
+
+  // Check that cached visible item is returned.
+  EXPECT_EQ("http://www.1.com/", manager_->GetVisibleItem()->GetURL());
 }
 
 // Tests that restoring session replaces existing history in navigation manager.
@@ -661,8 +664,10 @@
   EXPECT_TRUE(manager_->GetPendingItem() != nullptr);
 
   // Restores a fake session.
+  auto restored_item = std::make_unique<NavigationItemImpl>();
+  restored_item->SetURL(GURL("http://restored.com"));
   std::vector<std::unique_ptr<NavigationItem>> items;
-  items.push_back(std::make_unique<NavigationItemImpl>());
+  items.push_back(std::move(restored_item));
   manager_->Restore(0 /* last_committed_item_index */, std::move(items));
 
   // Check that last_committed_index, previous_item_index and pending_item_index
@@ -680,6 +685,9 @@
   GURL pending_url = pending_item->GetURL();
   EXPECT_TRUE(pending_url.SchemeIsFile());
   EXPECT_EQ("restore_session.html", pending_url.ExtractFileName());
+
+  // Check that cached visible item is returned.
+  EXPECT_EQ("http://restored.com/", manager_->GetVisibleItem()->GetURL());
 }
 
 // Tests that Restore() accepts empty session history and performs no-op.
@@ -884,6 +892,7 @@
       "\",\"http://www.1.com/\",\"http://www.2.com/\"]}",
       ExtractRestoredSession(manager_->GetPendingItem()->GetURL()));
   EXPECT_EQ(url0_, manager_->GetPendingItem()->GetVirtualURL());
+  EXPECT_EQ(url1_, manager_->GetVisibleItem()->GetURL());
 }
 
 // Tests that GoToIndex from detached mode restores cached history with updated
@@ -898,6 +907,7 @@
       "\",\"http://www.1.com/\",\"http://www.2.com/\"]}",
       ExtractRestoredSession(manager_->GetPendingItem()->GetURL()));
   EXPECT_EQ(url0_, manager_->GetPendingItem()->GetVirtualURL());
+  EXPECT_EQ(url0_, manager_->GetVisibleItem()->GetURL());
 }
 
 // Tests that LoadIfNecessary from detached mode restores cached history.
@@ -911,6 +921,7 @@
       "\",\"http://www.1.com/\",\"http://www.2.com/\"]}",
       ExtractRestoredSession(manager_->GetPendingItem()->GetURL()));
   EXPECT_EQ(url0_, manager_->GetPendingItem()->GetVirtualURL());
+  EXPECT_EQ(url1_, manager_->GetVisibleItem()->GetURL());
 }
 
 // Tests that LoadURLWithParams from detached mode restores backward history and
@@ -919,13 +930,15 @@
   manager_->DetachFromWebView();
   delegate_.RemoveWebView();
 
-  NavigationManager::WebLoadParams params(GURL("http://www.3.com"));
+  GURL url("http://www.3.com");
+  NavigationManager::WebLoadParams params(url);
   manager_->LoadURLWithParams(params);
   EXPECT_EQ(
       "{\"offset\":0,\"titles\":[\"\",\"\",\"\"],\"urls\":[\"http://www.0.com/"
       "\",\"http://www.1.com/\",\"http://www.3.com/\"]}",
       ExtractRestoredSession(manager_->GetPendingItem()->GetURL()));
   EXPECT_EQ(url0_, manager_->GetPendingItem()->GetVirtualURL());
+  EXPECT_EQ(url, manager_->GetVisibleItem()->GetURL());
 }
 
 }  // namespace web
diff --git a/ios/web/public/web_state/ui/crw_web_view_proxy.h b/ios/web/public/web_state/ui/crw_web_view_proxy.h
index c1dd7cb..1359758 100644
--- a/ios/web/public/web_state/ui/crw_web_view_proxy.h
+++ b/ios/web/public/web_state/ui/crw_web_view_proxy.h
@@ -65,9 +65,6 @@
 // Returns the currently visible keyboard accessory, or nil.
 - (UIView*)keyboardAccessory;
 
-// Returns the currently visible keyboard input assistant item, or nil.
-- (UITextInputAssistantItem*)inputAssistantItem;
-
 // Wrapper around the becomeFirstResponder method of the webview.
 - (BOOL)becomeFirstResponder;
 
diff --git a/ios/web/web_state/ui/crw_web_view_proxy_impl.mm b/ios/web/web_state/ui/crw_web_view_proxy_impl.mm
index 54c24c03..8519e580 100644
--- a/ios/web/web_state/ui/crw_web_view_proxy_impl.mm
+++ b/ios/web/web_state/ui/crw_web_view_proxy_impl.mm
@@ -175,13 +175,6 @@
   return firstResponder.inputAccessoryView;
 }
 
-- (UITextInputAssistantItem*)inputAssistantItem {
-  if (!_contentView)
-    return nil;
-  UIView* firstResponder = GetFirstResponderSubview(_contentView);
-  return firstResponder.inputAssistantItem;
-}
-
 - (BOOL)becomeFirstResponder {
   return [_contentView becomeFirstResponder];
 }
diff --git a/ios/web/web_state/web_state_impl.h b/ios/web/web_state/web_state_impl.h
index 42fb10b..34311800 100644
--- a/ios/web/web_state/web_state_impl.h
+++ b/ios/web/web_state/web_state_impl.h
@@ -377,9 +377,6 @@
   // The most recently restored session history that has not yet committed in
   // the WKWebView. This is reset in OnNavigationItemCommitted().
   CRWSessionStorage* restored_session_storage_;
-  // The title of the active navigation entry in |restored_session_storage_|.
-  // It is only valid when |restore_session_storage_| is not nil.
-  base::string16 restored_title_;
 
   // Favicons URLs received in OnFaviconUrlUpdated.
   // WebStateObserver:FaviconUrlUpdated must be called for same-document
diff --git a/ios/web/web_state/web_state_impl.mm b/ios/web/web_state/web_state_impl.mm
index 3fa60c5..c7c60a5 100644
--- a/ios/web/web_state/web_state_impl.mm
+++ b/ios/web/web_state/web_state_impl.mm
@@ -323,11 +323,6 @@
   DCHECK(Configured());
   web::NavigationItem* item = navigation_manager_->GetLastCommittedItem();
   if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) {
-    if (!restored_title_.empty()) {
-      DCHECK(!item);
-      return restored_title_;
-    }
-
     // Display title for the visible item makes more sense. Only do this in
     // WKBasedNavigationManager for now to limit impact.
     item = navigation_manager_->GetVisibleItem();
@@ -860,10 +855,8 @@
   // A committed navigation item indicates that NavigationManager has a new
   // valid session history so should invalidate the cached restored session
   // history.
-  if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) {
+  if (web::GetWebClient()->IsSlimNavigationManagerEnabled())
     restored_session_storage_ = nil;
-    restored_title_.clear();
-  }
   for (auto& observer : observers_)
     observer.NavigationItemCommitted(this, load_details);
 }
@@ -888,15 +881,8 @@
   // happen to inactive tabs when a navigation in the current tab triggers the
   // serialization of all tabs and when user clicks on tab switcher without
   // switching to a tab.
-  if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) {
+  if (web::GetWebClient()->IsSlimNavigationManagerEnabled())
     restored_session_storage_ = session_storage;
-    NSInteger index = session_storage.lastCommittedItemIndex;
-    if (index > -1) {
-      CRWNavigationItemStorage* item_storage =
-          session_storage.itemStorages[index];
-      restored_title_ = item_storage.title;
-    }
-  }
   SessionStorageBuilder session_storage_builder;
   session_storage_builder.ExtractSessionState(this, session_storage);
 }
diff --git a/ios/web/web_state/web_state_impl_unittest.mm b/ios/web/web_state/web_state_impl_unittest.mm
index 2c04802..d6acbd7 100644
--- a/ios/web/web_state/web_state_impl_unittest.mm
+++ b/ios/web/web_state/web_state_impl_unittest.mm
@@ -963,11 +963,13 @@
   scoped_feature_list.InitAndEnableFeature(
       web::features::kSlimNavigationManager);
 
+  GURL url("http://test.com");
   CRWSessionStorage* session_storage = [[CRWSessionStorage alloc] init];
   session_storage.lastCommittedItemIndex = 0;
   CRWNavigationItemStorage* item_storage =
       [[CRWNavigationItemStorage alloc] init];
   item_storage.title = base::SysNSStringToUTF16(@"Title");
+  item_storage.virtualURL = url;
   session_storage.itemStorages = @[ item_storage ];
 
   web::WebState::CreateParams params(GetBrowserState());
@@ -978,6 +980,7 @@
   EXPECT_EQ(0, extracted_session_storage.lastCommittedItemIndex);
   EXPECT_EQ(1U, extracted_session_storage.itemStorages.count);
   EXPECT_NSEQ(@"Title", base::SysUTF16ToNSString(web_state.GetTitle()));
+  EXPECT_EQ(url, web_state.GetVisibleURL());
 }
 
 TEST_P(WebStateImplTest, NoUncommittedRestoreSession) {
@@ -989,6 +992,7 @@
   EXPECT_EQ(-1, session_storage.lastCommittedItemIndex);
   EXPECT_NSEQ(@[], session_storage.itemStorages);
   EXPECT_TRUE(web_state_->GetTitle().empty());
+  EXPECT_EQ(GURL::EmptyGURL(), web_state_->GetVisibleURL());
 }
 
 // Tests showing and clearing interstitial when NavigationManager is
diff --git a/media/blink/DEPS b/media/blink/DEPS
index efda6347..178e8b5 100644
--- a/media/blink/DEPS
+++ b/media/blink/DEPS
@@ -16,6 +16,7 @@
   "+services/service_manager/public/cpp",
   "+third_party/blink/public/platform",
   "+third_party/blink/public/web",
+  "+third_party/blink/public/common",
 
   # media/mojo is not part of "media" target and should not use MEDIA_EXPORT.
   "-media/base/media_export.h"
diff --git a/media/blink/webmediaplayer_delegate.h b/media/blink/webmediaplayer_delegate.h
index 208cf1ba..c37d4d9 100644
--- a/media/blink/webmediaplayer_delegate.h
+++ b/media/blink/webmediaplayer_delegate.h
@@ -129,6 +129,12 @@
   virtual void DidPictureInPictureModeEnd(int delegate_id,
                                           base::OnceClosure) = 0;
 
+  // Notify that custom controls have been sent to be assigned to the
+  // Picture-in-Picture window.
+  virtual void DidSetPictureInPictureCustomControls(
+      int delegate_id,
+      const std::vector<blink::PictureInPictureControlInfo>&) = 0;
+
   // Notify that the media player in Picture-in-Picture had a change of surface.
   virtual void DidPictureInPictureSurfaceChange(int delegate_id,
                                                 const viz::SurfaceId&,
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index 4222789..88b073c 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -54,6 +54,7 @@
 #include "media/filters/chunk_demuxer.h"
 #include "media/filters/ffmpeg_demuxer.h"
 #include "media/media_buildflags.h"
+#include "third_party/blink/public/common/picture_in_picture/picture_in_picture_control_info.h"
 #include "third_party/blink/public/platform/web_encrypted_media_types.h"
 #include "third_party/blink/public/platform/web_localized_string.h"
 #include "third_party/blink/public/platform/web_media_player_client.h"
@@ -811,6 +812,11 @@
   OnPictureInPictureModeEnded();
 }
 
+void WebMediaPlayerImpl::SetPictureInPictureCustomControls(
+    const std::vector<blink::PictureInPictureControlInfo>& controls) {
+  delegate_->DidSetPictureInPictureCustomControls(delegate_id_, controls);
+}
+
 void WebMediaPlayerImpl::RegisterPictureInPictureWindowResizeCallback(
     blink::WebMediaPlayer::PipWindowResizedCallback callback) {
   DCHECK(IsInPictureInPicture() && !client_->IsInAutoPIP());
diff --git a/media/blink/webmediaplayer_impl.h b/media/blink/webmediaplayer_impl.h
index a0112b5..12694a6 100644
--- a/media/blink/webmediaplayer_impl.h
+++ b/media/blink/webmediaplayer_impl.h
@@ -138,6 +138,8 @@
       blink::WebMediaPlayer::PipWindowOpenedCallback callback) override;
   void ExitPictureInPicture(
       blink::WebMediaPlayer::PipWindowClosedCallback callback) override;
+  void SetPictureInPictureCustomControls(
+      const std::vector<blink::PictureInPictureControlInfo>&) override;
   void RegisterPictureInPictureWindowResizeCallback(
       blink::WebMediaPlayer::PipWindowResizedCallback callback) override;
   void SetSinkId(const blink::WebString& sink_id,
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc
index 08ee5b3..d393f6fb 100644
--- a/media/blink/webmediaplayer_impl_unittest.cc
+++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -45,6 +45,7 @@
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/picture_in_picture/picture_in_picture_control_info.h"
 #include "third_party/blink/public/platform/web_fullscreen_video_status.h"
 #include "third_party/blink/public/platform/web_media_player.h"
 #include "third_party/blink/public/platform/web_media_player_client.h"
@@ -229,6 +230,9 @@
                     blink::WebMediaPlayer::PipWindowOpenedCallback));
   MOCK_METHOD2(DidPictureInPictureModeEnd,
                void(int, blink::WebMediaPlayer::PipWindowClosedCallback));
+  MOCK_METHOD2(DidSetPictureInPictureCustomControls,
+               void(int,
+                    const std::vector<blink::PictureInPictureControlInfo>&));
   MOCK_METHOD3(DidPictureInPictureSurfaceChange,
                void(int, const viz::SurfaceId&, const gfx::Size&));
   MOCK_METHOD2(RegisterPictureInPictureWindowResizeCallback,
diff --git a/media/mojo/clients/mojo_video_decoder.cc b/media/mojo/clients/mojo_video_decoder.cc
index 6555c3f..d01ecb4 100644
--- a/media/mojo/clients/mojo_video_decoder.cc
+++ b/media/mojo/clients/mojo_video_decoder.cc
@@ -373,11 +373,22 @@
 
   has_connection_error_ = true;
 
+  // |init_cb_| is likely to reentrantly destruct |this|, so we check for that
+  // using an on-stack WeakPtr.
+  // TODO(sandersd): Update the VideoDecoder API to be explicit about what
+  // reentrancy is allowed, and therefore which callbacks must be posted.
+  base::WeakPtr<MojoVideoDecoder> weak_this = weak_this_;
+
   if (!init_cb_.is_null())
     base::ResetAndReturn(&init_cb_).Run(false);
+  if (!weak_this)
+    return;
 
-  for (const auto& pending_decode : pending_decodes_)
+  for (const auto& pending_decode : pending_decodes_) {
     pending_decode.second.Run(DecodeStatus::DECODE_ERROR);
+    if (!weak_this)
+      return;
+  }
   pending_decodes_.clear();
 
   if (!reset_cb_.is_null())
diff --git a/net/cert/nss_cert_database_chromeos.cc b/net/cert/nss_cert_database_chromeos.cc
index 3bf71878..8f29d9f 100644
--- a/net/cert/nss_cert_database_chromeos.cc
+++ b/net/cert/nss_cert_database_chromeos.cc
@@ -83,9 +83,9 @@
       NSSCertDatabase::ListCertsImpl(crypto::ScopedPK11Slot()));
 
   size_t pre_size = certs.size();
-  base::EraseIf(certs,
-                NSSProfileFilterChromeOS::CertNotAllowedForProfilePredicate(
-                    profile_filter));
+  base::EraseIf(certs, [&profile_filter](ScopedCERTCertificate& cert) {
+    return !profile_filter.IsCertAllowed(cert.get());
+  });
   DVLOG(1) << "filtered " << pre_size - certs.size() << " of " << pre_size
            << " certs";
   return certs;
diff --git a/net/cert/nss_profile_filter_chromeos.cc b/net/cert/nss_profile_filter_chromeos.cc
index 6160256..45bd99c 100644
--- a/net/cert/nss_profile_filter_chromeos.cc
+++ b/net/cert/nss_profile_filter_chromeos.cc
@@ -139,15 +139,6 @@
   return false;
 }
 
-NSSProfileFilterChromeOS::CertNotAllowedForProfilePredicate::
-    CertNotAllowedForProfilePredicate(const NSSProfileFilterChromeOS& filter)
-    : filter_(filter) {}
-
-bool NSSProfileFilterChromeOS::CertNotAllowedForProfilePredicate::operator()(
-    const ScopedCERTCertificate& cert) const {
-  return !filter_.IsCertAllowed(cert.get());
-}
-
 NSSProfileFilterChromeOS::ModuleNotAllowedForProfilePredicate::
     ModuleNotAllowedForProfilePredicate(const NSSProfileFilterChromeOS& filter)
     : filter_(filter) {}
diff --git a/net/cert/nss_profile_filter_chromeos.h b/net/cert/nss_profile_filter_chromeos.h
index 2538099..c67af16 100644
--- a/net/cert/nss_profile_filter_chromeos.h
+++ b/net/cert/nss_profile_filter_chromeos.h
@@ -42,17 +42,7 @@
   bool IsModuleAllowed(PK11SlotInfo* slot) const;
   bool IsCertAllowed(CERTCertificate* cert) const;
 
-  // TODO(mattm): remove these predicates and use labmdas instead.
-  class CertNotAllowedForProfilePredicate {
-   public:
-    explicit CertNotAllowedForProfilePredicate(
-        const NSSProfileFilterChromeOS& filter);
-    bool operator()(const ScopedCERTCertificate& cert) const;
-
-   private:
-    const NSSProfileFilterChromeOS& filter_;
-  };
-
+  // TODO(mattm): remove this predicate and use labmda instead.
   class ModuleNotAllowedForProfilePredicate {
    public:
     explicit ModuleNotAllowedForProfilePredicate(
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index 2de21b21..b492106 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -128,6 +128,7 @@
           quic::kInitialIdleTimeoutSecs),
       quic_migrate_sessions_on_network_change_v2(false),
       quic_migrate_sessions_early_v2(false),
+      quic_go_away_on_path_degrading(false),
       quic_max_time_on_non_default_network(
           base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs)),
       quic_max_migrations_to_non_default_network_on_write_error(
@@ -219,6 +220,7 @@
           params.quic_max_idle_time_before_crypto_handshake_seconds,
           params.quic_migrate_sessions_on_network_change_v2,
           params.quic_migrate_sessions_early_v2,
+          params.quic_go_away_on_path_degrading,
           params.quic_max_time_on_non_default_network,
           params.quic_max_migrations_to_non_default_network_on_write_error,
           params.quic_max_migrations_to_non_default_network_on_path_degrading,
@@ -381,6 +383,8 @@
                    params_.quic_migrate_sessions_on_network_change_v2);
   dict->SetBoolean("migrate_sessions_early_v2",
                    params_.quic_migrate_sessions_early_v2);
+  dict->SetBoolean("go_away_on_path_degrading",
+                   params_.quic_go_away_on_path_degrading);
   dict->SetInteger("max_time_on_non_default_network_seconds",
                    params_.quic_max_time_on_non_default_network.InSeconds());
   dict->SetInteger(
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h
index 7d1cd2b4..44f7b67 100644
--- a/net/http/http_network_session.h
+++ b/net/http/http_network_session.h
@@ -178,6 +178,8 @@
     // If true, connection migration v2 may be used to migrate active QUIC
     // sessions to alternative network if current network connectivity is poor.
     bool quic_migrate_sessions_early_v2;
+    // If true, the quic session may mark itself as GOAWAY on path degrading.
+    bool quic_go_away_on_path_degrading;
     // Maximum time the session could be on the non-default network before
     // migrates back to default network. Defaults to
     // kMaxTimeOnNonDefaultNetwork.
diff --git a/net/http/http_proxy_client_socket_wrapper_unittest.cc b/net/http/http_proxy_client_socket_wrapper_unittest.cc
index 914e006..6ca6397 100644
--- a/net/http/http_proxy_client_socket_wrapper_unittest.cc
+++ b/net/http/http_proxy_client_socket_wrapper_unittest.cc
@@ -136,6 +136,7 @@
         quic::kInitialIdleTimeoutSecs,
         /*migrate_sessions_on_network_change_v2=*/false,
         /*migrate_sessions_early_v2=*/false,
+        /*go_away_on_path_degrading*/ false,
         base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
         kMaxMigrationsToNonDefaultNetworkOnWriteError,
         kMaxMigrationsToNonDefaultNetworkOnPathDegrading,
diff --git a/net/log/net_log_event_type_list.h b/net/log/net_log_event_type_list.h
index 3c5cbce3..c76a2d9 100644
--- a/net/log/net_log_event_type_list.h
+++ b/net/log/net_log_event_type_list.h
@@ -1840,6 +1840,9 @@
 //   }
 EVENT_TYPE(QUIC_SESSION_GOAWAY_FRAME_SENT)
 
+// Session detected path degrading and decided to mark itself as goaway.
+EVENT_TYPE(QUIC_SESSION_CLIENT_GOAWAY_ON_PATH_DEGRADING)
+
 // Session received a PING frame.
 EVENT_TYPE(QUIC_SESSION_PING_FRAME_RECEIVED)
 
diff --git a/net/quic/bidirectional_stream_quic_impl_unittest.cc b/net/quic/bidirectional_stream_quic_impl_unittest.cc
index 6fa7f00..2dccbca 100644
--- a/net/quic/bidirectional_stream_quic_impl_unittest.cc
+++ b/net/quic/bidirectional_stream_quic_impl_unittest.cc
@@ -509,6 +509,7 @@
                        PRIVACY_MODE_DISABLED, SocketTag()),
         /*require_confirmation=*/false, /*migrate_session_early_v2=*/false,
         /*migrate_session_on_network_change_v2=*/false,
+        /*go_away_on_path_degrading*/ false,
         /*default_network=*/NetworkChangeNotifier::kInvalidNetworkHandle,
         base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
         kMaxMigrationsToNonDefaultNetworkOnWriteError,
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc
index d0740c6..9e10bf53 100644
--- a/net/quic/quic_chromium_client_session.cc
+++ b/net/quic/quic_chromium_client_session.cc
@@ -685,6 +685,7 @@
     bool require_confirmation,
     bool migrate_session_early_v2,
     bool migrate_sessions_on_network_change_v2,
+    bool go_away_on_path_degrading,
     NetworkChangeNotifier::NetworkHandle default_network,
     base::TimeDelta max_time_on_non_default_network,
     int max_migrations_to_non_default_network_on_write_error,
@@ -709,6 +710,7 @@
       migrate_session_early_v2_(migrate_session_early_v2),
       migrate_session_on_network_change_v2_(
           migrate_sessions_on_network_change_v2),
+      go_away_on_path_degrading_(go_away_on_path_degrading),
       max_time_on_non_default_network_(max_time_on_non_default_network),
       max_migrations_to_non_default_network_on_write_error_(
           max_migrations_to_non_default_network_on_write_error),
@@ -754,6 +756,9 @@
           headers_include_h2_stream_dependency &&
           this->connection()->transport_version() > quic::QUIC_VERSION_42),
       weak_factory_(this) {
+  // Make sure connection migration and goaway on path degrading are not turned
+  // on at the same time.
+  DCHECK(!(migrate_session_early_v2_ && go_away_on_path_degrading_));
   default_network_ = default_network;
   sockets_.push_back(std::move(socket));
   packet_readers_.push_back(std::make_unique<QuicChromiumPacketReader>(
@@ -2053,6 +2058,13 @@
 }
 
 void QuicChromiumClientSession::OnPathDegrading() {
+  if (go_away_on_path_degrading_) {
+    net_log_.AddEvent(
+        NetLogEventType::QUIC_SESSION_CLIENT_GOAWAY_ON_PATH_DEGRADING);
+    NotifyFactoryOfSessionGoingAway();
+    return;
+  }
+
   net_log_.AddEvent(
       NetLogEventType::QUIC_CONNECTION_MIGRATION_ON_PATH_DEGRADING);
   if (most_recent_path_degrading_timestamp_ == base::TimeTicks())
@@ -2715,6 +2727,7 @@
       new QuicChromiumPacketReader(socket.get(), clock_, this,
                                    yield_after_packets_, yield_after_duration_,
                                    net_log_));
+  new_reader->StartReading();
   std::unique_ptr<QuicChromiumPacketWriter> new_writer(
       new QuicChromiumPacketWriter(socket.get(), task_runner_));
 
@@ -2760,7 +2773,6 @@
 
   packet_readers_.push_back(std::move(reader));
   sockets_.push_back(std::move(socket));
-  StartReading();
   // Froce the writer to be blocked to prevent it being used until
   // WriteToNewSocket completes.
   DVLOG(1) << "Force blocking the packet writer";
diff --git a/net/quic/quic_chromium_client_session.h b/net/quic/quic_chromium_client_session.h
index 6068944..dfac814 100644
--- a/net/quic/quic_chromium_client_session.h
+++ b/net/quic/quic_chromium_client_session.h
@@ -383,6 +383,7 @@
       bool require_confirmation,
       bool migrate_sesion_early_v2,
       bool migrate_session_on_network_change_v2,
+      bool go_away_on_path_degrading,
       NetworkChangeNotifier::NetworkHandle default_network,
       base::TimeDelta max_time_on_non_default_network,
       int max_migrations_to_non_default_network_on_write_error,
@@ -576,10 +577,10 @@
                           bool close_session_on_error,
                           const NetLogWithSource& migration_net_log);
 
-  // Migrates session onto new socket, i.e., starts reading from
-  // |socket| in addition to any previous sockets, and sets |writer|
-  // to be the new default writer. Returns true if socket was
-  // successfully added to the session and the session was
+  // Migrates session onto new socket, i.e., sets |writer| to be the new
+  // default writer and post a task to write to |socket|. |reader| *must*
+  // has been started reading from the socket. Returns true if
+  // socket was successfully added to the session and the session was
   // successfully migrated to using the new socket. Returns true on
   // successful migration, or false if number of migrations exceeds
   // kMaxReadersPerQuicSession. Takes ownership of |socket|, |reader|,
@@ -728,6 +729,7 @@
   bool require_confirmation_;
   bool migrate_session_early_v2_;
   bool migrate_session_on_network_change_v2_;
+  bool go_away_on_path_degrading_;
   base::TimeDelta max_time_on_non_default_network_;
   // Maximum allowed number of migrations to non-default network triggered by
   // packet write error per default network.
diff --git a/net/quic/quic_chromium_client_session_test.cc b/net/quic/quic_chromium_client_session_test.cc
index eaeacf28..93b2b8b 100644
--- a/net/quic/quic_chromium_client_session_test.cc
+++ b/net/quic/quic_chromium_client_session_test.cc
@@ -155,6 +155,7 @@
         base::WrapUnique(static_cast<QuicServerInfo*>(nullptr)), session_key_,
         /*require_confirmation=*/false, migrate_session_early_v2_,
         /*migrate_session_on_network_change_v2=*/false,
+        /*go_away_on_path_degrading*/ false,
         /*defaulet_network=*/NetworkChangeNotifier::kInvalidNetworkHandle,
         base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
         kMaxMigrationsToNonDefaultNetworkOnWriteError,
@@ -1288,6 +1289,7 @@
                                    quic::QuicTime::Delta::FromMilliseconds(
                                        kQuicYieldAfterDurationMilliseconds),
                                    bound_test_net_log_.bound()));
+  new_reader->StartReading();
   std::unique_ptr<QuicChromiumPacketWriter> new_writer(
       CreateQuicChromiumPacketWriter(new_socket.get(), session_.get()));
 
@@ -1344,6 +1346,7 @@
                                      quic::QuicTime::Delta::FromMilliseconds(
                                          kQuicYieldAfterDurationMilliseconds),
                                      bound_test_net_log_.bound()));
+    new_reader->StartReading();
     std::unique_ptr<QuicChromiumPacketWriter> new_writer(
         CreateQuicChromiumPacketWriter(new_socket.get(), session_.get()));
 
@@ -1359,7 +1362,7 @@
       // Max readers exceeded.
       EXPECT_FALSE(session_->MigrateToSocket(
           std::move(new_socket), std::move(new_reader), std::move(new_writer)));
-      EXPECT_FALSE(socket_data.AllReadDataConsumed());
+      EXPECT_TRUE(socket_data.AllReadDataConsumed());
       EXPECT_FALSE(socket_data.AllWriteDataConsumed());
     }
   }
@@ -1404,6 +1407,7 @@
                                    quic::QuicTime::Delta::FromMilliseconds(
                                        kQuicYieldAfterDurationMilliseconds),
                                    bound_test_net_log_.bound()));
+  new_reader->StartReading();
   std::unique_ptr<QuicChromiumPacketWriter> new_writer(
       CreateQuicChromiumPacketWriter(new_socket.get(), session_.get()));
 
diff --git a/net/quic/quic_http_stream_test.cc b/net/quic/quic_http_stream_test.cc
index fae58c6..d19083d 100644
--- a/net/quic/quic_http_stream_test.cc
+++ b/net/quic/quic_http_stream_test.cc
@@ -319,6 +319,7 @@
                        PRIVACY_MODE_DISABLED, SocketTag()),
         /*require_confirmation=*/false, /*migrate_session_early_v2=*/false,
         /*migrate_session_on_network_change_v2=*/false,
+        /*go_away_on_path_degrading*/ false,
         /*default_network=*/NetworkChangeNotifier::kInvalidNetworkHandle,
         base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
         kMaxMigrationsToNonDefaultNetworkOnWriteError,
diff --git a/net/quic/quic_proxy_client_socket_unittest.cc b/net/quic/quic_proxy_client_socket_unittest.cc
index 805784e1c..81e38feb 100644
--- a/net/quic/quic_proxy_client_socket_unittest.cc
+++ b/net/quic/quic_proxy_client_socket_unittest.cc
@@ -210,6 +210,7 @@
                        SocketTag()),
         /*require_confirmation=*/false, /*migrate_session_early_v2=*/false,
         /*migrate_session_on_network_change_v2=*/false,
+        /*go_away_on_path_degrading*/ false,
         /*default_network=*/NetworkChangeNotifier::kInvalidNetworkHandle,
         base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
         kMaxMigrationsToNonDefaultNetworkOnWriteError,
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc
index 7e4d2a65..a65e9457 100644
--- a/net/quic/quic_stream_factory.cc
+++ b/net/quic/quic_stream_factory.cc
@@ -739,6 +739,7 @@
     int max_idle_time_before_crypto_handshake_seconds,
     bool migrate_sessions_on_network_change_v2,
     bool migrate_sessions_early_v2,
+    bool go_away_on_path_degrading,
     base::TimeDelta max_time_on_non_default_network,
     int max_migrations_to_non_default_network_on_write_error,
     int max_migrations_to_non_default_network_on_path_degrading,
@@ -793,6 +794,7 @@
           NetworkChangeNotifier::AreNetworkHandlesSupported()),
       migrate_sessions_early_v2_(migrate_sessions_early_v2 &&
                                  migrate_sessions_on_network_change_v2_),
+      go_away_on_path_degrading_(go_away_on_path_degrading),
       default_network_(NetworkChangeNotifier::kInvalidNetworkHandle),
       max_time_on_non_default_network_(max_time_on_non_default_network),
       max_migrations_to_non_default_network_on_write_error_(
@@ -1555,7 +1557,8 @@
       clock_, transport_security_state_, ssl_config_service_,
       std::move(server_info), key.session_key(), require_confirmation,
       migrate_sessions_early_v2_, migrate_sessions_on_network_change_v2_,
-      default_network_, max_time_on_non_default_network_,
+      go_away_on_path_degrading_, default_network_,
+      max_time_on_non_default_network_,
       max_migrations_to_non_default_network_on_write_error_,
       max_migrations_to_non_default_network_on_path_degrading_,
       yield_after_packets_, yield_after_duration_,
diff --git a/net/quic/quic_stream_factory.h b/net/quic/quic_stream_factory.h
index 6b49617ef..43058068 100644
--- a/net/quic/quic_stream_factory.h
+++ b/net/quic/quic_stream_factory.h
@@ -242,6 +242,7 @@
       int max_idle_time_before_crypto_handshake_seconds,
       bool migrate_sessions_on_network_change_v2,
       bool migrate_sessions_early_v2,
+      bool go_away_on_path_degrading,
       base::TimeDelta max_time_on_non_default_network,
       int max_migrations_to_non_default_network_on_write_error,
       int max_migrations_to_non_default_network_on_path_degrading,
@@ -542,6 +543,10 @@
   // connection experiences poor connectivity.
   const bool migrate_sessions_early_v2_;
 
+  // Set if client should mark the session as GOAWAY when the connection
+  // experiences poor connectivity
+  const bool go_away_on_path_degrading_;
+
   // If |migrate_sessions_early_v2_| is true, tracks the current default
   // network, and is updated OnNetworkMadeDefault.
   // Otherwise, always set to NetworkChangeNotifier::kInvalidNetwork.
diff --git a/net/quic/quic_stream_factory_fuzzer.cc b/net/quic/quic_stream_factory_fuzzer.cc
index dd90fcf..99bb6bb 100644
--- a/net/quic/quic_stream_factory_fuzzer.cc
+++ b/net/quic/quic_stream_factory_fuzzer.cc
@@ -110,6 +110,7 @@
   bool goaway_sessions_on_ip_change = false;
   bool migrate_sessions_early_v2 = false;
   bool migrate_sessions_on_network_change_v2 = false;
+  bool go_away_on_path_degrading = false;
 
   if (!close_sessions_on_ip_change) {
     goaway_sessions_on_ip_change = data_provider.ConsumeBool();
@@ -121,6 +122,9 @@
     }
   }
 
+  if (!migrate_sessions_early_v2)
+    go_away_on_path_degrading = data_provider.ConsumeBool();
+
   std::unique_ptr<QuicStreamFactory> factory =
       std::make_unique<QuicStreamFactory>(
           env->net_log.net_log(), &host_resolver, env->ssl_config_service.get(),
@@ -135,6 +139,7 @@
           kIdleConnectionTimeoutSeconds, quic::kPingTimeoutSecs,
           quic::kMaxTimeForCryptoHandshakeSecs, quic::kInitialIdleTimeoutSecs,
           migrate_sessions_on_network_change_v2, migrate_sessions_early_v2,
+          go_away_on_path_degrading,
           base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
           kMaxMigrationsToNonDefaultNetworkOnWriteError,
           kMaxMigrationsToNonDefaultNetworkOnPathDegrading,
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index 218afb4d..0326a176 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -259,6 +259,7 @@
             quic::kInitialIdleTimeoutSecs),
         migrate_sessions_on_network_change_v2_(false),
         migrate_sessions_early_v2_(false),
+        go_away_on_path_degrading_(false),
         allow_server_migration_(false),
         race_cert_verification_(false),
         estimate_initial_rtt_(false) {
@@ -282,6 +283,7 @@
         max_time_before_crypto_handshake_seconds_,
         max_idle_time_before_crypto_handshake_seconds_,
         migrate_sessions_on_network_change_v2_, migrate_sessions_early_v2_,
+        go_away_on_path_degrading_,
         base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs),
         kMaxMigrationsToNonDefaultNetworkOnWriteError,
         kMaxMigrationsToNonDefaultNetworkOnPathDegrading,
@@ -853,6 +855,7 @@
   int max_idle_time_before_crypto_handshake_seconds_;
   bool migrate_sessions_on_network_change_v2_;
   bool migrate_sessions_early_v2_;
+  bool go_away_on_path_degrading_;
   bool allow_server_migration_;
   bool race_cert_verification_;
   bool estimate_initial_rtt_;
@@ -3158,6 +3161,170 @@
   EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
 }
 
+// Regression test for http://crbug.com/872011.
+// This test verifies that migrate to the probing socket will not trigger
+// new packets being read synchronously and generate ACK frame while
+// processing the initial connectivity probe response, which may cause a
+// connection being closed with INTERNAL_ERROR as pending ACK frame is not
+// allowed when processing a new packet.
+TEST_P(QuicStreamFactoryTest, MigrateToProbingSocket) {
+  InitializeConnectionMigrationV2Test(
+      {kDefaultNetworkForTests, kNewNetworkForTests});
+  ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+  crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+  crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+
+  // Using a testing task runner so that we can control time.
+  auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
+  QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
+
+  scoped_mock_network_change_notifier_->mock_network_change_notifier()
+      ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
+
+  int packet_number = 1;
+  MockQuicData quic_data1;
+  quic::QuicStreamOffset header_stream_offset = 0;
+  quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);  // Hanging Read.
+  quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
+                                       packet_number++, &header_stream_offset));
+  quic_data1.AddWrite(
+      SYNCHRONOUS, ConstructGetRequestPacket(
+                       packet_number++, GetNthClientInitiatedStreamId(0), true,
+                       true, &header_stream_offset));
+  quic_data1.AddSocketDataToFactory(socket_factory_.get());
+
+  // Set up the second socket data provider that is used for probing on the
+  // alternate network.
+  MockQuicData quic_data2;
+  // Connectivity probe to be sent on the new path.
+  quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
+                                       packet_number++, true));
+  quic_data2.AddRead(ASYNC, ERR_IO_PENDING);  // Pause
+  // First connectivity probe to receive from the server, which will complete
+  // connection migraiton on path degrading.
+  quic_data2.AddRead(ASYNC,
+                     server_maker_.MakeConnectivityProbingPacket(1, false));
+  // Read multiple connectivity probes synchronously.
+  quic_data2.AddRead(SYNCHRONOUS,
+                     server_maker_.MakeConnectivityProbingPacket(2, false));
+  quic_data2.AddRead(SYNCHRONOUS,
+                     server_maker_.MakeConnectivityProbingPacket(3, false));
+  quic_data2.AddRead(SYNCHRONOUS,
+                     server_maker_.MakeConnectivityProbingPacket(4, false));
+  quic_data2.AddWrite(
+      ASYNC, client_maker_.MakeAckPacket(packet_number++, 1, 4, 1, 1, true));
+  quic_data2.AddRead(
+      ASYNC, ConstructOkResponsePacket(5, GetNthClientInitiatedStreamId(0),
+                                       false, false));
+  quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
+  quic_data2.AddWrite(
+      SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
+                       packet_number++, false, GetNthClientInitiatedStreamId(0),
+                       quic::QUIC_STREAM_CANCELLED, 5, 1, 1, true));
+  quic_data2.AddSocketDataToFactory(socket_factory_.get());
+
+  // Create request and QuicHttpStream.
+  QuicStreamRequest request(factory_.get());
+  EXPECT_EQ(ERR_IO_PENDING,
+            request.Request(host_port_pair_, version_, privacy_mode_,
+                            DEFAULT_PRIORITY, SocketTag(),
+                            /*cert_verify_flags=*/0, url_, net_log_,
+                            &net_error_details_, callback_.callback()));
+  EXPECT_THAT(callback_.WaitForResult(), IsOk());
+  std::unique_ptr<HttpStream> stream = CreateStream(&request);
+  EXPECT_TRUE(stream.get());
+
+  // Cause QUIC stream to be created.
+  HttpRequestInfo request_info;
+  request_info.method = "GET";
+  request_info.url = url_;
+  request_info.traffic_annotation =
+      MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+  EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
+                                         net_log_, CompletionOnceCallback()));
+
+  // Ensure that session is alive and active.
+  QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
+  EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+  EXPECT_TRUE(HasActiveSession(host_port_pair_));
+
+  // Send GET request on stream.
+  HttpResponseInfo response;
+  HttpRequestHeaders request_headers;
+  EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
+                                    callback_.callback()));
+
+  // Cause the connection to report path degrading to the session.
+  // Session will start to probe the alternate network.
+  session->connection()->OnPathDegradingTimeout();
+
+  // Next connectivity probe is scheduled to be sent in 2 *
+  // kDefaultRTTMilliSecs.
+  EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
+  base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
+  EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
+            next_task_delay);
+
+  // The connection should still be alive, and not marked as going away.
+  EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+  EXPECT_TRUE(HasActiveSession(host_port_pair_));
+  EXPECT_EQ(1u, session->GetNumActiveStreams());
+  EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
+
+  // Resume quic data and a connectivity probe response will be read on the new
+  // socket.
+  quic_data2.Resume();
+
+  EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+  EXPECT_TRUE(HasActiveSession(host_port_pair_));
+  EXPECT_EQ(1u, session->GetNumActiveStreams());
+
+  // There should be three pending tasks, the nearest one will complete
+  // migration to the new network.
+  EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
+  next_task_delay = task_runner->NextPendingTaskDelay();
+  EXPECT_EQ(base::TimeDelta(), next_task_delay);
+  task_runner->FastForwardBy(next_task_delay);
+
+  // Response headers are received over the new network.
+  EXPECT_THAT(callback_.WaitForResult(), IsOk());
+  EXPECT_EQ(200, response.headers->response_code());
+
+  // Now there are two pending tasks, the nearest one was to send connectivity
+  // probe and has been cancelled due to successful migration.
+  EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
+  next_task_delay = task_runner->NextPendingTaskDelay();
+  EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
+            next_task_delay);
+  task_runner->FastForwardBy(next_task_delay);
+
+  // There's one more task to mgirate back to the default network in 0.4s.
+  EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
+  next_task_delay = task_runner->NextPendingTaskDelay();
+  base::TimeDelta expected_delay =
+      base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
+      base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
+  EXPECT_EQ(expected_delay, next_task_delay);
+
+  // Deliver a signal that the alternate network now becomes default to session,
+  // this will cancel mgirate back to default network timer.
+  scoped_mock_network_change_notifier_->mock_network_change_notifier()
+      ->NotifyNetworkMadeDefault(kNewNetworkForTests);
+
+  task_runner->FastForwardBy(next_task_delay);
+  EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
+
+  // Verify that the session is still alive.
+  EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+  EXPECT_TRUE(HasActiveSession(host_port_pair_));
+
+  stream.reset();
+  EXPECT_TRUE(quic_data1.AllReadDataConsumed());
+  EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
+  EXPECT_TRUE(quic_data2.AllReadDataConsumed());
+  EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
+}
+
 // This test verifies that the connection migrates to the alternate network
 // early when path degrading is detected with an ASYNCHRONOUS write before
 // migration.
@@ -3331,6 +3498,109 @@
   EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
 }
 
+// This test verifies that the session marks itself GOAWAY on path degrading
+// and it does not receive any new request
+TEST_P(QuicStreamFactoryTest, GoawayOnPathDegrading) {
+  go_away_on_path_degrading_ = true;
+  Initialize();
+  ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+  crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+  crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+
+  MockQuicData quic_data1;
+  quic::QuicStreamOffset header_stream_offset = 0;
+  quic_data1.AddWrite(SYNCHRONOUS,
+                      ConstructInitialSettingsPacket(1, &header_stream_offset));
+  quic_data1.AddWrite(SYNCHRONOUS, ConstructGetRequestPacket(
+                                       2, GetNthClientInitiatedStreamId(0),
+                                       true, true, &header_stream_offset));
+  quic_data1.AddRead(ASYNC, ERR_IO_PENDING);  // Pause
+  quic_data1.AddRead(
+      ASYNC, ConstructOkResponsePacket(1, GetNthClientInitiatedStreamId(0),
+                                       false, true));
+  quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);  // Hanging read.
+  quic_data1.AddSocketDataToFactory(socket_factory_.get());
+
+  MockQuicData quic_data2;
+  quic::QuicStreamOffset header_stream_offset2 = 0;
+  quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);  // Hanging read.
+  quic_data2.AddWrite(
+      SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset2));
+  quic_data2.AddSocketDataToFactory(socket_factory_.get());
+
+  // Creat request and QuicHttpStream.
+  QuicStreamRequest request(factory_.get());
+  EXPECT_EQ(ERR_IO_PENDING,
+            request.Request(host_port_pair_, version_, privacy_mode_,
+                            DEFAULT_PRIORITY, SocketTag(),
+                            /*cerf_verify_flags=*/0, url_, net_log_,
+                            &net_error_details_, callback_.callback()));
+  EXPECT_THAT(callback_.WaitForResult(), IsOk());
+  std::unique_ptr<HttpStream> stream = CreateStream(&request);
+  EXPECT_TRUE(stream.get());
+
+  // Cause QUIC stream to be created.
+  HttpRequestInfo request_info;
+  request_info.method = "GET";
+  request_info.url = url_;
+  request_info.traffic_annotation =
+      MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+  EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
+                                         net_log_, CompletionOnceCallback()));
+
+  // Ensure that session is alive and active.
+  QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
+  EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+  EXPECT_TRUE(HasActiveSession(host_port_pair_));
+
+  // Send GET request on stream.
+  HttpResponseInfo response;
+  HttpRequestHeaders request_headers;
+  EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
+                                    callback_.callback()));
+
+  // Trigger the connection to report path degrading to the session.
+  // Session will mark itself GOAWAY.
+  session->connection()->OnPathDegradingTimeout();
+
+  // The connection should still be alive, but marked as going away.
+  EXPECT_FALSE(HasActiveSession(host_port_pair_));
+  EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+  EXPECT_EQ(1u, session->GetNumActiveStreams());
+
+  // Second request should be sent on a new connection.
+  QuicStreamRequest request2(factory_.get());
+  EXPECT_EQ(ERR_IO_PENDING,
+            request2.Request(host_port_pair_, version_, privacy_mode_,
+                             DEFAULT_PRIORITY, SocketTag(),
+                             /*cert_verify_flags=*/0, url_, net_log_,
+                             &net_error_details_, callback_.callback()));
+  EXPECT_THAT(callback_.WaitForResult(), IsOk());
+  std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
+  EXPECT_TRUE(stream2.get());
+
+  // Resume the data, verify old request can read response on the old session
+  // successfully.
+  quic_data1.Resume();
+  EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
+  EXPECT_EQ(200, response.headers->response_code());
+  EXPECT_EQ(0U, session->GetNumActiveStreams());
+
+  // Check an active session exists for the destination.
+  EXPECT_TRUE(HasActiveSession(host_port_pair_));
+  EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+  QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
+  EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
+  EXPECT_NE(session, session2);
+
+  stream.reset();
+  stream2.reset();
+  EXPECT_TRUE(quic_data1.AllReadDataConsumed());
+  EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
+  EXPECT_TRUE(quic_data2.AllReadDataConsumed());
+  EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
+}
+
 // This test verifies that the connection will not migrate to a bad socket
 // when path degrading is detected.
 TEST_P(QuicStreamFactoryTest, DoNotMigrateToBadSocketOnPathDegrading) {
diff --git a/printing/BUILD.gn b/printing/BUILD.gn
index ae715ad..11549b4 100644
--- a/printing/BUILD.gn
+++ b/printing/BUILD.gn
@@ -269,6 +269,7 @@
     "page_range_unittest.cc",
     "page_setup_unittest.cc",
     "pdf_metafile_cg_mac_unittest.cc",
+    "pdf_metafile_skia_unittest.cc",
     "printing_context_win_unittest.cc",
     "printing_test.h",
     "printing_utils_unittest.cc",
@@ -279,6 +280,7 @@
     ":printing",
     "//base/test:run_all_unittests",
     "//base/test:test_support",
+    "//printing/common",
     "//testing/gtest",
     "//ui/base",
     "//ui/gfx",
diff --git a/printing/pdf_metafile_skia.cc b/printing/pdf_metafile_skia.cc
index 4daaf91..6235d63e 100644
--- a/printing/pdf_metafile_skia.cc
+++ b/printing/pdf_metafile_skia.cc
@@ -369,6 +369,22 @@
   return data_->subframe_content_info_;
 }
 
+void PdfMetafileSkia::AppendPage(const SkSize& page_size,
+                                 sk_sp<cc::PaintRecord> record) {
+  data_->pages_.emplace_back(page_size, std::move(record));
+}
+
+void PdfMetafileSkia::AppendSubframeInfo(uint32_t content_id,
+                                         int proxy_id,
+                                         sk_sp<SkPicture> pic_holder) {
+  data_->subframe_content_info_[content_id] = proxy_id;
+  data_->subframe_pics_[content_id] = pic_holder;
+}
+
+SkStreamAsset* PdfMetafileSkia::GetPdfData() const {
+  return data_->pdf_data_.get();
+}
+
 void PdfMetafileSkia::CustomDataToSkPictureCallback(SkCanvas* canvas,
                                                     uint32_t content_id) {
   // Check whether this is the one we need to handle.
diff --git a/printing/pdf_metafile_skia.h b/printing/pdf_metafile_skia.h
index 602f0f6..9fa92fa 100644
--- a/printing/pdf_metafile_skia.h
+++ b/printing/pdf_metafile_skia.h
@@ -9,6 +9,7 @@
 
 #include <memory>
 
+#include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "build/build_config.h"
 #include "cc/paint/paint_canvas.h"
@@ -96,6 +97,15 @@
   const ContentToProxyIdMap& GetSubframeContentInfo() const;
 
  private:
+  FRIEND_TEST_ALL_PREFIXES(PdfMetafileSkiaTest, TestFrameContent);
+
+  // The following three functions are used for tests only.
+  void AppendPage(const SkSize& page_size, sk_sp<cc::PaintRecord> record);
+  void AppendSubframeInfo(uint32_t content_id,
+                          int proxy_id,
+                          sk_sp<SkPicture> subframe_pic_holder);
+  SkStreamAsset* GetPdfData() const;
+
   // Callback function used during page content drawing to replace a custom
   // data holder with corresponding place holder SkPicture.
   void CustomDataToSkPictureCallback(SkCanvas* canvas, uint32_t content_id);
diff --git a/printing/pdf_metafile_skia_unittest.cc b/printing/pdf_metafile_skia_unittest.cc
new file mode 100644
index 0000000..70a118ed
--- /dev/null
+++ b/printing/pdf_metafile_skia_unittest.cc
@@ -0,0 +1,80 @@
+// 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 "printing/pdf_metafile_skia.h"
+
+#include "cc/paint/paint_record.h"
+#include "printing/common/pdf_metafile_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkPictureRecorder.h"
+
+namespace printing {
+
+TEST(PdfMetafileSkiaTest, TestFrameContent) {
+  constexpr int kPictureSideLen = 100;
+  constexpr int kPageSideLen = 150;
+
+  // Create a placeholder picture.
+  sk_sp<SkPicture> pic_holder = SkPicture::MakePlaceholder(
+      SkRect::MakeXYWH(0, 0, kPictureSideLen, kPictureSideLen));
+
+  // Create the page with nested content which is the placeholder and will be
+  // replaced later.
+  sk_sp<cc::PaintRecord> record = sk_make_sp<cc::PaintRecord>();
+  cc::PaintFlags flags;
+  flags.setColor(SK_ColorWHITE);
+  const SkRect page_rect = SkRect::MakeXYWH(0, 0, kPageSideLen, kPageSideLen);
+  record->push<cc::DrawRectOp>(page_rect, flags);
+  const uint32_t content_id = pic_holder->uniqueID();
+  record->push<cc::CustomDataOp>(content_id);
+  SkSize page_size = SkSize::Make(kPageSideLen, kPageSideLen);
+
+  // Finish creating the entire metafile.
+  PdfMetafileSkia metafile(SkiaDocumentType::MSKP, 1);
+  metafile.AppendPage(page_size, std::move(record));
+  metafile.AppendSubframeInfo(content_id, 2, std::move(pic_holder));
+  metafile.FinishFrameContent();
+  SkStreamAsset* metafile_stream = metafile.GetPdfData();
+  ASSERT_TRUE(metafile_stream);
+
+  // Draw a 100 by 100 red square which will be the actual content of
+  // the placeholder.
+  SkPictureRecorder recorder;
+  SkCanvas* canvas = recorder.beginRecording(kPictureSideLen, kPictureSideLen);
+  SkPaint paint;
+  paint.setStyle(SkPaint::kStrokeAndFill_Style);
+  paint.setColor(SK_ColorRED);
+  paint.setAlpha(SK_AlphaOPAQUE);
+  canvas->drawRect(SkRect::MakeXYWH(0, 0, kPictureSideLen, kPictureSideLen),
+                   paint);
+  sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
+  EXPECT_TRUE(picture);
+
+  // Get the complete picture by replacing the placeholder.
+  DeserializationContext subframes;
+  subframes[content_id] = picture;
+  SkDeserialProcs procs = DeserializationProcs(&subframes);
+  sk_sp<SkPicture> pic = SkPicture::MakeFromStream(metafile_stream, &procs);
+  ASSERT_TRUE(pic);
+
+  // Verify the resultant picture is as expected by comparing the sizes and
+  // detecting the color inside and outside of the square area.
+  EXPECT_TRUE(pic->cullRect() == page_rect);
+  SkBitmap bitmap;
+  bitmap.allocN32Pixels(kPageSideLen, kPageSideLen);
+  SkCanvas bitmap_canvas(bitmap);
+  pic->playback(&bitmap_canvas);
+  // Check top left pixel color of the red square.
+  EXPECT_EQ(bitmap.getColor(0, 0), SK_ColorRED);
+  // Check bottom right pixel of the red square.
+  EXPECT_EQ(bitmap.getColor(kPictureSideLen - 1, kPictureSideLen - 1),
+            SK_ColorRED);
+  // Check inside of the red square.
+  EXPECT_EQ(bitmap.getColor(kPictureSideLen / 2, kPictureSideLen / 2),
+            SK_ColorRED);
+  // Check outside of the red square.
+  EXPECT_EQ(bitmap.getColor(kPictureSideLen, kPictureSideLen), SK_ColorWHITE);
+}
+
+}  // namespace printing
diff --git a/remoting/resources/remoting_strings_es-419.xtb b/remoting/resources/remoting_strings_es-419.xtb
index a661c20e..f23c1984 100644
--- a/remoting/resources/remoting_strings_es-419.xtb
+++ b/remoting/resources/remoting_strings_es-419.xtb
@@ -271,7 +271,7 @@
 <translation id="6998989275928107238">A</translation>
 <translation id="7019153418965365059">Error de host no reconocido: <ph name="HOST_OFFLINE_REASON" /></translation>
 <translation id="701976023053394610">Asistencia remota</translation>
-<translation id="7026930240735156896">Sigue las instrucciones para configurar la computadora para acceder de forma remota.</translation>
+<translation id="7026930240735156896">Sigue las instrucciones para configurar la computadora a fin de acceder de forma remota.</translation>
 <translation id="7038683108611689168">Ayúdanos a mejorar la aplicación Chromoting permitiéndonos recopilar estadísticas de uso e informes sobre fallos.</translation>
 <translation id="7067321367069083429">La pantalla cuenta con función táctil</translation>
 <translation id="7116737094673640201">Bienvenido a Escritorio remoto de Chrome</translation>
diff --git a/remoting/resources/remoting_strings_gu.xtb b/remoting/resources/remoting_strings_gu.xtb
index ab1b6f6b..147a690 100644
--- a/remoting/resources/remoting_strings_gu.xtb
+++ b/remoting/resources/remoting_strings_gu.xtb
@@ -271,7 +271,7 @@
 <translation id="6998989275928107238">પ્રતિ</translation>
 <translation id="7019153418965365059">ન ઓળખાયેલ હોસ્ટ ભૂલ: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">રીમોટ સહાય</translation>
-<translation id="7026930240735156896">રિમોટ ઍક્સેસ માટે તમારા કમ્પ્યુટરને સેટ અપ કરવા માટે સૂચનાઓને અનુસરો</translation>
+<translation id="7026930240735156896">રિમોટ ઍક્સેસ માટે તમારા કમ્પ્યુટરને સેટઅપ કરવા માટે સૂચનાઓને અનુસરો</translation>
 <translation id="7038683108611689168">અમને ઉપયોગનાં આંકડા અને ક્રેશ રિપોર્ટ્સ એકત્રિત કરવાની મંજૂરી આપીને Chromoting માં સુધારો કરવામાં અમને સહાય કરો.</translation>
 <translation id="7067321367069083429">સ્ક્રીન એ ટચ સ્ક્રીનના જેવું કાર્ય કરે છે</translation>
 <translation id="7116737094673640201">Chrome રિમોટ ડેસ્કટૉપમાં સ્વાગત છે</translation>
diff --git a/remoting/resources/remoting_strings_id.xtb b/remoting/resources/remoting_strings_id.xtb
index 4d83787..5753b4f 100644
--- a/remoting/resources/remoting_strings_id.xtb
+++ b/remoting/resources/remoting_strings_id.xtb
@@ -136,7 +136,7 @@
 <translation id="405887016757208221">Komputer jarak jauh gagal melakukan inisialisasi sesi. Jika masalah tetap ada, coba konfigurasi ulang host.</translation>
 <translation id="4068946408131579958">Semua sambungan</translation>
 <translation id="409800995205263688">CATATAN: Setelan kebijakan hanya mengizinkan sambungan antar-komputer dalam jaringan Anda.</translation>
-<translation id="4126409073460786861">Setelah penyiapan selesai, refresh halaman ini, maka Anda dapat mengakses komputer dengan memilih perangkat dan memasukkan PIN</translation>
+<translation id="4126409073460786861">Setelah penyiapan selesai, muat ulang halaman ini, maka Anda dapat mengakses komputer dengan memilih perangkat dan memasukkan PIN</translation>
 <translation id="4145029455188493639">Login sebagai <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Beberapa komponen yang diperlukan tidak ada. Pastikan Anda memasang software versi terbaru dan coba lagi.</translation>
 <translation id="4156740505453712750">Untuk melindungi akses ke komputer ini, gunakan PIN <ph name="BOLD_START" />setidaknya enam digit<ph name="BOLD_END" />. PIN ini akan diperlukan saat menyambung dari lokasi lainnya.</translation>
diff --git a/remoting/resources/remoting_strings_kn.xtb b/remoting/resources/remoting_strings_kn.xtb
index c8d54bf..dc08889 100644
--- a/remoting/resources/remoting_strings_kn.xtb
+++ b/remoting/resources/remoting_strings_kn.xtb
@@ -271,7 +271,7 @@
 <translation id="6998989275928107238">ಇವರಿಗೆ</translation>
 <translation id="7019153418965365059">ಗುರುತಿಸಲಾಗದ ಹೋಸ್ಟ್ ದೋಷ: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">ರಿಮೋಟ್ ಸಹಾಯಕ</translation>
-<translation id="7026930240735156896">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ಗೆ ಸೂರದ ಸ್ಥಳದಿಂದ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವಂತೆ ಹೊಂದಿಸುವುದಕ್ಕಾಗಿ ಸೂಚನೆಗಳನ್ನು ಅನುಸರಿಸಿ</translation>
+<translation id="7026930240735156896">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ಗೆ ದೂರದ ಸ್ಥಳದಿಂದ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವಂತೆ ಹೊಂದಿಸುವುದಕ್ಕಾಗಿ ಸೂಚನೆಗಳನ್ನು ಅನುಸರಿಸಿ</translation>
 <translation id="7038683108611689168">ಬಳಕೆಯ ಅಂಕಿಅಂಶಗಳನ್ನು ಹಾಗೂ ಕ್ರ್ಯಾಶ್ ವರದಿಗಳನ್ನು ನಮಗೆ ಸಂಗ್ರಹಿಸಲು ಅನುಮತಿಸುವುದರ ಮೂಲಕ ಕ್ರೊಮೊಟಿಂಗ್‌ ಅನ್ನು ಸುಧಾರಿಸಲು ನಮಗೆ ಸಹಾಯ ಮಾಡಿ.</translation>
 <translation id="7067321367069083429">ಪರದೆಯು ಸ್ಪರ್ಶ ಪರದೆಯಂತೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ</translation>
 <translation id="7116737094673640201">Chrome ರಿಮೋಟ್ ಡೆಸ್ಕ್‌ಟಾಪ್‌ಗೆ ಸ್ವಾಗತ</translation>
diff --git a/remoting/resources/remoting_strings_no.xtb b/remoting/resources/remoting_strings_no.xtb
index 4c26b91..c1087cc 100644
--- a/remoting/resources/remoting_strings_no.xtb
+++ b/remoting/resources/remoting_strings_no.xtb
@@ -136,7 +136,7 @@
 <translation id="405887016757208221">Den eksterne datamaskinen kunne ikke initialisere økten. Hvis problemet vedvarer, kan du prøve å konfigurere verten på nytt.</translation>
 <translation id="4068946408131579958">Alle tilkoblinger</translation>
 <translation id="409800995205263688">MERK: I henhold til lokale retningslinjer er tilkobling tillatt bare mellom datamaskiner i nettverket ditt.</translation>
-<translation id="4126409073460786861">Når konfigureringen er fullført, last inn denne siden på nytt, og du vil kunne bruke datamaskinen ved å velge enhet og skrive inn PIN-koden.</translation>
+<translation id="4126409073460786861">Når konfigureringen er fullført, laster du inn denne siden på nytt, så kan du bruke datamaskinen ved å velge enhet og skrive inn PIN-koden.</translation>
 <translation id="4145029455188493639">Logget på som <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Det mangler noen nødvendige komponenter. Kontrollér at du kjører den nyeste versjonen av programvaren, og prøv på nytt.</translation>
 <translation id="4156740505453712750">For å beskytte tilgangen til denne datamaskinen må du velge en PIN-kode bestående av <ph name="BOLD_START" />minst seks tall<ph name="BOLD_END" />. Denne PIN-koden kreves når man kobler til fra en annen posisjon.</translation>
@@ -271,7 +271,7 @@
 <translation id="6998989275928107238">Til</translation>
 <translation id="7019153418965365059">Ukjent vertsfeil: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Fjernhjelp</translation>
-<translation id="7026930240735156896">Følg instrukjonene for å konfigurere datamaskinen din for ekstern tilgang.</translation>
+<translation id="7026930240735156896">Følg instruksjonene for å konfigurere datamaskinen din for ekstern tilgang.</translation>
 <translation id="7038683108611689168">Hjelp oss med å gjøre Chromoting bedre ved å samle inn bruksstatistikk og programstopprapporter.</translation>
 <translation id="7067321367069083429">Skjermen fungerer som en berøringsskjerm</translation>
 <translation id="7116737094673640201">Velkommen til Chrome Eksternt skrivebord</translation>
diff --git a/remoting/resources/remoting_strings_ta.xtb b/remoting/resources/remoting_strings_ta.xtb
index 5e564862..4d40239 100644
--- a/remoting/resources/remoting_strings_ta.xtb
+++ b/remoting/resources/remoting_strings_ta.xtb
@@ -271,7 +271,8 @@
 <translation id="6998989275928107238">பெறுநர்:</translation>
 <translation id="7019153418965365059">அறியப்படாத ஹோஸ்ட் பிழை: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">தொலைநிலை உதவி</translation>
-<translation id="7026930240735156896">தொலைநிலை அணுகலைப் பெற உங்கள் கம்ப்யூட்டரை அமைப்பதற்கு, வழிமுறைகளைப் பின்பற்றவும்</translation>
+<translation id="7026930240735156896">உங்கள் கம்ப்யூட்டரை தொலைநிலையில் அமைக்க, இந்த
+வழிமுறைகளைப் பின்பற்றவும்</translation>
 <translation id="7038683108611689168">பயன்பாட்டு  புள்ளிவிவரங்களையும் சிதைவு அறிக்கைகளையும் சேகரிக்க எங்களை அனுமதிப்பதன் மூலம் குரோமோட்டிங்கை மேம்படுத்த உதவவும்.</translation>
 <translation id="7067321367069083429">டச் ஸ்கிரீன் போல திரை செயல்படும்</translation>
 <translation id="7116737094673640201">Chrome தொலைநிலை டெஸ்க்டாப்பிற்கு வரவேற்கிறோம்</translation>
diff --git a/remoting/resources/remoting_strings_te.xtb b/remoting/resources/remoting_strings_te.xtb
index 844e350..a8e030b 100644
--- a/remoting/resources/remoting_strings_te.xtb
+++ b/remoting/resources/remoting_strings_te.xtb
@@ -136,7 +136,7 @@
 <translation id="405887016757208221">సెషన్‌ను ప్రారంభించడంలో రిమోట్ కంప్యూటర్ విఫలమైంది. సమస్య కొనసాగితే, దయచేసి హోస్ట్‌ను మళ్లీ కాన్ఫిగర్ చేసి ప్రయత్నించండి.</translation>
 <translation id="4068946408131579958">అన్ని కనెక్షన్‌లు</translation>
 <translation id="409800995205263688">గమనిక: విధాన సెట్టింగ్‌లు మీ నెట్‌వర్క్‌లోని కంప్యూటర్‌ల మధ్య మాత్రమే కనెక్షన్‌లను అనుమతిస్తాయి.</translation>
-<translation id="4126409073460786861">సెటప్ పూర్తయిన తర్వాత, పేజీని రీఫ్రెష్ చేయండి, అప్పుడు మీరు మీ పరికరాన్ని ఎంచుకుని, PINను నమోదు చేయడం ద్వారా మీ కంప్యూటర్‌ను యాక్సెస్ చేయగలుగుతారు</translation>
+<translation id="4126409073460786861">సెటప్ పూర్తయిన తర్వాత, పేజీని రిఫ్రెష్ చేయండి, అప్పుడు మీరు మీ పరికరాన్ని ఎంచుకుని, PINను నమోదు చేయడం ద్వారా మీ కంప్యూటర్‌ను యాక్సెస్ చేయగలుగుతారు</translation>
 <translation id="4145029455188493639"><ph name="EMAIL_ADDRESS" /> వలె సైన్ ఇన్ చేసారు.</translation>
 <translation id="4155497795971509630">కొన్ని ఆవశ్యక అంశాలు లేవు. దయచేసి మీరు తాజా సాఫ్ట్‌వేర్ సంస్కరణను ఇన్‌స్టాల్ చేసారని నిర్ధారించుకొని, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="4156740505453712750">ఈ కంప్యూటర్‌కు ప్రాప్యతను రక్షించడానికి, దయచేసి <ph name="BOLD_START" />కనీసం ఆరు అంకెలు<ph name="BOLD_END" /> కలిగి ఉన్న PINను ఎంచుకోండి. ఈ PIN వేరొక స్థానం నుండి కనెక్ట్ చేస్తున్నప్పుడు అవసరం అవుతుంది.</translation>
diff --git a/services/device/hid/hid_connection.cc b/services/device/hid/hid_connection.cc
index 8872bfb..0589be0 100644
--- a/services/device/hid/hid_connection.cc
+++ b/services/device/hid/hid_connection.cc
@@ -63,6 +63,23 @@
 
 }  // namespace
 
+struct HidConnection::PendingHidReport {
+  PendingHidReport() = default;
+  PendingHidReport(const PendingHidReport& other) = default;
+  ~PendingHidReport() = default;
+
+  scoped_refptr<base::RefCountedBytes> buffer;
+  size_t size;
+};
+
+struct HidConnection::PendingHidRead {
+  PendingHidRead() = default;
+  PendingHidRead(PendingHidRead&& other) = default;
+  ~PendingHidRead() = default;
+
+  HidConnection::ReadCallback callback;
+};
+
 HidConnection::HidConnection(scoped_refptr<HidDeviceInfo> device_info)
     : device_info_(device_info), closed_(false) {
   has_protected_collection_ =
@@ -90,7 +107,10 @@
     return;
   }
 
-  PlatformRead(std::move(callback));
+  PendingHidRead pending_read;
+  pending_read.callback = std::move(callback);
+  pending_reads_.push(std::move(pending_read));
+  ProcessReadQueue();
 }
 
 void HidConnection::Write(scoped_refptr<base::RefCountedBytes> buffer,
@@ -180,16 +200,37 @@
   return has_protected_collection();
 }
 
-PendingHidReport::PendingHidReport() {}
+void HidConnection::ProcessInputReport(
+    scoped_refptr<base::RefCountedBytes> buffer,
+    size_t size) {
+  DCHECK(thread_checker().CalledOnValidThread());
+  DCHECK_GE(size, 1u);
 
-PendingHidReport::PendingHidReport(const PendingHidReport& other) = default;
+  uint8_t report_id = buffer->data()[0];
+  if (IsReportIdProtected(report_id))
+    return;
 
-PendingHidReport::~PendingHidReport() {}
+  PendingHidReport report;
+  report.buffer = buffer;
+  report.size = size;
+  pending_reports_.push(report);
+  ProcessReadQueue();
+}
 
-PendingHidRead::PendingHidRead() {}
+void HidConnection::ProcessReadQueue() {
+  DCHECK(thread_checker().CalledOnValidThread());
 
-PendingHidRead::PendingHidRead(PendingHidRead&& other) = default;
+  // Hold a reference to |this| to prevent a callback from freeing this object
+  // during the loop.
+  scoped_refptr<HidConnection> self(this);
+  while (pending_reads_.size() && pending_reports_.size()) {
+    PendingHidRead read = std::move(pending_reads_.front());
+    PendingHidReport report = std::move(pending_reports_.front());
 
-PendingHidRead::~PendingHidRead() {}
+    pending_reads_.pop();
+    pending_reports_.pop();
+    std::move(read.callback).Run(true, std::move(report.buffer), report.size);
+  }
+}
 
 }  // namespace device
diff --git a/services/device/hid/hid_connection.h b/services/device/hid/hid_connection.h
index b41103c3..110b83e 100644
--- a/services/device/hid/hid_connection.h
+++ b/services/device/hid/hid_connection.h
@@ -9,6 +9,7 @@
 #include <stdint.h>
 
 #include "base/callback_forward.h"
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread_checker.h"
@@ -68,7 +69,6 @@
   virtual ~HidConnection();
 
   virtual void PlatformClose() = 0;
-  virtual void PlatformRead(ReadCallback callback) = 0;
   virtual void PlatformWrite(scoped_refptr<base::RefCountedBytes> buffer,
                              WriteCallback callback) = 0;
   virtual void PlatformGetFeatureReport(uint8_t report_id,
@@ -78,33 +78,25 @@
       WriteCallback callback) = 0;
 
   bool IsReportIdProtected(uint8_t report_id);
+  void ProcessInputReport(scoped_refptr<base::RefCountedBytes> buffer,
+                          size_t size);
+  void ProcessReadQueue();
 
  private:
+  struct PendingHidReport;
+  struct PendingHidRead;
+
   scoped_refptr<HidDeviceInfo> device_info_;
   bool has_protected_collection_;
   base::ThreadChecker thread_checker_;
   bool closed_;
 
+  base::queue<PendingHidReport> pending_reports_;
+  base::queue<PendingHidRead> pending_reads_;
+
   DISALLOW_COPY_AND_ASSIGN(HidConnection);
 };
 
-struct PendingHidReport {
-  PendingHidReport();
-  PendingHidReport(const PendingHidReport& other);
-  ~PendingHidReport();
-
-  scoped_refptr<base::RefCountedBytes> buffer;
-  size_t size;
-};
-
-struct PendingHidRead {
-  PendingHidRead();
-  PendingHidRead(PendingHidRead&& other);
-  ~PendingHidRead();
-
-  HidConnection::ReadCallback callback;
-};
-
 }  // namespace device
 
 #endif  // SERVICES_DEVICE_HID_HID_CONNECTION_H_
diff --git a/services/device/hid/hid_connection_linux.cc b/services/device/hid/hid_connection_linux.cc
index ca36410..876ed9e8 100644
--- a/services/device/hid/hid_connection_linux.cc
+++ b/services/device/hid/hid_connection_linux.cc
@@ -194,18 +194,6 @@
   // and 2) any tasks posted to this task runner that refer to this file will
   // complete before it is closed.
   blocking_task_runner_->DeleteSoon(FROM_HERE, helper_.release());
-
-  while (!pending_reads_.empty()) {
-    std::move(pending_reads_.front().callback).Run(false, NULL, 0);
-    pending_reads_.pop();
-  }
-}
-
-void HidConnectionLinux::PlatformRead(ReadCallback callback) {
-  PendingHidRead pending_read;
-  pending_read.callback = std::move(callback);
-  pending_reads_.push(std::move(pending_read));
-  ProcessReadQueue();
 }
 
 void HidConnectionLinux::PlatformWrite(
@@ -245,37 +233,4 @@
                                 std::move(callback)));
 }
 
-void HidConnectionLinux::ProcessInputReport(
-    scoped_refptr<base::RefCountedBytes> buffer,
-    size_t size) {
-  DCHECK(thread_checker().CalledOnValidThread());
-  DCHECK_GE(size, 1u);
-
-  uint8_t report_id = buffer->data()[0];
-  if (IsReportIdProtected(report_id))
-    return;
-
-  PendingHidReport report;
-  report.buffer = buffer;
-  report.size = size;
-  pending_reports_.push(report);
-  ProcessReadQueue();
-}
-
-void HidConnectionLinux::ProcessReadQueue() {
-  DCHECK(thread_checker().CalledOnValidThread());
-
-  // Hold a reference to |this| to prevent a callback from freeing this object
-  // during the loop.
-  scoped_refptr<HidConnectionLinux> self(this);
-  while (pending_reads_.size() && pending_reports_.size()) {
-    PendingHidRead read = std::move(pending_reads_.front());
-    PendingHidReport report = std::move(pending_reports_.front());
-
-    pending_reads_.pop();
-    pending_reports_.pop();
-    std::move(read.callback).Run(true, std::move(report.buffer), report.size);
-  }
-}
-
 }  // namespace device
diff --git a/services/device/hid/hid_connection_linux.h b/services/device/hid/hid_connection_linux.h
index 8ecf7cd..97ae5c8 100644
--- a/services/device/hid/hid_connection_linux.h
+++ b/services/device/hid/hid_connection_linux.h
@@ -8,7 +8,6 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include "base/containers/queue.h"
 #include "base/files/scoped_file.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
@@ -36,7 +35,6 @@
 
   // HidConnection implementation.
   void PlatformClose() override;
-  void PlatformRead(ReadCallback callback) override;
   void PlatformWrite(scoped_refptr<base::RefCountedBytes> buffer,
                      WriteCallback callback) override;
   void PlatformGetFeatureReport(uint8_t report_id,
@@ -44,10 +42,6 @@
   void PlatformSendFeatureReport(scoped_refptr<base::RefCountedBytes> buffer,
                                  WriteCallback callback) override;
 
-  void ProcessInputReport(scoped_refptr<base::RefCountedBytes> buffer,
-                          size_t size);
-  void ProcessReadQueue();
-
   // |helper_| lives on the sequence to which |blocking_task_runner_| posts
   // tasks so all calls must be posted there including this object's
   // destruction.
@@ -55,9 +49,6 @@
 
   const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
 
-  base::queue<PendingHidReport> pending_reports_;
-  base::queue<PendingHidRead> pending_reads_;
-
   SEQUENCE_CHECKER(sequence_checker_);
 
   base::WeakPtrFactory<HidConnectionLinux> weak_factory_;
diff --git a/services/device/hid/hid_connection_mac.cc b/services/device/hid/hid_connection_mac.cc
index 3fa70d58d..e3ff2ed1 100644
--- a/services/device/hid/hid_connection_mac.cc
+++ b/services/device/hid/hid_connection_mac.cc
@@ -66,19 +66,6 @@
   if (result != kIOReturnSuccess) {
     HID_LOG(EVENT) << "Failed to close HID device: " << HexErrorCode(result);
   }
-
-  while (!pending_reads_.empty()) {
-    std::move(pending_reads_.front().callback).Run(false, NULL, 0);
-    pending_reads_.pop();
-  }
-}
-
-void HidConnectionMac::PlatformRead(ReadCallback callback) {
-  DCHECK(thread_checker().CalledOnValidThread());
-  PendingHidRead pending_read;
-  pending_read.callback = std::move(callback);
-  pending_reads_.push(std::move(pending_read));
-  ProcessReadQueue();
 }
 
 void HidConnectionMac::PlatformWrite(
@@ -132,39 +119,7 @@
     memcpy(buffer->front() + 1, report_bytes, report_length);
   }
 
-  connection->ProcessInputReport(buffer);
-}
-
-void HidConnectionMac::ProcessInputReport(
-    scoped_refptr<base::RefCountedBytes> buffer) {
-  DCHECK(thread_checker().CalledOnValidThread());
-  DCHECK_GE(buffer->size(), 1u);
-
-  uint8_t report_id = buffer->data()[0];
-  if (IsReportIdProtected(report_id))
-    return;
-
-  PendingHidReport report;
-  report.buffer = buffer;
-  report.size = buffer->size();
-  pending_reports_.push(report);
-  ProcessReadQueue();
-}
-
-void HidConnectionMac::ProcessReadQueue() {
-  DCHECK(thread_checker().CalledOnValidThread());
-
-  // Hold a reference to |this| to prevent a callback from freeing this object
-  // during the loop.
-  scoped_refptr<HidConnectionMac> self(this);
-  while (pending_reads_.size() && pending_reports_.size()) {
-    PendingHidRead read = std::move(pending_reads_.front());
-    PendingHidReport report = pending_reports_.front();
-
-    pending_reads_.pop();
-    pending_reports_.pop();
-    std::move(read.callback).Run(true, report.buffer, report.size);
-  }
+  connection->ProcessInputReport(buffer, buffer->size());
 }
 
 void HidConnectionMac::GetFeatureReportAsync(uint8_t report_id,
diff --git a/services/device/hid/hid_connection_mac.h b/services/device/hid/hid_connection_mac.h
index 14b53663..f891e4ee 100644
--- a/services/device/hid/hid_connection_mac.h
+++ b/services/device/hid/hid_connection_mac.h
@@ -31,7 +31,6 @@
 
   // HidConnection implementation.
   void PlatformClose() override;
-  void PlatformRead(ReadCallback callback) override;
   void PlatformWrite(scoped_refptr<base::RefCountedBytes> buffer,
                      WriteCallback callback) override;
   void PlatformGetFeatureReport(uint8_t report_id,
@@ -46,8 +45,6 @@
                                   uint32_t report_id,
                                   uint8_t* report_bytes,
                                   CFIndex report_length);
-  void ProcessInputReport(scoped_refptr<base::RefCountedBytes> buffer);
-  void ProcessReadQueue();
   void GetFeatureReportAsync(uint8_t report_id, ReadCallback callback);
   void SetReportAsync(IOHIDReportType report_type,
                       scoped_refptr<base::RefCountedBytes> buffer,
@@ -59,9 +56,6 @@
   const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
   std::vector<uint8_t> inbound_buffer_;
 
-  base::queue<PendingHidReport> pending_reports_;
-  base::queue<PendingHidRead> pending_reads_;
-
   DISALLOW_COPY_AND_ASSIGN(HidConnectionMac);
 };
 
diff --git a/services/device/hid/hid_connection_win.cc b/services/device/hid/hid_connection_win.cc
index 718d6ab30..c5959c9 100644
--- a/services/device/hid/hid_connection_win.cc
+++ b/services/device/hid/hid_connection_win.cc
@@ -17,8 +17,8 @@
 
 #define INITGUID
 
-#include <windows.h>
 #include <hidclass.h>
+#include <windows.h>
 
 extern "C" {
 #include <hidsdi.h>
@@ -44,7 +44,6 @@
   // Implements base::win::ObjectWatcher::Delegate.
   void OnObjectSignaled(HANDLE object) override;
 
- private:
   // The buffer isn't used by this object but it's important that a reference
   // to it is held until the transfer completes.
   scoped_refptr<base::RefCountedBytes> buffer_;
@@ -53,6 +52,7 @@
   base::win::ScopedHandle event_;
   base::win::ObjectWatcher watcher_;
 
+ private:
   DISALLOW_COPY_AND_ASSIGN(PendingHidTransfer);
 };
 
@@ -86,6 +86,16 @@
   std::move(callback_).Run(this, true);
 }
 
+// static
+scoped_refptr<HidConnection> HidConnectionWin::Create(
+    scoped_refptr<HidDeviceInfo> device_info,
+    base::win::ScopedHandle file) {
+  scoped_refptr<HidConnectionWin> connection(
+      new HidConnectionWin(std::move(device_info), std::move(file)));
+  connection->ReadNextInputReport();
+  return std::move(connection);
+}
+
 HidConnectionWin::HidConnectionWin(scoped_refptr<HidDeviceInfo> device_info,
                                    base::win::ScopedHandle file)
     : HidConnection(std::move(device_info)), file_(std::move(file)) {}
@@ -101,19 +111,6 @@
   transfers_.clear();
 }
 
-void HidConnectionWin::PlatformRead(HidConnection::ReadCallback callback) {
-  // Windows will always include the report ID (including zero if report IDs
-  // are not in use) in the buffer.
-  auto buffer = base::MakeRefCounted<base::RefCountedBytes>(
-      device_info()->max_input_report_size() + 1);
-  transfers_.push_back(std::make_unique<PendingHidTransfer>(
-      buffer, base::BindOnce(&HidConnectionWin::OnReadComplete, this, buffer,
-                             std::move(callback))));
-  transfers_.back()->TakeResultFromWindowsAPI(
-      ReadFile(file_.Get(), buffer->front(), static_cast<DWORD>(buffer->size()),
-               NULL, transfers_.back()->GetOverlapped()));
-}
-
 void HidConnectionWin::PlatformWrite(
     scoped_refptr<base::RefCountedBytes> buffer,
     WriteCallback callback) {
@@ -162,38 +159,52 @@
                       transfers_.back()->GetOverlapped()));
 }
 
-void HidConnectionWin::OnReadComplete(
+void HidConnectionWin::ReadNextInputReport() {
+  // Windows will always include the report ID (including zero if report IDs
+  // are not in use) in the buffer.
+  auto buffer = base::MakeRefCounted<base::RefCountedBytes>(
+      device_info()->max_input_report_size() + 1);
+
+  transfers_.push_back(std::make_unique<PendingHidTransfer>(
+      buffer,
+      base::BindOnce(&HidConnectionWin::OnReadInputReport, this, buffer)));
+  transfers_.back()->TakeResultFromWindowsAPI(
+      ReadFile(file_.Get(), buffer->front(), static_cast<DWORD>(buffer->size()),
+               NULL, transfers_.back()->GetOverlapped()));
+}
+
+void HidConnectionWin::OnReadInputReport(
     scoped_refptr<base::RefCountedBytes> buffer,
-    ReadCallback callback,
     PendingHidTransfer* transfer_raw,
     bool signaled) {
-  if (!file_.IsValid()) {
-    std::move(callback).Run(false, nullptr, 0);
+  if (!file_.IsValid())
     return;
-  }
 
   std::unique_ptr<PendingHidTransfer> transfer = UnlinkTransfer(transfer_raw);
   DWORD bytes_transferred;
   if (!signaled || !GetOverlappedResult(file_.Get(), transfer->GetOverlapped(),
                                         &bytes_transferred, FALSE)) {
     HID_PLOG(EVENT) << "HID read failed";
-    std::move(callback).Run(false, nullptr, 0);
     return;
   }
 
   if (bytes_transferred < 1) {
     HID_LOG(EVENT) << "HID read too short.";
-    std::move(callback).Run(false, nullptr, 0);
     return;
   }
 
   uint8_t report_id = buffer->data()[0];
   if (IsReportIdProtected(report_id)) {
-    PlatformRead(std::move(callback));
+    ReadNextInputReport();
     return;
   }
 
-  std::move(callback).Run(true, buffer, bytes_transferred);
+  // Hold a reference to |this| to prevent a callback executed by
+  // ProcessInputReport from freeing this object.
+  scoped_refptr<HidConnection> self(this);
+  ProcessInputReport(buffer, bytes_transferred);
+
+  ReadNextInputReport();
 }
 
 void HidConnectionWin::OnReadFeatureComplete(
@@ -210,6 +221,7 @@
   DWORD bytes_transferred;
   if (signaled && GetOverlappedResult(file_.Get(), transfer->GetOverlapped(),
                                       &bytes_transferred, FALSE)) {
+    DCHECK_LE(bytes_transferred, buffer->size());
     std::move(callback).Run(true, buffer, bytes_transferred);
   } else {
     HID_PLOG(EVENT) << "HID read failed";
@@ -229,6 +241,7 @@
   DWORD bytes_transferred;
   if (signaled && GetOverlappedResult(file_.Get(), transfer->GetOverlapped(),
                                       &bytes_transferred, FALSE)) {
+    DCHECK_LE(bytes_transferred, transfer->buffer_->size());
     std::move(callback).Run(true);
   } else {
     HID_PLOG(EVENT) << "HID write failed";
diff --git a/services/device/hid/hid_connection_win.h b/services/device/hid/hid_connection_win.h
index fe403890..ecdd7c2 100644
--- a/services/device/hid/hid_connection_win.h
+++ b/services/device/hid/hid_connection_win.h
@@ -21,18 +21,20 @@
 
 class HidConnectionWin : public HidConnection {
  public:
-  HidConnectionWin(scoped_refptr<HidDeviceInfo> device_info,
-                   base::win::ScopedHandle file);
+  static scoped_refptr<HidConnection> Create(
+      scoped_refptr<HidDeviceInfo> device_info,
+      base::win::ScopedHandle file);
 
  private:
   friend class HidServiceWin;
   friend class PendingHidTransfer;
 
+  HidConnectionWin(scoped_refptr<HidDeviceInfo> device_info,
+                   base::win::ScopedHandle file);
   ~HidConnectionWin() override;
 
   // HidConnection implementation.
   void PlatformClose() override;
-  void PlatformRead(ReadCallback callback) override;
   void PlatformWrite(scoped_refptr<base::RefCountedBytes> buffer,
                      WriteCallback callback) override;
   void PlatformGetFeatureReport(uint8_t report_id,
@@ -40,10 +42,10 @@
   void PlatformSendFeatureReport(scoped_refptr<base::RefCountedBytes> buffer,
                                  WriteCallback callback) override;
 
-  void OnReadComplete(scoped_refptr<base::RefCountedBytes> buffer,
-                      ReadCallback callback,
-                      PendingHidTransfer* transfer,
-                      bool signaled);
+  void ReadNextInputReport();
+  void OnReadInputReport(scoped_refptr<base::RefCountedBytes> buffer,
+                         PendingHidTransfer* transfer,
+                         bool signaled);
   void OnReadFeatureComplete(scoped_refptr<base::RefCountedBytes> buffer,
                              ReadCallback callback,
                              PendingHidTransfer* transfer,
diff --git a/services/device/hid/hid_service_win.cc b/services/device/hid/hid_service_win.cc
index f80f6a5..c07087a 100644
--- a/services/device/hid/hid_service_win.cc
+++ b/services/device/hid/hid_service_win.cc
@@ -66,9 +66,8 @@
   }
 
   task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(callback, base::MakeRefCounted<HidConnectionWin>(
-                                   device_info, std::move(file))));
+      FROM_HERE, base::BindOnce(callback, HidConnectionWin::Create(
+                                              device_info, std::move(file))));
 }
 
 base::WeakPtr<HidService> HidServiceWin::GetWeakPtr() {
diff --git a/services/device/hid/mock_hid_connection.cc b/services/device/hid/mock_hid_connection.cc
index faf67f80..40093cec 100644
--- a/services/device/hid/mock_hid_connection.cc
+++ b/services/device/hid/mock_hid_connection.cc
@@ -14,17 +14,8 @@
 
 MockHidConnection::~MockHidConnection() {}
 
-// HidConnection implementation.
 void MockHidConnection::PlatformClose() {}
 
-void MockHidConnection::PlatformRead(ReadCallback callback) {
-  // The first byte is the report id.
-  const uint8_t data[] = "\1TestRead";
-  auto buffer =
-      base::MakeRefCounted<base::RefCountedBytes>(data, sizeof(data) - 1);
-  std::move(callback).Run(true, buffer, buffer->size());
-}
-
 void MockHidConnection::PlatformWrite(
     scoped_refptr<base::RefCountedBytes> buffer,
     WriteCallback callback) {
@@ -45,4 +36,9 @@
   std::move(callback).Run(true);
 }
 
+void MockHidConnection::MockInputReport(
+    scoped_refptr<base::RefCountedBytes> buffer) {
+  ProcessInputReport(buffer, buffer->size());
+}
+
 }  // namespace device
diff --git a/services/device/hid/mock_hid_connection.h b/services/device/hid/mock_hid_connection.h
index bd2cb8e..97bb031 100644
--- a/services/device/hid/mock_hid_connection.h
+++ b/services/device/hid/mock_hid_connection.h
@@ -17,7 +17,6 @@
 
   // HidConnection implementation.
   void PlatformClose() override;
-  void PlatformRead(ReadCallback callback) override;
   void PlatformWrite(scoped_refptr<base::RefCountedBytes> buffer,
                      WriteCallback callback) override;
   void PlatformGetFeatureReport(uint8_t report_id,
@@ -25,6 +24,8 @@
   void PlatformSendFeatureReport(scoped_refptr<base::RefCountedBytes> buffer,
                                  WriteCallback callback) override;
 
+  void MockInputReport(scoped_refptr<base::RefCountedBytes> buffer);
+
  private:
   ~MockHidConnection() override;
 
diff --git a/services/device/hid/mock_hid_service.cc b/services/device/hid/mock_hid_service.cc
index 8fa447a..9ec098e 100644
--- a/services/device/hid/mock_hid_service.cc
+++ b/services/device/hid/mock_hid_service.cc
@@ -4,6 +4,7 @@
 
 #include <map>
 
+#include "base/memory/ref_counted_memory.h"
 #include "services/device/hid/mock_hid_connection.h"
 #include "services/device/hid/mock_hid_service.h"
 
@@ -38,7 +39,16 @@
     return;
   }
 
-  callback.Run(base::MakeRefCounted<MockHidConnection>(map_entry->second));
+  auto connection = base::MakeRefCounted<MockHidConnection>(map_entry->second);
+
+  // Set up a single input report that is ready to be read from the device.
+  // The first byte is the report id.
+  const uint8_t data[] = "\1TestRead";
+  auto buffer =
+      base::MakeRefCounted<base::RefCountedBytes>(data, sizeof(data) - 1);
+  connection->MockInputReport(std::move(buffer));
+
+  callback.Run(connection);
 }
 
 const std::map<std::string, scoped_refptr<HidDeviceInfo>>&
diff --git a/services/network/public/cpp/simple_url_loader.cc b/services/network/public/cpp/simple_url_loader.cc
index e97e14d..9649f27 100644
--- a/services/network/public/cpp/simple_url_loader.cc
+++ b/services/network/public/cpp/simple_url_loader.cc
@@ -219,6 +219,7 @@
   const ResourceResponseHead* ResponseInfo() const override;
   const GURL& GetFinalURL() const override;
   bool LoadedFromCache() const override;
+  int64_t GetContentSize() const override;
 
   // Called by BodyHandler when the BodyHandler body handler is done. If |error|
   // is not net::OK, some error occurred reading or consuming the body. If it is
@@ -1274,6 +1275,12 @@
   return request_state_->loaded_from_cache;
 }
 
+int64_t SimpleURLLoaderImpl::GetContentSize() const {
+  // Should only be called once the request is compelete.
+  DCHECK(request_state_->finished);
+  return request_state_->received_body_size;
+}
+
 const ResourceResponseHead* SimpleURLLoaderImpl::ResponseInfo() const {
   // Should only be called once the request is compelete.
   DCHECK(request_state_->finished);
@@ -1288,6 +1295,12 @@
 
   // If there's an error, fail request and report it immediately.
   if (error != net::OK) {
+    // When |allow_partial_results_| is true, a valid body|file_path is
+    // passed to the completion callback even in the case of failures.
+    // For consistency, it makes sense to also hold the actual decompressed
+    // body size in case GetContentSize is called.
+    if (allow_partial_results_)
+      request_state_->received_body_size = received_body_size;
     FinishWithResult(error);
     return;
   }
diff --git a/services/network/public/cpp/simple_url_loader.h b/services/network/public/cpp/simple_url_loader.h
index 3655064c..ecd7f611 100644
--- a/services/network/public/cpp/simple_url_loader.h
+++ b/services/network/public/cpp/simple_url_loader.h
@@ -303,6 +303,18 @@
   // completion.
   virtual bool LoadedFromCache() const = 0;
 
+  // Indicates the total of decompressed bytes of the response body.
+  // May only be called once the loader has informed the caller of completion.
+  //
+  // The value might be different than the number of bytes actually
+  // received over the network. This happens, for example, in the case
+  // of gzipped bodies (Content-Encoding: gzip).
+  //
+  // When |SetAllowPartialResults| is set to true and there is an error,
+  // the method returns the total bytes decompressed bytes until the failure
+  // occurred.
+  virtual int64_t GetContentSize() const = 0;
+
  protected:
   SimpleURLLoader();
 
diff --git a/services/network/public/cpp/simple_url_loader_unittest.cc b/services/network/public/cpp/simple_url_loader_unittest.cc
index b008406b8b1..ac48ccc 100644
--- a/services/network/public/cpp/simple_url_loader_unittest.cc
+++ b/services/network/public/cpp/simple_url_loader_unittest.cc
@@ -75,6 +75,11 @@
 const char kShortUploadBody[] =
     "Though this upload be but little, it is fierce.";
 
+// Standard value used on requests / responses.
+const char kExpectedResponse[] = "Expected Response";
+
+const int64_t kExpectedResponseSize = strlen(kExpectedResponse);
+
 // Returns a string longer than
 // SimpleURLLoader::kMaxUploadStringAsStringLength, to test the path where
 // strings are streamed to the URLLoader.
@@ -667,7 +672,7 @@
   // Use a more interesting request than "/echo", just to verify more than the
   // request URL is hooked up.
   resource_request->url = test_server_.GetURL("/echoheader?foo");
-  resource_request->headers.SetHeader("foo", "Expected Response");
+  resource_request->headers.SetHeader("foo", kExpectedResponse);
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelper(std::move(resource_request));
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
@@ -677,7 +682,9 @@
 
   if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
     ASSERT_TRUE(test_helper->response_body());
-    EXPECT_EQ("Expected Response", *test_helper->response_body());
+    EXPECT_EQ(kExpectedResponse, *test_helper->response_body());
+    EXPECT_EQ(kExpectedResponseSize,
+              test_helper->simple_url_loader()->GetContentSize());
   }
 }
 
@@ -694,14 +701,17 @@
   if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
     ASSERT_TRUE(test_helper->response_body());
     EXPECT_EQ("foo", *test_helper->response_body());
+    EXPECT_EQ(3, test_helper->simple_url_loader()->GetContentSize());
   }
 }
 
 // Make sure the class works when the size of the encoded and decoded bodies are
 // different.
 TEST_P(SimpleURLLoaderTest, GzipBody) {
+  std::string content(100, 'a');
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
-      CreateHelperForURL(test_server_.GetURL("/gzip-body?foo"));
+      CreateHelperForURL(test_server_.GetURL(
+          base::StringPrintf("/gzip-body?%s", content.c_str())));
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
@@ -709,7 +719,9 @@
 
   if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
     ASSERT_TRUE(test_helper->response_body());
-    EXPECT_EQ("foo", *test_helper->response_body());
+    EXPECT_EQ(content, *test_helper->response_body());
+    EXPECT_EQ(static_cast<int64_t>(content.size()),
+              test_helper->simple_url_loader()->GetContentSize());
   }
 }
 
@@ -883,7 +895,7 @@
   std::unique_ptr<network::ResourceRequest> resource_request =
       std::make_unique<network::ResourceRequest>();
   resource_request->url = test_server_.GetURL("/server-redirect?" + url.spec());
-  resource_request->headers.SetHeader("foo", "Expected Response");
+  resource_request->headers.SetHeader("foo", kExpectedResponse);
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelper(std::move(resource_request));
 
@@ -917,7 +929,7 @@
   std::unique_ptr<network::ResourceRequest> resource_request =
       std::make_unique<network::ResourceRequest>();
   resource_request->url = test_server_.GetURL("/server-redirect?" + url.spec());
-  resource_request->headers.SetHeader("foo", "Expected Response");
+  resource_request->headers.SetHeader("foo", kExpectedResponse);
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelper(std::move(resource_request));
 
@@ -938,7 +950,7 @@
     ASSERT_TRUE(test_helper->response_body());
     // The "foo" header is not removed since the SimpleURLLoader's redirect
     // callback marks "bar" header to be removed.
-    EXPECT_EQ("Expected Response", *test_helper->response_body());
+    EXPECT_EQ(kExpectedResponse, *test_helper->response_body());
   }
 
   // Make sure request really was redirected.
@@ -1009,7 +1021,7 @@
   // Use a more interesting request than "/echo", just to verify more than the
   // request URL is hooked up.
   resource_request->url = test_server_.GetURL("/echoheader?foo");
-  resource_request->headers.SetHeader("foo", "Expected Response");
+  resource_request->headers.SetHeader("foo", kExpectedResponse);
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelper(std::move(resource_request));
   test_helper->set_destroy_loader_on_complete(true);
@@ -1017,7 +1029,7 @@
 
   if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
     ASSERT_TRUE(test_helper->response_body());
-    EXPECT_EQ("Expected Response", *test_helper->response_body());
+    EXPECT_EQ(kExpectedResponse, *test_helper->response_body());
   }
 }
 
@@ -1032,7 +1044,7 @@
   std::unique_ptr<network::ResourceRequest> resource_request =
       std::make_unique<network::ResourceRequest>();
   resource_request->url = test_server_.GetURL("/echoheader?foo");
-  resource_request->headers.SetHeader("foo", "Expected Response");
+  resource_request->headers.SetHeader("foo", kExpectedResponse);
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelper(std::move(resource_request));
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
@@ -1050,6 +1062,7 @@
   EXPECT_EQ(net::ERR_FAILED, test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(400, test_helper->GetResponseCode());
   EXPECT_FALSE(test_helper->response_body());
+  EXPECT_EQ(0, test_helper->simple_url_loader()->GetContentSize());
 }
 
 // Check that the body is returned with an HTTP error response, when
@@ -1066,6 +1079,7 @@
   if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
     ASSERT_TRUE(test_helper->response_body());
     EXPECT_EQ("Echo", *test_helper->response_body());
+    EXPECT_EQ(4, test_helper->simple_url_loader()->GetContentSize());
   }
 }
 
@@ -1081,6 +1095,7 @@
     ASSERT_TRUE(test_helper->response_body());
     // A response body is sent from the NetworkService, but it's empty.
     EXPECT_EQ("", *test_helper->response_body());
+    EXPECT_EQ(0, test_helper->simple_url_loader()->GetContentSize());
   }
 }
 
@@ -1102,6 +1117,8 @@
     ASSERT_TRUE(test_helper->response_body());
     EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
     EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+    EXPECT_EQ(kResponseSize,
+              test_helper->simple_url_loader()->GetContentSize());
   }
 }
 
@@ -1124,6 +1141,8 @@
     ASSERT_TRUE(test_helper->response_body());
     EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
     EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+    EXPECT_EQ(kResponseSize,
+              test_helper->simple_url_loader()->GetContentSize());
   }
 }
 
@@ -1147,6 +1166,8 @@
     ASSERT_TRUE(test_helper->response_body());
     EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
     EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+    EXPECT_EQ(kResponseSize,
+              test_helper->simple_url_loader()->GetContentSize());
   }
 }
 
@@ -1167,6 +1188,7 @@
   } else {
     EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES,
               test_helper->simple_url_loader()->NetError());
+    EXPECT_EQ(0, test_helper->simple_url_loader()->GetContentSize());
   }
   EXPECT_FALSE(test_helper->response_body());
 }
@@ -1196,6 +1218,8 @@
     EXPECT_EQ(std::string(kMaxResponseSize, 'a'),
               *test_helper->response_body());
     EXPECT_EQ(kMaxResponseSize, test_helper->response_body()->length());
+    EXPECT_EQ(kMaxResponseSize,
+              test_helper->simple_url_loader()->GetContentSize());
   }
 }
 
@@ -1219,6 +1243,8 @@
     ASSERT_TRUE(test_helper->response_body());
     EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
     EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+    EXPECT_EQ(kResponseSize,
+              test_helper->simple_url_loader()->GetContentSize());
   }
 }
 
@@ -1241,6 +1267,8 @@
     ASSERT_TRUE(test_helper->response_body());
     EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
     EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+    EXPECT_EQ(kResponseSize,
+              test_helper->simple_url_loader()->GetContentSize());
   }
 }
 
@@ -1261,6 +1289,7 @@
   } else {
     EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES,
               test_helper->simple_url_loader()->NetError());
+    EXPECT_EQ(0, test_helper->simple_url_loader()->GetContentSize());
   }
   EXPECT_FALSE(test_helper->response_body());
 }
@@ -1289,6 +1318,8 @@
     EXPECT_EQ(std::string(kMaxResponseSize, 'a'),
               *test_helper->response_body());
     EXPECT_EQ(kMaxResponseSize, test_helper->response_body()->length());
+    EXPECT_EQ(kMaxResponseSize,
+              test_helper->simple_url_loader()->GetContentSize());
   }
 }
 
@@ -1301,6 +1332,7 @@
             test_helper->simple_url_loader()->NetError());
   EXPECT_FALSE(test_helper->simple_url_loader()->ResponseInfo());
   EXPECT_FALSE(test_helper->response_body());
+  EXPECT_EQ(0, test_helper->simple_url_loader()->GetContentSize());
 }
 
 TEST_P(SimpleURLLoaderTest, NetErrorBeforeHeadersWithPartialResults) {
@@ -1316,6 +1348,7 @@
   EXPECT_EQ(net::ERR_EMPTY_RESPONSE,
             test_helper->simple_url_loader()->NetError());
   EXPECT_FALSE(test_helper->simple_url_loader()->ResponseInfo());
+  EXPECT_EQ(0, test_helper->simple_url_loader()->GetContentSize());
 }
 
 TEST_P(SimpleURLLoaderTest, NetErrorAfterHeaders) {
@@ -1327,6 +1360,7 @@
             test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(200, test_helper->GetResponseCode());
   EXPECT_FALSE(test_helper->response_body());
+  EXPECT_EQ(0, test_helper->simple_url_loader()->GetContentSize());
 }
 
 TEST_P(SimpleURLLoaderTest, NetErrorAfterHeadersWithPartialResults) {
@@ -1343,6 +1377,7 @@
   if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
     ASSERT_TRUE(test_helper->response_body());
     EXPECT_EQ("", *test_helper->response_body());
+    EXPECT_EQ(0, test_helper->simple_url_loader()->GetContentSize());
   }
 }
 
@@ -1355,6 +1390,8 @@
             test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(200, test_helper->GetResponseCode());
   EXPECT_FALSE(test_helper->response_body());
+  EXPECT_EQ(static_cast<int64_t>(strlen(kTruncatedBody)),
+            test_helper->simple_url_loader()->GetContentSize());
 }
 
 TEST_P(SimpleURLLoaderTest, TruncatedBodyWithPartialResults) {
@@ -1369,7 +1406,8 @@
 
   if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
     ASSERT_TRUE(test_helper->response_body());
-    EXPECT_EQ(kTruncatedBody, *test_helper->response_body());
+    EXPECT_EQ(static_cast<int64_t>(strlen(kTruncatedBody)),
+              test_helper->simple_url_loader()->GetContentSize());
   }
 }
 
@@ -1560,6 +1598,8 @@
   if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
     ASSERT_TRUE(test_helper->response_body());
     EXPECT_EQ(GetTestFileContents(), *test_helper->response_body());
+    EXPECT_EQ(static_cast<int64_t>(GetTestFileContents().size()),
+              test_helper->simple_url_loader()->GetContentSize());
   }
 
   if (GetParam() == SimpleLoaderTestHelper::DownloadType::AS_STREAM)
@@ -1581,6 +1621,7 @@
             test_helper->simple_url_loader()->NetError());
   EXPECT_FALSE(test_helper->simple_url_loader()->ResponseInfo());
   EXPECT_FALSE(test_helper->response_body());
+  EXPECT_EQ(0, test_helper->simple_url_loader()->GetContentSize());
 }
 
 // Test case where uploading a file is canceled before the URLLoader is started
diff --git a/services/network/public/mojom/url_loader_factory.mojom b/services/network/public/mojom/url_loader_factory.mojom
index 2cd1457..432de1c 100644
--- a/services/network/public/mojom/url_loader_factory.mojom
+++ b/services/network/public/mojom/url_loader_factory.mojom
@@ -24,7 +24,7 @@
 const uint32 kURLLoadOptionPauseOnResponseStarted = 16;
 
 interface URLLoaderFactory {
-  // Creats a URLLoader and starts loading with the given |request|. |client|'s
+  // Creates a URLLoader and starts loading with the given |request|. |client|'s
   // method will be called when certain events related to that loading
   // (e.g., response arrival) happen.
   // |routing_id| is the routing_id for subframe requests, and is the
diff --git a/services/ui/gpu_host/gpu_host.cc b/services/ui/gpu_host/gpu_host.cc
index 5aee061..f546d93 100644
--- a/services/ui/gpu_host/gpu_host.cc
+++ b/services/ui/gpu_host/gpu_host.cc
@@ -86,7 +86,10 @@
   gpu_memory_buffer_manager_ =
       std::make_unique<viz::HostGpuMemoryBufferManager>(
           base::BindRepeating(
-              [](viz::mojom::GpuService* gpu_service) { return gpu_service; },
+              [](viz::mojom::GpuService* gpu_service,
+                 base::OnceClosure connection_error_handler) {
+                return gpu_service;
+              },
               gpu_service_.get()),
           next_client_id_++, std::make_unique<gpu::GpuMemoryBufferSupport>(),
           main_thread_task_runner_);
diff --git a/services/ui/public/interfaces/window_manager.mojom b/services/ui/public/interfaces/window_manager.mojom
index 1d82173..d48fdc9 100644
--- a/services/ui/public/interfaces/window_manager.mojom
+++ b/services/ui/public/interfaces/window_manager.mojom
@@ -68,6 +68,9 @@
   // Type: bool.
   const string kAlwaysOnTop_Property = "prop:always_on_top";
 
+  // A boolean determining whether animations are disabled for the window.
+  const string kAnimationsDisabled_Property = "prop:animations-disabled";
+
   // The application icon; typically larger for shelf icons, etc. Type: SkBitmap
   const string kAppIcon_Property = "prop:app-icon";
 
diff --git a/services/ui/test_ws/BUILD.gn b/services/ui/test_ws/BUILD.gn
index 1c1dfec..25eadfe 100644
--- a/services/ui/test_ws/BUILD.gn
+++ b/services/ui/test_ws/BUILD.gn
@@ -18,8 +18,10 @@
 
   deps = [
     "//base",
+    "//components/discardable_memory/service",
     "//services/service_manager/public/cpp",
     "//services/service_manager/public/mojom",
+    "//services/ui/gpu_host",
     "//services/ui/public/cpp",
     "//services/ui/public/interfaces",
     "//services/ui/ws2:lib",
diff --git a/services/ui/test_ws/test_gpu_interface_provider.cc b/services/ui/test_ws/test_gpu_interface_provider.cc
index 209578a..c924c55 100644
--- a/services/ui/test_ws/test_gpu_interface_provider.cc
+++ b/services/ui/test_ws/test_gpu_interface_provider.cc
@@ -5,36 +5,31 @@
 #include "services/ui/test_ws/test_gpu_interface_provider.h"
 
 #include "base/bind.h"
-#include "components/discardable_memory/public/interfaces/discardable_shared_memory_manager.mojom.h"
+#include "base/logging.h"
+#include "components/discardable_memory/service/discardable_shared_memory_manager.h"
+#include "services/service_manager/public/cpp/bind_source_info.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
-#include "services/ui/public/interfaces/gpu.mojom.h"
-
-namespace {
-
-// A placeholder to prevent test crashes on unbound requests.
-void BindGpuRequest(ui::mojom::GpuRequest request) {
-  NOTIMPLEMENTED_LOG_ONCE();
-}
-
-// A placeholder to prevent test crashes on unbound requests.
-void BindDiscardableSharedMemoryManagerRequest(
-    discardable_memory::mojom::DiscardableSharedMemoryManagerRequest request) {
-  NOTIMPLEMENTED_LOG_ONCE();
-}
-
-}  // namespace
+#include "services/ui/gpu_host/gpu_host.h"
 
 namespace ui {
 namespace test {
 
-TestGpuInterfaceProvider::TestGpuInterfaceProvider() = default;
+TestGpuInterfaceProvider::TestGpuInterfaceProvider(
+    ui::gpu_host::GpuHost* gpu_host,
+    discardable_memory::DiscardableSharedMemoryManager*
+        discardable_shared_memory_manager)
+    : gpu_host_(gpu_host),
+      discardable_shared_memory_manager_(discardable_shared_memory_manager) {}
+
 TestGpuInterfaceProvider::~TestGpuInterfaceProvider() = default;
 
 void TestGpuInterfaceProvider::RegisterGpuInterfaces(
     service_manager::BinderRegistry* registry) {
-  registry->AddInterface(
-      base::BindRepeating(&BindDiscardableSharedMemoryManagerRequest));
-  registry->AddInterface(base::BindRepeating(BindGpuRequest));
+  registry->AddInterface(base::BindRepeating(
+      &TestGpuInterfaceProvider::BindDiscardableSharedMemoryManagerRequest,
+      base::Unretained(this)));
+  registry->AddInterface(base::BindRepeating(
+      &TestGpuInterfaceProvider::BindGpuRequest, base::Unretained(this)));
 }
 
 #if defined(USE_OZONE)
@@ -42,5 +37,28 @@
     service_manager::BinderRegistry* registry) {}
 #endif
 
+void TestGpuInterfaceProvider::BindDiscardableSharedMemoryManagerRequest(
+    discardable_memory::mojom::DiscardableSharedMemoryManagerRequest request) {
+  // |discardable_shared_memory_manager_| could be null. See test_ws.cc for
+  // details.
+  if (!discardable_shared_memory_manager_) {
+    NOTIMPLEMENTED_LOG_ONCE();
+    return;
+  }
+
+  discardable_shared_memory_manager_->Bind(std::move(request),
+                                           service_manager::BindSourceInfo());
+}
+
+void TestGpuInterfaceProvider::BindGpuRequest(ui::mojom::GpuRequest request) {
+  // |gpu_host_| could be null. See test_ws.cc for details.
+  if (!gpu_host_) {
+    NOTIMPLEMENTED_LOG_ONCE();
+    return;
+  }
+
+  gpu_host_->Add(std::move(request));
+}
+
 }  // namespace test
 }  // namespace ui
diff --git a/services/ui/test_ws/test_gpu_interface_provider.h b/services/ui/test_ws/test_gpu_interface_provider.h
index 8ed03fab..cfd0727 100644
--- a/services/ui/test_ws/test_gpu_interface_provider.h
+++ b/services/ui/test_ws/test_gpu_interface_provider.h
@@ -5,16 +5,28 @@
 #ifndef SERVICES_UI_TEST_WS_TEST_GPU_INTERFACE_PROVIDER_H_
 #define SERVICES_UI_TEST_WS_TEST_GPU_INTERFACE_PROVIDER_H_
 
+#include "components/discardable_memory/public/interfaces/discardable_shared_memory_manager.mojom.h"
+#include "services/ui/public/interfaces/gpu.mojom.h"
 #include "services/ui/ws2/gpu_interface_provider.h"
 
+namespace discardable_memory {
+class DiscardableSharedMemoryManager;
+}
+
 namespace ui {
+
+namespace gpu_host {
+class GpuHost;
+}
+
 namespace test {
 
-// TestGpuInterfaceProvider binds Gpu and DiscardableSharedMemoryManager
-// requests with no-op stub functions to avoid test crashes.
+// TestGpuInterfaceProvider used by test_ws.
 class TestGpuInterfaceProvider : public ui::ws2::GpuInterfaceProvider {
  public:
-  TestGpuInterfaceProvider();
+  TestGpuInterfaceProvider(ui::gpu_host::GpuHost* gpu_host,
+                           discardable_memory::DiscardableSharedMemoryManager*
+                               discardable_shared_memory_manager);
   ~TestGpuInterfaceProvider() override;
 
   // ui::ws2::GpuInterfaceProvider:
@@ -26,6 +38,14 @@
 #endif
 
  private:
+  void BindDiscardableSharedMemoryManagerRequest(
+      discardable_memory::mojom::DiscardableSharedMemoryManagerRequest request);
+  void BindGpuRequest(ui::mojom::GpuRequest request);
+
+  ui::gpu_host::GpuHost* const gpu_host_;
+  discardable_memory::DiscardableSharedMemoryManager* const
+      discardable_shared_memory_manager_;
+
   DISALLOW_COPY_AND_ASSIGN(TestGpuInterfaceProvider);
 };
 
diff --git a/services/ui/test_ws/test_ws.cc b/services/ui/test_ws/test_ws.cc
index ea8335f..e930a24 100644
--- a/services/ui/test_ws/test_ws.cc
+++ b/services/ui/test_ws/test_ws.cc
@@ -6,7 +6,9 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback.h"
 #include "base/message_loop/message_loop.h"
+#include "components/discardable_memory/service/discardable_shared_memory_manager.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/service_manager/public/c/main.h"
@@ -16,6 +18,8 @@
 #include "services/service_manager/public/cpp/service_context.h"
 #include "services/service_manager/public/cpp/service_runner.h"
 #include "services/service_manager/public/mojom/service_factory.mojom.h"
+#include "services/ui/gpu_host/gpu_host.h"
+#include "services/ui/gpu_host/gpu_host_delegate.h"
 #include "services/ui/public/interfaces/constants.mojom.h"
 #include "services/ui/public/interfaces/window_tree_host_factory.mojom.h"
 #include "services/ui/test_ws/test_drag_drop_client.h"
@@ -112,6 +116,7 @@
 // Service.
 class TestWindowService : public service_manager::Service,
                           public service_manager::mojom::ServiceFactory,
+                          public ui::gpu_host::GpuHostDelegate,
                           public ws2::WindowServiceDelegate {
  public:
   TestWindowService() = default;
@@ -156,7 +161,6 @@
   void CancelDragLoop(aura::Window* window) override {
     drag_drop_client_.DragCancel();
   }
-
   aura::WindowTreeHost* GetWindowTreeHostForDisplayId(
       int64_t display_id) override {
     return aura_test_helper_->host();
@@ -167,23 +171,26 @@
     CHECK(!started_);
     started_ = true;
 
-    gl::GLSurfaceTestSupport::InitializeOneOff();
     gfx::RegisterPathProvider();
     ui::RegisterPathProvider();
 
-    ui::ContextFactory* context_factory = nullptr;
-    ui::ContextFactoryPrivate* context_factory_private = nullptr;
-    ui::InitializeContextFactoryForTests(false /* enable_pixel_output */,
-                                         &context_factory,
-                                         &context_factory_private);
-    aura_test_helper_ = std::make_unique<aura::test::AuraTestHelper>();
-    aura_test_helper_->SetUp(context_factory, context_factory_private);
-
-    aura::client::SetScreenPositionClient(aura_test_helper_->root_window(),
-                                          &screen_position_client_);
-
     registry_.AddInterface(base::BindRepeating(
         &TestWindowService::BindServiceFactory, base::Unretained(this)));
+
+#if defined(OS_CHROMEOS)
+    // Use gpu service only for ChromeOS to run content_browsertests in mash.
+    //
+    // To use this code path for all platforms, we need to fix the following
+    // flaky failure on Win7 bot:
+    //   gl_surface_egl.cc:
+    //     EGL Driver message (Critical) eglInitialize: No available renderers
+    //   gl_initializer_win.cc:
+    //     GLSurfaceEGL::InitializeOneOff failed.
+    CreateGpuHost();
+#else
+    gl::GLSurfaceTestSupport::InitializeOneOff();
+    CreateAuraTestHelper();
+#endif  // defined(OS_CHROMEOS)
   }
   void OnBindInterface(const service_manager::BindSourceInfo& source_info,
                        const std::string& interface_name,
@@ -197,11 +204,24 @@
       const std::string& name,
       service_manager::mojom::PIDReceiverPtr pid_receiver) override {
     DCHECK_EQ(name, ui::mojom::kServiceName);
+
+    // Defer CreateService if |aura_test_helper_| is not created.
+    if (!aura_test_helper_) {
+      DCHECK(!pending_create_service_);
+
+      pending_create_service_ = base::BindOnce(
+          &TestWindowService::CreateService, base::Unretained(this),
+          std::move(request), name, std::move(pid_receiver));
+      return;
+    }
+
     DCHECK(!ui_service_created_);
     ui_service_created_ = true;
 
     auto window_service = std::make_unique<ws2::WindowService>(
-        this, std::make_unique<TestGpuInterfaceProvider>(),
+        this,
+        std::make_unique<TestGpuInterfaceProvider>(
+            gpu_host_.get(), discardable_shared_memory_manager_.get()),
         aura_test_helper_->focus_client());
     window_tree_host_factory_ = std::make_unique<WindowTreeHostFactory>(
         window_service.get(), aura_test_helper_->root_window());
@@ -213,11 +233,44 @@
     pid_receiver->SetPID(base::GetCurrentProcId());
   }
 
+  // ui::gpu_host::GpuHostDelegate:
+  void OnGpuServiceInitialized() override {
+    CreateAuraTestHelper();
+
+    if (pending_create_service_)
+      std::move(pending_create_service_).Run();
+  }
+
   void BindServiceFactory(
       service_manager::mojom::ServiceFactoryRequest request) {
     service_factory_bindings_.AddBinding(this, std::move(request));
   }
 
+  void CreateGpuHost() {
+    discardable_shared_memory_manager_ =
+        std::make_unique<discardable_memory::DiscardableSharedMemoryManager>();
+
+    gpu_host_ = std::make_unique<ui::gpu_host::DefaultGpuHost>(
+        this, context()->connector(), discardable_shared_memory_manager_.get());
+
+    // |aura_test_helper_| is created later in OnGpuServiceInitialized.
+  }
+
+  void CreateAuraTestHelper() {
+    DCHECK(!aura_test_helper_);
+
+    ui::ContextFactory* context_factory = nullptr;
+    ui::ContextFactoryPrivate* context_factory_private = nullptr;
+    ui::InitializeContextFactoryForTests(false /* enable_pixel_output */,
+                                         &context_factory,
+                                         &context_factory_private);
+    aura_test_helper_ = std::make_unique<aura::test::AuraTestHelper>();
+    aura_test_helper_->SetUp(context_factory, context_factory_private);
+
+    aura::client::SetScreenPositionClient(aura_test_helper_->root_window(),
+                                          &screen_position_client_);
+  }
+
   service_manager::BinderRegistry registry_;
 
   mojo::BindingSet<service_manager::mojom::ServiceFactory>
@@ -229,6 +282,10 @@
   std::unique_ptr<aura::test::AuraTestHelper> aura_test_helper_;
   std::unique_ptr<WindowTreeHostFactory> window_tree_host_factory_;
 
+  std::unique_ptr<discardable_memory::DiscardableSharedMemoryManager>
+      discardable_shared_memory_manager_;
+  std::unique_ptr<ui::gpu_host::DefaultGpuHost> gpu_host_;
+
   // For drag and drop code to convert to/from screen coordinates.
   wm::DefaultScreenPositionClient screen_position_client_;
 
@@ -237,6 +294,8 @@
   bool started_ = false;
   bool ui_service_created_ = false;
 
+  base::OnceClosure pending_create_service_;
+
   DISALLOW_COPY_AND_ASSIGN(TestWindowService);
 };
 
diff --git a/services/ui/ws2/focus_handler.cc b/services/ui/ws2/focus_handler.cc
index c6249cf..0f7094f 100644
--- a/services/ui/ws2/focus_handler.cc
+++ b/services/ui/ws2/focus_handler.cc
@@ -51,6 +51,26 @@
     return true;
   }
 
+  // The client is asking to remove focus from a window. This is typically a
+  // side effect of the window becoming, or about to become, an unfocusable
+  // Window (for example, the Window is hiding). Windows becoming unfocusable is
+  // handled locally. Assume the request is for such a scenario and return
+  // true. Returning false means the client will attempt to revert to the
+  // previously focused window, which may cause unexpected activation changes.
+  //
+  // To process null requests conflicts with top-level activation changes. For
+  // example, the typical sequence when a window is hidden is to first remove
+  // focus, and then hide the window. FocusController keys off window hiding to
+  // move activation. If this code were to set focus to null, FocusController
+  // would not see the window hiding (because the active window was set to null)
+  // and not automatically activate the next window.
+  //
+  // Another possibility for this code is to handle null as a signal to move
+  // focus to the active window (if there is one). I'm going with the simpler
+  // approach for now.
+  if (!window)
+    return true;
+
   ClientChange change(window_tree_->property_change_tracker_.get(), window,
                       ClientChangeType::kFocus);
   focus_client->FocusWindow(window);
diff --git a/services/ui/ws2/focus_handler_unittest.cc b/services/ui/ws2/focus_handler_unittest.cc
index a5c5113e..fd3acc70 100644
--- a/services/ui/ws2/focus_handler_unittest.cc
+++ b/services/ui/ws2/focus_handler_unittest.cc
@@ -40,6 +40,33 @@
   EXPECT_TRUE(top_level->HasFocus());
 }
 
+// This test simulates the typical sequence of a client closing a window:
+// SetFocus(nullptr) and then Hide().
+TEST(FocusHandlerTest, FocusChangesAfterSetFocusToNullAndHide) {
+  // Create two top-levels and focus the second.
+  WindowServiceTestSetup setup;
+  aura::Window* top_level1 =
+      setup.window_tree_test_helper()->NewTopLevelWindow();
+  ASSERT_TRUE(top_level1);
+  top_level1->Show();
+  aura::Window* top_level2 =
+      setup.window_tree_test_helper()->NewTopLevelWindow();
+  ASSERT_TRUE(top_level2);
+  top_level2->Show();
+  EXPECT_TRUE(setup.window_tree_test_helper()->SetFocus(top_level2));
+  EXPECT_TRUE(top_level2->HasFocus());
+
+  // SetFocus(nullptr) should succeed, but should not actually change focus
+  // (SetFocus(nullptr) is effectively ignored).
+  EXPECT_TRUE(setup.window_tree_test_helper()->SetFocus(nullptr));
+  EXPECT_TRUE(top_level2->HasFocus());
+
+  // Hiding |top_level2| should focus |top_level1|.
+  top_level2->Hide();
+  EXPECT_FALSE(top_level2->HasFocus());
+  EXPECT_TRUE(top_level1->HasFocus());
+}
+
 TEST(FocusHandlerTest, FocusNull) {
   WindowServiceTestSetup setup;
   aura::Window* top_level =
@@ -48,8 +75,10 @@
   top_level->Show();
   EXPECT_TRUE(setup.window_tree_test_helper()->SetFocus(top_level));
   EXPECT_TRUE(top_level->HasFocus());
+  // SetFocus(nullptr) returns true, but doesn't actually change focus. See
+  // comments in FocusHandler for details.
   EXPECT_TRUE(setup.window_tree_test_helper()->SetFocus(nullptr));
-  EXPECT_FALSE(top_level->HasFocus());
+  EXPECT_TRUE(top_level->HasFocus());
 }
 
 TEST(FocusHandlerTest, FocusChild) {
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index c2d7424..53ba3f7 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -197,6 +197,8 @@
 #define SK_SUPPORT_LEGACY_AAA_CHOICE
 #endif
 
+#define SK_LEGACY_CONVERT_PIXELS_IMPL
+
 ///////////////////////// Imported from BUILD.gn and skia_common.gypi
 
 /* In some places Skia can use static initializers for global initialization,
diff --git a/sql/test/test_helpers.cc b/sql/test/test_helpers.cc
index 620fbc3..244fab6c 100644
--- a/sql/test/test_helpers.cc
+++ b/sql/test/test_helpers.cc
@@ -20,7 +20,8 @@
 namespace {
 
 size_t CountSQLItemsOfType(sql::Database* db, const char* type) {
-  const char kTypeSQL[] = "SELECT COUNT(*) FROM sqlite_master WHERE type = ?";
+  static const char kTypeSQL[] =
+      "SELECT COUNT(*) FROM sqlite_master WHERE type = ?";
   sql::Statement s(db->GetUniqueStatement(kTypeSQL));
   s.BindCString(0, type);
   EXPECT_TRUE(s.Step());
@@ -38,7 +39,8 @@
 
 // Get |name|'s root page number in the database.
 bool GetRootPage(sql::Database* db, const char* name, int* page_number) {
-  const char kPageSql[] = "SELECT rootpage FROM sqlite_master WHERE name = ?";
+  static const char kPageSql[] =
+      "SELECT rootpage FROM sqlite_master WHERE name = ?";
   sql::Statement s(db->GetUniqueStatement(kPageSql));
   s.BindString(0, name);
   if (!s.Step())
@@ -210,7 +212,7 @@
   // TODO(shess): sql::Database::QuoteForSQL() would make sense.
   std::string quoted_table;
   {
-    const char kQuoteSQL[] = "SELECT quote(?)";
+    static const char kQuoteSQL[] = "SELECT quote(?)";
     sql::Statement s(db->GetUniqueStatement(kQuoteSQL));
     s.BindCString(0, table);
     EXPECT_TRUE(s.Step());
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json
index 36793e8..5d6eb15 100644
--- a/testing/buildbot/chromium.perf.fyi.json
+++ b/testing/buildbot/chromium.perf.fyi.json
@@ -167,7 +167,7 @@
               "pool": "chrome.tests.perf-fyi"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -211,7 +211,7 @@
               "pool": "chrome.tests.perf-fyi"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -254,7 +254,7 @@
               "pool": "chrome.tests.perf-fyi"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -301,7 +301,7 @@
               "pool": "chrome.tests.perf-fyi"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -346,7 +346,7 @@
               "pool": "chrome.tests.perf-fyi"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -396,7 +396,7 @@
               "pool": "chrome.tests.perf-fyi"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -446,7 +446,7 @@
               "pool": "chrome.tests.perf-webview-fyi"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index ae099bac..34980d8f 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -40,7 +40,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -85,7 +85,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -130,7 +130,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -177,7 +177,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -222,7 +222,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -273,7 +273,7 @@
               "pool": "chrome.tests.perf-webview"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -324,7 +324,7 @@
               "pool": "chrome.tests.perf-webview"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -387,7 +387,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -430,7 +430,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -473,7 +473,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -518,7 +518,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -563,7 +563,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -608,7 +608,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -655,7 +655,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -698,7 +698,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -741,7 +741,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -785,7 +785,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -845,7 +845,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -895,7 +895,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -940,7 +940,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -985,7 +985,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1030,7 +1030,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1077,7 +1077,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1122,7 +1122,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1169,7 +1169,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1212,7 +1212,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1255,7 +1255,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1300,7 +1300,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1343,7 +1343,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1390,7 +1390,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1433,7 +1433,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1477,7 +1477,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1524,7 +1524,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1567,7 +1567,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1611,7 +1611,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1654,7 +1654,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1701,7 +1701,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1744,7 +1744,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1789,7 +1789,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
@@ -1832,7 +1832,7 @@
               "pool": "chrome.tests.perf"
             }
           ],
-          "expiration": 21600,
+          "expiration": 7200,
           "hard_timeout": 25200,
           "ignore_task_failure": false,
           "io_timeout": 1800,
diff --git a/testing/buildbot/filters/mash.browser_tests.filter b/testing/buildbot/filters/mash.browser_tests.filter
index 8c7cb6fd..4e582707 100644
--- a/testing/buildbot/filters/mash.browser_tests.filter
+++ b/testing/buildbot/filters/mash.browser_tests.filter
@@ -39,7 +39,6 @@
 -BrowserNonClientFrameViewAshTest.AvatarDisplayOnTeleportedWindow/*
 -BrowserNonClientFrameViewAshTest.HeaderHeightForSnappedBrowserInSplitView/*
 -BrowserNonClientFrameViewAshTest.ImmersiveModeTopViewInset/*
--BrowserNonClientFrameViewAshTest.RestoreMinimizedBrowserUpdatesCaption/*
 -BrowserNonClientFrameViewAshTest.ToggleTabletModeOnMinimizedWindow/*
 -BrowserNonClientFrameViewAshTest.ToggleTabletModeRelayout/*
 -BrowserNonClientFrameViewAshTest.TopViewInset/*
diff --git a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
index 91874ae8..103ab2ca 100644
--- a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
+++ b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
@@ -16,16 +16,6 @@
 -SubresourceFilterBrowserTest.FailedProvisionalLoadInMainframe
 -WebViewTest.WebViewInBackgroundPage
 
-# These tests uses net::URLRequestFilter (through TestRequestInterceptor) to
-# mock out network responses, and use ExtensionDownloader to issue requests,
-# which has yet to be switched from URLFetcher.
-# https://crbug.com/844928
--PolicyTest.ExtensionInstallForcelist
--PolicyTest.ExtensionInstallForcelist_DefaultedUpdateUrl
--PolicyTest.ExtensionMinimumVersionForceInstalled
--PolicyTest.ExtensionMinimumVersionRequired
--PolicyTest.ExtensionMinimumVersionRequiredAlt
--PolicyTest.ExtensionRecommendedInstallationMode
 
 # These tests uses net::URLRequestFilter (through TestRequestInterceptor) to
 # mock out network responses, and use URLFetcherDownloader to issue requests,
@@ -120,20 +110,7 @@
 -ClientHintsBrowserTest.ClientHintsNoLifetimeCookiesNotAllowed/1
 
 # http://crbug.com/816684 Track Page Load Metrics.
--AdsPageLoadMetricsObserverBrowserTest.OriginStatusMetricEmbedded
--AdsPageLoadMetricsObserverBrowserTest.OriginStatusMetricEmbeddedEmpty
--AdsPageLoadMetricsObserverBrowserTest.OriginStatusMetricSame
--AdsPageLoadMetricsObserverBrowserTest.OriginStatusMetricCross
--AdsPageLoadMetricsObserverBrowserTest.DocOverwritesNavigation
--AdsPageLoadMetricsObserverBrowserTest.SubresourceFilter
--AdTaggingBrowserTest.VerifyCrossOriginWithoutNavigate
--AdTaggingBrowserTest.VerifySameOriginWithoutNavigate
--AdTaggingBrowserTest.VerifyCrossOriginWithImmediateNavigate
--AdTaggingBrowserTest.VerifySameOriginWithCrossOriginRenavigate
--PageLoadMetricsBrowserTest.LoadingMetrics
 -PageLoadMetricsBrowserTest.LoadingMetricsFailed
--PageLoadMetricsBrowserTest.PayloadSize
--PageLoadMetricsBrowserTest.PayloadSizeChildFrame
 
 # https://crbug.com/810329 DnsProbe browsertests that rely on delaying requests:
 -DnsProbeBrowserTest.NxdomainProbeResultWithWorkingSlowCorrections
@@ -244,11 +221,6 @@
 # about an origin.
 -ReportingBrowserTest.TestReportingHeadersProcessed
 
-# Add magic x-frame-options headers to web store requests
-# https://crbug.com/852877
--ExtensionWebstorePrivateApiTest.FrameErrorPageBlocked
--ExtensionWebstorePrivateApiTest.FrameWebstorePageBlocked
-
 # NOTE: if adding an exclusion for an existing failure (e.g. additional test for
 # feature X that is already not working), please add it beside the existing
 # failures. Otherwise please reach out to network-service-dev@.
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
index 3c5fb56..fe5c523 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -70,7 +70,6 @@
 crbug.com/591099 css3/flexbox/line-wrapping.html [ Failure ]
 crbug.com/591099 css3/flexbox/scrollbars-auto.html [ Failure ]
 crbug.com/714962 css3/masking/clip-path-reference-box-inline.html [ Failure ]
-crbug.com/591099 editing/selection/continuations-with-move-caret-to-boundary.html [ Failure Pass ]
 crbug.com/591099 editing/selection/paint-hyphen.html [ Pass ]
 crbug.com/591099 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11.html [ Pass ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures.worker.html [ Timeout ]
@@ -88,7 +87,7 @@
 crbug.com/591099 external/wpt/WebCryptoAPI/import_export/rsa_importKey.worker.html [ Timeout ]
 crbug.com/709227 external/wpt/WebCryptoAPI/import_export/symmetric_importKey.worker.html [ Failure ]
 crbug.com/591099 external/wpt/background-fetch/get-ids.https.window.html [ Crash Pass ]
-crbug.com/591099 external/wpt/background-fetch/get.https.window.html [ Crash Pass ]
+crbug.com/591099 external/wpt/background-fetch/get.https.window.html [ Pass ]
 crbug.com/591099 external/wpt/css/CSS2/floats/floats-line-wrap-shifted-001.html [ Pass ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-empty-001.xht [ Pass ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-empty-004.xht [ Pass ]
@@ -118,6 +117,7 @@
 crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-ic-003.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-text/overflow-wrap/overflow-wrap-break-word-004.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-text/overflow-wrap/overflow-wrap-min-content-size-002.html [ Pass ]
+crbug.com/591099 external/wpt/css/css-text/overflow-wrap/overflow-wrap-min-content-size-003.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-text/white-space/pre-wrap-002.html [ Pass ]
 crbug.com/40634 external/wpt/css/css-text/white-space/trailing-space-before-br-001.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-text/word-break/word-break-break-all-004.html [ Pass ]
@@ -228,8 +228,8 @@
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-definite-sizes-002.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-definite-sizes-004.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003v.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-011.html [ Crash Pass ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-012.html [ Crash Pass ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-011.html [ Pass ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-012.html [ Pass ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-1.html [ Pass ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-4.html [ Pass ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/remove-from-split-inline-6.html [ Pass ]
@@ -326,7 +326,7 @@
 crbug.com/591099 external/wpt/picture-in-picture/request-picture-in-picture-twice.html [ Pass ]
 crbug.com/591099 external/wpt/pointerevents/pointerevent_click_during_capture-manual.html [ Crash Timeout ]
 crbug.com/591099 external/wpt/quirks/line-height-calculation.html [ Failure ]
-crbug.com/591099 external/wpt/requestidlecallback/callback-iframe.html [ Pass Timeout ]
+crbug.com/591099 external/wpt/requestidlecallback/callback-iframe.html [ Pass ]
 crbug.com/591099 external/wpt/requestidlecallback/callback-timeout-when-busy.html [ Timeout ]
 crbug.com/591099 external/wpt/requestidlecallback/callback-timeout.html [ Timeout ]
 crbug.com/591099 external/wpt/service-workers/service-worker/navigation-preload/broken-chunked-encoding.https.html [ Failure ]
@@ -383,7 +383,7 @@
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_outline_properties.html [ Failure ]
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_outline_shorthand.html [ Failure ]
 crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_white-space_normal_wrapped.html [ Failure ]
-crbug.com/591099 external/wpt/workers/Worker_terminate_event_queue.htm [ Timeout ]
+crbug.com/591099 external/wpt/workers/Worker_terminate_event_queue.htm [ Crash Timeout ]
 crbug.com/591099 external/wpt/workers/baseurl/alpha/worker-in-worker.html [ Pass ]
 crbug.com/591099 external/wpt/workers/constructors/Worker/same-origin.html [ Timeout ]
 crbug.com/591099 external/wpt/workers/semantics/interface-objects/004.html [ Failure ]
@@ -453,7 +453,7 @@
 crbug.com/591099 fast/table/empty-table-percent-height.html [ Failure ]
 crbug.com/591099 fast/table/height-percent-test-vertical.html [ Failure ]
 crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure Pass ]
-crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure ]
+crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure Pass ]
 crbug.com/591099 fast/table/percent-height-replaced-content-in-cell.html [ Failure ]
 crbug.com/858998 fast/table/table-continuation-outline-paint-crash.html [ Failure ]
 crbug.com/591099 fast/table/table-display-types-vertical.html [ Failure ]
@@ -493,7 +493,6 @@
 crbug.com/591099 http/tests/images/restyle-decode-error.html [ Failure ]
 crbug.com/591099 http/tests/local/fileapi/select-dragged-file-input.html [ Skip ]
 crbug.com/591099 http/tests/misc/object-embedding-svg-delayed-size-negotiation.xhtml [ Failure ]
-crbug.com/591099 http/tests/preload/dynamic_remove_preload_href.html [ Failure Pass ]
 crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-appcache.https.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-csp-appcache.https.html [ Crash Failure Pass ]
 crbug.com/591099 http/tests/security/setDomainRelaxationForbiddenForURLScheme.html [ Crash ]
@@ -571,7 +570,6 @@
 crbug.com/591099 paint/invalidation/window-resize/window-resize-viewport-percent.html [ Failure ]
 crbug.com/591099 paint/overflow/background-mask-should-be-recorded-full.html [ Failure ]
 crbug.com/591099 paint/pagination/pagination-change-clip-crash.html [ Failure ]
-crbug.com/714962 paint/text/text-match-highlights-big-line-height.html [ Failure Pass ]
 crbug.com/591099 printing/absolute-position-headers-and-footers.html [ Failure ]
 crbug.com/591099 printing/iframe-svg-in-object-print.html [ Failure ]
 crbug.com/591099 scrollbars/auto-scrollbar-fit-content.html [ Failure ]
@@ -608,7 +606,7 @@
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-blending-gradient-over-pattern.html [ Pass Timeout ]
 crbug.com/591099 virtual/layout_ng/ [ Skip ]
 crbug.com/824918 virtual/layout_ng_experimental/ [ Skip ]
-crbug.com/591099 virtual/mojo-blob-urls/external/wpt/FileAPI/url/sandboxed-iframe.html [ Pass ]
+crbug.com/591099 virtual/mojo-blob-urls/external/wpt/FileAPI/url/sandboxed-iframe.html [ Pass Timeout ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/compositor-touch-hit-rects.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/mainthread-touchpad-fling-latching.html [ Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/wheel-scroll-latching-on-scrollbar.html [ Pass ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees
index 1ae914b..fe157aa 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees
@@ -288,7 +288,6 @@
 # Rounding differences.
 # Maybe due to different render surface generation? (Needs investigation.)
 Bug(none) compositing/backface-visibility-transformed.html [ Failure ]
-Bug(none) compositing/color-matching/image-color-matching.html [ Failure ]
 Bug(none) compositing/iframes/invisible-nested-iframe-show.html [ Failure ]
 Bug(none) compositing/lots-of-img-layers-with-opacity.html [ Failure ]
 Bug(none) compositing/lots-of-img-layers.html [ Failure ]
@@ -307,16 +306,12 @@
 # Subpixel differences on text. Likely benign.
 Bug(none) css3/blending/background-blend-mode-overlapping-accelerated-elements.html [ Failure ]
 
-# Incorrect clipping.
-crbug.com/844429 compositing/culling/tile-occlusion-boundaries.html [ Failure ]
-
 # Failures that don't belong to any of above categories. Investigation needed.
 Bug(none) compositing/overflow/nested-render-surfaces-with-rotation.html [ Failure ]
 Bug(none) compositing/overflow/non-composited-sticky-element-in-main-thread-scrolled-composited-ancestor.html [ Failure ]
 Bug(none) compositing/overflow-trumps-transform-style.html [ Failure ]
 Bug(none) compositing/backface-visibility/backface-visibility-hierarchical-transform.html [ Failure ]
 Bug(none) compositing/geometry/clipping-foreground.html [ Failure Pass ]
-Bug(none) compositing/masks/mask-with-removed-filters.html [ Failure ]
 Bug(none) compositing/video/video-controls-layer-creation.html [ Failure Pass ]
 
 # Rounded borders have slightly different antialiasing
@@ -352,12 +347,6 @@
 crbug.com/854192 fast/multicol/vertical-rl/composited-relpos-overlapping-will-change.html [ Failure ]
 crbug.com/854192 paint/pagination/composited-paginated-outlined-box.html [ Failure ]
 
-# Image layers are not scaled.
-crbug.com/854195 images/color-profile-layer.html [ Failure ]
-crbug.com/854195 images/pixelated-composited.html [ Failure ]
-crbug.com/854195 compositing/visibility/visibility-image-layers.html [ Failure ]
-crbug.com/854195 virtual/threaded/compositing/visibility/visibility-image-layers.html [ Failure ]
-
 # Paint invalidation test failures. Needs investigation.
 crbug.com/857322 paint/invalidation/background/obscured-background-no-repaint.html [ Failure Crash ]
 crbug.com/854196 paint/invalidation/compositing/clipping-should-not-repaint-composited-descendants.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process b/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process
index dfa00712..6d6832e 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process
@@ -1,10 +1,6 @@
 # These tests currently fail when they run with --site-per-process.
 # See https://crbug.com/477150.
 
-# https://crbug.com/794631: OOPIFs VS feature policy VS opaque origins?
-crbug.com/794631 virtual/unified-autoplay/external/wpt/feature-policy/autoplay-allowed-by-feature-policy-attribute.https.sub.html [ Failure ]
-crbug.com/794631 virtual/unified-autoplay/external/wpt/feature-policy/autoplay-allowed-by-feature-policy.https.sub.html [ Failure ]
-
 # https://crbug.com/793127: NOTREACHED() from clamy@ tickled by frame consolidation CL?
 crbug.com/793127 http/tests/security/upgrade-insecure-requests/iframe-upgrade.https.html [ Crash ]
 crbug.com/793127 external/wpt/content-security-policy/securitypolicyviolation/upgrade-insecure-requests-reporting.https.html [ Crash ]
@@ -34,10 +30,6 @@
 crbug.com/582245 http/tests/security/xssAuditor/block-does-not-leak-referrer.html [ Failure ]
 crbug.com/582245 http/tests/security/xssAuditor/full-block-script-tag-cross-domain.html [ Failure ]
 
-# https://crbug.com/582176 - InspectorTest.changeExecutionContext doesn't like OOPIFs.
-crbug.com/582176 http/tests/devtools/console-cd-completions.js [ Failure ]
-crbug.com/582176 http/tests/devtools/console-cd.js [ Failure ]
-
 # https://crbug.com/608015 - node.contentDocument is undefined.
 crbug.com/608015 http/tests/inspector-protocol/access-inspected-object.js [ Failure Timeout ]
 
@@ -343,16 +335,5 @@
 crbug.com/859988 virtual/outofblink-cors/http/tests/fetch/serviceworker-proxied/thorough/scheme-data-base-https-other-https.html [ Failure Pass Timeout ]
 crbug.com/859988 virtual/outofblink-cors-ns/http/tests/fetch/serviceworker-proxied/thorough/scheme-data-base-https-other-https.html [ Failure Pass Timeout ]
 
-# These tests have issues with —site-per-process. https://crbug.com/794631
-crbug.com/794631 http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-delegation.html [ Failure Pass Timeout ]
-crbug.com/794631 http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-disabled.html [ Failure Pass Timeout ]
-crbug.com/794631 http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-gesture.html [ Failure Pass Timeout ]
-crbug.com/794631 http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-header.html [ Failure Pass Timeout ]
-crbug.com/794631 http/tests/media/autoplay/document-user-activation-feature-policy-alternating.html [ Failure Pass Timeout ]
-crbug.com/794631 http/tests/media/autoplay/document-user-activation-feature-policy-iframe-no-gesture.html [ Failure Pass Timeout ]
-crbug.com/794631 http/tests/media/autoplay/document-user-activation-feature-policy-same-origin.html [ Failure Pass Timeout ]
-crbug.com/794631 http/tests/media/autoplay/document-user-activation-iframe-delegation.html [ Failure Pass Timeout ]
-crbug.com/794631 virtual/user-activation-v2/http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-delegation.html [ Failure Pass Timeout ]
-crbug.com/794631 virtual/user-activation-v2/http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-disabled.html [ Failure Pass Timeout ]
-crbug.com/794631 virtual/user-activation-v2/http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-gesture.html [ Failure Pass Timeout ]
-crbug.com/794631 virtual/user-activation-v2/http/tests/media/autoplay/document-user-activation-iframe-delegation.html [ Failure Pass Timeout ]
+# https://crbug.com/872952: Autoplay is still disabled if there is no gesture.
+crbug.com/872952 http/tests/media/autoplay/document-user-activation-feature-policy-iframe-no-gesture.html [ Failure Pass Timeout ]
diff --git a/third_party/WebKit/LayoutTests/MSANExpectations b/third_party/WebKit/LayoutTests/MSANExpectations
index aa351fd..2bd01bf 100644
--- a/third_party/WebKit/LayoutTests/MSANExpectations
+++ b/third_party/WebKit/LayoutTests/MSANExpectations
@@ -107,7 +107,8 @@
 crbug.com/838057 [ Linux ] virtual/outofblink-cors/external/wpt/fetch/api/cors/cors-preflight.any.worker.html [ Crash ]
 crbug.com/838057 [ Linux ] virtual/outofblink-cors/external/wpt/fetch/api/cors/cors-redirect-preflight.any.html [ Crash ]
 crbug.com/838057 [ Linux ] virtual/outofblink-cors/external/wpt/fetch/api/cors/cors-redirect-preflight.any.worker.html [ Crash ]
-crbug.com/838057 [ Linux ] virtual/outofblink-cors/external/wpt/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html [ Crash ]
+# This next one is flaky as of 2018-08-09.
+crbug.com/838057 [ Linux ] virtual/outofblink-cors/external/wpt/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html [ Pass Crash ]
 crbug.com/838057 [ Linux ] virtual/outofblink-cors/external/wpt/service-workers/service-worker/fetch-canvas-tainting-video.https.html [ Crash ]
 
 # Crashes on Linux Trusty MSAN
@@ -136,13 +137,17 @@
 crbug.com/856601 [ Linux ] external/wpt/cookie-store/idlharness.tentative.https.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/css/css-font-loading/idlharness.https.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/css/css-paint-api/idlharness.html [ Pass Timeout ]
+crbug.com/856601 [ Linux ] external/wpt/css/css-typed-om/interfaces.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/css/cssom-view/interfaces.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/dom/nodes/Element-classlist.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/encrypted-media/idlharness.https.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/fetch/cors-rfc1918/idlharness.tentative.any.worker.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/mediacapture-image/idlharness.window.html [ Pass Timeout ]
+crbug.com/856601 [ Linux ] external/wpt/mediacapture-streams/idlharness.https.window.html [ Pass Timeout ]
+crbug.com/856601 [ Linux ] external/wpt/notifications/idlharness.https.any.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/pointerevents/idlharness.window.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/presentation-api/controlling-ua/idlharness.https.html [ Pass Timeout ]
+crbug.com/856601 [ Linux ] external/wpt/push-api/idlharness.https.any.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/push-api/idlharness.https.any.sharedworker.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/push-api/idlharness.https.any.worker.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/remote-playback/idlharness.window.html [ Pass Timeout ]
@@ -151,6 +156,7 @@
 crbug.com/856601 [ Linux ] external/wpt/screen-orientation/idlharness.window.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/selection/idlharness.window.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Pass Timeout ]
+crbug.com/856601 [ Linux ] external/wpt/speech-api/idlharness.window.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/subresource-integrity/idlharness.window.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/svg/idlharness.window.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/touch-events/idlharness.window.html [ Pass Timeout ]
@@ -165,7 +171,9 @@
 crbug.com/856601 [ Linux ] virtual/video-surface-layer/external/wpt/picture-in-picture/idlharness.window.html [ Pass Timeout ]
 
 # background-fetch tests crash on MSAN
+crbug.com/869818 [ Linux ] external/wpt/background-fetch/fetch.https.window.html [ Pass Crash ]
 crbug.com/869818 [ Linux ] external/wpt/background-fetch/get-ids.https.window.html [ Pass Crash ]
 crbug.com/869818 [ Linux ] external/wpt/background-fetch/get.https.window.html [ Pass Crash ]
 crbug.com/869818 [ Linux ] external/wpt/background-fetch/mixed-content-and-allowed-schemes.https.window.html [ Pass Crash ]
 crbug.com/869818 [ Linux ] external/wpt/background-fetch/port-blocking.https.window.html [ Pass Crash ]
+crbug.com/869818 [ Linux ] http/tests/background_fetch/block-cors-preflights.https.html [ Pass Crash ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index dcbfebf..d89f49a 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2704,6 +2704,9 @@
 crbug.com/870526 external/wpt/push-api/idlharness.https.any.serviceworker.html [ Skip ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 external/wpt/speech-api/SpeechSynthesis-speak-with-activation-succeeds.html [ Timeout ]
+crbug.com/626703 external/wpt/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html [ Timeout ]
+crbug.com/626703 external/wpt/svg/painting/reftests/paint-order-001.svg [ Failure ]
 crbug.com/626703 external/wpt/svg/text/reftests/text-inline-size-007.svg [ Failure ]
 crbug.com/626703 external/wpt/svg/text/reftests/text-inline-size-005.svg [ Failure ]
 crbug.com/626703 external/wpt/svg/text/reftests/text-multiline-002.svg [ Failure ]
@@ -4896,3 +4899,6 @@
 crbug.com/872635 [ Mac ] fast/events/middleClickAutoscroll-nested-divs-forbidden.html [ Failure Pass ]
 crbug.com/872705 [ Mac ] virtual/mouseevent_fractional/fast/events/autoscroll-over-scrollbar.html [ Failure Pass ]
 crbug.com/872705 [ Mac ] virtual/mouseevent_fractional/fast/events/recorded-keydown-event.html [ Timeout Pass ]
+
+# Sheriff 2018-08-10
+crbug.com/873078 [ Win7 ] device_orientation/motion/detached-frame.html [ Failure Pass ]
diff --git a/third_party/WebKit/LayoutTests/bindings/idl-dictionary-unittest-expected.txt b/third_party/WebKit/LayoutTests/bindings/idl-dictionary-unittest-expected.txt
index 39ec385..2553af3 100644
--- a/third_party/WebKit/LayoutTests/bindings/idl-dictionary-unittest-expected.txt
+++ b/third_party/WebKit/LayoutTests/bindings/idl-dictionary-unittest-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 269: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 273: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 IDL dictionary unittest
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
@@ -30,6 +30,7 @@
 PASS dict.doubleOrStringSequenceMember is undefined.
 PASS dict.eventTargetOrNullMember is null
 PASS dict.anyMember is undefined.
+PASS dict.callbackFunctionMember is undefined.
 
 Test for setting undefined
 PASS dict.longMember is undefined.
@@ -52,6 +53,7 @@
 PASS dict.objectOrNullMemberWithDefault is null
 PASS dict.eventTargetOrNullMember is null
 PASS dict.anyMember is undefined.
+PASS dict.callbackFunctionMember is undefined.
 
 Test for setting valid values
 PASS dict.longMember is 1
@@ -80,6 +82,7 @@
 PASS dict.eventTargetOrNullMember is element1
 PASS dict.internalEnumOrInternalEnumSequenceMember is "foo"
 PASS dict.anyMember is 42
+PASS dict.callbackFunctionMember("A", "B") is "Hi A and B"
 
 Additional test for union type members
 PASS dict.doubleOrStringMember is "foo"
diff --git a/third_party/WebKit/LayoutTests/bindings/idl-dictionary-unittest.html b/third_party/WebKit/LayoutTests/bindings/idl-dictionary-unittest.html
index c38c0a5..971ef39 100644
--- a/third_party/WebKit/LayoutTests/bindings/idl-dictionary-unittest.html
+++ b/third_party/WebKit/LayoutTests/bindings/idl-dictionary-unittest.html
@@ -37,6 +37,7 @@
     shouldBeUndefined('dict.doubleOrStringSequenceMember');
     shouldBeNull('dict.eventTargetOrNullMember');
     shouldBeUndefined('dict.anyMember');
+    shouldBeUndefined('dict.callbackFunctionMember');
     debug('');
 
     debug('Test for setting undefined');
@@ -62,6 +63,7 @@
     shouldBeNull('dict.objectOrNullMemberWithDefault');
     shouldBeNull('dict.eventTargetOrNullMember');
     shouldBeUndefined('dict.anyMember');
+    shouldBeUndefined('dict.callbackFunctionMember');
     debug('');
 
     var element1 = document.createElement('div');
@@ -93,7 +95,8 @@
         doubleOrStringSequenceMember: [3.14, 'Hello'],
         eventTargetOrNullMember: element1,
         internalEnumOrInternalEnumSequenceMember: 'foo',
-        anyMember: 42
+        anyMember: 42,
+        callbackFunctionMember: (arg1, arg2) => { return 'Hi ' + arg1 + ' and ' + arg2; },
     });
     dict = dictionaryTest.get();
     shouldBe('dict.longMember', '1');
@@ -122,6 +125,7 @@
     shouldBe('dict.eventTargetOrNullMember', 'element1');
     shouldBeEqualToString('dict.internalEnumOrInternalEnumSequenceMember', 'foo');
     shouldBe('dict.anyMember', '42');
+    shouldBeEqualToString('dict.callbackFunctionMember("A", "B")', 'Hi A and B');
     debug('');
 
     debug('Additional test for union type members');
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
index c58001e..4564647 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -96825,6 +96825,18 @@
      {}
     ]
    ],
+   "svg/painting/reftests/paint-order-001.svg": [
+    [
+     "/svg/painting/reftests/paint-order-001.svg",
+     [
+      [
+       "/svg/painting/reftests/paint-order-001-ref.svg",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "svg/path/bearing/absolute.svg": [
     [
      "/svg/path/bearing/absolute.svg",
@@ -124899,11 +124911,26 @@
      {}
     ]
    ],
+   "css/css-logical/logical-values-resize-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "css/css-logical/resources/test-box-properties.js": [
     [
      {}
     ]
    ],
+   "css/css-logical/resources/test-logical-values.js": [
+    [
+     {}
+    ]
+   ],
+   "css/css-logical/resources/test-shared.js": [
+    [
+     {}
+    ]
+   ],
    "css/css-masking/META.yml": [
     [
      {}
@@ -158899,11 +158926,6 @@
      {}
     ]
    ],
-   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/004-1.html": [
-    [
-     {}
-    ]
-   ],
    "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/005-expected.txt": [
     [
      {}
@@ -166229,11 +166251,6 @@
      {}
     ]
    ],
-   "secure-contexts/idlharness.any-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "secure-contexts/postMessage-helper.html": [
     [
      {}
@@ -170214,6 +170231,11 @@
      {}
     ]
    ],
+   "svg/painting/reftests/paint-order-001-ref.svg": [
+    [
+     {}
+    ]
+   ],
    "svg/path/bearing/absolute-ref.svg": [
     [
      {}
@@ -175719,11 +175741,6 @@
      {}
     ]
    ],
-   "workers/modules/dedicated-worker-import-referrer-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "workers/modules/dedicated-worker-options-credentials.html.headers": [
     [
      {}
@@ -193672,6 +193689,18 @@
      {}
     ]
    ],
+   "css/css-logical/logical-values-float-clear.html": [
+    [
+     "/css/css-logical/logical-values-float-clear.html",
+     {}
+    ]
+   ],
+   "css/css-logical/logical-values-resize.html": [
+    [
+     "/css/css-logical/logical-values-resize.html",
+     {}
+    ]
+   ],
    "css/css-logical/logicalprops-block-size-vlr.html": [
     [
      "/css/css-logical/logicalprops-block-size-vlr.html",
@@ -226396,12 +226425,6 @@
      {}
     ]
    ],
-   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/007.html": [
-    [
-     "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/007.html",
-     {}
-    ]
-   ],
    "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/008.html": [
     [
      "/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/008.html",
@@ -252213,12 +252236,30 @@
    "speech-api/SpeechSynthesis-speak-ownership.html": [
     [
      "/speech-api/SpeechSynthesis-speak-ownership.html",
-     {}
+     {
+      "testdriver": true
+     }
     ]
    ],
    "speech-api/SpeechSynthesis-speak-twice.html": [
     [
      "/speech-api/SpeechSynthesis-speak-twice.html",
+     {
+      "testdriver": true
+     }
+    ]
+   ],
+   "speech-api/SpeechSynthesis-speak-with-activation-succeeds.html": [
+    [
+     "/speech-api/SpeechSynthesis-speak-with-activation-succeeds.html",
+     {
+      "testdriver": true
+     }
+    ]
+   ],
+   "speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html": [
+    [
+     "/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html",
      {}
     ]
    ],
@@ -269970,7 +270011,7 @@
    "support"
   ],
   "./lint.whitelist": [
-   "a10b26945c0ef0105e7e183cfb4d1df05ea5af15",
+   "3b7bd6da3d2e6812cea8659166518687d8c83d33",
    "support"
   ],
   "./update-built-tests.sh": [
@@ -281662,7 +281703,7 @@
    "testharness"
   ],
   "content-security-policy/unsafe-hashes/style_attribute_allowed.html": [
-   "02676f3fe19f2da59f166f2a7be071a4071615c6",
+   "af60cc395027bdba45e8a789de40d7c36669ee2d",
    "testharness"
   ],
   "content-security-policy/unsafe-hashes/style_attribute_denied_missing_unsafe_hashes.html": [
@@ -282526,7 +282567,7 @@
    "testharness"
   ],
   "cookies/resources/cookie-helper.sub.js": [
-   "a5cfe0b65ee4c71ea97731624974ab1b6077b60c",
+   "bbc3f9aad2455be161ba163cb627735848ff38de",
    "support"
   ],
   "cookies/resources/drop.py": [
@@ -317482,7 +317523,7 @@
    "support"
   ],
   "css/css-logical/logical-box-border-color.html": [
-   "8b0476ee42276ea327938e573cd7a62ceff595c1",
+   "f46cce77c60ffa24548b9c706ad5ce96876665cc",
    "testharness"
   ],
   "css/css-logical/logical-box-border-shorthands-expected.txt": [
@@ -317490,7 +317531,7 @@
    "support"
   ],
   "css/css-logical/logical-box-border-shorthands.html": [
-   "c02cf997b0f7046a0332079a57deaea78f132057",
+   "39da7b534bcc5ef8c6987025d1424f77acb122b9",
    "testharness"
   ],
   "css/css-logical/logical-box-border-style-expected.txt": [
@@ -317498,7 +317539,7 @@
    "support"
   ],
   "css/css-logical/logical-box-border-style.html": [
-   "ad9ba7a5fd26a3d4f4465785dfbdc77177ab5d23",
+   "b6866f4c8957593d2bced410747fef3125221952",
    "testharness"
   ],
   "css/css-logical/logical-box-border-width-expected.txt": [
@@ -317506,7 +317547,7 @@
    "support"
   ],
   "css/css-logical/logical-box-border-width.html": [
-   "eced0215f89082de7f674caf3be2c0bf704d9faf",
+   "b18c41a7d15d97c12fdd36806f6eb1bb0dce36d7",
    "testharness"
   ],
   "css/css-logical/logical-box-inset-expected.txt": [
@@ -317514,7 +317555,7 @@
    "support"
   ],
   "css/css-logical/logical-box-inset.html": [
-   "b63ebeabb307cddca59a604084fb74809dbffe37",
+   "abc4f9182ca599418741c971e63e612c3d0386ba",
    "testharness"
   ],
   "css/css-logical/logical-box-margin-expected.txt": [
@@ -317522,7 +317563,7 @@
    "support"
   ],
   "css/css-logical/logical-box-margin.html": [
-   "ce777da59fbf772ac7b63928228491710ca32772",
+   "369d57d2ba5f1bbce20eba140487a21811b16a5e",
    "testharness"
   ],
   "css/css-logical/logical-box-padding-expected.txt": [
@@ -317530,7 +317571,7 @@
    "support"
   ],
   "css/css-logical/logical-box-padding.html": [
-   "0091cd5ff0f047dcd0fa46c4db871d13bbacabdf",
+   "5caadf842530d5b8a3d9f28fe4b464849b7e733c",
    "testharness"
   ],
   "css/css-logical/logical-box-size-expected.txt": [
@@ -317538,7 +317579,19 @@
    "support"
   ],
   "css/css-logical/logical-box-size.html": [
-   "f0a5d18ea2a33fbde40e290de33e7c1d3a1fc378",
+   "a9c71b487ace9e06b1eed86cb0f705291aeff96c",
+   "testharness"
+  ],
+  "css/css-logical/logical-values-float-clear.html": [
+   "9d59451a3d0fae82264ecc1c03e4054e397ae23f",
+   "testharness"
+  ],
+  "css/css-logical/logical-values-resize-expected.txt": [
+   "6fe016454d7393f1fba90ba48f260dbc8b98169b",
+   "support"
+  ],
+  "css/css-logical/logical-values-resize.html": [
+   "4611b26e50fee4d0e045fe42be25fa4ec91325be",
    "testharness"
   ],
   "css/css-logical/logicalprops-block-size-vlr.html": [
@@ -317562,7 +317615,15 @@
    "testharness"
   ],
   "css/css-logical/resources/test-box-properties.js": [
-   "2a9ed0b45186a1910d71a4d449b6c21f672e8250",
+   "4054e2e590a98fdeca0ec7aba0610ae17a3523a6",
+   "support"
+  ],
+  "css/css-logical/resources/test-logical-values.js": [
+   "b06a250d465efe8628f406d439a67d4207fda712",
+   "support"
+  ],
+  "css/css-logical/resources/test-shared.js": [
+   "c56a95408a8c5c5e8e3ba380b63482674f1074ec",
    "support"
   ],
   "css/css-masking/META.yml": [
@@ -345658,7 +345719,7 @@
    "testharness"
   ],
   "css/cssom/interfaces-expected.txt": [
-   "defaf5702e2b46cdb55dd2356e8a6bc53d54f3dc",
+   "9e7e2c9027e8ece2d166cf3c6c2593e9530845a7",
    "support"
   ],
   "css/cssom/interfaces.html": [
@@ -379614,15 +379675,11 @@
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/002.html": [
-   "6f633c653ba9fb431fe41f69687e37ac1083c320",
+   "344367d581edc92817888937c852320211605735",
    "testharness"
   ],
-  "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/004-1.html": [
-   "448f6f9971f92c4b9b7b7a536be353793f6147d6",
-   "support"
-  ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/004.html": [
-   "290990faf1c4107c80069110d28b925e65e4719c",
+   "30a1ae7a97090e0897d5e6e3237244077a9da0ef",
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/005-expected.txt": [
@@ -379630,15 +379687,11 @@
    "support"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/005.html": [
-   "6eb18f167496446c4c9d776e0f10be71c8f65a95",
+   "cda5dad49acef96f217730081f8b8493430ed032",
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/006.html": [
-   "94989d1ee98fb9e739a116b103c23e8d8108ac87",
-   "testharness"
-  ],
-  "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/007.html": [
-   "6a409aa8cd0629dc1f71977e3994d07ccc7bbcfd",
+   "35bff72f39a2f9b8266dd9b906eee238a7dee8e5",
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/008-expected.txt": [
@@ -379646,7 +379699,7 @@
    "support"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/008.html": [
-   "1c813722dd68b1a13348aa8071d99cf358ab9eca",
+   "69628e3809b5e5ddb75a105570f41db089d723ee",
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/009.https-expected.txt": [
@@ -379654,7 +379707,7 @@
    "support"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/009.https.html": [
-   "02278f0ed00b2392afcbcacd56ddd750b7204241",
+   "4c6f4c5244dfc54ec5795b5e19a136d5f655fb7f",
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/010-1.html": [
@@ -379670,11 +379723,11 @@
    "support"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/010.html": [
-   "95a5ad21f6ff58456d614f767046c5d3c2131460",
+   "bfb5a62c9f5943f6cb0bdec178b6a1d29f1ba8f5",
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/011-1.html": [
-   "5feea2d56edcfd872eeac109e2ff8e52acd6d60c",
+   "3e7bd7c1f8f6efce7d4cfea968835fc90a4026b7",
    "support"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/011.html": [
@@ -379682,7 +379735,7 @@
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/012-1.html": [
-   "923397f1eec1ea22f8515c44113dea080d9230eb",
+   "79380f879ca36dc504c34845789ea476725cb2d3",
    "support"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/012.html": [
@@ -379690,7 +379743,7 @@
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/013-1.html": [
-   "32cd8db0139a5d65ce3ade4906724b3897a9e64d",
+   "db6e9480d7185928da7f54c9e4ef4d08439117ab",
    "support"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/013.html": [
@@ -379698,7 +379751,7 @@
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/014-1.html": [
-   "23c430e683be5ea67d4be1c8ab7ff8064914199b",
+   "862aa5d24f6b7adcf804d49fe1176693a32c48bc",
    "support"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/014.html": [
@@ -379706,7 +379759,7 @@
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/015-1.html": [
-   "bfcf2e3d916c30f00f448f6c1b225be99f35c1c1",
+   "f05ef229a8bbb92107d8e9598e075efece24b6b9",
    "support"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/015-expected.txt": [
@@ -379718,7 +379771,7 @@
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016-1.html": [
-   "3320a164d93b8d39254c4609a5320e2f1bd115b2",
+   "a1dca6ef99e9ccc8b8575409d1a48e7a4759bdf4",
    "support"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016-expected.txt": [
@@ -379738,7 +379791,7 @@
    "support"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window.js": [
-   "6cd609805d6eb7c8dc701ac7286d9fd1c920f484",
+   "5c2bc5c2a1f8e5d45bca135dc0a894f5a3253e47",
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-same-origin-domain.sub.window.js": [
@@ -379746,7 +379799,7 @@
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-synchronous-script.window.js": [
-   "b725a11dad2765f1674369b3852be2eea3b92adc",
+   "9d12a126e2d8aa11f816f8b6d48a29795c44b021",
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-xml.window.js": [
@@ -379754,7 +379807,7 @@
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/custom-element.window.js": [
-   "f6c02de00d0d8edb20f1503304561c8deb36da79",
+   "cf2defc2d01fbfec7514fc9b791fd306a6c0099c",
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/document.open-01.xhtml": [
@@ -379778,11 +379831,11 @@
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/encoding.window.js": [
-   "b021d6fcc38925ddf39309e21716c5be37791247",
+   "fa2af4d587b07c5e2b925c9b0297ac1294446a8d",
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js": [
-   "ccf357a8081b99de1d85e05196145e83b3de2ab5",
+   "5d301193b16c624b0d56dbc266c005ac9996ad72",
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window-expected.txt": [
@@ -379790,11 +379843,11 @@
    "support"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.js": [
-   "ec477e24eaca19f35b250ef49ceaa94c05238b69",
+   "e18e242f8c727be15512d6b8b6b9d41c3899971f",
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-events.window.js": [
-   "1e1c656e1d19c9c459faf16327e099a4c9e13872",
+   "2853c643c684eec460532d20e39b5471d85d36bc",
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/origin-check-in-document-open-basic.html": [
@@ -379834,11 +379887,11 @@
    "support"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/type-argument-plaintext.window.js": [
-   "1f440ff93300a0ab715982feb067dd3162c8fce9",
+   "f5c4a43c96f71b600e150eda9fdcbb9a01b919fc",
    "testharness"
   ],
   "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/type-argument.window.js": [
-   "0f0020e1d7d8050892ef146d687178cfe8eedcd2",
+   "b218084f1b43c74033eb597ec75e0af7d0ed602b",
    "testharness"
   ],
   "html/webappapis/microtask-queuing/queue-microtask-exceptions.any-expected.txt": [
@@ -382902,7 +382955,7 @@
    "testharness"
   ],
   "mediacapture-streams/MediaStream-removetrack.https-expected.txt": [
-   "87065c67c9c3745c68dae5d5ef498c276ec20eda",
+   "a7755b454079db43f9d25e8485fab9c11d56ac83",
    "support"
   ],
   "mediacapture-streams/MediaStream-removetrack.https.html": [
@@ -401809,12 +401862,8 @@
    "7241035c47bc2a0251826d2c9ad3bc5f9acd61d2",
    "testharness"
   ],
-  "secure-contexts/idlharness.any-expected.txt": [
-   "aa9f95dfee4acab2218abd6dee63cf09df9a4aff",
-   "support"
-  ],
   "secure-contexts/idlharness.any.js": [
-   "aadb6cb566dfa52c34e7c9f261874ecbcb55d13a",
+   "14706e7b7f48f96042c390283f94cb8780fe3f5a",
    "testharness"
   ],
   "secure-contexts/postMessage-helper.html": [
@@ -406034,15 +406083,23 @@
    "manual"
   ],
   "speech-api/SpeechSynthesis-speak-ownership-expected.txt": [
-   "d0f7cd2adefa9222ee2b81fa31e5f007e904ddd2",
+   "5edd57227d0a3cdba212f9d71ef40c0cee432c7a",
    "support"
   ],
   "speech-api/SpeechSynthesis-speak-ownership.html": [
-   "6d72bb9c89ef527709fb01608e8b4d7e7bb7ccf7",
+   "bb75dab8c1a510ec45aa567a7430601a5c86c303",
    "testharness"
   ],
   "speech-api/SpeechSynthesis-speak-twice.html": [
-   "60eaf93103abe422222307b3c4172f2a0fabee57",
+   "5e7fc3f3b5e3c0e2ad0ac7e2d03b8bc7e6d97bc8",
+   "testharness"
+  ],
+  "speech-api/SpeechSynthesis-speak-with-activation-succeeds.html": [
+   "92e994d589de710f8203111291f3ad0b2f799ecd",
+   "testharness"
+  ],
+  "speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html": [
+   "e8d76a8cee60f5921aa02c03b7df5ea420590bc2",
    "testharness"
   ],
   "speech-api/SpeechSynthesisUtterance-basics.https-expected.txt": [
@@ -406350,7 +406407,7 @@
    "testharness"
   ],
   "streams/piping/multiple-propagation.js": [
-   "a4f9df6a5da581c14aae0d489bc73972873f2b7d",
+   "60e6d249fa1310b788ffb4b7702dcfd249ec27ac",
    "support"
   ],
   "streams/piping/multiple-propagation.serviceworker.https.html": [
@@ -407881,6 +407938,14 @@
    "510bd6b75e4e3688fd604fa7145c27587e63d6ff",
    "reftest"
   ],
+  "svg/painting/reftests/paint-order-001-ref.svg": [
+   "56cd3768472f9f5564a5835eb2dabcbdb232f854",
+   "support"
+  ],
+  "svg/painting/reftests/paint-order-001.svg": [
+   "3c22542d718a708877b81a8522195a7b1f1d0577",
+   "reftest"
+  ],
   "svg/path/bearing/absolute-ref.svg": [
    "6ad5320a05fcc31fd2af98d2bbd0bd6fbc558daa",
    "support"
@@ -418421,10 +418486,6 @@
    "1f5a6dcb95464a46817c2b6ad09af6f64d53f128",
    "testharness"
   ],
-  "workers/modules/dedicated-worker-import-referrer-expected.txt": [
-   "849c2ffb7101b181e27bec999df756e4f8a3a992",
-   "support"
-  ],
   "workers/modules/dedicated-worker-import-referrer.html": [
    "c41d89774837e4816b197e2b2b93bee23fc42cb4",
    "testharness"
@@ -419034,7 +419095,7 @@
    "testharness"
   ],
   "worklets/animation-worklet-referrer.https-expected.txt": [
-   "a4fdf44bc0ae720bce19cc1d5252908615514c12",
+   "56c56125da0f32e1330e55fe6d3c527e9250f53d",
    "support"
   ],
   "worklets/animation-worklet-referrer.https.html": [
@@ -419062,7 +419123,7 @@
    "testharness"
   ],
   "worklets/layout-worklet-referrer.https-expected.txt": [
-   "a4fdf44bc0ae720bce19cc1d5252908615514c12",
+   "56c56125da0f32e1330e55fe6d3c527e9250f53d",
    "support"
   ],
   "worklets/layout-worklet-referrer.https.html": [
@@ -419086,7 +419147,7 @@
    "testharness"
   ],
   "worklets/paint-worklet-referrer.https-expected.txt": [
-   "a4fdf44bc0ae720bce19cc1d5252908615514c12",
+   "56c56125da0f32e1330e55fe6d3c527e9250f53d",
    "support"
   ],
   "worklets/paint-worklet-referrer.https.html": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/style_attribute_allowed.html b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/style_attribute_allowed.html
index 69657ef..568c469 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/style_attribute_allowed.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/content-security-policy/unsafe-hashes/style_attribute_allowed.html
@@ -17,10 +17,9 @@
     <script>
         var t1 = async_test("Test that the inline style attribute is loaded");
 
-        function check_for_style() {
+        self.check_for_style = t1.step_func_done(function() {
           assert_equals("green", document.getElementById('test').style.background);
-          t1.done();
-        }
+        });
 
         window.addEventListener('securitypolicyviolation', t1.unreached_func("Should have not raised any event"));
     </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/cookies/resources/cookie-helper.sub.js b/third_party/WebKit/LayoutTests/external/wpt/cookies/resources/cookie-helper.sub.js
index 852fbb6..428cab04 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/cookies/resources/cookie-helper.sub.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/cookies/resources/cookie-helper.sub.js
@@ -48,19 +48,19 @@
 }
 
 // Remove the cookie named |name| from |origin|, then set it on |origin| anew.
-// If |origin| matches `document.origin`, also assert (via `document.cookie`) that
+// If |origin| matches `self.origin`, also assert (via `document.cookie`) that
 // the cookie was correctly removed and reset.
 function create_cookie(origin, name, value, extras) {
   alert("Create_cookie: " + origin + "/cookies/resources/drop.py?name=" + name);
   return credFetch(origin + "/cookies/resources/drop.py?name=" + name)
     .then(_ => {
-      if (origin == document.origin)
+      if (origin == self.origin)
         assert_dom_cookie(name, value, false);
     })
     .then(_ => {
       return credFetch(origin + "/cookies/resources/set.py?" + name + "=" + value + ";path=/;" + extras)
         .then(_ => {
-          if (origin == document.origin)
+          if (origin == self.origin)
             assert_dom_cookie(name, value, true);
         });
     });
@@ -96,7 +96,7 @@
 
     var name = options.prefix + "prefixtestcookie";
     if (!options.origin) {
-      options.origin = document.origin;
+      options.origin = self.origin;
       erase_cookie_from_js(name);
       return postDelete;
     } else {
@@ -116,12 +116,12 @@
   STRICT: "strict"
 };
 
-// Reset SameSite test cookies on |origin|. If |origin| matches `document.origin`, assert
+// Reset SameSite test cookies on |origin|. If |origin| matches `self.origin`, assert
 // (via `document.cookie`) that they were properly removed and reset.
 function resetSameSiteCookies(origin, value) {
   return credFetch(origin + "/cookies/resources/dropSameSite.py")
     .then(_ => {
-      if (origin == document.origin) {
+      if (origin == self.origin) {
         assert_dom_cookie("samesite_strict", value, false);
         assert_dom_cookie("samesite_lax", value, false);
         assert_dom_cookie("samesite_none", value, false);
@@ -130,7 +130,7 @@
     .then(_ => {
       return credFetch(origin + "/cookies/resources/setSameSite.py?" + value)
         .then(_ => {
-          if (origin == document.origin) {
+          if (origin == self.origin) {
             assert_dom_cookie("samesite_strict", value, true);
             assert_dom_cookie("samesite_lax", value, true);
             assert_dom_cookie("samesite_none", value, true);
@@ -164,12 +164,12 @@
   BOTH_COOKIES: "2",
 };
 
-//Reset SameSite test cookies on |origin|. If |origin| matches `document.origin`, assert
+//Reset SameSite test cookies on |origin|. If |origin| matches `self.origin`, assert
 //(via `document.cookie`) that they were properly removed and reset.
 function resetSecureCookies(origin, value) {
 return credFetch(origin + "/cookies/resources/dropSecure.py")
  .then(_ => {
-   if (origin == document.origin) {
+   if (origin == self.origin) {
      assert_dom_cookie("alone_secure", value, false);
      assert_dom_cookie("alone_insecure", value, false);
    }
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-color.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-color.html
index c279ef4..b33528d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-color.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-color.html
@@ -9,7 +9,7 @@
 
 <div id="log"></div>
 
-<script src="./resources/test-box-properties.js"></script>
-<script>
+<script type="module">
+import {runTests, createBoxPropertyGroup} from "./resources/test-box-properties.js";
 runTests(createBoxPropertyGroup("border-*-color", {type: "color"}));
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-shorthands.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-shorthands.html
index 497d9f4..d05d864 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-shorthands.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-shorthands.html
@@ -9,7 +9,7 @@
 
 <div id="log"></div>
 
-<script src="./resources/test-box-properties.js"></script>
-<script>
+<script type="module">
+import {runTests, createBoxPropertyGroup} from "./resources/test-box-properties.js";
 runTests(createBoxPropertyGroup("border-*", {type: ["length", "border-style", "color"]}));
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-style.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-style.html
index 4954bac3..448499d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-style.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-style.html
@@ -9,7 +9,7 @@
 
 <div id="log"></div>
 
-<script src="./resources/test-box-properties.js"></script>
-<script>
+<script type="module">
+import {runTests, createBoxPropertyGroup} from "./resources/test-box-properties.js";
 runTests(createBoxPropertyGroup("border-*-style", {type: "border-style"}));
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-width.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-width.html
index 7396ce7..d7cac48 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-width.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-border-width.html
@@ -9,8 +9,8 @@
 
 <div id="log"></div>
 
-<script src="./resources/test-box-properties.js"></script>
-<script>
+<script type="module">
+import {runTests, createBoxPropertyGroup} from "./resources/test-box-properties.js";
 runTests(createBoxPropertyGroup("border-*-width", {
   type: "length",
   prerequisites: {"border-*-style": "solid"},
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-inset.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-inset.html
index 005a269..8587d79e 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-inset.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-inset.html
@@ -9,8 +9,8 @@
 
 <div id="log"></div>
 
-<script src="./resources/test-box-properties.js"></script>
-<script>
+<script type="module">
+import {runTests, createBoxPropertyGroup} from "./resources/test-box-properties.js";
 runTests(createBoxPropertyGroup("inset-*", {
   type: "length",
   prerequisites: {"position": "relative"},
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-margin.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-margin.html
index 5fcd5c38..86240f9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-margin.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-margin.html
@@ -9,7 +9,7 @@
 
 <div id="log"></div>
 
-<script src="./resources/test-box-properties.js"></script>
-<script>
+<script type="module">
+import {runTests, createBoxPropertyGroup} from "./resources/test-box-properties.js";
 runTests(createBoxPropertyGroup("margin-*", {type: "length"}));
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-padding.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-padding.html
index b3f6b6f..f96f02757 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-padding.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-padding.html
@@ -9,7 +9,7 @@
 
 <div id="log"></div>
 
-<script src="./resources/test-box-properties.js"></script>
-<script>
+<script type="module">
+import {runTests, createBoxPropertyGroup} from "./resources/test-box-properties.js";
 runTests(createBoxPropertyGroup("padding-*", {type: "length"}));
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-size.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-size.html
index 90d8e4405..f90346b8 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-size.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-box-size.html
@@ -9,8 +9,8 @@
 
 <div id="log"></div>
 
-<script src="./resources/test-box-properties.js"></script>
-<script>
+<script type="module">
+import {runTests, createSizingPropertyGroup} from "./resources/test-box-properties.js";
 runTests(createSizingPropertyGroup(""));
 runTests(createSizingPropertyGroup("max-"));
 runTests(createSizingPropertyGroup("min-"));
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-values-float-clear.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-values-float-clear.html
new file mode 100644
index 0000000..e827658
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-values-float-clear.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>CSS Logical Values: Flow-Relative Values for the 'float' and 'clear' Properties</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com" />
+<link rel="help" href="https://drafts.csswg.org/css-logical/#float-clear">
+<meta name="assert" content="This test checks the flow-relative values for 'float' and 'clear' in different writing modes." />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {runTests} from "./resources/test-logical-values.js";
+const values = ["inline-start", "inline-end"];
+runTests("clear", values);
+runTests("float", values);
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-values-resize-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-values-resize-expected.txt
new file mode 100644
index 0000000..b65de31
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-values-resize-expected.txt
@@ -0,0 +1,25 @@
+This is a testharness.js-based test.
+PASS Test that 'resize: block' is supported.
+PASS Test 'resize: block' with 'writing-mode: horizontal-tb; direction: ltr; '.
+PASS Test 'resize: block' with 'writing-mode: horizontal-tb; direction: rtl; '.
+PASS Test 'resize: block' with 'writing-mode: vertical-rl; direction: rtl; '.
+FAIL Test 'resize: block' with 'writing-mode: sideways-rl; direction: rtl; '. assert_equals: computed value, resize expected "horizontal" but got "vertical"
+PASS Test 'resize: block' with 'writing-mode: vertical-rl; direction: ltr; '.
+FAIL Test 'resize: block' with 'writing-mode: sideways-rl; direction: ltr; '. assert_equals: computed value, resize expected "horizontal" but got "vertical"
+PASS Test 'resize: block' with 'writing-mode: vertical-lr; direction: rtl; '.
+FAIL Test 'resize: block' with 'writing-mode: sideways-lr; direction: ltr; '. assert_equals: computed value, resize expected "horizontal" but got "vertical"
+PASS Test 'resize: block' with 'writing-mode: vertical-lr; direction: ltr; '.
+FAIL Test 'resize: block' with 'writing-mode: sideways-lr; direction: rtl; '. assert_equals: computed value, resize expected "horizontal" but got "vertical"
+PASS Test that 'resize: inline' is supported.
+PASS Test 'resize: inline' with 'writing-mode: horizontal-tb; direction: ltr; '.
+PASS Test 'resize: inline' with 'writing-mode: horizontal-tb; direction: rtl; '.
+PASS Test 'resize: inline' with 'writing-mode: vertical-rl; direction: rtl; '.
+FAIL Test 'resize: inline' with 'writing-mode: sideways-rl; direction: rtl; '. assert_equals: computed value, resize expected "vertical" but got "horizontal"
+PASS Test 'resize: inline' with 'writing-mode: vertical-rl; direction: ltr; '.
+FAIL Test 'resize: inline' with 'writing-mode: sideways-rl; direction: ltr; '. assert_equals: computed value, resize expected "vertical" but got "horizontal"
+PASS Test 'resize: inline' with 'writing-mode: vertical-lr; direction: rtl; '.
+FAIL Test 'resize: inline' with 'writing-mode: sideways-lr; direction: ltr; '. assert_equals: computed value, resize expected "vertical" but got "horizontal"
+PASS Test 'resize: inline' with 'writing-mode: vertical-lr; direction: ltr; '.
+FAIL Test 'resize: inline' with 'writing-mode: sideways-lr; direction: rtl; '. assert_equals: computed value, resize expected "vertical" but got "horizontal"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-values-resize.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-values-resize.html
new file mode 100644
index 0000000..3be65da
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/logical-values-resize.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>CSS Logical Values: Flow-Relative Values for the 'resize' Property</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com" />
+<link rel="help" href="https://drafts.csswg.org/css-logical/#resize">
+<meta name="assert" content="This test checks the flow-relative values for 'resize' in different writing modes." />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {runTests} from "./resources/test-logical-values.js";
+runTests("resize", ["block", "inline"]);
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/resources/test-box-properties.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/resources/test-box-properties.js
index 5170769..9d73b5b8 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/resources/test-box-properties.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/resources/test-box-properties.js
@@ -1,295 +1,226 @@
-"use strict";
-(function(exports) {
-  const sheet = document.head.appendChild(document.createElement("style"));
+import {
+  testElement,
+  writingModes,
+  testCSSValues,
+  testComputedValues,
+  makeDeclaration
+} from "./test-shared.js";
 
-  // Specify size for outer <div> to avoid unconstrained-size warnings
-  // when writing-mode of the inner test <div> is vertical-*
-  const wrapper = document.body.appendChild(document.createElement("div"));
-  wrapper.style.cssText = "width:100px; height: 100px;";
-  const testElement = wrapper.appendChild(document.createElement("div"));
-  testElement.id = testElement.className = "test";
+// Values to use while testing
+const testValues = {
+  "length": ["1px", "2px", "3px", "4px", "5px"],
+  "color": ["rgb(1, 1, 1)", "rgb(2, 2, 2)", "rgb(3, 3, 3)", "rgb(4, 4, 4)", "rgb(5, 5, 5)"],
+  "border-style": ["solid", "dashed", "dotted", "double", "groove"],
+};
 
-  // Values to use while testing
-  const testValues = {
-    "length": ["1px", "2px", "3px", "4px", "5px"],
-    "color": ["rgb(1, 1, 1)", "rgb(2, 2, 2)", "rgb(3, 3, 3)", "rgb(4, 4, 4)", "rgb(5, 5, 5)"],
-    "border-style": ["solid", "dashed", "dotted", "double", "groove"],
+/**
+ * Creates a group of physical and logical box properties, such as
+ *
+ * { physical: {
+ *     left: "margin-left", right: "margin-right",
+ *     top: "margin-top", bottom: "margin-bottom",
+ *   }, logical: {
+ *     inlineStart: "margin-inline-start", inlineEnd: "margin-inline-end",
+ *     blockStart: "margin-block-start", blockEnd: "margin-block-end",
+ *   }, shorthands: {
+ *     inline: ["margin-inline-start", "margin-inline-end"],
+ *     block: ["margin-block-start", "margin-block-end"],
+ *   }, type: ["length"], prerequisites: "...", property: "'margin-*'" }
+ *
+ * @param {string} property
+ *        A string representing the property names, like "margin-*".
+ * @param {Object} descriptor
+ * @param {string|string[]} descriptor.type
+ *        Describes the kind of values accepted by the property, like "length".
+ *        Must be a key or a collection of keys from the `testValues` object.
+ * @param {Object={}} descriptor.prerequisites
+ *        Represents property declarations that are needed by `property` to work.
+ *        For example, border-width properties require a border style.
+ */
+export function createBoxPropertyGroup(property, descriptor) {
+  const logical = {};
+  const physical = {};
+  const shorthands = {};
+  for (const axis of ["inline", "block"]) {
+    const shorthand = property.replace("*", axis);
+    const longhands = [];
+    shorthands[shorthand] = longhands;
+    for (const side of ["start", "end"]) {
+      const logicalSide = axis + "-" + side;
+      const camelCase = logicalSide.replace(/-(.)/g, (match, $1) => $1.toUpperCase());
+      const longhand = property.replace("*", logicalSide);
+      logical[camelCase] = longhand;
+      longhands.push(longhand);
+    }
+  }
+  const isInset = property === "inset-*";
+  let prerequisites = "";
+  for (const physicalSide of ["left", "right", "top", "bottom"]) {
+    physical[physicalSide] = isInset ? physicalSide : property.replace("*", physicalSide);
+    prerequisites += makeDeclaration(descriptor.prerequisites, physicalSide);
+  }
+  const type = [].concat(descriptor.type);
+  return {name, logical, physical, shorthands, type, prerequisites, property};
+}
+
+/**
+ * Creates a group of physical and logical sizing properties.
+ *
+ * @param {string} prefix
+ *        One of "", "max-" or "min-".
+ */
+export function createSizingPropertyGroup(prefix) {
+  return {
+    logical: {
+      inline: `${prefix}inline-size`,
+      block: `${prefix}block-size`,
+    },
+    physical: {
+      horizontal: `${prefix}width`,
+      vertical: `${prefix}height`,
+    },
+    type: ["length"],
+    prerequisites: makeDeclaration({display: "block"}),
+    property: (prefix ? prefix.slice(0, -1) + " " : "") + "sizing",
   };
+}
 
-  // Six unique overall writing modes for property-mapping purposes.
-  const writingModes = [
-    {
-      styles: [
-        {"writing-mode": "horizontal-tb", "direction": "ltr"},
-      ],
-      blockStart: "top", blockEnd: "bottom", inlineStart: "left", inlineEnd: "right",
-      block: "vertical", inline: "horizontal" },
-    {
-      styles: [
-        {"writing-mode": "horizontal-tb", "direction": "rtl"},
-      ],
-      blockStart: "top", blockEnd: "bottom", inlineStart: "right", inlineEnd: "left",
-      block: "vertical", inline: "horizontal" },
-    {
-      styles: [
-        {"writing-mode": "vertical-rl", "direction": "rtl"},
-        {"writing-mode": "sideways-rl", "direction": "rtl"},
-      ],
-      blockStart: "right", blockEnd: "left", inlineStart: "bottom", inlineEnd: "top",
-      block: "horizontal", inline: "vertical" },
-    {
-      styles: [
-        {"writing-mode": "vertical-rl", "direction": "ltr"},
-        {"writing-mode": "sideways-rl", "direction": "ltr"},
-      ],
-      blockStart: "right", blockEnd: "left", inlineStart: "top", inlineEnd: "bottom",
-      block: "horizontal", inline: "vertical" },
-    {
-      styles: [
-        {"writing-mode": "vertical-lr", "direction": "rtl"},
-        {"writing-mode": "sideways-lr", "direction": "ltr"},
-      ],
-      blockStart: "left", blockEnd: "right", inlineStart: "bottom", inlineEnd: "top",
-      block: "horizontal", inline: "vertical" },
-    {
-      styles: [
-        {"writing-mode": "vertical-lr", "direction": "ltr"},
-        {"writing-mode": "sideways-lr", "direction": "rtl"},
-      ],
-      blockStart: "left", blockEnd: "right", inlineStart: "top", inlineEnd: "bottom",
-      block: "horizontal", inline: "vertical" },
-  ];
+/**
+ * Tests a grup of logical and physical properties in different writing modes.
+ *
+ * @param {Object} group
+ *        An object returned by createBoxPropertyGroup or createSizingPropertyGroup.
+ */
+export function runTests(group) {
+  const values = testValues[group.type[0]].map(function(_, i) {
+    return group.type.map(type => testValues[type][i]).join(" ");
+  });
+  const logicals = Object.values(group.logical);
+  const physicals = Object.values(group.physical);
+  const shorthands = group.shorthands ? Object.entries(group.shorthands) : null;
 
-  function testCSSValues(testName, style, expectedValues) {
-    for (const [property, value] of expectedValues) {
-      assert_equals(style.getPropertyValue(property), value, `${testName}, ${property}`);
+  test(function() {
+    const expected = [];
+    for (const [i, logicalProp] of logicals.entries()) {
+      testElement.style.setProperty(logicalProp, values[i]);
+      expected.push([logicalProp, values[i]]);
     }
-  }
+    testCSSValues("logical properties in inline style", testElement.style, expected);
+  }, `Test that logical ${group.property} properties are supported.`);
+  testElement.style.cssText = "";
 
-  function testComputedValues(testName, rules, expectedValues) {
-    sheet.textContent = rules;
-    const cs = getComputedStyle(testElement);
-    testCSSValues(testName, cs, expectedValues);
-    sheet.textContent = "";
-  }
+  for (const writingMode of writingModes) {
+    for (const style of writingMode.styles) {
+      const writingModeDecl = makeDeclaration(style);
 
-  function makeDeclaration(object = {}, replacement = "*") {
-    let decl = "";
-    for (const [property, value] of Object.entries(object)) {
-      decl += `${property.replace("*", replacement)}: ${value}; `;
-    }
-    return decl;
-  }
-
-  /**
-   * Creates a group of physical and logical box properties, such as
-   *
-   * { physical: {
-   *     left: "margin-left", right: "margin-right",
-   *     top: "margin-top", bottom: "margin-bottom",
-   *   }, logical: {
-   *     inlineStart: "margin-inline-start", inlineEnd: "margin-inline-end",
-   *     blockStart: "margin-block-start", blockEnd: "margin-block-end",
-   *   }, shorthands: {
-   *     inline: ["margin-inline-start", "margin-inline-end"],
-   *     block: ["margin-block-start", "margin-block-end"],
-   *   }, type: ["length"], prerequisites: "...", property: "'margin-*'" }
-   *
-   * @param {string} property
-   *        A string representing the property names, like "margin-*".
-   * @param {Object} descriptor
-   * @param {string|string[]} descriptor.type
-   *        Describes the kind of values accepted by the property, like "length".
-   *        Must be a key or a collection of keys from the `testValues` object.
-   * @param {Object={}} descriptor.prerequisites
-   *        Represents property declarations that are needed by `property` to work.
-   *        For example, border-width properties require a border style.
-   */
-  exports.createBoxPropertyGroup = function(property, descriptor) {
-    const logical = {};
-    const physical = {};
-    const shorthands = {};
-    for (const axis of ["inline", "block"]) {
-      const shorthand = property.replace("*", axis);
-      const longhands = [];
-      shorthands[shorthand] = longhands;
-      for (const side of ["start", "end"]) {
-        const logicalSide = axis + "-" + side;
-        const camelCase = logicalSide.replace(/-(.)/g, (match, $1) => $1.toUpperCase());
-        const longhand = property.replace("*", logicalSide);
-        logical[camelCase] = longhand;
-        longhands.push(longhand);
+      const associated = {};
+      for (const [logicalSide, logicalProp] of Object.entries(group.logical)) {
+        const physicalProp = group.physical[writingMode[logicalSide]];
+        associated[logicalProp] = physicalProp;
+        associated[physicalProp] = logicalProp;
       }
-    }
-    const isInset = property === "inset-*";
-    let prerequisites = "";
-    for (const physicalSide of ["left", "right", "top", "bottom"]) {
-      physical[physicalSide] = isInset ? physicalSide : property.replace("*", physicalSide);
-      prerequisites += makeDeclaration(descriptor.prerequisites, physicalSide);
-    }
-    const type = [].concat(descriptor.type);
-    return {name, logical, physical, shorthands, type, prerequisites, property};
-  };
 
-  /**
-   * Creates a group of physical and logical sizing properties.
-   *
-   * @param {string} prefix
-   *        One of "", "max-" or "min-".
-   */
-  exports.createSizingPropertyGroup = function(prefix) {
-    return {
-      logical: {
-        inline: `${prefix}inline-size`,
-        block: `${prefix}block-size`,
-      },
-      physical: {
-        horizontal: `${prefix}width`,
-        vertical: `${prefix}height`,
-      },
-      type: ["length"],
-      prerequisites: makeDeclaration({display: "block"}),
-      property: (prefix ? prefix.slice(0, -1) + " " : "") + "sizing",
-    };
-  };
+      // Test that logical properties are converted to their physical
+      // equivalent correctly when all in the group are present on a single
+      // declaration, with no overwriting of previous properties and
+      // no physical properties present.  We put the writing mode properties
+      // on a separate declaration to test that the computed values of these
+      // properties are used, rather than those on the same declaration.
+      test(function() {
+        let decl = group.prerequisites;
+        const expected = [];
+        for (const [i, logicalProp] of logicals.entries()) {
+          decl += `${logicalProp}: ${values[i]}; `;
+          expected.push([logicalProp, values[i]]);
+          expected.push([associated[logicalProp], values[i]]);
+        }
+        testComputedValues("logical properties on one declaration, writing " +
+                           `mode properties on another, '${writingModeDecl}'`,
+                           `.test { ${writingModeDecl} } .test { ${decl} }`,
+                           expected);
+      }, `Test that logical ${group.property} properties share computed values `
+       + `with their physical associates, with '${writingModeDecl}'.`);
 
-  /**
-   * Tests a grup of logical and physical properties in different writing modes.
-   *
-   * @param {Object} group
-   *        An object returned by createBoxPropertyGroup or createSizingPropertyGroup.
-   */
-  exports.runTests = function(group) {
-    const values = testValues[group.type[0]].map(function(_, i) {
-      return group.type.map(type => testValues[type][i]).join(" ");
-    });
-    const logicals = Object.values(group.logical);
-    const physicals = Object.values(group.physical);
-    const shorthands = group.shorthands ? Object.entries(group.shorthands) : null;
 
-    test(function() {
-      const expected = [];
-      for (const [i, logicalProp] of logicals.entries()) {
-        testElement.style.setProperty(logicalProp, values[i]);
-        expected.push([logicalProp, values[i]]);
+      // Test logical shorthand properties.
+      if (shorthands) {
+        test(function() {
+          for (const [shorthand, longhands] of shorthands) {
+            let shorthandValues;
+            if (group.type.length > 1) {
+              shorthandValues = [values[0]];
+            } else {
+              shorthandValues = testValues[group.type].slice(0, longhands.length);
+            }
+            const decl = group.prerequisites + `${shorthand}: ${shorthandValues.join(" ")}; `;
+            const expected = [];
+            for (let [i, longhand] of longhands.entries()) {
+              const longhandValue = shorthandValues[group.type.length > 1 ? 0 : i];
+              expected.push([longhand, longhandValue]);
+              expected.push([associated[longhand], longhandValue]);
+            }
+            testComputedValues("shorthand properties on one declaration, writing " +
+                               `mode properties on another, '${writingModeDecl}'`,
+                               `.test { ${writingModeDecl} } .test { ${decl} }`,
+                               expected);
+          }
+        }, `Test that ${group.property} shorthands set the computed value of both `
+         + `logical and physical longhands, with '${writingModeDecl}'.`);
       }
-      testCSSValues("logical properties in inline style", testElement.style, expected);
-    }, `Test that logical ${group.property} properties are supported.`);
-    testElement.style.cssText = "";
 
-    for (const writingMode of writingModes) {
-      for (const style of writingMode.styles) {
-        const writingModeDecl = makeDeclaration(style);
-
-        const associated = {};
-        for (const [logicalSide, logicalProp] of Object.entries(group.logical)) {
-          const physicalProp = group.physical[writingMode[logicalSide]];
-          associated[logicalProp] = physicalProp;
-          associated[physicalProp] = logicalProp;
-        }
-
-        // Test that logical properties are converted to their physical
-        // equivalent correctly when all in the group are present on a single
-        // declaration, with no overwriting of previous properties and
-        // no physical properties present.  We put the writing mode properties
-        // on a separate declaration to test that the computed values of these
-        // properties are used, rather than those on the same declaration.
-        test(function() {
-          let decl = group.prerequisites;
-          const expected = [];
-          for (const [i, logicalProp] of logicals.entries()) {
-            decl += `${logicalProp}: ${values[i]}; `;
-            expected.push([logicalProp, values[i]]);
-            expected.push([associated[logicalProp], values[i]]);
-          }
-          testComputedValues("logical properties on one declaration, writing " +
-                             `mode properties on another, '${writingModeDecl}'`,
-                             `.test { ${writingModeDecl} } .test { ${decl} }`,
-                             expected);
-        }, `Test that logical ${group.property} properties share computed values `
-         + `with their physical associates, with '${writingModeDecl}'.`);
-
-
-        // Test logical shorthand properties.
-        if (shorthands) {
-          test(function() {
-            for (const [shorthand, longhands] of shorthands) {
-              let shorthandValues;
-              if (group.type.length > 1) {
-                shorthandValues = [values[0]];
-              } else {
-                shorthandValues = testValues[group.type].slice(0, longhands.length);
-              }
-              const decl = group.prerequisites + `${shorthand}: ${shorthandValues.join(" ")}; `;
-              const expected = [];
-              for (let [i, longhand] of longhands.entries()) {
-                const longhandValue = shorthandValues[group.type.length > 1 ? 0 : i];
-                expected.push([longhand, longhandValue]);
-                expected.push([associated[longhand], longhandValue]);
-              }
-              testComputedValues("shorthand properties on one declaration, writing " +
-                                 `mode properties on another, '${writingModeDecl}'`,
-                                 `.test { ${writingModeDecl} } .test { ${decl} }`,
-                                 expected);
-            }
-          }, `Test that ${group.property} shorthands set the computed value of both `
-           + `logical and physical longhands, with '${writingModeDecl}'.`);
-        }
-
-        // Test that logical and physical properties are cascaded together,
-        // honoring their relative order on a single declaration
-        // (a) with a single logical property after the physical ones
-        // (b) with a single physical property after the logical ones
-        test(function() {
-          for (const lastIsLogical of [true, false]) {
-            const lasts = lastIsLogical ? logicals : physicals;
-            const others = lastIsLogical ? physicals : logicals;
-            for (const lastProp of lasts) {
-              let decl = writingModeDecl + group.prerequisites;
-              const expected = [];
-              for (const [i, prop] of others.entries()) {
-                decl += `${prop}: ${values[i]}; `;
-                const valueIdx = associated[prop] === lastProp ? others.length : i;
-                expected.push([prop, values[valueIdx]]);
-                expected.push([associated[prop], values[valueIdx]]);
-              }
-              decl += `${lastProp}: ${values[others.length]}; `;
-              testComputedValues(`'${lastProp}' last on single declaration, '${writingModeDecl}'`,
-                                 `.test { ${decl} }`,
-                                 expected);
-            }
-          }
-        }, `Test that ${group.property} properties honor order of appearance when both `
-         + `logical and physical associates are declared, with '${writingModeDecl}'.`);
-
-        // Test that logical and physical properties are cascaded properly when
-        // on different declarations
-        // (a) with a logical property in the high specificity rule
-        // (b) with a physical property in the high specificity rule
-        test(function() {
-          for (const highIsLogical of [true, false]) {
-            let lowDecl = writingModeDecl + group.prerequisites;
-            const high = highIsLogical ? logicals : physicals;
-            const others = highIsLogical ? physicals : logicals;
+      // Test that logical and physical properties are cascaded together,
+      // honoring their relative order on a single declaration
+      // (a) with a single logical property after the physical ones
+      // (b) with a single physical property after the logical ones
+      test(function() {
+        for (const lastIsLogical of [true, false]) {
+          const lasts = lastIsLogical ? logicals : physicals;
+          const others = lastIsLogical ? physicals : logicals;
+          for (const lastProp of lasts) {
+            let decl = writingModeDecl + group.prerequisites;
+            const expected = [];
             for (const [i, prop] of others.entries()) {
-              lowDecl += `${prop}: ${values[i]}; `;
+              decl += `${prop}: ${values[i]}; `;
+              const valueIdx = associated[prop] === lastProp ? others.length : i;
+              expected.push([prop, values[valueIdx]]);
+              expected.push([associated[prop], values[valueIdx]]);
             }
-            for (const highProp of high) {
-              const highDecl = `${highProp}: ${values[others.length]}; `;
-              const expected = [];
-              for (const [i, prop] of others.entries()) {
-                const valueIdx = associated[prop] === highProp ? others.length : i;
-                expected.push([prop, values[valueIdx]]);
-                expected.push([associated[prop], values[valueIdx]]);
-              }
-              testComputedValues(`'${highProp}', two declarations, '${writingModeDecl}'`,
-                                 `#test { ${highDecl} } .test { ${lowDecl} }`,
-                                 expected);
-            }
+            decl += `${lastProp}: ${values[others.length]}; `;
+            testComputedValues(`'${lastProp}' last on single declaration, '${writingModeDecl}'`,
+                               `.test { ${decl} }`,
+                               expected);
           }
-        }, `Test that ${group.property} properties honor selector specificty when both `
-         + `logical and physical associates are declared, with '${writingModeDecl}'.`);
-      }
+        }
+      }, `Test that ${group.property} properties honor order of appearance when both `
+       + `logical and physical associates are declared, with '${writingModeDecl}'.`);
+
+      // Test that logical and physical properties are cascaded properly when
+      // on different declarations
+      // (a) with a logical property in the high specificity rule
+      // (b) with a physical property in the high specificity rule
+      test(function() {
+        for (const highIsLogical of [true, false]) {
+          let lowDecl = writingModeDecl + group.prerequisites;
+          const high = highIsLogical ? logicals : physicals;
+          const others = highIsLogical ? physicals : logicals;
+          for (const [i, prop] of others.entries()) {
+            lowDecl += `${prop}: ${values[i]}; `;
+          }
+          for (const highProp of high) {
+            const highDecl = `${highProp}: ${values[others.length]}; `;
+            const expected = [];
+            for (const [i, prop] of others.entries()) {
+              const valueIdx = associated[prop] === highProp ? others.length : i;
+              expected.push([prop, values[valueIdx]]);
+              expected.push([associated[prop], values[valueIdx]]);
+            }
+            testComputedValues(`'${highProp}', two declarations, '${writingModeDecl}'`,
+                               `#test { ${highDecl} } .test { ${lowDecl} }`,
+                               expected);
+          }
+        }
+      }, `Test that ${group.property} properties honor selector specificty when both `
+       + `logical and physical associates are declared, with '${writingModeDecl}'.`);
     }
-  };
-})(window);
+  }
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/resources/test-logical-values.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/resources/test-logical-values.js
new file mode 100644
index 0000000..c34b4ee
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/resources/test-logical-values.js
@@ -0,0 +1,47 @@
+import {
+  testElement,
+  writingModes,
+  testCSSValues,
+  testComputedValues,
+  makeDeclaration
+} from "./test-shared.js";
+
+/**
+ * Tests flow-relative values for a CSS property in different writing modes.
+ *
+ * @param {string} property
+ *        The CSS property to be tested.
+ * @param {string[]} values
+ *        An array with the flow-relative values to be tested.
+ */
+export function runTests(property, values) {
+  for (const value of values) {
+    test(function() {
+      const {style} = testElement;
+      style.cssText = "";
+      style.setProperty(property, value);
+      testCSSValues("logical values in inline style", style, [[property, value]]);
+    }, `Test that '${property}: ${value}' is supported.`);
+
+    const camelCase = value.replace(/-(.)/g, (match, $1) => $1.toUpperCase());
+    for (const writingMode of writingModes) {
+      for (const style of writingMode.styles) {
+        const writingModeDecl = makeDeclaration(style);
+        test(function() {
+          const physicalSide = writingMode[camelCase];
+          let expected;
+          if (physicalSide === writingMode.lineLeft) {
+            expected = "left";
+          } else if (physicalSide === writingMode.lineRight) {
+            expected = "right";
+          } else {
+            expected = physicalSide;
+          }
+          testComputedValues(`computed value`,
+                             `.test { ${writingModeDecl} }`,
+                             [[property, expected]]);
+        }, `Test '${property}: ${value}' with '${writingModeDecl}'.`);
+      }
+    }
+  }
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/resources/test-shared.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/resources/test-shared.js
new file mode 100644
index 0000000..da3db74
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-logical/resources/test-shared.js
@@ -0,0 +1,91 @@
+const sheet = document.head.appendChild(document.createElement("style"));
+
+// Specify size for outer <div> to avoid unconstrained-size warnings
+// when writing-mode of the inner test <div> is vertical-*
+const wrapper = document.body.appendChild(document.createElement("div"));
+wrapper.style.cssText = "width:100px; height: 100px;";
+export const testElement = wrapper.appendChild(document.createElement("div"));
+testElement.id = testElement.className = "test";
+
+// Six unique overall writing modes for property-mapping purposes.
+export const writingModes = [
+  {
+    styles: [
+      {"writing-mode": "horizontal-tb", "direction": "ltr"},
+    ],
+    blockStart: "top", blockEnd: "bottom", inlineStart: "left", inlineEnd: "right",
+    over: "top", under: "bottom", lineLeft: "left", lineRight: "right",
+    block: "vertical", inline: "horizontal" },
+  {
+    styles: [
+      {"writing-mode": "horizontal-tb", "direction": "rtl"},
+    ],
+    blockStart: "top", blockEnd: "bottom", inlineStart: "right", inlineEnd: "left",
+    over: "top", under: "bottom", lineLeft: "left", lineRight: "right",
+    block: "vertical", inline: "horizontal" },
+  {
+    styles: [
+      {"writing-mode": "vertical-rl", "direction": "rtl"},
+      {"writing-mode": "sideways-rl", "direction": "rtl"},
+    ],
+    blockStart: "right", blockEnd: "left", inlineStart: "bottom", inlineEnd: "top",
+    over: "right", under: "left", lineLeft: "top", lineRight: "bottom",
+    block: "horizontal", inline: "vertical" },
+  {
+    styles: [
+      {"writing-mode": "vertical-rl", "direction": "ltr"},
+      {"writing-mode": "sideways-rl", "direction": "ltr"},
+    ],
+    blockStart: "right", blockEnd: "left", inlineStart: "top", inlineEnd: "bottom",
+    over: "right", under: "left", lineLeft: "top", lineRight: "bottom",
+    block: "horizontal", inline: "vertical" },
+  {
+    styles: [
+      {"writing-mode": "vertical-lr", "direction": "rtl"},
+    ],
+    blockStart: "left", blockEnd: "right", inlineStart: "bottom", inlineEnd: "top",
+    over: "right", under: "left", lineLeft: "top", lineRight: "bottom",
+    block: "horizontal", inline: "vertical" },
+  {
+    styles: [
+      {"writing-mode": "sideways-lr", "direction": "ltr"},
+    ],
+    blockStart: "left", blockEnd: "right", inlineStart: "bottom", inlineEnd: "top",
+    over: "left", under: "right", lineLeft: "bottom", lineRight: "top",
+    block: "horizontal", inline: "vertical" },
+  {
+    styles: [
+      {"writing-mode": "vertical-lr", "direction": "ltr"},
+    ],
+    blockStart: "left", blockEnd: "right", inlineStart: "top", inlineEnd: "bottom",
+    over: "right", under: "left", lineLeft: "top", lineRight: "bottom",
+    block: "horizontal", inline: "vertical" },
+  {
+    styles: [
+      {"writing-mode": "sideways-lr", "direction": "rtl"},
+    ],
+    blockStart: "left", blockEnd: "right", inlineStart: "top", inlineEnd: "bottom",
+    over: "left", under: "right", lineLeft: "bottom", lineRight: "top",
+    block: "horizontal", inline: "vertical" },
+];
+
+export function testCSSValues(testName, style, expectedValues) {
+  for (const [property, value] of expectedValues) {
+    assert_equals(style.getPropertyValue(property), value, `${testName}, ${property}`);
+  }
+}
+
+export function testComputedValues(testName, rules, expectedValues) {
+  sheet.textContent = rules;
+  const cs = getComputedStyle(testElement);
+  testCSSValues(testName, cs, expectedValues);
+  sheet.textContent = "";
+}
+
+export function makeDeclaration(object = {}, replacement = "*") {
+  let decl = "";
+  for (const [property, value] of Object.entries(object)) {
+    decl += `${property.replace("*", replacement)}: ${value}; `;
+  }
+  return decl;
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt
index 18388c8..fbc962c5 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/cssom/interfaces-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 377 tests; 323 PASS, 54 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 377 tests; 322 PASS, 55 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Test driver
 PASS Partial interface Document: original interface defined
 PASS Partial interface Window: original interface defined
@@ -38,7 +38,7 @@
 PASS StyleSheet interface: attribute title
 PASS StyleSheet interface: attribute media
 PASS StyleSheet interface: attribute disabled
-PASS CSSStyleSheet interface: existence and properties of interface object
+FAIL CSSStyleSheet interface: existence and properties of interface object assert_throws: interface object didn't throw TypeError when called as a constructor function "function () { [native code] }" did not throw
 PASS CSSStyleSheet interface object length
 PASS CSSStyleSheet interface object name
 PASS CSSStyleSheet interface: existence and properties of interface prototype object
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/002.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/002.html
index 42f6c58..5584bf9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/002.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/002.html
@@ -6,7 +6,7 @@
 <script>
 test(function() {
  var log = document.getElementById("log");
- document.open()
- assert_equals(document.getElementById("log"), log)
+ assert_equals(document.open(), document);
+ assert_equals(document.getElementById("log"), log);
 })
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/004-1.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/004-1.html
deleted file mode 100644
index c50eddd4..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/004-1.html
+++ /dev/null
@@ -1 +0,0 @@
-<!doctype html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/004.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/004.html
index f489caa..3fb443a9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/004.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/004.html
@@ -3,7 +3,7 @@
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <div id="log"></div>
-<iframe src="004-1.html"></iframe>
+<iframe src="/common/blank.html"></iframe>
 <script>
 var t = async_test();
 var iframe;
@@ -11,7 +11,7 @@
   var iframe = document.getElementsByTagName("iframe")[0];
   var handle = iframe.contentDocument;
   iframe.contentDocument.test_state = 1;
-  iframe.contentDocument.open();
+  assert_equals(iframe.contentDocument.open(), handle);
   assert_equals(iframe.contentDocument.test_state, 1);
   assert_equals(iframe.contentDocument, handle);
   t.done();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/005.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/005.html
index 6bd8505..e849c31 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/005.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/005.html
@@ -3,14 +3,14 @@
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <div id="log"></div>
-<iframe src="004-1.html"></iframe>
+<iframe src="/common/blank.html"></iframe>
 <script>
 var t = async_test();
 var iframe;
 onload = t.step_func(function() {
   var iframe = document.getElementsByTagName("iframe")[0];
   iframe.contentWindow.setTimeout(t.step_func(function() {assert_unreached()}), 100);
-  iframe.contentDocument.open()
+  assert_equals(iframe.contentDocument.open(), iframe.contentDocument);
   setTimeout(function() {t.done();}, 200);
 });
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/006.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/006.html
index 692d06d9..1dcb9261 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/006.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/006.html
@@ -3,7 +3,7 @@
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <div id="log"></div>
-<iframe src="004-1.html"></iframe>
+<iframe src="/common/blank.html"></iframe>
 <script>
 var t = async_test();
 var iframe;
@@ -13,7 +13,7 @@
   img.onerror = t.step_func(function() {assert_unreached()})
   img.src = "missing";
   iframe.contentDocument.body.appendChild(img);
-  iframe.contentDocument.open()
+  assert_equals(iframe.contentDocument.open(), iframe.contentDocument);
   setTimeout(function() {t.done();}, 500);
 });
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/007.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/007.html
deleted file mode 100644
index e5f0d156..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/007.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!doctype html>
-<title>Unregistering event handlers after document.open</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<iframe src="004-1.html"></iframe>
-<script>
-var t = async_test();
-var iframe;
-onload = t.step_func(function() {
-  var iframe = document.getElementsByTagName("iframe")[0];
-  iframe.contentDocument.onclick = t.step_func(function() {assert_unreached()})
-  iframe.contentDocument.open();
-  var e = iframe.contentDocument.createEvent("mouseevents")
-  e.initEvent("click", false, false);
-  iframe.contentDocument.dispatchEvent(e);
-  setTimeout(function() {t.done();}, 500);
-});
-</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/008.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/008.html
index 08fd4aa..36c0a3f3 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/008.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/008.html
@@ -3,7 +3,7 @@
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <div id="log"></div>
-<iframe src="004-1.html"></iframe>
+<iframe src="/common/blank.html"></iframe>
 <script>
 var t = async_test();
 var iframe;
@@ -11,7 +11,7 @@
   var iframe = document.getElementsByTagName("iframe")[0];
   var handle = Object.getPrototypeOf(iframe.contentDocument);
   handle.test_state = 1;
-  iframe.contentDocument.open();
+  assert_equals(iframe.contentDocument.open(), iframe.contentDocument);
   var new_handle = Object.getPrototypeOf(iframe.contentDocument);
   assert_equals(new_handle.test_state, undefined);
   assert_not_equals(new_handle, handle);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/009.https.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/009.https.html
index 4fc5163..0d104c9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/009.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/009.https.html
@@ -3,7 +3,7 @@
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <div id="log"></div>
-<iframe src="004-1.html"></iframe>
+<iframe src="/common/blank.html"></iframe>
 <script>
 var iframe = document.getElementsByTagName("iframe")[0];
 var steps;
@@ -28,7 +28,7 @@
 );
 }
 onload = function() {
-  iframe.contentDocument.open();
+  assert_equals(iframe.contentDocument.open(), iframe.contentDocument);
   steps.forEach(function(x) {x()});
 }
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/010.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/010.html
index f37e885..d83d24f 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/010.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/010.html
@@ -9,7 +9,7 @@
 var t = async_test();
 onload = t.step_func(function() {
   iframe = document.getElementsByTagName("iframe")[0];
-  iframe.contentDocument.open();
+  assert_equals(iframe.contentDocument.open(), iframe.contentDocument);
   iframe.contentDocument.close();
 
   iframe.contentWindow.setTimeout(t.step_func(function() {t.done();}), 500);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/011-1.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/011-1.html
index e12d78f..37973fd 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/011-1.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/011-1.html
@@ -1,5 +1,5 @@
 <script>
-document.open()
+parent.t.step(() => { parent.assert_equals(document.open(), document); });
 setTimeout(parent.t.step_func(function() {parent.t.done()}), 0);
 document.close();
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/012-1.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/012-1.html
index b1937b2..644b308 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/012-1.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/012-1.html
@@ -1,6 +1,6 @@
 <script>
 onload = parent.t.step_func(function() {
-  document.open()
+  parent.assert_equals(document.open(), document);
   setTimeout(parent.t.step_func(function() {parent.t.done()}), 0);
   document.close();
 });
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/013-1.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/013-1.html
index ed8843b..ea32123 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/013-1.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/013-1.html
@@ -1,6 +1,6 @@
 <script>
 addEventListener("DOMContentLoaded", parent.t.step_func(function() {
-  document.open()
+  parent.assert_equals(document.open(), document);
   setTimeout(parent.t.step_func(function() {parent.t.done()}), 0);
   document.close();
 }), false);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/014-1.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/014-1.html
index 6d04da56..0e978081 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/014-1.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/014-1.html
@@ -1,7 +1,7 @@
 <script>
 onload = parent.t.step_func(function() {
   setTimeout(parent.t.step_func(function() {
-    document.open()
+    parent.assert_equals(document.open(), document);
     setTimeout(parent.t.step_func(function() {parent.t.done()}), 0);
     document.close();
   }), 100)
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/015-1.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/015-1.html
index 6707100..dffbac0 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/015-1.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/015-1.html
@@ -2,7 +2,7 @@
 onload = function() {
   window.test_prop = 1;
   parent.tests[0].step(function() {parent.assert_equals(test_prop, 1)});
-  document.open();
+  parent.tests[0].step(function() {parent.assert_equals(document.open(), document)});
   document.write("<script>test_prop = 2;<\/script>");
   document.close();
   parent.tests[0].step(function() {parent.assert_equals(test_prop, 1)});
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016-1.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016-1.html
index 17f5140e..12990a5 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016-1.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/016-1.html
@@ -3,7 +3,9 @@
 </script>
 <script>
 onload = function() {
-  document.open();
+  parent.tests[0].step(function() {
+    parent.assert_equals(document.open(), document);
+  });
   document.write("<script>test_prop = 2; timeout_fired=false;<\/script>");
   document.close();
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window.js
index 92bd74e..98ffba20 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-ignore-opens-during-unload.window.js
@@ -9,7 +9,7 @@
       iframe.contentWindow.addEventListener(ev, t.step_func_done(() => {
         const origURL = iframe.contentDocument.URL;
         assertDocumentIsReadyForSideEffectsTest(iframe.contentDocument, `ignore-opens-during-unload counter is greater than 0 during ${ev} event`);
-        iframe.contentDocument.open();
+        assert_equals(iframe.contentDocument.open(), iframe.contentDocument);
         assertOpenHasNoSideEffects(iframe.contentDocument, origURL, `ignore-opens-during-unload counter is greater than 0 during ${ev} event`);
       }));
       iframe.src = "about:blank";
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-synchronous-script.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-synchronous-script.window.js
index 6e24357..59a750a 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-synchronous-script.window.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-synchronous-script.window.js
@@ -6,7 +6,7 @@
   self.testSynchronousScript = t.step_func_done(() => {
     const origURL = iframe.contentDocument.URL;
     assertDocumentIsReadyForSideEffectsTest(iframe.contentDocument, "active parser whose script nesting level is greater than 0");
-    iframe.contentDocument.open();
+    assert_equals(iframe.contentDocument.open(), iframe.contentDocument);
     assertOpenHasNoSideEffects(iframe.contentDocument, origURL, "active parser whose script nesting level is greater than 0");
   });
   iframe.src = "resources/bailout-order-synchronous-script-frame.html";
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/custom-element.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/custom-element.window.js
index 015df8fd..be646d1 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/custom-element.window.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/custom-element.window.js
@@ -16,7 +16,7 @@
   constructor() {
     super();
     try {
-      document.open();
+      assert_equals(document.open(), document);
     } catch (e) {
       err = e;
     }
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/encoding.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/encoding.window.js
index a610ce9e..f0d133a5 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/encoding.window.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/encoding.window.js
@@ -4,7 +4,7 @@
   frame.onload = t.step_func_done(t => {
     // Using toLowerCase() to avoid an Edge bug
     assert_equals(frame.contentDocument.characterSet.toLowerCase(), "shift_jis", "precondition");
-    frame.contentDocument.open();
+    assert_equals(frame.contentDocument.open(), frame.contentDocument);
     assert_equals(frame.contentDocument.characterSet.toLowerCase(), "shift_jis", "actual test");
     frame.contentDocument.close();
     assert_equals(frame.contentDocument.characterSet.toLowerCase(), "shift_jis", "might as well");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js
index 97334ce..58ec08f 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js
@@ -2,13 +2,81 @@
   const frame = document.body.appendChild(document.createElement("iframe")),
         body = frame.contentDocument.body;
   t.add_cleanup(() => frame.remove());
+  const div = body.appendChild(frame.contentDocument.createElement("div"));
+  div.addEventListener("click", t.unreached_func("element event listener not removed"));
+  frame.contentDocument.open();
+  div.click();
+  frame.contentDocument.close();
+}, "Standard event listeners are to be removed");
+
+test(t => {
+  const frame = document.body.appendChild(document.createElement("iframe")),
+        body = frame.contentDocument.body;
+  t.add_cleanup(() => frame.remove());
   frame.contentDocument.addEventListener("x", t.unreached_func("document event listener not removed"));
   body.addEventListener("x", t.unreached_func("body event listener not removed"));
   frame.contentDocument.open();
   frame.contentDocument.dispatchEvent(new Event("x"));
   body.dispatchEvent(new Event("x"));
   frame.contentDocument.close();
-}, "Event listeners are to be removed");
+}, "Custom event listeners are to be removed");
+
+test(t => {
+  const frame = document.body.appendChild(document.createElement("iframe")),
+        body = frame.contentDocument.body;
+  t.add_cleanup(() => frame.remove());
+  // Focus on the current window so that the frame's window is blurred.
+  window.focus();
+  assert_false(frame.contentDocument.hasFocus());
+  frame.contentWindow.addEventListener("focus", t.unreached_func("window event listener not removed"));
+  body.onfocus = t.unreached_func("body event listener not removed");
+  frame.contentDocument.open();
+  assert_equals(body.onfocus, null);
+  frame.contentWindow.focus();
+  frame.contentDocument.close();
+}, "Standard event listeners are to be removed from Window");
+
+test(t => {
+  const frame = document.body.appendChild(document.createElement("iframe"));
+  t.add_cleanup(() => frame.remove());
+  frame.contentWindow.addEventListener("x", t.unreached_func("window event listener not removed"));
+  frame.contentDocument.open();
+  frame.contentWindow.dispatchEvent(new Event("x"));
+  frame.contentDocument.close();
+}, "Custom event listeners are to be removed from Window");
+
+test(t => {
+  const frame = document.body.appendChild(document.createElement("iframe")),
+        body = frame.contentDocument.body;
+  t.add_cleanup(() => frame.remove());
+  const div = body.appendChild(frame.contentDocument.createElement("div"));
+  div.onclick = t.unreached_func("element event listener not removed");
+  frame.contentDocument.open();
+  assert_equals(div.onclick, null);
+  const e = frame.contentDocument.createEvent("mouseevents")
+  e.initEvent("click", false, false);
+  div.dispatchEvent(e);
+  frame.contentDocument.close();
+}, "IDL attribute event handlers are to be deactivated");
+
+var thrower;
+
+test(t => {
+  const frame = document.body.appendChild(document.createElement("iframe")),
+        body = frame.contentDocument.body;
+  t.add_cleanup(() => frame.remove());
+  const div = body.appendChild(frame.contentDocument.createElement("div"));
+  thrower = t.step_func(() => { throw new Error('element event listener not removed'); });
+  div.setAttribute("onclick", "parent.thrower()");
+  assert_not_equals(div.onclick, null);
+  frame.contentDocument.open();
+  assert_equals(div.getAttribute("onclick"), "parent.thrower()");
+  assert_equals(div.onclick, null);
+  const e = frame.contentDocument.createEvent("mouseevents")
+  e.initEvent("click", false, false);
+  div.dispatchEvent(e);
+  frame.contentDocument.close();
+}, "Content attribute event handlers are to be deactivated");
 
 test(t => {
   const frame = document.body.appendChild(document.createElement("iframe"));
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.js
index d76ca85..5de4b14 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/ignore-opens-during-unload.window.js
@@ -6,7 +6,7 @@
     iframe.onload = t.step_func(() => {
       iframe.contentWindow.addEventListener(ev, t.step_func_done(() => {
         assert_not_equals(iframe.contentDocument.childNodes.length, 0);
-        iframe.contentDocument.open();
+        assert_equals(iframe.contentDocument.open(), iframe.contentDocument);
         assert_not_equals(iframe.contentDocument.childNodes.length, 0);
       }));
       iframe.src = "about:blank";
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-events.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-events.window.js
index 5c8e7d68..4efbb863 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-events.window.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-events.window.js
@@ -13,7 +13,7 @@
   frame.contentWindow.addEventListener("DOMSubtreeModified", t.unreached_func());
   frame.contentWindow.addEventListener("DOMSubtreeModified", t.unreached_func(), true);
   assert_equals(frame.contentDocument.documentElement.localName, "html");
-  frame.contentDocument.open();
+  assert_equals(frame.contentDocument.open(), frame.contentDocument);
   assert_equals(frame.contentDocument.documentElement, null);
   frame.contentDocument.write("<div>heya</div>");
   frame.contentDocument.close();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/type-argument-plaintext.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/type-argument-plaintext.window.js
index 52edd00..ab1d970 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/type-argument-plaintext.window.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/type-argument-plaintext.window.js
@@ -12,7 +12,7 @@
     document.body.appendChild(frame);
     t.add_cleanup(() => frame.remove());
     frame.onload = t.step_func_done(() => {
-      frame.contentDocument.open(type);
+      assert_equals(frame.contentDocument.open(type), frame.contentDocument);
       frame.contentDocument.write("<B>heya</b>");
       frame.contentDocument.close();
       assert_equals(frame.contentDocument.body.firstChild.localName, "b");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/type-argument.window.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/type-argument.window.js
index 704130a..9174008d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/type-argument.window.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/type-argument.window.js
@@ -9,7 +9,7 @@
   async_test(t => {
     const frame = document.body.appendChild(document.createElement("iframe"));
     t.add_cleanup(() => frame.remove());
-    frame.contentDocument.open(type);
+    assert_equals(frame.contentDocument.open(type), frame.contentDocument);
     frame.contentDocument.write("<B>heya</b>");
     frame.contentDocument.close();
     assert_equals(frame.contentDocument.body.firstChild.localName, "b");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/lint.whitelist b/third_party/WebKit/LayoutTests/external/wpt/lint.whitelist
index de9e36cf..bd9bd46c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/lint.whitelist
+++ b/third_party/WebKit/LayoutTests/external/wpt/lint.whitelist
@@ -293,8 +293,12 @@
 SET TIMEOUT: html/webappapis/timers/*
 SET TIMEOUT: resources/chromium/*
 SET TIMEOUT: resources/test/tests/functional/add_cleanup.html
+SET TIMEOUT: resources/test/tests/functional/add_cleanup_async.html
+SET TIMEOUT: resources/test/tests/functional/add_cleanup_async_rejection.html
+SET TIMEOUT: resources/test/tests/functional/add_cleanup_async_rejection_after_load.html
 SET TIMEOUT: resources/test/tests/functional/api-tests-1.html
 SET TIMEOUT: resources/test/tests/functional/worker.js
+SET TIMEOUT: resources/test/tests/unit/exceptional-cases.html
 SET TIMEOUT: resources/testharness.js
 
 # setTimeout use in reftests
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStream-removetrack.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStream-removetrack.https-expected.txt
index 59a5126..09d4d66 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStream-removetrack.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStream-removetrack.https-expected.txt
@@ -1,6 +1,7 @@
 This is a testharness.js-based test.
+Harness Error. harness_status.status = 1 , harness_status.message = Test named 'Test that removal from a MediaStream fires ended on media elements (video first)' specified 2 'cleanup' functions, and 1 returned a non-thenable value.
 PASS Tests that a removal from a MediaStream works as expected
 FAIL Test that removal from a MediaStream fires ended on media elements (video first) assert_equals: audio element ended because no more audio tracks expected true but got false
-FAIL Test that removal from a MediaStream fires ended on media elements (audio first) assert_equals: audio element ended because no more audio tracks expected true but got false
+NOTRUN Test that removal from a MediaStream fires ended on media elements (audio first)
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/web_usb_service.mojom.js b/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/web_usb_service.mojom.js
new file mode 100644
index 0000000..c283f0e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/web_usb_service.mojom.js
@@ -0,0 +1,561 @@
+// 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.
+
+'use strict';
+
+(function() {
+  var mojomId = 'third_party/blink/public/mojom/usb/web_usb_service.mojom';
+  if (mojo.internal.isMojomLoaded(mojomId)) {
+    console.warn('The following mojom is loaded multiple times: ' + mojomId);
+    return;
+  }
+  mojo.internal.markMojomLoaded(mojomId);
+  var bindings = mojo;
+  var associatedBindings = mojo;
+  var codec = mojo.internal;
+  var validator = mojo.internal;
+
+  var exports = mojo.internal.exposeNamespace('blink.mojom');
+  var device$ =
+      mojo.internal.exposeNamespace('device.mojom');
+  if (mojo.config.autoLoadMojomDeps) {
+    mojo.internal.loadMojomIfNecessary(
+        'device/usb/public/mojom/device.mojom', '../../../../../device/usb/public/mojom/device.mojom.js');
+  }
+  var device_manager$ =
+      mojo.internal.exposeNamespace('device.mojom');
+  if (mojo.config.autoLoadMojomDeps) {
+    mojo.internal.loadMojomIfNecessary(
+        'device/usb/public/mojom/device_manager.mojom', '../../../../../device/usb/public/mojom/device_manager.mojom.js');
+  }
+
+
+
+  function WebUsbService_GetDevices_Params(values) {
+    this.initDefaults_();
+    this.initFields_(values);
+  }
+
+
+  WebUsbService_GetDevices_Params.prototype.initDefaults_ = function() {
+  };
+  WebUsbService_GetDevices_Params.prototype.initFields_ = function(fields) {
+    for(var field in fields) {
+        if (this.hasOwnProperty(field))
+          this[field] = fields[field];
+    }
+  };
+  WebUsbService_GetDevices_Params.generate = function(generator_) {
+    var generated = new WebUsbService_GetDevices_Params;
+    return generated;
+  };
+
+  WebUsbService_GetDevices_Params.prototype.mutate = function(mutator_) {
+    return this;
+  };
+  WebUsbService_GetDevices_Params.prototype.getHandleDeps = function() {
+    var handles = [];
+    return handles;
+  };
+
+  WebUsbService_GetDevices_Params.prototype.setHandles = function() {
+    this.setHandlesInternal_(arguments, 0);
+  };
+  WebUsbService_GetDevices_Params.prototype.setHandlesInternal_ = function(handles, idx) {
+    return idx;
+  };
+
+  WebUsbService_GetDevices_Params.validate = function(messageValidator, offset) {
+    var err;
+    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+    if (err !== validator.validationError.NONE)
+        return err;
+
+    var kVersionSizes = [
+      {version: 0, numBytes: 8}
+    ];
+    err = messageValidator.validateStructVersion(offset, kVersionSizes);
+    if (err !== validator.validationError.NONE)
+        return err;
+
+    return validator.validationError.NONE;
+  };
+
+  WebUsbService_GetDevices_Params.encodedSize = codec.kStructHeaderSize + 0;
+
+  WebUsbService_GetDevices_Params.decode = function(decoder) {
+    var packed;
+    var val = new WebUsbService_GetDevices_Params();
+    var numberOfBytes = decoder.readUint32();
+    var version = decoder.readUint32();
+    return val;
+  };
+
+  WebUsbService_GetDevices_Params.encode = function(encoder, val) {
+    var packed;
+    encoder.writeUint32(WebUsbService_GetDevices_Params.encodedSize);
+    encoder.writeUint32(0);
+  };
+  function WebUsbService_GetDevices_ResponseParams(values) {
+    this.initDefaults_();
+    this.initFields_(values);
+  }
+
+
+  WebUsbService_GetDevices_ResponseParams.prototype.initDefaults_ = function() {
+    this.results = null;
+  };
+  WebUsbService_GetDevices_ResponseParams.prototype.initFields_ = function(fields) {
+    for(var field in fields) {
+        if (this.hasOwnProperty(field))
+          this[field] = fields[field];
+    }
+  };
+  WebUsbService_GetDevices_ResponseParams.generate = function(generator_) {
+    var generated = new WebUsbService_GetDevices_ResponseParams;
+    generated.results = generator_.generateArray(function() {
+      return generator_.generateStruct(device.mojom.UsbDeviceInfo, false);
+    });
+    return generated;
+  };
+
+  WebUsbService_GetDevices_ResponseParams.prototype.mutate = function(mutator_) {
+    if (mutator_.chooseMutateField()) {
+      this.results = mutator_.mutateArray(this.results, function(val) {
+        return mutator_.mutateStruct(val, device.mojom.UsbDeviceInfo, false);
+      });
+    }
+    return this;
+  };
+  WebUsbService_GetDevices_ResponseParams.prototype.getHandleDeps = function() {
+    var handles = [];
+    return handles;
+  };
+
+  WebUsbService_GetDevices_ResponseParams.prototype.setHandles = function() {
+    this.setHandlesInternal_(arguments, 0);
+  };
+  WebUsbService_GetDevices_ResponseParams.prototype.setHandlesInternal_ = function(handles, idx) {
+    return idx;
+  };
+
+  WebUsbService_GetDevices_ResponseParams.validate = function(messageValidator, offset) {
+    var err;
+    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+    if (err !== validator.validationError.NONE)
+        return err;
+
+    var kVersionSizes = [
+      {version: 0, numBytes: 16}
+    ];
+    err = messageValidator.validateStructVersion(offset, kVersionSizes);
+    if (err !== validator.validationError.NONE)
+        return err;
+
+
+    // validate WebUsbService_GetDevices_ResponseParams.results
+    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 8, new codec.PointerTo(device$.UsbDeviceInfo), false, [0], 0);
+    if (err !== validator.validationError.NONE)
+        return err;
+
+    return validator.validationError.NONE;
+  };
+
+  WebUsbService_GetDevices_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;
+
+  WebUsbService_GetDevices_ResponseParams.decode = function(decoder) {
+    var packed;
+    var val = new WebUsbService_GetDevices_ResponseParams();
+    var numberOfBytes = decoder.readUint32();
+    var version = decoder.readUint32();
+    val.results = decoder.decodeArrayPointer(new codec.PointerTo(device$.UsbDeviceInfo));
+    return val;
+  };
+
+  WebUsbService_GetDevices_ResponseParams.encode = function(encoder, val) {
+    var packed;
+    encoder.writeUint32(WebUsbService_GetDevices_ResponseParams.encodedSize);
+    encoder.writeUint32(0);
+    encoder.encodeArrayPointer(new codec.PointerTo(device$.UsbDeviceInfo), val.results);
+  };
+  function WebUsbService_GetDevice_Params(values) {
+    this.initDefaults_();
+    this.initFields_(values);
+  }
+
+
+  WebUsbService_GetDevice_Params.prototype.initDefaults_ = function() {
+    this.guid = null;
+    this.deviceRequestd = new bindings.InterfaceRequest();
+  };
+  WebUsbService_GetDevice_Params.prototype.initFields_ = function(fields) {
+    for(var field in fields) {
+        if (this.hasOwnProperty(field))
+          this[field] = fields[field];
+    }
+  };
+  WebUsbService_GetDevice_Params.generate = function(generator_) {
+    var generated = new WebUsbService_GetDevice_Params;
+    generated.guid = generator_.generateString(false);
+    generated.deviceRequestd = generator_.generateInterfaceRequest("device.mojom.UsbDevice", false);
+    return generated;
+  };
+
+  WebUsbService_GetDevice_Params.prototype.mutate = function(mutator_) {
+    if (mutator_.chooseMutateField()) {
+      this.guid = mutator_.mutateString(this.guid, false);
+    }
+    if (mutator_.chooseMutateField()) {
+      this.deviceRequestd = mutator_.mutateInterfaceRequest(this.deviceRequestd, "device.mojom.UsbDevice", false);
+    }
+    return this;
+  };
+  WebUsbService_GetDevice_Params.prototype.getHandleDeps = function() {
+    var handles = [];
+    if (this.deviceRequestd !== null) {
+      Array.prototype.push.apply(handles, ["device.mojom.UsbDeviceRequest"]);
+    }
+    return handles;
+  };
+
+  WebUsbService_GetDevice_Params.prototype.setHandles = function() {
+    this.setHandlesInternal_(arguments, 0);
+  };
+  WebUsbService_GetDevice_Params.prototype.setHandlesInternal_ = function(handles, idx) {
+    this.deviceRequestd = handles[idx++];;
+    return idx;
+  };
+
+  WebUsbService_GetDevice_Params.validate = function(messageValidator, offset) {
+    var err;
+    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+    if (err !== validator.validationError.NONE)
+        return err;
+
+    var kVersionSizes = [
+      {version: 0, numBytes: 24}
+    ];
+    err = messageValidator.validateStructVersion(offset, kVersionSizes);
+    if (err !== validator.validationError.NONE)
+        return err;
+
+
+    // validate WebUsbService_GetDevice_Params.guid
+    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
+    if (err !== validator.validationError.NONE)
+        return err;
+
+
+    // validate WebUsbService_GetDevice_Params.deviceRequestd
+    err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 8, false)
+    if (err !== validator.validationError.NONE)
+        return err;
+
+    return validator.validationError.NONE;
+  };
+
+  WebUsbService_GetDevice_Params.encodedSize = codec.kStructHeaderSize + 16;
+
+  WebUsbService_GetDevice_Params.decode = function(decoder) {
+    var packed;
+    var val = new WebUsbService_GetDevice_Params();
+    var numberOfBytes = decoder.readUint32();
+    var version = decoder.readUint32();
+    val.guid = decoder.decodeStruct(codec.String);
+    val.deviceRequestd = decoder.decodeStruct(codec.InterfaceRequest);
+    decoder.skip(1);
+    decoder.skip(1);
+    decoder.skip(1);
+    decoder.skip(1);
+    return val;
+  };
+
+  WebUsbService_GetDevice_Params.encode = function(encoder, val) {
+    var packed;
+    encoder.writeUint32(WebUsbService_GetDevice_Params.encodedSize);
+    encoder.writeUint32(0);
+    encoder.encodeStruct(codec.String, val.guid);
+    encoder.encodeStruct(codec.InterfaceRequest, val.deviceRequestd);
+    encoder.skip(1);
+    encoder.skip(1);
+    encoder.skip(1);
+    encoder.skip(1);
+  };
+  function WebUsbService_SetClient_Params(values) {
+    this.initDefaults_();
+    this.initFields_(values);
+  }
+
+
+  WebUsbService_SetClient_Params.prototype.initDefaults_ = function() {
+    this.client = new device_manager$.UsbDeviceManagerClientPtr();
+  };
+  WebUsbService_SetClient_Params.prototype.initFields_ = function(fields) {
+    for(var field in fields) {
+        if (this.hasOwnProperty(field))
+          this[field] = fields[field];
+    }
+  };
+  WebUsbService_SetClient_Params.generate = function(generator_) {
+    var generated = new WebUsbService_SetClient_Params;
+    generated.client = generator_.generateInterface("device.mojom.UsbDeviceManagerClient", false);
+    return generated;
+  };
+
+  WebUsbService_SetClient_Params.prototype.mutate = function(mutator_) {
+    if (mutator_.chooseMutateField()) {
+      this.client = mutator_.mutateInterface(this.client, "device.mojom.UsbDeviceManagerClient", false);
+    }
+    return this;
+  };
+  WebUsbService_SetClient_Params.prototype.getHandleDeps = function() {
+    var handles = [];
+    if (this.client !== null) {
+      Array.prototype.push.apply(handles, ["device.mojom.UsbDeviceManagerClientPtr"]);
+    }
+    return handles;
+  };
+
+  WebUsbService_SetClient_Params.prototype.setHandles = function() {
+    this.setHandlesInternal_(arguments, 0);
+  };
+  WebUsbService_SetClient_Params.prototype.setHandlesInternal_ = function(handles, idx) {
+    this.client = handles[idx++];;
+    return idx;
+  };
+
+  WebUsbService_SetClient_Params.validate = function(messageValidator, offset) {
+    var err;
+    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+    if (err !== validator.validationError.NONE)
+        return err;
+
+    var kVersionSizes = [
+      {version: 0, numBytes: 16}
+    ];
+    err = messageValidator.validateStructVersion(offset, kVersionSizes);
+    if (err !== validator.validationError.NONE)
+        return err;
+
+
+    // validate WebUsbService_SetClient_Params.client
+    err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 0, false);
+    if (err !== validator.validationError.NONE)
+        return err;
+
+    return validator.validationError.NONE;
+  };
+
+  WebUsbService_SetClient_Params.encodedSize = codec.kStructHeaderSize + 8;
+
+  WebUsbService_SetClient_Params.decode = function(decoder) {
+    var packed;
+    var val = new WebUsbService_SetClient_Params();
+    var numberOfBytes = decoder.readUint32();
+    var version = decoder.readUint32();
+    val.client = decoder.decodeStruct(new codec.Interface(device_manager$.UsbDeviceManagerClientPtr));
+    return val;
+  };
+
+  WebUsbService_SetClient_Params.encode = function(encoder, val) {
+    var packed;
+    encoder.writeUint32(WebUsbService_SetClient_Params.encodedSize);
+    encoder.writeUint32(0);
+    encoder.encodeStruct(new codec.Interface(device_manager$.UsbDeviceManagerClientPtr), val.client);
+  };
+  var kWebUsbService_GetDevices_Name = 0;
+  var kWebUsbService_GetDevice_Name = 1;
+  var kWebUsbService_SetClient_Name = 2;
+
+  function WebUsbServicePtr(handleOrPtrInfo) {
+    this.ptr = new bindings.InterfacePtrController(WebUsbService,
+                                                   handleOrPtrInfo);
+  }
+
+  function WebUsbServiceAssociatedPtr(associatedInterfacePtrInfo) {
+    this.ptr = new associatedBindings.AssociatedInterfacePtrController(
+        WebUsbService, associatedInterfacePtrInfo);
+  }
+
+  WebUsbServiceAssociatedPtr.prototype =
+      Object.create(WebUsbServicePtr.prototype);
+  WebUsbServiceAssociatedPtr.prototype.constructor =
+      WebUsbServiceAssociatedPtr;
+
+  function WebUsbServiceProxy(receiver) {
+    this.receiver_ = receiver;
+  }
+  WebUsbServicePtr.prototype.getDevices = function() {
+    return WebUsbServiceProxy.prototype.getDevices
+        .apply(this.ptr.getProxy(), arguments);
+  };
+
+  WebUsbServiceProxy.prototype.getDevices = function() {
+    var params_ = new WebUsbService_GetDevices_Params();
+    return new Promise(function(resolve, reject) {
+      var builder = new codec.MessageV1Builder(
+          kWebUsbService_GetDevices_Name,
+          codec.align(WebUsbService_GetDevices_Params.encodedSize),
+          codec.kMessageExpectsResponse, 0);
+      builder.encodeStruct(WebUsbService_GetDevices_Params, params_);
+      var message = builder.finish();
+      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+        var reader = new codec.MessageReader(message);
+        var responseParams =
+            reader.decodeStruct(WebUsbService_GetDevices_ResponseParams);
+        resolve(responseParams);
+      }).catch(function(result) {
+        reject(Error("Connection error: " + result));
+      });
+    }.bind(this));
+  };
+  WebUsbServicePtr.prototype.getDevice = function() {
+    return WebUsbServiceProxy.prototype.getDevice
+        .apply(this.ptr.getProxy(), arguments);
+  };
+
+  WebUsbServiceProxy.prototype.getDevice = function(guid, deviceRequestd) {
+    var params_ = new WebUsbService_GetDevice_Params();
+    params_.guid = guid;
+    params_.deviceRequestd = deviceRequestd;
+    var builder = new codec.MessageV0Builder(
+        kWebUsbService_GetDevice_Name,
+        codec.align(WebUsbService_GetDevice_Params.encodedSize));
+    builder.encodeStruct(WebUsbService_GetDevice_Params, params_);
+    var message = builder.finish();
+    this.receiver_.accept(message);
+  };
+  WebUsbServicePtr.prototype.setClient = function() {
+    return WebUsbServiceProxy.prototype.setClient
+        .apply(this.ptr.getProxy(), arguments);
+  };
+
+  WebUsbServiceProxy.prototype.setClient = function(client) {
+    var params_ = new WebUsbService_SetClient_Params();
+    params_.client = client;
+    var builder = new codec.MessageV0Builder(
+        kWebUsbService_SetClient_Name,
+        codec.align(WebUsbService_SetClient_Params.encodedSize));
+    builder.encodeStruct(WebUsbService_SetClient_Params, params_);
+    var message = builder.finish();
+    this.receiver_.accept(message);
+  };
+
+  function WebUsbServiceStub(delegate) {
+    this.delegate_ = delegate;
+  }
+  WebUsbServiceStub.prototype.getDevices = function() {
+    return this.delegate_ && this.delegate_.getDevices && this.delegate_.getDevices();
+  }
+  WebUsbServiceStub.prototype.getDevice = function(guid, deviceRequestd) {
+    return this.delegate_ && this.delegate_.getDevice && this.delegate_.getDevice(guid, deviceRequestd);
+  }
+  WebUsbServiceStub.prototype.setClient = function(client) {
+    return this.delegate_ && this.delegate_.setClient && this.delegate_.setClient(client);
+  }
+
+  WebUsbServiceStub.prototype.accept = function(message) {
+    var reader = new codec.MessageReader(message);
+    switch (reader.messageName) {
+    case kWebUsbService_GetDevice_Name:
+      var params = reader.decodeStruct(WebUsbService_GetDevice_Params);
+      this.getDevice(params.guid, params.deviceRequestd);
+      return true;
+    case kWebUsbService_SetClient_Name:
+      var params = reader.decodeStruct(WebUsbService_SetClient_Params);
+      this.setClient(params.client);
+      return true;
+    default:
+      return false;
+    }
+  };
+
+  WebUsbServiceStub.prototype.acceptWithResponder =
+      function(message, responder) {
+    var reader = new codec.MessageReader(message);
+    switch (reader.messageName) {
+    case kWebUsbService_GetDevices_Name:
+      var params = reader.decodeStruct(WebUsbService_GetDevices_Params);
+      this.getDevices().then(function(response) {
+        var responseParams =
+            new WebUsbService_GetDevices_ResponseParams();
+        responseParams.results = response.results;
+        var builder = new codec.MessageV1Builder(
+            kWebUsbService_GetDevices_Name,
+            codec.align(WebUsbService_GetDevices_ResponseParams.encodedSize),
+            codec.kMessageIsResponse, reader.requestID);
+        builder.encodeStruct(WebUsbService_GetDevices_ResponseParams,
+                             responseParams);
+        var message = builder.finish();
+        responder.accept(message);
+      });
+      return true;
+    default:
+      return false;
+    }
+  };
+
+  function validateWebUsbServiceRequest(messageValidator) {
+    var message = messageValidator.message;
+    var paramsClass = null;
+    switch (message.getName()) {
+      case kWebUsbService_GetDevices_Name:
+        if (message.expectsResponse())
+          paramsClass = WebUsbService_GetDevices_Params;
+      break;
+      case kWebUsbService_GetDevice_Name:
+        if (!message.expectsResponse() && !message.isResponse())
+          paramsClass = WebUsbService_GetDevice_Params;
+      break;
+      case kWebUsbService_SetClient_Name:
+        if (!message.expectsResponse() && !message.isResponse())
+          paramsClass = WebUsbService_SetClient_Params;
+      break;
+    }
+    if (paramsClass === null)
+      return validator.validationError.NONE;
+    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
+  }
+
+  function validateWebUsbServiceResponse(messageValidator) {
+   var message = messageValidator.message;
+   var paramsClass = null;
+   switch (message.getName()) {
+      case kWebUsbService_GetDevices_Name:
+        if (message.isResponse())
+          paramsClass = WebUsbService_GetDevices_ResponseParams;
+        break;
+    }
+    if (paramsClass === null)
+      return validator.validationError.NONE;
+    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
+  }
+
+  var WebUsbService = {
+    name: 'blink.mojom.WebUsbService',
+    kVersion: 0,
+    ptrClass: WebUsbServicePtr,
+    proxyClass: WebUsbServiceProxy,
+    stubClass: WebUsbServiceStub,
+    validateRequest: validateWebUsbServiceRequest,
+    validateResponse: validateWebUsbServiceResponse,
+    mojomId: 'third_party/blink/public/mojom/usb/web_usb_service.mojom',
+    fuzzMethods: {
+      getDevices: {
+        params: WebUsbService_GetDevices_Params,
+      },
+      getDevice: {
+        params: WebUsbService_GetDevice_Params,
+      },
+      setClient: {
+        params: WebUsbService_SetClient_Params,
+      },
+    },
+  };
+  WebUsbServiceStub.prototype.validator = validateWebUsbServiceRequest;
+  WebUsbServiceProxy.prototype.validator = validateWebUsbServiceResponse;
+  exports.WebUsbService = WebUsbService;
+  exports.WebUsbServicePtr = WebUsbServicePtr;
+  exports.WebUsbServiceAssociatedPtr = WebUsbServiceAssociatedPtr;
+})();
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/web_usb_service.mojom.js.headers b/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/web_usb_service.mojom.js.headers
new file mode 100644
index 0000000..6805c323
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/web_usb_service.mojom.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/webusb-test.js b/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/webusb-test.js
index 630a7da..94db93d3 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/webusb-test.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/resources/chromium/webusb-test.js
@@ -10,9 +10,9 @@
 let internal = {
   intialized: false,
 
-  deviceManager: null,
-  deviceManagerInterceptor: null,
-  deviceManagerCrossFrameProxy: null,
+  webUsbService: null,
+  webUsbServiceInterceptor: null,
+  webUsbServiceCrossFrameProxy: null,
 
   chooser: null,
   chooserInterceptor: null,
@@ -299,9 +299,9 @@
   }
 }
 
-class FakeDeviceManager {
+class FakeWebUsbService {
   constructor() {
-    this.bindingSet_ = new mojo.BindingSet(device.mojom.UsbDeviceManager);
+    this.bindingSet_ = new mojo.BindingSet(blink.mojom.WebUsbService);
     this.devices_ = new Map();
     this.devicesByGuid_ = new Map();
     this.client_ = null;
@@ -351,7 +351,7 @@
     this.devicesByGuid_.clear();
   }
 
-  getDevices(options) {
+  getDevices() {
     let devices = [];
     this.devices_.forEach(device => {
       devices.push(fakeDeviceInitToDeviceInfo(device.guid, device.info));
@@ -391,7 +391,7 @@
     // Wait until |value| resolves (if it is a Promise). This function returns
     // no value.
     Promise.resolve(value).then(fakeDevice => {
-      let device = internal.deviceManager.devices_.get(fakeDevice);
+      let device = internal.webUsbService.devices_.get(fakeDevice);
       let result = null;
       if (device) {
         result = fakeDeviceInitToDeviceInfo(device.guid, device.info);
@@ -431,7 +431,7 @@
   }
 
   disconnect() {
-    setTimeout(() => internal.deviceManager.removeDevice(this), 0);
+    setTimeout(() => internal.webUsbService.removeDevice(this), 0);
   }
 }
 
@@ -463,14 +463,14 @@
     if (internal.initialized)
       return;
 
-    internal.deviceManager = new FakeDeviceManager();
-    internal.deviceManagerInterceptor =
-        new MojoInterfaceInterceptor(device.mojom.UsbDeviceManager.name);
-    internal.deviceManagerInterceptor.oninterfacerequest =
-        e => internal.deviceManager.addBinding(e.handle);
-    internal.deviceManagerInterceptor.start();
-    internal.deviceManagerCrossFrameProxy = new CrossFrameHandleProxy(
-        handle => internal.deviceManager.addBinding(handle));
+    internal.webUsbService = new FakeWebUsbService();
+    internal.webUsbServiceInterceptor =
+        new MojoInterfaceInterceptor(blink.mojom.WebUsbService.name);
+    internal.webUsbServiceInterceptor.oninterfacerequest =
+        e => internal.webUsbService.addBinding(e.handle);
+    internal.webUsbServiceInterceptor.start();
+    internal.webUsbServiceCrossFrameProxy = new CrossFrameHandleProxy(
+        handle => internal.webUsbService.addBinding(handle));
 
     internal.chooser = new FakeChooserService();
     internal.chooserInterceptor =
@@ -491,12 +491,12 @@
     if (!internal.initialized)
       throw new Error('Call initialize() before attachToWindow().');
 
-    otherWindow.deviceManagerInterceptor =
+    otherWindow.webUsbServiceInterceptor =
         new otherWindow.MojoInterfaceInterceptor(
-            device.mojom.UsbDeviceManager.name);
-    otherWindow.deviceManagerInterceptor.oninterfacerequest =
-        e => internal.deviceManagerCrossFrameProxy.forwardHandle(e.handle);
-    otherWindow.deviceManagerInterceptor.start();
+            blink.mojom.WebUsbService.name);
+    otherWindow.webUsbServiceInterceptor.oninterfacerequest =
+        e => internal.webUsbServiceCrossFrameProxy.forwardHandle(e.handle);
+    otherWindow.webUsbServiceInterceptor.start();
 
     otherWindow.chooserInterceptor =
         new otherWindow.MojoInterfaceInterceptor(
@@ -519,7 +519,7 @@
     // may not be true for all implementations of this test API.
     let fakeDevice = new FakeUSBDevice();
     setTimeout(
-        () => internal.deviceManager.addDevice(fakeDevice, deviceInit), 0);
+        () => internal.webUsbService.addDevice(fakeDevice, deviceInit), 0);
     return fakeDevice;
   }
 
@@ -531,7 +531,7 @@
     // the fact that this polyfill can do this synchronously.
     return new Promise(resolve => {
       setTimeout(() => {
-        internal.deviceManager.removeAllDevices();
+        internal.webUsbService.removeAllDevices();
         resolve();
       }, 0);
     });
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/testharness.js b/third_party/WebKit/LayoutTests/external/wpt/resources/testharness.js
index 0ea7a2a..f0c24635 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/resources/testharness.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/resources/testharness.js
@@ -536,7 +536,6 @@
     /*
      * API functions
      */
-
     function test(func, name, properties)
     {
         var test_name = name ? name : test_environment.next_default_test_name();
@@ -566,31 +565,42 @@
 
     function promise_test(func, name, properties) {
         var test = async_test(name, properties);
+        test._is_promise_test = true;
+
         // If there is no promise tests queue make one.
         if (!tests.promise_tests) {
             tests.promise_tests = Promise.resolve();
         }
         tests.promise_tests = tests.promise_tests.then(function() {
-            var donePromise = new Promise(function(resolve) {
-                test._add_cleanup(resolve);
-            });
-            var promise = test.step(func, test, test);
-            test.step(function() {
-                assert_not_equals(promise, undefined);
-            });
-            Promise.resolve(promise).then(
-                    function() {
+            return new Promise(function(resolve) {
+                var promise = test.step(func, test, test);
+
+                test.step(function() {
+                    assert_not_equals(promise, undefined);
+                });
+
+                // Test authors may use the `step` method within a
+                // `promise_test` even though this reflects a mixture of
+                // asynchronous control flow paradigms. The "done" callback
+                // should be registered prior to the resolution of the
+                // user-provided Promise to avoid timeouts in cases where the
+                // Promise does not settle but a `step` function has thrown an
+                // error.
+                add_test_done_callback(test, resolve);
+
+                Promise.resolve(promise)
+                    .catch(test.step_func(
+                        function(value) {
+                            if (value instanceof AssertionError) {
+                                throw value;
+                            }
+                            assert(false, "promise_test", null,
+                                   "Unhandled rejection with value: ${value}", {value:value});
+                        }))
+                    .then(function() {
                         test.done();
-                    })
-                .catch(test.step_func(
-                    function(value) {
-                        if (value instanceof AssertionError) {
-                            throw value;
-                        }
-                        assert(false, "promise_test", null,
-                               "Unhandled rejection with value: ${value}", {value:value});
-                    }));
-            return donePromise;
+                    });
+                });
         });
     }
 
@@ -723,6 +733,8 @@
             tests.set_file_is_test();
         }
         if (tests.file_is_test) {
+            // file is test files never have asynchronous cleanup logic,
+            // meaning the fully-sycnronous `done` funtion can be used here.
             tests.tests[0].done();
         }
         tests.end_wait();
@@ -1451,7 +1463,7 @@
         }
         this.name = name;
 
-        this.phase = tests.phase === tests.phases.ABORTED ?
+        this.phase = tests.is_aborted ?
             this.phases.COMPLETE : this.phases.INITIAL;
 
         this.status = this.NOTRUN;
@@ -1470,9 +1482,11 @@
         this.stack = null;
 
         this.steps = [];
+        this._is_promise_test = false;
 
         this.cleanup_callbacks = [];
         this._user_defined_cleanup_count = 0;
+        this._done_callbacks = [];
 
         tests.push(this);
     }
@@ -1490,7 +1504,8 @@
         INITIAL:0,
         STARTED:1,
         HAS_RESULT:2,
-        COMPLETE:3
+        CLEANING:3,
+        COMPLETE:4
     };
 
     Test.prototype.structured_clone = function()
@@ -1646,9 +1661,13 @@
 
     Test.prototype.force_timeout = Test.prototype.timeout;
 
+    /**
+     * Update the test status, initiate "cleanup" functions, and signal test
+     * completion.
+     */
     Test.prototype.done = function()
     {
-        if (this.phase == this.phases.COMPLETE) {
+        if (this.phase >= this.phases.CLEANING) {
             return;
         }
 
@@ -1656,15 +1675,23 @@
             this.set_status(this.PASS, null);
         }
 
-        this.phase = this.phases.COMPLETE;
-
         if (global_scope.clearTimeout) {
             clearTimeout(this.timeout_id);
         }
-        tests.result(this);
+
         this.cleanup();
     };
 
+    function add_test_done_callback(test, callback)
+    {
+        if (test.phase === test.phases.COMPLETE) {
+            callback();
+            return;
+        }
+
+        test._done_callbacks.push(callback);
+    }
+
     /*
      * Invoke all specified cleanup functions. If one or more produce an error,
      * the context is in an unpredictable state, so all further testing should
@@ -1672,30 +1699,109 @@
      */
     Test.prototype.cleanup = function() {
         var error_count = 0;
-        var total;
+        var bad_value_count = 0;
+        function on_error() {
+            error_count += 1;
+            // Abort tests immediately so that tests declared within subsequent
+            // cleanup functions are not run.
+            tests.abort();
+        }
+        var this_obj = this;
+        var results = [];
+
+        this.phase = this.phases.CLEANING;
 
         forEach(this.cleanup_callbacks,
                 function(cleanup_callback) {
+                    var result;
+
                     try {
-                        cleanup_callback();
+                        result = cleanup_callback();
                     } catch (e) {
-                        // Set test phase immediately so that tests declared
-                        // within subsequent cleanup functions are not run.
-                        tests.phase = tests.phases.ABORTED;
-                        error_count += 1;
+                        on_error();
+                        return;
                     }
+
+                    if (!is_valid_cleanup_result(this_obj, result)) {
+                        bad_value_count += 1;
+                        // Abort tests immediately so that tests declared
+                        // within subsequent cleanup functions are not run.
+                        tests.abort();
+                    }
+
+                    results.push(result);
                 });
 
-        if (error_count > 0) {
-            total = this._user_defined_cleanup_count;
-            tests.status.status = tests.status.ERROR;
-            tests.status.message = "Test named '" + this.name +
-                "' specified " + total + " 'cleanup' function" +
-                (total > 1 ? "s" : "") + ", and " + error_count + " failed.";
-            tests.status.stack = null;
+        if (!this._is_promise_test) {
+            cleanup_done(this_obj, error_count, bad_value_count);
+        } else {
+            all_async(results,
+                      function(result, done) {
+                          if (result && typeof result.then === "function") {
+                              result
+                                  .then(null, on_error)
+                                  .then(done);
+                          } else {
+                              done();
+                          }
+                      },
+                      function() {
+                          cleanup_done(this_obj, error_count, bad_value_count);
+                      });
         }
     };
 
+    /**
+     * Determine if the return value of a cleanup function is valid for a given
+     * test. Any test may return the value `undefined`. Tests created with
+     * `promise_test` may alternatively return "thenable" object values.
+     */
+    function is_valid_cleanup_result(test, result) {
+        if (result === undefined) {
+            return true;
+        }
+
+        if (test._is_promise_test) {
+            return result && typeof result.then === "function";
+        }
+
+        return false;
+    }
+
+    function cleanup_done(test, error_count, bad_value_count) {
+        if (error_count || bad_value_count) {
+            var total = test._user_defined_cleanup_count;
+
+            tests.status.status = tests.status.ERROR;
+            tests.status.message = "Test named '" + test.name +
+                "' specified " + total +
+                " 'cleanup' function" + (total > 1 ? "s" : "");
+
+            if (error_count) {
+                tests.status.message += ", and " + error_count + " failed";
+            }
+
+            if (bad_value_count) {
+                var type = test._is_promise_test ?
+                   "non-thenable" : "non-undefined";
+                tests.status.message += ", and " + bad_value_count +
+                    " returned a " + type + " value";
+            }
+
+            tests.status.message += ".";
+
+            tests.status.stack = null;
+        }
+
+        test.phase = test.phases.COMPLETE;
+        tests.result(test);
+        forEach(test._done_callbacks,
+                function(callback) {
+                    callback();
+                });
+        test._done_callbacks.length = 0;
+    }
+
     /*
      * A RemoteTest object mirrors a Test object on a remote worker. The
      * associated RemoteWorker updates the RemoteTest object in response to
@@ -1712,6 +1818,7 @@
         this.index = null;
         this.phase = this.phases.INITIAL;
         this.update_state_from(clone);
+        this._done_callbacks = [];
         tests.push(this);
     }
 
@@ -1720,6 +1827,15 @@
         Object.keys(this).forEach(
                 (function(key) {
                     var value = this[key];
+                    // `RemoteTest` instances are responsible for managing
+                    // their own "done" callback functions, so those functions
+                    // are not relevant in other execution contexts. Because of
+                    // this (and because Function values cannot be serialized
+                    // for cross-realm transmittance), the property should not
+                    // be considered when cloning instances.
+                    if (key === '_done_callbacks' ) {
+                        return;
+                    }
 
                     if (typeof value === "object" && value !== null) {
                         clone[key] = merge({}, value);
@@ -1731,7 +1847,19 @@
         return clone;
     };
 
-    RemoteTest.prototype.cleanup = function() {};
+    /**
+     * `RemoteTest` instances are objects which represent tests running in
+     * another realm. They do not define "cleanup" functions (if necessary,
+     * such functions are defined on the associated `Test` instance within the
+     * external realm). However, `RemoteTests` may have "done" callbacks (e.g.
+     * as attached by the `Tests` instance responsible for tracking the overall
+     * test status in the parent realm). The `cleanup` method delegates to
+     * `done` in order to ensure that such callbacks are invoked following the
+     * completion of the `RemoteTest`.
+     */
+    RemoteTest.prototype.cleanup = function() {
+        this.done();
+    };
     RemoteTest.prototype.phases = Test.prototype.phases;
     RemoteTest.prototype.update_state_from = function(clone) {
         this.status = clone.status;
@@ -1743,6 +1871,11 @@
     };
     RemoteTest.prototype.done = function() {
         this.phase = this.phases.COMPLETE;
+
+        forEach(this._done_callbacks,
+                function(callback) {
+                    callback();
+                });
     }
 
     /*
@@ -1774,6 +1907,11 @@
         this.message_target = message_target;
         this.message_handler = function(message) {
             var passesFilter = !message_filter || message_filter(message);
+            // The reference to the `running` property in the following
+            // condition is unnecessary because that value is only set to
+            // `false` after the `message_handler` function has been
+            // unsubscribed.
+            // TODO: Simplify the condition by removing the reference.
             if (this_obj.running && message.data && passesFilter &&
                 (message.data.type in this_obj.message_handlers)) {
                 this_obj.message_handlers[message.data.type].call(this_obj, message.data);
@@ -1794,13 +1932,9 @@
         var filename = (error.filename ? " " + error.filename: "");
         // FIXME: Display remote error states separately from main document
         // error state.
-        this.remote_done({
-            status: {
-                status: tests.status.ERROR,
-                message: "Error in remote" + filename + ": " + message,
-                stack: error.stack
-            }
-        });
+        tests.set_status(tests.status.ERROR,
+                         "Error in remote" + filename + ": " + message,
+                         error.stack);
 
         if (error.preventDefault) {
             error.preventDefault();
@@ -1827,10 +1961,9 @@
     RemoteContext.prototype.remote_done = function(data) {
         if (tests.status.status === null &&
             data.status.status !== data.status.OK) {
-            tests.status.status = data.status.status;
-            tests.status.message = data.status.message;
-            tests.status.stack = data.status.stack;
+            tests.set_status(data.status.status, data.status.message, data.status.sack);
         }
+
         this.message_target.removeEventListener("message", this.message_handler);
         this.running = false;
 
@@ -1902,8 +2035,7 @@
             SETUP:1,
             HAVE_TESTS:2,
             HAVE_RESULTS:3,
-            COMPLETE:4,
-            ABORTED:5
+            COMPLETE:4
         };
         this.phase = this.phases.INITIAL;
 
@@ -1993,6 +2125,13 @@
         async_test();
     };
 
+    Tests.prototype.set_status = function(status, message, stack)
+    {
+        this.status.status = status;
+        this.status.message = message;
+        this.status.stack = stack ? stack : null;
+    };
+
     Tests.prototype.set_timeout = function() {
         if (global_scope.clearTimeout) {
             var this_obj = this;
@@ -2006,9 +2145,35 @@
     };
 
     Tests.prototype.timeout = function() {
+        var test_in_cleanup = null;
+
         if (this.status.status === null) {
-            this.status.status = this.status.TIMEOUT;
+            forEach(this.tests,
+                    function(test) {
+                        // No more than one test is expected to be in the
+                        // "CLEANUP" phase at any time
+                        if (test.phase === test.phases.CLEANING) {
+                            test_in_cleanup = test;
+                        }
+
+                        test.phase = test.phases.COMPLETE;
+                    });
+
+            // Timeouts that occur while a test is in the "cleanup" phase
+            // indicate that some global state was not properly reverted. This
+            // invalidates the overall test execution, so the timeout should be
+            // reported as an error and cancel the execution of any remaining
+            // tests.
+            if (test_in_cleanup) {
+                this.status.status = this.status.ERROR;
+                this.status.message = "Timeout while running cleanup for " +
+                    "test named \"" + test_in_cleanup.name + "\".";
+                tests.status.stack = null;
+            } else {
+                this.status.status = this.status.TIMEOUT;
+            }
         }
+
         this.complete();
     };
 
@@ -2039,11 +2204,10 @@
     };
 
     Tests.prototype.all_done = function() {
-        return this.phase === this.phases.ABORTED ||
-            (this.tests.length > 0 && test_environment.all_loaded &&
-                this.num_pending === 0 && !this.wait_for_finish &&
+        return this.tests.length > 0 && test_environment.all_loaded &&
+                (this.num_pending === 0 || this.is_aborted) && !this.wait_for_finish &&
                 !this.processing_callbacks &&
-                !this.pending_remotes.some(function(w) { return w.running; }));
+                !this.pending_remotes.some(function(w) { return w.running; });
     };
 
     Tests.prototype.start = function() {
@@ -2062,10 +2226,11 @@
 
     Tests.prototype.result = function(test)
     {
-        if (this.phase > this.phases.HAVE_RESULTS) {
-            return;
+        // If the harness has already transitioned beyond the `HAVE_RESULTS`
+        // phase, subsequent tests should not cause it to revert.
+        if (this.phase <= this.phases.HAVE_RESULTS) {
+            this.phase = this.phases.HAVE_RESULTS;
         }
-        this.phase = this.phases.HAVE_RESULTS;
         this.num_pending--;
         this.notify_result(test);
     };
@@ -2088,19 +2253,54 @@
         if (this.phase === this.phases.COMPLETE) {
             return;
         }
-        this.phase = this.phases.COMPLETE;
         var this_obj = this;
-        this.tests.forEach(
-            function(x)
-            {
-                if (x.phase < x.phases.COMPLETE) {
-                    this_obj.notify_result(x);
-                    x.cleanup();
-                    x.phase = x.phases.COMPLETE;
-                }
-            }
-        );
-        this.notify_complete();
+        var all_complete = function() {
+            this_obj.phase = this_obj.phases.COMPLETE;
+            this_obj.notify_complete();
+        };
+        var incomplete = filter(this.tests,
+                                function(test) {
+                                    return test.phase < test.phases.COMPLETE;
+                                });
+
+        /**
+         * To preserve legacy behavior, overall test completion must be
+         * signaled synchronously.
+         */
+        if (incomplete.length === 0) {
+            all_complete();
+            return;
+        }
+
+        all_async(incomplete,
+                  function(test, testDone)
+                  {
+                      if (test.phase === test.phases.INITIAL) {
+                          test.phase = test.phases.COMPLETE;
+                          testDone();
+                      } else {
+                          add_test_done_callback(test, testDone);
+                          test.cleanup();
+                      }
+                  },
+                  all_complete);
+    };
+
+    /**
+     * Update the harness status to reflect an unrecoverable harness error that
+     * should cancel all further testing. Update all previously-defined tests
+     * which have not yet started to indicate that they will not be executed.
+     */
+    Tests.prototype.abort = function() {
+        this.status.status = this.status.ERROR;
+        this.is_aborted = true;
+
+        forEach(this.tests,
+                function(test) {
+                    if (test.phase === test.phases.INITIAL) {
+                        test.phase = test.phases.COMPLETE;
+                    }
+                });
     };
 
     /*
@@ -2866,6 +3066,57 @@
         }
     }
 
+    /**
+     * Immediately invoke a "iteratee" function with a series of values in
+     * parallel and invoke a final "done" function when all of the "iteratee"
+     * invocations have signaled completion.
+     *
+     * If all callbacks complete synchronously (or if no callbacks are
+     * specified), the `done_callback` will be invoked synchronously. It is the
+     * responsibility of the caller to ensure asynchronicity in cases where
+     * that is desired.
+     *
+     * @param {array} value Zero or more values to use in the invocation of
+     *                      `iter_callback`
+     * @param {function} iter_callback A function that will be invoked once for
+     *                                 each of the provided `values`. Two
+     *                                 arguments will be available in each
+     *                                 invocation: the value from `values` and
+     *                                 a function that must be invoked to
+     *                                 signal completion
+     * @param {function} done_callback A function that will be invoked after
+     *                                 all operations initiated by the
+     *                                 `iter_callback` function have signaled
+     *                                 completion
+     */
+    function all_async(values, iter_callback, done_callback)
+    {
+        var remaining = values.length;
+
+        if (remaining === 0) {
+            done_callback();
+        }
+
+        forEach(values,
+                function(element) {
+                    var invoked = false;
+                    var elDone = function() {
+                        if (invoked) {
+                            return;
+                        }
+
+                        invoked = true;
+                        remaining -= 1;
+
+                        if (remaining === 0) {
+                            done_callback();
+                        }
+                    };
+
+                    iter_callback(element, elDone);
+                });
+    }
+
     function merge(a,b)
     {
         var rv = {};
@@ -3008,6 +3259,8 @@
                 }
                 test.set_status(test.FAIL, e.message, stack);
                 test.phase = test.phases.HAS_RESULT;
+                // The following function invocation is superfluous.
+                // TODO: Remove.
                 test.done();
             } else if (!tests.allow_uncaught_exception) {
                 tests.status.status = tests.status.ERROR;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/secure-contexts/idlharness.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/secure-contexts/idlharness.any-expected.txt
deleted file mode 100644
index d2c66ad..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/secure-contexts/idlharness.any-expected.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-This is a testharness.js-based test.
-PASS Test IDL implementation of Secure Contexts
-PASS Partial interface WindowOrWorkerGlobalScope: original interface defined
-PASS WorkerGlobalScope interface: existence and properties of interface object
-FAIL WindowOrWorkerGlobalScope interface: self must inherit property "isSecureContext" with the proper type assert_inherits: property "isSecureContext" found on object expected in prototype chain
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/secure-contexts/idlharness.any.js b/third_party/WebKit/LayoutTests/external/wpt/secure-contexts/idlharness.any.js
index 88341f3..5bd1d44 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/secure-contexts/idlharness.any.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/secure-contexts/idlharness.any.js
@@ -6,15 +6,14 @@
 
 'use strict';
 
-promise_test(async () => {
-  const idl = await fetch("/interfaces/secure-contexts.idl").then(r => r.text());
-  const workers = await fetch("/interfaces/dedicated-workers.idl").then(r => r.text());
-
-  const idl_array = new IdlArray();
-  idl_array.add_idls(idl);
-  idl_array.add_dependency_idls(workers);
-  idl_array.add_objects({
-    WindowOrWorkerGlobalScope: ["self"],
-  });
-  idl_array.test();
-}, "Test IDL implementation of Secure Contexts");
+idl_test(
+  ['secure-contexts'],
+  ['html', 'dom'],
+  idl_array => {
+    if (self.Window) {
+      idl_array.add_objects({ Window: ['self'] });
+    } else {
+      idl_array.add_objects({ WorkerGlobalScope: ['self'] });
+    }
+  }
+);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-ownership-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-ownership-expected.txt
index 34e9813..65f5116e 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-ownership-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-ownership-expected.txt
@@ -1,6 +1,6 @@
 This is a testharness.js-based test.
 FAIL Using the same SpeechSynthesisUtterance with two SpeechSynthesis instances assert_throws: function "() => {
-    iframe.contentWindow.speechSynthesis.speak(utter);
-  }" did not throw
+      iframe.contentWindow.speechSynthesis.speak(utter);
+    }" did not throw
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-ownership.html b/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-ownership.html
index 64bed13..f2121fc 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-ownership.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-ownership.html
@@ -1,19 +1,23 @@
 <!doctype html>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
 <iframe></iframe>
 <script>
 // using an utterance for different SpeechSynthesis instances should throw
-test(t => {
-  // the utterance is short to make the test faster
-  const utter = new SpeechSynthesisUtterance('1');
-  const iframe = document.querySelector('iframe');
-  assert_not_equals(speechSynthesis, iframe.contentWindow.speechSynthesis);
-  speechSynthesis.speak(utter);
-  // the spec doesn't say what exception to throw:
-  // https://github.com/w3c/speech-api/issues/8
-  assert_throws(null, () => {
-    iframe.contentWindow.speechSynthesis.speak(utter);
-  });
+async_test(t => {
+  test_driver.bless('speechSynthesis.speak', t.step_func_done(() => {
+    // the utterance is short to make the test faster
+    const utter = new SpeechSynthesisUtterance('1');
+    const iframe = document.querySelector('iframe');
+    assert_not_equals(speechSynthesis, iframe.contentWindow.speechSynthesis);
+    speechSynthesis.speak(utter);
+    // the spec doesn't say what exception to throw:
+    // https://github.com/w3c/speech-api/issues/8
+    assert_throws(null, () => {
+      iframe.contentWindow.speechSynthesis.speak(utter);
+    });
+  }));
 }, 'Using the same SpeechSynthesisUtterance with two SpeechSynthesis instances');
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-twice.html b/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-twice.html
index 4e4ee345..3e0388b9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-twice.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-twice.html
@@ -1,17 +1,22 @@
 <!doctype html>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<body>
 <script>
 // using an utterance twice on the same SpeechSynthesis instance should work
 // https://github.com/w3c/speech-api/issues/7
 async_test(t => {
-  // the utterance is short to make the test faster
-  const utter = new SpeechSynthesisUtterance('1');
-  speechSynthesis.speak(utter);
-  utter.onend = t.step_func(() => {
+  test_driver.bless('speechSynthesis.speak', t.step_func(() => {
+    // the utterance is short to make the test faster
+    const utter = new SpeechSynthesisUtterance('1');
     speechSynthesis.speak(utter);
-    // pass if the utterance finishes a second time
-    utter.onend = t.step_func_done();
-  });
+    utter.onend = t.step_func(() => {
+      speechSynthesis.speak(utter);
+      // pass if the utterance finishes a second time
+      utter.onend = t.step_func_done();
+    });
+  }));
 }, 'Using the same SpeechSynthesisUtterance twice for speechSynthesis.speak()');
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-with-activation-succeeds.html b/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-with-activation-succeeds.html
new file mode 100644
index 0000000..55dec5c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-with-activation-succeeds.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<body>
+<script>
+async_test(t => {
+  test_driver.bless('speechSynthesis.speak', t.step_func(() => {
+    const utter = new SpeechSynthesisUtterance('1');
+    utter.onend = t.step_func_done();
+    speechSynthesis.speak(utter);
+  }));
+}, 'speechSynthesis.speak requires user activation');
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html
new file mode 100644
index 0000000..acf0d7d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+// TODO(csharrison): Make this test not tentative once
+// https://github.com/w3c/speech-api/issues/35 is resolved.
+async_test(t => {
+  const utter = new SpeechSynthesisUtterance('1');
+  utter.onerror = t.step_func_done((e) => {
+    assert_equals(e.name, "not-allowed");
+  });
+  utter.onend = t.step_func_done(() => assert_unreached());
+  speechSynthesis.speak(utter);
+}, 'speechSynthesis.speak requires user activation');
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/piping/multiple-propagation.js b/third_party/WebKit/LayoutTests/external/wpt/streams/piping/multiple-propagation.js
index 4edc7c1..87119eb 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/streams/piping/multiple-propagation.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/streams/piping/multiple-propagation.js
@@ -12,6 +12,24 @@
 const error2 = new Error('error2!');
 error2.name = 'error2';
 
+function createErroredWritableStream(t) {
+  return Promise.resolve().then(() => {
+    const ws = recordingWritableStream({
+      start(c) {
+        c.error(error2);
+      }
+    });
+
+    const writer = ws.getWriter();
+    return promise_rejects(t, error2, writer.closed, 'the writable stream must be errored with error2')
+        .then(() => {
+          writer.releaseLock();
+          assert_array_equals(ws.events, []);
+          return ws;
+        });
+  });
+}
+
 promise_test(t => {
   const rs = recordingReadableStream({
     start(c) {
@@ -24,7 +42,7 @@
     }
   });
 
-  // Trying to abort a stream that was errored will give that error back
+  // Trying to abort a stream that is erroring will give the writable's error
   return promise_rejects(t, error2, rs.pipeTo(ws), 'pipeTo must reject with the writable stream\'s error').then(() => {
     assert_array_equals(rs.events, []);
     assert_array_equals(ws.events, []);
@@ -35,6 +53,22 @@
     ]);
   });
 
+}, 'Piping from an errored readable stream to an erroring writable stream');
+
+promise_test(t => {
+  const rs = recordingReadableStream({
+    start(c) {
+      c.error(error1);
+    }
+  });
+
+  return createErroredWritableStream(t)
+      .then(ws => promise_rejects(t, error1, rs.pipeTo(ws), 'pipeTo must reject with the readable stream\'s error'))
+      .then(() => {
+        assert_array_equals(rs.events, []);
+
+        return promise_rejects(t, error1, rs.getReader().closed, 'the readable stream must be errored with error1');
+      });
 }, 'Piping from an errored readable stream to an errored writable stream');
 
 promise_test(t => {
@@ -61,6 +95,23 @@
     ]);
   });
 
+}, 'Piping from an errored readable stream to an erroring writable stream; preventAbort = true');
+
+promise_test(t => {
+  const rs = recordingReadableStream({
+    start(c) {
+      c.error(error1);
+    }
+  });
+  return createErroredWritableStream(t)
+  .then(ws => promise_rejects(t, error1, rs.pipeTo(ws, { preventAbort: true }),
+                              'pipeTo must reject with the readable stream\'s error'))
+  .then(() => {
+    assert_array_equals(rs.events, []);
+
+    return promise_rejects(t, error1, rs.getReader().closed, 'the readable stream must be errored with error1');
+  });
+
 }, 'Piping from an errored readable stream to an errored writable stream; preventAbort = true');
 
 promise_test(t => {
@@ -137,6 +188,22 @@
     ]);
   });
 
+}, 'Piping from a closed readable stream to an erroring writable stream');
+
+promise_test(t => {
+  const rs = recordingReadableStream({
+    start(c) {
+      c.close();
+    }
+  });
+  return createErroredWritableStream(t)
+  .then(ws => promise_rejects(t, error2, rs.pipeTo(ws), 'pipeTo must reject with the writable stream\'s error'))
+  .then(() => {
+    assert_array_equals(rs.events, []);
+
+    return rs.getReader().closed;
+  });
+
 }, 'Piping from a closed readable stream to an errored writable stream');
 
 promise_test(() => {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/svg/painting/reftests/paint-order-001-ref.svg b/third_party/WebKit/LayoutTests/external/wpt/svg/painting/reftests/paint-order-001-ref.svg
new file mode 100644
index 0000000..6e1e016
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/svg/painting/reftests/paint-order-001-ref.svg
@@ -0,0 +1,74 @@
+<svg id="svg-root"
+  width="100%" height="100%" viewBox="0 0 480 360"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:xlink="http://www.w3.org/1999/xlink"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+  <g id="testmeta">
+    <title>Paint: 'paint-order'</title>
+    <html:link rel="author"
+          title="Tavmjong Bah"
+          href="http://tavmjong.free.fr"/>
+  </g>
+
+  <style id="test-font" type="text/css">
+    /* Standard Font (if needed). */
+    @font-face {
+      font-family: FreeSans;
+      src: url("../fonts/FreeSans.woff") format("woff");
+    }
+    text {
+      font-family: FreeSans, sans-serif;
+      text-anchor: middle;
+      fill: black;
+    }
+    #title {
+      font-size: 24px;
+    }
+    .label {
+      font-size: 18px;
+    }
+  </style>
+
+  <defs>
+    <rect id="rectangle" width="2" height="2" style="fill:blue" />
+    <marker id="marker" style="overflow:visible" markerWidth="2" markerHeight="2" orient="auto" viewBox="0 0 2 2" refX="1" refY="1">
+      <use xlink:href="#rectangle"/>
+    </marker>
+    <path id="path" d="m -25,-25 0,50 50,0 0,-50 z"/>
+  </defs>
+
+  <g id="test-reference" font-size="16" style="fill:lavender;stroke:green;stroke-width:5px;marker:url(#marker)">
+    <g transform="translate(120,120)">
+      <use xlink:href="#path"/>
+    </g>
+    <g transform="translate(240,120)">
+      <use xlink:href="#path"/>
+    </g>
+    <g transform="translate(360,120)">
+      <use xlink:href="#path"/>
+    </g>
+    <g transform="translate(120,220)">
+      <use xlink:href="#path"/>
+    </g>
+    <g transform="translate(240,220)">
+      <use xlink:href="#path"/>
+      <use xlink:href="#path" style="stroke:none"/>
+    </g>
+    <g transform="translate(360,220)">
+      <use xlink:href="#path"/>
+      <use xlink:href="#path" style="marker:none"/>
+    </g>
+    <g transform="translate(120,320)">
+      <use xlink:href="#path"/>
+    </g>
+    <g transform="translate(240,320)">
+      <use xlink:href="#path"/>
+      <use xlink:href="#path" style="stroke:none"/>
+    </g>
+    <g transform="translate(360,320)">
+      <use xlink:href="#path"/>
+      <use xlink:href="#path" style="marker:none"/>
+    </g>
+  </g>
+
+</svg>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/svg/painting/reftests/paint-order-001.svg b/third_party/WebKit/LayoutTests/external/wpt/svg/painting/reftests/paint-order-001.svg
new file mode 100644
index 0000000..c8d60bd5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/svg/painting/reftests/paint-order-001.svg
@@ -0,0 +1,55 @@
+<svg id="svg-root"
+  width="100%" height="100%" viewBox="0 0 480 360"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:xlink="http://www.w3.org/1999/xlink"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+  <g id="testmeta">
+    <title>Paint: 'paint-order'</title>
+    <html:link rel="author"
+          title="Tavmjong Bah"
+          href="http://tavmjong.free.fr"/>
+    <html:link rel="help"
+          href="https://www.w3.org/TR/SVG2/painting.html#PaintOrder"/>
+    <html:link rel="match"  href="paint-order-001-ref.svg" />
+  </g>
+
+  <style id="test-font" type="text/css">
+    /* Standard Font (if needed). */
+    @font-face {
+      font-family: FreeSans;
+      src: url("../fonts/FreeSans.woff") format("woff");
+    }
+    text {
+      font-family: FreeSans, sans-serif;
+      text-anchor: middle;
+      fill: black;
+    }
+    #title {
+      font-size: 24px;
+    }
+    .label {
+      font-size: 18px;
+    }
+  </style>
+
+  <defs>
+    <rect id="rectangle" width="2" height="2" style="fill:blue" />
+    <marker id="marker" style="overflow:visible" markerWidth="2" markerHeight="2" orient="auto" viewBox="0 0 2 2" refX="1" refY="1">
+      <use xlink:href="#rectangle"/>
+    </marker>
+    <path id="path" d="m -25,-25 0,50 50,0 0,-50 z"/>
+  </defs>
+
+  <g id="test-body-content" font-size="16" style="fill:lavender;stroke:green;stroke-width:5px;marker:url(#marker)">
+    <use xlink:href="#path" transform="translate(120,120)" style="" />
+    <use xlink:href="#path" transform="translate(240,120)" style="paint-order:normal" />
+    <use xlink:href="#path" transform="translate(360,120)" style="paint-order:fill stroke markers" />
+    <use xlink:href="#path" transform="translate(120,220)" style="paint-order:fill" />
+    <use xlink:href="#path" transform="translate(240,220)" style="paint-order:stroke" />
+    <use xlink:href="#path" transform="translate(360,220)" style="paint-order:markers" />
+    <use xlink:href="#path" transform="translate(120,320)" style="paint-order:fill stroke" />
+    <use xlink:href="#path" transform="translate(240,320)" style="paint-order:stroke markers" />
+    <use xlink:href="#path" transform="translate(360,320)" style="paint-order:markers fill" />
+  </g>
+
+</svg>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/resources/usb-helpers.js b/third_party/WebKit/LayoutTests/external/wpt/webusb/resources/usb-helpers.js
index e2b7d46..881ea8b 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webusb/resources/usb-helpers.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/webusb/resources/usb-helpers.js
@@ -22,6 +22,7 @@
     '/resources/chromium/device.mojom.js',
     '/resources/chromium/device_manager.mojom.js',
     '/resources/chromium/chooser_service.mojom.js',
+    '/resources/chromium/web_usb_service.mojom.js',
     '/resources/chromium/webusb-test.js',
   ].forEach(path => {
     // Use importScripts for workers.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/workers/modules/dedicated-worker-import-referrer-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/workers/modules/dedicated-worker-import-referrer-expected.txt
deleted file mode 100644
index 033d418..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/workers/modules/dedicated-worker-import-referrer-expected.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-This is a testharness.js-based test.
-FAIL Same-origin top-level module script loading with "no-referrer" referrer policy assert_equals: expected "" but got "http://web-platform.test:8001/workers/modules/resources/new-worker-window.html"
-FAIL Same-origin top-level module script loading with "origin" referrer policy assert_equals: expected "http://web-platform.test:8001/" but got "http://web-platform.test:8001/workers/modules/resources/new-worker-window.html"
-PASS Same-origin top-level module script loading with "same-origin" referrer policy
-FAIL Same-origin static import with "no-referrer" referrer policy. assert_equals: expected "" but got "http://web-platform.test:8001/workers/modules/resources/static-import-same-origin-referrer-checker-worker.js"
-FAIL Same-origin static import with "origin" referrer policy. assert_equals: expected "http://web-platform.test:8001/" but got "http://web-platform.test:8001/workers/modules/resources/static-import-same-origin-referrer-checker-worker.js"
-PASS Same-origin static import with "same-origin" referrer policy.
-FAIL Cross-origin static import with "no-referrer" referrer policy. assert_equals: expected "" but got "http://web-platform.test:8001/workers/modules/resources/static-import-remote-origin-referrer-checker-worker.sub.js"
-FAIL Cross-origin static import with "origin" referrer policy. assert_equals: expected "http://web-platform.test:8001/" but got "http://web-platform.test:8001/workers/modules/resources/static-import-remote-origin-referrer-checker-worker.sub.js"
-FAIL Cross-origin static import with "same-origin" referrer policy. assert_equals: expected "" but got "http://web-platform.test:8001/workers/modules/resources/static-import-remote-origin-referrer-checker-worker.sub.js"
-FAIL Same-origin dynamic import with "no-referrer" referrer policy. assert_equals: expected "" but got "http://web-platform.test:8001/workers/modules/resources/dynamic-import-same-origin-referrer-checker-worker.js"
-FAIL Same-origin dynamic import with "origin" referrer policy. assert_equals: expected "http://web-platform.test:8001/" but got "http://web-platform.test:8001/workers/modules/resources/dynamic-import-same-origin-referrer-checker-worker.js"
-PASS Same-origin dynamic import with "same-origin" referrer policy.
-FAIL Cross-origin dynamic import with "no-referrer" referrer policy. assert_equals: expected "" but got "http://web-platform.test:8001/workers/modules/resources/dynamic-import-remote-origin-referrer-checker-worker.sub.js"
-FAIL Cross-origin dynamic import with "origin" referrer policy. assert_equals: expected "http://web-platform.test:8001/" but got "http://web-platform.test:8001/workers/modules/resources/dynamic-import-remote-origin-referrer-checker-worker.sub.js"
-FAIL Cross-origin dynamic import with "same-origin" referrer policy. assert_equals: expected "" but got "http://web-platform.test:8001/workers/modules/resources/dynamic-import-remote-origin-referrer-checker-worker.sub.js"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/worklets/animation-worklet-referrer.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/worklets/animation-worklet-referrer.https-expected.txt
index ba0d50f7..d605c756 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/worklets/animation-worklet-referrer.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/worklets/animation-worklet-referrer.https-expected.txt
@@ -1,18 +1,18 @@
 This is a testharness.js-based test.
-FAIL Importing a same-origin script from a page that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a page that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a same-origin script from a page that has "origin" referrer policy should send only an origin as referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a page that has "origin" referrer policy should send only an origin as referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
+PASS Importing a same-origin script from a page that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a remote-origin script from a page that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a same-origin script from a page that has "origin" referrer policy should send only an origin as referrer.
+PASS Importing a remote-origin script from a page that has "origin" referrer policy should send only an origin as referrer.
 PASS Importing a same-origin script from a page that has "same-origin" referrer policy should send referrer.
-FAIL Importing a remote-origin script from a page that has "same-origin" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a same-origin script from a same-origin worklet script that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a same-origin worklet script that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a remote-origin worklet script that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a same-origin script from a same-origin worklet script that has "origin" referrer policy should send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a same-origin worklet script that has "origin" referrer policy should send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a remote-origin worklet script that has "origin" referrer policy should send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
+PASS Importing a remote-origin script from a page that has "same-origin" referrer policy should not send referrer.
+PASS Importing a same-origin script from a same-origin worklet script that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a remote-origin script from a same-origin worklet script that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a remote-origin script from a remote-origin worklet script that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a same-origin script from a same-origin worklet script that has "origin" referrer policy should send referrer.
+PASS Importing a remote-origin script from a same-origin worklet script that has "origin" referrer policy should send referrer.
+PASS Importing a remote-origin script from a remote-origin worklet script that has "origin" referrer policy should send referrer.
 PASS Importing a same-origin script from a same-origin worklet script that has "same-origin" referrer policy should send referrer.
-FAIL Importing a remote-origin script from a same-origin worklet script that has "same-origin" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
+PASS Importing a remote-origin script from a same-origin worklet script that has "same-origin" referrer policy should not send referrer.
 FAIL Importing a remote-origin script from a remote-origin worklet script that has "same-origin" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/worklets/layout-worklet-referrer.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/worklets/layout-worklet-referrer.https-expected.txt
index ba0d50f7..d605c756 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/worklets/layout-worklet-referrer.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/worklets/layout-worklet-referrer.https-expected.txt
@@ -1,18 +1,18 @@
 This is a testharness.js-based test.
-FAIL Importing a same-origin script from a page that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a page that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a same-origin script from a page that has "origin" referrer policy should send only an origin as referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a page that has "origin" referrer policy should send only an origin as referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
+PASS Importing a same-origin script from a page that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a remote-origin script from a page that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a same-origin script from a page that has "origin" referrer policy should send only an origin as referrer.
+PASS Importing a remote-origin script from a page that has "origin" referrer policy should send only an origin as referrer.
 PASS Importing a same-origin script from a page that has "same-origin" referrer policy should send referrer.
-FAIL Importing a remote-origin script from a page that has "same-origin" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a same-origin script from a same-origin worklet script that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a same-origin worklet script that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a remote-origin worklet script that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a same-origin script from a same-origin worklet script that has "origin" referrer policy should send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a same-origin worklet script that has "origin" referrer policy should send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a remote-origin worklet script that has "origin" referrer policy should send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
+PASS Importing a remote-origin script from a page that has "same-origin" referrer policy should not send referrer.
+PASS Importing a same-origin script from a same-origin worklet script that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a remote-origin script from a same-origin worklet script that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a remote-origin script from a remote-origin worklet script that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a same-origin script from a same-origin worklet script that has "origin" referrer policy should send referrer.
+PASS Importing a remote-origin script from a same-origin worklet script that has "origin" referrer policy should send referrer.
+PASS Importing a remote-origin script from a remote-origin worklet script that has "origin" referrer policy should send referrer.
 PASS Importing a same-origin script from a same-origin worklet script that has "same-origin" referrer policy should send referrer.
-FAIL Importing a remote-origin script from a same-origin worklet script that has "same-origin" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
+PASS Importing a remote-origin script from a same-origin worklet script that has "same-origin" referrer policy should not send referrer.
 FAIL Importing a remote-origin script from a remote-origin worklet script that has "same-origin" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/worklets/paint-worklet-referrer.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/worklets/paint-worklet-referrer.https-expected.txt
index ba0d50f7..d605c756 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/worklets/paint-worklet-referrer.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/worklets/paint-worklet-referrer.https-expected.txt
@@ -1,18 +1,18 @@
 This is a testharness.js-based test.
-FAIL Importing a same-origin script from a page that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a page that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a same-origin script from a page that has "origin" referrer policy should send only an origin as referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a page that has "origin" referrer policy should send only an origin as referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
+PASS Importing a same-origin script from a page that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a remote-origin script from a page that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a same-origin script from a page that has "origin" referrer policy should send only an origin as referrer.
+PASS Importing a remote-origin script from a page that has "origin" referrer policy should send only an origin as referrer.
 PASS Importing a same-origin script from a page that has "same-origin" referrer policy should send referrer.
-FAIL Importing a remote-origin script from a page that has "same-origin" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a same-origin script from a same-origin worklet script that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a same-origin worklet script that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a remote-origin worklet script that has "no-referrer" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a same-origin script from a same-origin worklet script that has "origin" referrer policy should send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a same-origin worklet script that has "origin" referrer policy should send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
-FAIL Importing a remote-origin script from a remote-origin worklet script that has "origin" referrer policy should send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
+PASS Importing a remote-origin script from a page that has "same-origin" referrer policy should not send referrer.
+PASS Importing a same-origin script from a same-origin worklet script that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a remote-origin script from a same-origin worklet script that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a remote-origin script from a remote-origin worklet script that has "no-referrer" referrer policy should not send referrer.
+PASS Importing a same-origin script from a same-origin worklet script that has "origin" referrer policy should send referrer.
+PASS Importing a remote-origin script from a same-origin worklet script that has "origin" referrer policy should send referrer.
+PASS Importing a remote-origin script from a remote-origin worklet script that has "origin" referrer policy should send referrer.
 PASS Importing a same-origin script from a same-origin worklet script that has "same-origin" referrer policy should send referrer.
-FAIL Importing a remote-origin script from a same-origin worklet script that has "same-origin" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
+PASS Importing a remote-origin script from a same-origin worklet script that has "same-origin" referrer policy should not send referrer.
 FAIL Importing a remote-origin script from a remote-origin worklet script that has "same-origin" referrer policy should not send referrer. assert_equals: expected "RESOLVED" but got "The user aborted a request."
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/fast/css/CSSStyleSheet-constructable.html b/third_party/WebKit/LayoutTests/fast/css/CSSStyleSheet-constructable.html
index 30e177e..c0d358148 100644
--- a/third_party/WebKit/LayoutTests/fast/css/CSSStyleSheet-constructable.html
+++ b/third_party/WebKit/LayoutTests/fast/css/CSSStyleSheet-constructable.html
@@ -9,6 +9,26 @@
 const redStyleTexts = [".red { color: red; }", ".red + span + span { color: red; }"];
 
 test(() => {
+  const sheet = new CSSStyleSheet({title: "Red", disabled: true, media: "screen, print"});
+  assert_equals(sheet.title, "Red");
+  assert_equals(sheet.ownerNode, null);
+  assert_equals(sheet.ownerRule, null);
+  assert_equals(sheet.media.length, 2);
+  assert_equals(sheet.media.item(0), "screen");
+  assert_equals(sheet.media.item(1), "print");
+  assert_true(sheet.disabled);
+  assert_equals(sheet.cssRules.length, 0);
+
+  sheet.insertRule(redStyleTexts[0]);
+  assert_equals(sheet.cssRules.length, 1);
+  assert_equals(sheet.cssRules[0].cssText, redStyleTexts[0]);
+
+  sheet.insertRule(redStyleTexts[1]);
+  assert_equals(sheet.cssRules.length, 2);
+  assert_equals(sheet.cssRules[0].cssText, redStyleTexts[1]);
+}, 'Empty CSSStyleSheet can be constructed using script');
+
+test(() => {
   const sheet = document.createEmptyCSSStyleSheet({title: "Red", disabled: true, media: "screen, print"});
   assert_equals(sheet.title, "Red");
   assert_equals(sheet.ownerNode, null);
diff --git a/third_party/WebKit/LayoutTests/fast/dom/dom-constructors-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/dom-constructors-expected.txt
index ee72f095..39d0f34 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/dom-constructors-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/dom-constructors-expected.txt
@@ -74,7 +74,7 @@
 PASS TryAllocate('CSSRuleList') is 'exception'
 PASS TryAllocate('CSSStyleDeclaration') is 'exception'
 PASS TryAllocate('CSSStyleRule') is 'exception'
-PASS TryAllocate('CSSStyleSheet') is 'exception'
+FAIL TryAllocate('CSSStyleSheet') should be exception. Was [object CSSStyleSheet].
 PASS TryAllocate('DOMImplementation') is 'exception'
 PASS TryAllocate('HTMLCollection') is 'exception'
 PASS TryAllocate('MediaList') is 'exception'
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/reflection/scroll-fixed-layer-with-reflection-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/reflection/scroll-fixed-layer-with-reflection-expected.txt
index 17dffad..119e02c4 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/reflection/scroll-fixed-layer-with-reflection-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/reflection/scroll-fixed-layer-with-reflection-expected.txt
@@ -45,10 +45,6 @@
   ],
   "objectPaintInvalidations": [
     {
-      "object": "NGPhysicalBoxFragment LayoutNGBlockFlow (positioned) DIV id='moveMe' class='fixed clipped'",
-      "reason": "full"
-    },
-    {
       "object": "LayoutNGBlockFlow (positioned) DIV class='absolute green reflected'",
       "reason": "geometry"
     },
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-fixed-layer-with-transformed-parent-layer-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-fixed-layer-with-transformed-parent-layer-expected.txt
index 450706d..f94bc1fb 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-fixed-layer-with-transformed-parent-layer-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-fixed-layer-with-transformed-parent-layer-expected.txt
@@ -45,10 +45,6 @@
   ],
   "objectPaintInvalidations": [
     {
-      "object": "NGPhysicalBoxFragment LayoutNGBlockFlow (positioned) DIV id='moveMe' class='fixed clipped'",
-      "reason": "full"
-    },
-    {
       "object": "LayoutNGBlockFlow (positioned) DIV class='absolute green'",
       "reason": "geometry"
     },
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-in-fixed-layer-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-in-fixed-layer-expected.txt
index 2ecd9919d..33a86b4 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-in-fixed-layer-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-in-fixed-layer-expected.txt
@@ -45,10 +45,6 @@
   ],
   "objectPaintInvalidations": [
     {
-      "object": "NGPhysicalBoxFragment LayoutNGBlockFlow (positioned) DIV id='moveMe' class='fixed clipped'",
-      "reason": "full"
-    },
-    {
       "object": "LayoutNGBlockFlow (positioned) DIV class='absolute green'",
       "reason": "geometry"
     },
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-in-transformed-layer-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-in-transformed-layer-expected.txt
index b591fa2..31221993 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-in-transformed-layer-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-in-transformed-layer-expected.txt
@@ -33,7 +33,7 @@
   "objectPaintInvalidations": [
     {
       "object": "NGPhysicalBoxFragment LayoutNGBlockFlow (positioned) DIV id='moveMe' class='absolute clipped rotated'",
-      "reason": "full"
+      "reason": "style change"
     },
     {
       "object": "LayoutNGBlockFlow (positioned) DIV class='absolute green'",
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-with-transformed-parent-layer-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-with-transformed-parent-layer-expected.txt
index 793b4ac..6165b8f0 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-with-transformed-parent-layer-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/scroll/scroll-with-transformed-parent-layer-expected.txt
@@ -29,12 +29,6 @@
         }
       ]
     }
-  ],
-  "objectPaintInvalidations": [
-    {
-      "object": "NGPhysicalBoxFragment LayoutNGBlockFlow (positioned) DIV id='moveMe' class='absolute clipped'",
-      "reason": "full"
-    }
   ]
 }
 
diff --git a/third_party/WebKit/LayoutTests/flag-specific/site-per-process/http/tests/inspector-protocol/network/multiple-headers-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/site-per-process/http/tests/inspector-protocol/network/multiple-headers-expected.txt
deleted file mode 100644
index 65df470..0000000
--- a/third_party/WebKit/LayoutTests/flag-specific/site-per-process/http/tests/inspector-protocol/network/multiple-headers-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Tests that multiple HTTP headers with same name are correctly folded into one LF-separated line.
-Pragma header of fetch of http://localhost:8000/inspector-protocol/network/resources/multiple-headers.php?fetch=1: value1, value2
-Pragma header of navigation to http://localhost:8000/inspector-protocol/network/resources/multiple-headers.php: value1
-value2
-
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/multiple-headers-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/multiple-headers-expected.txt
index b28d3430..ece6801 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/multiple-headers-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/multiple-headers-expected.txt
@@ -1,6 +1,6 @@
 Tests that multiple HTTP headers with same name are correctly folded into one LF-separated line.
-Pragma header of fetch of http://localhost:8000/inspector-protocol/network/resources/multiple-headers.php?fetch=1: value1
+Pragma header of fetch of http://127.0.0.1:8000/inspector-protocol/network/resources/multiple-headers.php?fetch=1: value1
 value2
-Pragma header of navigation to http://localhost:8000/inspector-protocol/network/resources/multiple-headers.php: value1
+Pragma header of navigation to http://127.0.0.1:8000/inspector-protocol/network/resources/multiple-headers.php: value1
 value2
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/multiple-headers.js b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/multiple-headers.js
index 646b4138..4c521342 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/multiple-headers.js
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/multiple-headers.js
@@ -3,11 +3,11 @@
       '../resources/test-page.html',
       `Tests that multiple HTTP headers with same name are correctly folded into one LF-separated line.`);
 
-  const url = 'http://localhost:8000/inspector-protocol/network/resources/multiple-headers.php';
+  const url = 'http://127.0.0.1:8000/inspector-protocol/network/resources/multiple-headers.php';
   await dp.Network.enable();
   await dp.Page.enable();
 
-  session.evaluate(`fetch("${url}?fetch=1")`);
+  session.evaluate(`fetch("${url}?fetch=1").then(r => r.text())`);
   const fetchResponse = (await dp.Network.onceResponseReceived()).params.response;
   testRunner.log(`Pragma header of fetch of ${fetchResponse.url}: ${fetchResponse.headers['Access-Control-Pragma']}`);
   await dp.Network.onceLoadingFinished();
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/input/dispatchKeyEvent-focus.js b/third_party/WebKit/LayoutTests/inspector-protocol/input/dispatchKeyEvent-focus.js
index 33bd837..73556e9 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/input/dispatchKeyEvent-focus.js
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/input/dispatchKeyEvent-focus.js
@@ -36,7 +36,7 @@
       windowsVirtualKeyCode: 9,
       key: 'Tab',
     });
-    dp.Input.dispatchKeyEvent({
+    return dp.Input.dispatchKeyEvent({
       type: 'keyUp',
       windowsVirtualKeyCode: 9,
       key: 'Tab',
@@ -56,7 +56,7 @@
   type('foo');
   typeTab();
   type('bar');
-  typeTab();
+  await typeTab();
   testRunner.log(await session.evaluate(`
     logs.push('================');
     logs.push('value of foo:' + document.getElementById('foo').value);
diff --git a/third_party/WebKit/LayoutTests/paint/overflow/flipped-replaced-overflow-expected.html b/third_party/WebKit/LayoutTests/paint/overflow/flipped-replaced-overflow-expected.html
new file mode 100644
index 0000000..7658745
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/paint/overflow/flipped-replaced-overflow-expected.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<style>
+div {
+  position: absolute;
+  top: 100px;
+  left: 0;
+  width: 100px;
+  height: 100px;
+  overflow: hidden;
+  border: 2px solid green;
+}
+img {
+  position: absolute;
+  width: 100px;
+  height: 50px;
+  box-shadow: -50px 0;
+  border: none;
+}
+</style>
+Tests culling of replaced elements with vertical-rl writing mode and asymmetric overflows.
+Passes if there are two black boxes.
+<div>
+  <img style="left: 90px; top: 0">
+  <img style="left: 100px; top: 50px">
+</div>
diff --git a/third_party/WebKit/LayoutTests/paint/overflow/flipped-replaced-overflow.html b/third_party/WebKit/LayoutTests/paint/overflow/flipped-replaced-overflow.html
new file mode 100644
index 0000000..e56a7d4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/paint/overflow/flipped-replaced-overflow.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<style>
+div {
+  position: absolute;
+  top: 100px;
+  left: 0;
+  width: 100px;
+  height: 100px;
+  will-change: transform;
+  overflow: hidden;
+  border: 2px solid green;
+}
+img {
+  writing-mode: vertical-rl;
+  position: absolute;
+  width: 100px;
+  height: 50px;
+  box-shadow: -50px 0;
+  border: none;
+}
+</style>
+Tests culling of replaced elements with vertical-rl writing mode and asymmetric overflows.
+Passes if there are two black boxes.
+<div>
+  <img style="left: 90px; top: 0">
+  <img style="left: 100px; top: 50px">
+</div>
diff --git a/third_party/WebKit/LayoutTests/usb/protected-interface-classes.html b/third_party/WebKit/LayoutTests/usb/protected-interface-classes.html
index fe86dbf..8780f20 100644
--- a/third_party/WebKit/LayoutTests/usb/protected-interface-classes.html
+++ b/third_party/WebKit/LayoutTests/usb/protected-interface-classes.html
@@ -6,6 +6,7 @@
 <script src="../external/wpt/resources/chromium/device.mojom.js"></script>
 <script src="../external/wpt/resources/chromium/device_manager.mojom.js"></script>
 <script src="../external/wpt/resources/chromium/chooser_service.mojom.js"></script>
+<script src="../external/wpt/resources/chromium/web_usb_service.mojom.js"></script>
 <script src="../external/wpt/resources/chromium/webusb-test.js"></script>
 <body>
 <script>
diff --git a/third_party/WebKit/LayoutTests/usb/usbDevice-iframe.html b/third_party/WebKit/LayoutTests/usb/usbDevice-iframe.html
index 98256f1..bf54e8c 100644
--- a/third_party/WebKit/LayoutTests/usb/usbDevice-iframe.html
+++ b/third_party/WebKit/LayoutTests/usb/usbDevice-iframe.html
@@ -6,6 +6,7 @@
 <script src="../external/wpt/resources/chromium/device.mojom.js"></script>
 <script src="../external/wpt/resources/chromium/device_manager.mojom.js"></script>
 <script src="../external/wpt/resources/chromium/chooser_service.mojom.js"></script>
+<script src="../external/wpt/resources/chromium/web_usb_service.mojom.js"></script>
 <script src="../external/wpt/resources/chromium/webusb-test.js"></script>
 <body>
 <script>
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/nonstable-css-properties-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/nonstable-css-properties-expected.txt
index 86e7a29..6bf6e883 100644
--- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/nonstable-css-properties-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/nonstable-css-properties-expected.txt
@@ -79,6 +79,30 @@
 el.style.getPropertyValue('text-underline-position') is 
 getComputedStyle(el).getPropertyValue('text-underline-position') is auto
 
+el.style.setProperty('clear', 'inline-start')
+el.style.getPropertyValue('clear') is 
+getComputedStyle(el).getPropertyValue('clear') is none
+
+el.style.setProperty('clear', 'inline-end')
+el.style.getPropertyValue('clear') is 
+getComputedStyle(el).getPropertyValue('clear') is none
+
+el.style.setProperty('float', 'inline-start')
+el.style.getPropertyValue('float') is 
+getComputedStyle(el).getPropertyValue('float') is none
+
+el.style.setProperty('float', 'inline-end')
+el.style.getPropertyValue('float') is 
+getComputedStyle(el).getPropertyValue('float') is none
+
+el.style.setProperty('resize', 'block')
+el.style.getPropertyValue('resize') is 
+getComputedStyle(el).getPropertyValue('resize') is none
+
+el.style.setProperty('resize', 'inline')
+el.style.getPropertyValue('resize') is 
+getComputedStyle(el).getPropertyValue('resize') is none
+
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/webexposed/element-instance-property-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/element-instance-property-listing-expected.txt
index 63d2b0a2..a08d709 100644
--- a/third_party/WebKit/LayoutTests/webexposed/element-instance-property-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/element-instance-property-listing-expected.txt
@@ -1145,6 +1145,7 @@
     property seekable
     property seeking
     property setMediaKeys
+    property setPictureInPictureControls
     property setSinkId
     property sinkId
     property src
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index 30ed8b3..6801a62a 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -3762,6 +3762,7 @@
     method constructor
     method getVideoPlaybackQuality
     method requestPictureInPicture
+    method setPictureInPictureControls
     method webkitEnterFullScreen
     method webkitEnterFullscreen
     method webkitExitFullScreen
diff --git a/third_party/WebKit/LayoutTests/webexposed/nonstable-css-properties-expected.txt b/third_party/WebKit/LayoutTests/webexposed/nonstable-css-properties-expected.txt
index 3694492b..5786fcb 100644
--- a/third_party/WebKit/LayoutTests/webexposed/nonstable-css-properties-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/nonstable-css-properties-expected.txt
@@ -79,6 +79,30 @@
 el.style.getPropertyValue('text-underline-position') is under right
 getComputedStyle(el).getPropertyValue('text-underline-position') is under right
 
+el.style.setProperty('clear', 'inline-start')
+el.style.getPropertyValue('clear') is inline-start
+getComputedStyle(el).getPropertyValue('clear') is left
+
+el.style.setProperty('clear', 'inline-end')
+el.style.getPropertyValue('clear') is inline-end
+getComputedStyle(el).getPropertyValue('clear') is right
+
+el.style.setProperty('float', 'inline-start')
+el.style.getPropertyValue('float') is inline-start
+getComputedStyle(el).getPropertyValue('float') is left
+
+el.style.setProperty('float', 'inline-end')
+el.style.getPropertyValue('float') is inline-end
+getComputedStyle(el).getPropertyValue('float') is right
+
+el.style.setProperty('resize', 'block')
+el.style.getPropertyValue('resize') is block
+getComputedStyle(el).getPropertyValue('resize') is vertical
+
+el.style.setProperty('resize', 'inline')
+el.style.getPropertyValue('resize') is inline
+getComputedStyle(el).getPropertyValue('resize') is horizontal
+
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/webexposed/nonstable-css-properties.html b/third_party/WebKit/LayoutTests/webexposed/nonstable-css-properties.html
index 27dc3b1..98e613b6 100644
--- a/third_party/WebKit/LayoutTests/webexposed/nonstable-css-properties.html
+++ b/third_party/WebKit/LayoutTests/webexposed/nonstable-css-properties.html
@@ -43,6 +43,13 @@
 ['text-underline-position', 'right'],
 ['text-underline-position', 'under left'],
 ['text-underline-position', 'right under'],
+
+['clear', 'inline-start'],
+['clear', 'inline-end'],
+['float', 'inline-start'],
+['float', 'inline-end'],
+['resize', 'block'],
+['resize', 'inline'],
 ];
 
 properties.forEach(function(args) {
diff --git a/third_party/android_crazy_linker/BUILD.gn b/third_party/android_crazy_linker/BUILD.gn
index 988f794..ced05ef4 100644
--- a/third_party/android_crazy_linker/BUILD.gn
+++ b/third_party/android_crazy_linker/BUILD.gn
@@ -116,7 +116,7 @@
           "src/src/crazy_linker_system_mock.h",
         ]
         defines = [
-          "UNIT_TESTS",
+          "UNIT_TEST",
           "CRAZY_DEBUG=1",
         ]
       } else {
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_api.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_api.cpp
index 9eb4e33..8fb91b40 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_api.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_api.cpp
@@ -292,9 +292,9 @@
   LibraryView* wrap = reinterpret_cast<LibraryView*>(library);
 
   // TODO(digit): Handle NULL symbols properly.
-  *symbol_address = wrap->LookupSymbol(symbol_name);
-  return (*symbol_address == NULL) ? CRAZY_STATUS_FAILURE
-                                   : CRAZY_STATUS_SUCCESS;
+  LibraryView::SearchResult sym = wrap->LookupSymbol(symbol_name);
+  *symbol_address = sym.address;
+  return sym.IsValid() ? CRAZY_STATUS_SUCCESS : CRAZY_STATUS_FAILURE;
 }
 
 crazy_status_t crazy_linker_find_symbol(const char* symbol_name,
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_library_list.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_library_list.cpp
index 8276f77..d0905b3 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_library_list.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_library_list.cpp
@@ -151,7 +151,8 @@
   return nullptr;
 }
 
-void* LibraryList::FindSymbolFrom(const char* symbol_name, LibraryView* from) {
+void* LibraryList::FindSymbolFrom(const char* symbol_name,
+                                  const LibraryView* from) {
   SymbolLookupState lookup_state;
 
   if (!from)
@@ -159,23 +160,20 @@
 
   // Use a work-queue and a set to ensure to perform a breadth-first
   // search.
-  Vector<LibraryView*> work_queue;
+  Vector<const LibraryView*> work_queue;
   PointerSet visited_set;
 
   work_queue.PushBack(from);
 
   while (!work_queue.IsEmpty()) {
-    LibraryView* lib = work_queue.PopFirst();
+    const LibraryView* lib = work_queue.PopFirst();
     if (lib->IsCrazy()) {
       if (lookup_state.CheckSymbol(symbol_name, lib->GetCrazy()))
         return lookup_state.found_addr;
     } else if (lib->IsSystem()) {
-      // TODO(digit): Support weak symbols in system libraries.
-      // With the current code, all symbols in system libraries
-      // are assumed to be non-weak.
-      void* addr = lib->LookupSymbol(symbol_name);
-      if (addr)
-        return addr;
+      LibraryView::SearchResult sym = lib->LookupSymbol(symbol_name);
+      if (sym.IsValid())
+        return sym.address;
     }
 
     // If this is a crazy library, add non-visited dependencies
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_library_list.h b/third_party/android_crazy_linker/src/src/crazy_linker_library_list.h
index 1f308094..27e6f31 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_library_list.h
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_library_list.h
@@ -34,7 +34,7 @@
   // Lookup for a given |symbol_name|, starting from |from_lib|
   // then through its dependencies in breadth-first search order.
   // On failure, returns NULL.
-  void* FindSymbolFrom(const char* symbol_name, LibraryView* from_lib);
+  void* FindSymbolFrom(const char* symbol_name, const LibraryView* from_lib);
 
   // Return the address of a visible given symbol. Used to implement
   // the dlsym() wrapper. Returns NULL on failure.
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_library_view.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_library_view.cpp
index bb549ddb..f8d2f8e 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_library_view.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_library_view.cpp
@@ -19,25 +19,29 @@
   if (type_ == TYPE_SYSTEM) {
     SystemLinker::Close(system_);
     system_ = NULL;
-  }
-  if (type_ == TYPE_CRAZY) {
+  } else if (type_ == TYPE_CRAZY) {
     delete crazy_;
     crazy_ = NULL;
   }
   type_ = TYPE_NONE;
 }
 
-void* LibraryView::LookupSymbol(const char* symbol_name) {
+LibraryView::SearchResult LibraryView::LookupSymbol(
+    const char* symbol_name) const {
   if (type_ == TYPE_SYSTEM) {
-    return SystemLinker::Resolve(system_, symbol_name);
-  }
-
-  if (type_ == TYPE_CRAZY) {
+    SystemLinker::SearchResult result =
+        SystemLinker::Resolve(system_, symbol_name);
+    if (result.IsValid()) {
+      return {result.address, this};
+    }
+  } else if (type_ == TYPE_CRAZY) {
     LibraryList* lib_list = Globals::Get()->libraries();
-    return lib_list->FindSymbolFrom(symbol_name, this);
+    void* address = lib_list->FindSymbolFrom(symbol_name, this);
+    if (address) {
+      return {address, this};
+    }
   }
-
-  return NULL;
+  return {};
 }
 
 bool LibraryView::GetInfo(size_t* load_address,
@@ -49,7 +53,6 @@
     *error = "No RELRO sharing with system libraries";
     return false;
   }
-
   crazy_->GetInfo(load_address, load_size, relro_start, relro_size);
   return true;
 }
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_library_view.h b/third_party/android_crazy_linker/src/src/crazy_linker_library_view.h
index a3aa9a7..f016ce73 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_library_view.h
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_library_view.h
@@ -51,8 +51,10 @@
   // available).
   const char* GetName() const { return name_.c_str(); }
 
+  // Returns SharedLibrary handle if valid, nullptr otherwise.
   SharedLibrary* GetCrazy() const { return IsCrazy() ? crazy_ : NULL; }
 
+  // Returns system handle if valid, nullptr otherwise.
   void* GetSystem() const { return IsSystem() ? system_ : NULL; }
 
   // Increment reference count for this LibraryView.
@@ -62,11 +64,19 @@
   // This never destroys the object.
   bool SafeDecrementRef() { return (--ref_count_ == 0); }
 
+  // Result type for LookupSymbol()
+  struct SearchResult {
+    void* address = nullptr;
+    const LibraryView* library = nullptr;
+
+    constexpr bool IsValid() const { return library != nullptr; }
+  };
+
   // Lookup a symbol from this library.
-  // If this is a crazy library, perform a breadth-first search,
-  // for system libraries, use dlsym() instead.
-  // TODO(digit): Make this const.
-  void* LookupSymbol(const char* symbol_name);
+  // If this is a crazy library, only looks directly in the library (and none
+  // of its dependencies). For system libraries, this uses dlsym() which will
+  // perform a breadth-first-search.
+  SearchResult LookupSymbol(const char* symbol_name) const;
 
   // Retrieve library information.
   bool GetInfo(size_t* load_address,
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_pointer_set.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_pointer_set.cpp
index 3b151fe4..e58d2c1 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_pointer_set.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_pointer_set.cpp
@@ -6,7 +6,8 @@
 
 namespace crazy {
 
-static SearchResult BinarySearch(const Vector<void*>& items, void* key) {
+static SearchResult BinarySearch(const Vector<const void*>& items,
+                                 const void* key) {
   auto key_val = reinterpret_cast<uintptr_t>(key);
   size_t min = 0, max = items.GetCount();
   while (min < max) {
@@ -23,7 +24,7 @@
   return {false, min};
 }
 
-bool PointerSet::Add(void* item) {
+bool PointerSet::Add(const void* item) {
   SearchResult ret = BinarySearch(items_, item);
   if (ret.found)
     return true;
@@ -32,7 +33,7 @@
   return false;
 }
 
-bool PointerSet::Remove(void* item) {
+bool PointerSet::Remove(const void* item) {
   SearchResult ret = BinarySearch(items_, item);
   if (!ret.found)
     return false;
@@ -41,7 +42,7 @@
   return true;
 }
 
-bool PointerSet::Has(void* item) const {
+bool PointerSet::Has(const void* item) const {
   SearchResult ret = BinarySearch(items_, item);
   return ret.found;
 }
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_pointer_set.h b/third_party/android_crazy_linker/src/src/crazy_linker_pointer_set.h
index da4a403..eb40ecb 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_pointer_set.h
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_pointer_set.h
@@ -15,23 +15,23 @@
   PointerSet() = default;
 
   // Add a new value to the set.
-  bool Add(void* item);
+  bool Add(const void* item);
 
   // Remove value |item| from the set, if needed. Returns true if the value
   // was previously in the set, false otherwise.
-  bool Remove(void* item);
+  bool Remove(const void* item);
 
   // Returns true iff the set contains |item|, false otherwise.
-  bool Has(void* item) const;
+  bool Has(const void* item) const;
 
   // Return a reference to the values in the set, only for testing.
-  const Vector<void*>& GetValuesForTesting() const { return items_; }
+  const Vector<const void*>& GetValuesForTesting() const { return items_; }
 
  private:
   // TECHNICAL NOTE: The current implementation uses a simple sorted array,
   // and thus should perform well for sets of a few hundred items, when
   // insertions and removals are pretty rare, but lookups need to be fast.
-  Vector<void*> items_;
+  Vector<const void*> items_;
 };
 
 }  // namespace crazy
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_pointer_set_unittest.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_pointer_set_unittest.cpp
index 31c1ef5..0b5d6c9 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_pointer_set_unittest.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_pointer_set_unittest.cpp
@@ -12,7 +12,7 @@
   PointerSet set;
   EXPECT_FALSE(set.Has(nullptr));
 
-  const Vector<void*>& values = set.GetValuesForTesting();
+  const Vector<const void*>& values = set.GetValuesForTesting();
   EXPECT_TRUE(values.IsEmpty());
 }
 
@@ -24,7 +24,7 @@
   EXPECT_FALSE(set.Add(nullptr));
   EXPECT_TRUE(set.Has(nullptr));
 
-  const Vector<void*>& values = set.GetValuesForTesting();
+  const Vector<const void*>& values = set.GetValuesForTesting();
   EXPECT_FALSE(values.IsEmpty());
   EXPECT_EQ(1U, values.GetCount());
   EXPECT_EQ(nullptr, values[0]);
@@ -45,7 +45,7 @@
   EXPECT_FALSE(set.Has(kTwo));
   EXPECT_TRUE(set.Has(kTen));
 
-  const Vector<void*>& values = set.GetValuesForTesting();
+  const Vector<const void*>& values = set.GetValuesForTesting();
   EXPECT_FALSE(values.IsEmpty());
   EXPECT_EQ(2U, values.GetCount());
   EXPECT_EQ(kOne, values[0]);
@@ -67,7 +67,7 @@
   EXPECT_TRUE(set.Has(kTwo));
   EXPECT_TRUE(set.Has(kTen));
 
-  const Vector<void*>& values = set.GetValuesForTesting();
+  const Vector<const void*>& values = set.GetValuesForTesting();
   EXPECT_FALSE(values.IsEmpty());
   EXPECT_EQ(3U, values.GetCount());
 
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_shared_library.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_shared_library.cpp
index 99f5c0d..006fe69 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_shared_library.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_shared_library.cpp
@@ -87,21 +87,40 @@
     func();
 }
 
-// An instance of ElfRelocator::SymbolResolver that can be used
+// An instance of ElfRelocations::SymbolResolver that can be used
 // to resolve symbols in a shared library being loaded by
 // LibraryList::LoadLibrary.
 class SharedLibraryResolver : public ElfRelocations::SymbolResolver {
  public:
   SharedLibraryResolver(SharedLibrary* lib,
                         LibraryList* lib_list,
-                        Vector<LibraryView*>* preloads,
-                        Vector<LibraryView*>* dependencies)
+                        const Vector<LibraryView*>* preloads,
+                        const Vector<LibraryView*>* dependencies)
       : main_program_handle_(SystemLinker::Open(NULL, RTLD_NOW)),
         lib_(lib),
         preloads_(preloads),
         dependencies_(dependencies) {}
 
+  ~SharedLibraryResolver() { SystemLinker::Close(main_program_handle_); }
+
   virtual void* Lookup(const char* symbol_name) {
+    // IMPORTANT NOTE: This code is completely buggy, when relocating symbol
+    // a correct ELF linker should only consider libraries in the global scope,
+    // or other libraries in the same load group.
+    //
+    // The global scope is defined as the program executable, any of its
+    // direct dependencies, any preloads, as well as any library loaded later
+    // with the RTLD_GLOBAL flag.
+    //
+    // Normally, one can lookup symbols in it using dlsym(RTLD_DEFAULT, <name>)
+    // or using dlsym() with a handle created with dlopen(NULL, ...). However
+    // the Android system linker didn't always implement these cases properly.
+
+    // TODO(digit): Fix this by totally changing the way libraries are loaded
+    // and relocated, and provide mock SystemLinker implementations that
+    // mimic the broken implementations of the Android linker for proper
+    // testing.
+
     // First, look inside the current library.
     const ELF::Sym* entry = lib_->LookupSymbolEntry(symbol_name);
     if (entry)
@@ -124,38 +143,41 @@
     //
     // For more, see commentary in LibraryList(), and
     //   https://code.google.com/p/android/issues/detail?id=74255
-    for (size_t n = 0; n < preloads_->GetCount(); ++n) {
-      LibraryView* wrap = (*preloads_)[n];
+    for (const LibraryView* preload : *preloads_) {
       // LOG("Looking into preload %p (%s)", wrap,
       // wrap->GetName());
-      address = LookupInWrap(symbol_name, wrap);
+      address = LookupIn(symbol_name, preload);
       if (address)
         return address;
     }
 
-    // Then lookup inside the main executable.
-    address = SystemLinker::Resolve(main_program_handle_, symbol_name);
-    if (address)
-      return address;
+    // Then lookup inside the global scope.
+    SystemLinker::SearchResult ret =
+        SystemLinker::Resolve(main_program_handle_, symbol_name);
+    if (ret.IsValid()) {
+      return ret.address;
+    }
 
     // Then look inside the dependencies.
-    for (size_t n = 0; n < dependencies_->GetCount(); ++n) {
-      LibraryView* wrap = (*dependencies_)[n];
-      // LOG("Looking into dependency %p (%s)", wrap,
-      // wrap->GetName());
-      address = LookupInWrap(symbol_name, wrap);
+    for (const LibraryView* dep : *dependencies_) {
+      // LOG("Looking into dependency %p (%s)", dep, dep->GetName());
+      address = LookupIn(symbol_name, dep);
       if (address)
         return address;
     }
 
     // Nothing found here.
-    return NULL;
+    return nullptr;
   }
 
  private:
-  virtual void* LookupInWrap(const char* symbol_name, LibraryView* wrap) {
-    if (wrap->IsSystem()) {
-      void* address = SystemLinker::Resolve(wrap->GetSystem(), symbol_name);
+  // Lookup for |symbol_name| inside of |lib|, and return the corresponding
+  // address. For system libraries, this can also resolve missing "isnanf"
+  // or "__isnanf" symbols from libm.so to local_isnanf. For crazy libraries,
+  // this will look only within the library, not its dependencies.
+  virtual void* LookupIn(const char* symbol_name, const LibraryView* lib) {
+    if (lib->IsSystem()) {
+      LibraryView::SearchResult sym = lib->LookupSymbol(symbol_name);
       // Android libm.so defines isnanf as weak. This means that its
       // address cannot be found by dlsym(), which returns NULL for weak
       // symbols prior to Android 5.0. However, libm.so contains the real
@@ -167,32 +189,32 @@
       // isnanf never need be resolved in gcc builds.
       //
       // http://code.google.com/p/chromium/issues/detail?id=376828
-      if (!address && !strcmp(symbol_name, "isnanf") &&
-          !strcmp(wrap->GetName(), "libm.so")) {
-        address = SystemLinker::Resolve(wrap->GetSystem(), "__isnanf");
-        if (!address) {
+      if (!sym.IsValid() && !strcmp(symbol_name, "isnanf") &&
+          !strcmp(lib->GetName(), "libm.so")) {
+        sym = lib->LookupSymbol("__isnanf");
+        if (!sym.IsValid()) {
           // __isnanf only exists on Android 21+, so use a local fallback
           // if that doesn't exist either.
-          address = reinterpret_cast<void*>(&local_isnanf);
+          sym.address = reinterpret_cast<void*>(&local_isnanf);
         }
       }
-      return address;
+      return sym.address;
     }
 
-    if (wrap->IsCrazy()) {
-      SharedLibrary* crazy = wrap->GetCrazy();
+    if (lib->IsCrazy()) {
+      SharedLibrary* crazy = lib->GetCrazy();
       const ELF::Sym* entry = crazy->LookupSymbolEntry(symbol_name);
       if (entry)
         return reinterpret_cast<void*>(crazy->load_bias() + entry->st_value);
     }
 
-    return NULL;
+    return nullptr;
   }
 
   void* main_program_handle_;
   SharedLibrary* lib_;
-  Vector<LibraryView*>* preloads_;
-  Vector<LibraryView*>* dependencies_;
+  const Vector<LibraryView*>* preloads_;
+  const Vector<LibraryView*>* dependencies_;
 };
 
 }  // namespace
@@ -342,8 +364,8 @@
 }
 
 bool SharedLibrary::Relocate(LibraryList* lib_list,
-                             Vector<LibraryView*>* preloads,
-                             Vector<LibraryView*>* dependencies,
+                             const Vector<LibraryView*>* preloads,
+                             const Vector<LibraryView*>* dependencies,
                              Error* error) {
   // Apply relocations.
   LOG("Applying relocations to %s", base_name_);
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_shared_library.h b/third_party/android_crazy_linker/src/src/crazy_linker_shared_library.h
index 52ff560..e3a0eee 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_shared_library.h
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_shared_library.h
@@ -63,8 +63,8 @@
   // loaded in |lib_list|. On failure, return false and set |error|
   // message.
   bool Relocate(LibraryList* lib_list,
-                Vector<LibraryView*>* preloads,
-                Vector<LibraryView*>* dependencies,
+                const Vector<LibraryView*>* preloads,
+                const Vector<LibraryView*>* dependencies,
                 Error* error);
 
   void GetInfo(size_t* load_address,
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_system.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_system.cpp
index 1c53bb8..f29da84 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_system.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_system.cpp
@@ -53,7 +53,7 @@
 
 }  // namespace crazy
 
-#ifndef UNIT_TESTS
+#ifndef UNIT_TEST
 
 namespace crazy {
 
@@ -219,4 +219,4 @@
 
 #endif  // !CRAZY_LINKER_ENABLE_FUZZING
 
-#endif  // !UNIT_TESTS
+#endif  // !UNIT_TEST
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_system_linker.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_system_linker.cpp
index c2a5a072..162805a 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_system_linker.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_system_linker.cpp
@@ -27,11 +27,17 @@
 }
 
 // static
-void* SystemLinker::Resolve(void* handle, const char* symbol) {
+SystemLinker::SearchResult SystemLinker::Resolve(void* handle,
+                                                 const char* symbol) {
   // Just in case the system linker performs lazy symbol resolution
   // that would modify the global link map.
   ScopedLinkMapLocker locker;
-  return ::dlsym(handle, symbol);
+  void* address = ::dlsym(handle, symbol);
+  if (!address) {
+    // TODO(digit): Distinguish between missing symbols and weak symbols.
+    return {};
+  }
+  return {address, handle};
 }
 
 // static
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_system_linker.h b/third_party/android_crazy_linker/src/src/crazy_linker_system_linker.h
index 50da145..538c6eec 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_system_linker.h
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_system_linker.h
@@ -21,8 +21,16 @@
   // Wrapper for dlclose().
   static int Close(void* handle);
 
+  // Result type for Resolve() below.
+  struct SearchResult {
+    void* address = nullptr;
+    void* library = nullptr;
+
+    constexpr bool IsValid() const { return library != nullptr; }
+  };
+
   // Wrapper for dlsym().
-  static void* Resolve(void* handle, const char* symbol);
+  static SearchResult Resolve(void* handle, const char* symbol);
 
   // Wrapper for dlerror().
   static const char* Error();
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_system_mock.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_system_mock.cpp
index 1f1234e..edf1233 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_system_mock.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_system_mock.cpp
@@ -341,7 +341,7 @@
 
 namespace crazy {
 
-#ifdef UNIT_TESTS
+#ifdef UNIT_TEST
 
 bool PathExists(const char* path) {
   s_mock_fs.Check();
@@ -464,6 +464,6 @@
   s_mock_fs.SetCurrentDir(path);
 }
 
-#endif  // UNIT_TESTS
+#endif  // UNIT_TEST
 
 }  // namespace crazy
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_util.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_util.cpp
index f584984..421b979e 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_util.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_util.cpp
@@ -115,6 +115,14 @@
   }
 }
 
+bool String::operator==(const String& other) const {
+  return size_ == other.size_ && !::memcmp(ptr_, other.ptr_, size_);
+}
+
+bool String::operator==(const char* str) const {
+  return !::strcmp(ptr_, str);
+}
+
 VectorBase::~VectorBase() {
   ::free(data_);
 }
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_util.h b/third_party/android_crazy_linker/src/src/crazy_linker_util.h
index cb043ea..3c140ee 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_util.h
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_util.h
@@ -145,6 +145,16 @@
 
   void Append(const char* str) { Append(str, strlen(str)); }
 
+  // Comparison operators.
+  bool operator==(const String& other) const;
+  bool operator==(const char* str) const;
+
+  inline bool operator!=(const String& other) const {
+    return !(*this == other);
+  }
+
+  inline bool operator!=(const char* str) const { return !(*this == str); }
+
  private:
   inline void Init() {
     ptr_ = const_cast<char*>(kEmpty);
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_util_unittest.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_util_unittest.cpp
index bbd8f7a..5eb38f16 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_util_unittest.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_util_unittest.cpp
@@ -101,6 +101,30 @@
   EXPECT_EQ('\0', s[6]);
 }
 
+TEST(String, EqualityOperators) {
+  String a("Foo");
+  String b("Bar");
+
+  EXPECT_TRUE(a == String("Foo"));
+  EXPECT_TRUE(a == "Foo");
+
+  EXPECT_TRUE(b != String("Foo"));
+  EXPECT_TRUE(b != "Foo");
+
+  EXPECT_TRUE(a != b);
+
+  EXPECT_TRUE(b == String("Bar"));
+  EXPECT_TRUE(b == "Bar");
+
+  EXPECT_FALSE(a == "Foo ");
+  EXPECT_FALSE(b == " Bar");
+  EXPECT_FALSE(a == "foo");
+
+  EXPECT_TRUE(a != "Foo ");
+  EXPECT_TRUE(b != " Bar");
+  EXPECT_TRUE(a != "foo");
+}
+
 TEST(String, Resize) {
   String s("A very long string to have fun");
   s.Resize(10);
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_wrappers.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_wrappers.cpp
index 96cfe00..192954e 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_wrappers.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_wrappers.cpp
@@ -38,7 +38,7 @@
 
 namespace {
 
-#ifndef UNIT_TESTS
+#ifndef UNIT_TEST
 // LLVM's demangler is large, and we have no need of it.  Overriding it with
 // our own stub version here stops a lot of code being pulled in from libc++.
 // This reduces the on-disk footprint of the crazy linker library by more than
@@ -56,7 +56,7 @@
     *status = kMemoryAllocFailure;
   return NULL;
 }
-#endif  // UNIT_TESTS
+#endif  // UNIT_TEST
 
 #ifdef __arm__
 extern "C" int __cxa_atexit(void (*)(void*), void*, void*);
@@ -145,26 +145,27 @@
   if (!globals->valid_handles()->Has(lib_handle)) {
     // Note: the handle was not opened with the crazy linker, so fall back
     // to the system linker. That can happen in rare cases.
-    void* result = SystemLinker::Resolve(lib_handle, symbol_name);
-    if (!result) {
+    SystemLinker::SearchResult sym =
+        SystemLinker::Resolve(lib_handle, symbol_name);
+    if (!sym.IsValid()) {
       SaveSystemError();
       LOG("dlsym: could not find symbol '%s' from foreign library\n",
           symbol_name, GetThreadData()->GetError());
     }
-    return result;
+    return sym.address;
   }
 
   auto* wrap_lib = reinterpret_cast<LibraryView*>(lib_handle);
   if (wrap_lib->IsSystem()) {
-    void* result = SystemLinker::Resolve(wrap_lib->GetSystem(), symbol_name);
-    if (!result) {
+    LibraryView::SearchResult sym = wrap_lib->LookupSymbol(symbol_name);
+    if (!sym.IsValid()) {
       SaveSystemError();
       LOG("dlsym:%s: could not find symbol '%s' from system library\n%s",
           wrap_lib->GetName(),
           symbol_name,
           GetThreadData()->GetError());
     }
-    return result;
+    return sym.address;
   }
 
   if (wrap_lib->IsCrazy()) {
@@ -281,16 +282,16 @@
 // the address of a heap-allocated array of pointers, which must be explicitly
 // free()-ed by the caller. This returns nullptr is the array is empty.
 // On exit, sets |*p_count| to the number of items in the array.
-void** GetValidDlopenHandlesForTesting(size_t* p_count) {
+const void** GetValidDlopenHandlesForTesting(size_t* p_count) {
   ScopedLockedGlobals globals;
-  const Vector<void*>& handles =
+  const Vector<const void*>& handles =
       globals->valid_handles()->GetValuesForTesting();
   *p_count = handles.GetCount();
   if (handles.IsEmpty())
     return nullptr;
 
-  auto* ptr =
-      reinterpret_cast<void**>(malloc(handles.GetCount() * sizeof(void*)));
+  auto* ptr = reinterpret_cast<const void**>(
+      malloc(handles.GetCount() * sizeof(void*)));
   for (size_t n = 0; n < handles.GetCount(); ++n) {
     ptr[n] = handles[n];
   }
diff --git a/third_party/blink/public/common/BUILD.gn b/third_party/blink/public/common/BUILD.gn
index 9f6ac75..72fb8fb 100644
--- a/third_party/blink/public/common/BUILD.gn
+++ b/third_party/blink/public/common/BUILD.gn
@@ -59,6 +59,7 @@
     "origin_trials/trial_token.h",
     "origin_trials/trial_token_validator.h",
     "page/launching_process_state.h",
+    "picture_in_picture/picture_in_picture_control_info.h",
     "privacy_preferences.h",
     "screen_orientation/web_screen_orientation_enum_traits.h",
     "screen_orientation/web_screen_orientation_lock_type.h",
diff --git a/third_party/blink/public/common/picture_in_picture/picture_in_picture_control_info.h b/third_party/blink/public/common/picture_in_picture/picture_in_picture_control_info.h
new file mode 100644
index 0000000..e27a29e
--- /dev/null
+++ b/third_party/blink/public/common/picture_in_picture/picture_in_picture_control_info.h
@@ -0,0 +1,38 @@
+// 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 THIRD_PARTY_BLINK_PUBLIC_COMMON_PICTURE_IN_PICTURE_PICTURE_IN_PICTURE_CONTROL_INFO_H_
+#define THIRD_PARTY_BLINK_PUBLIC_COMMON_PICTURE_IN_PICTURE_PICTURE_IN_PICTURE_CONTROL_INFO_H_
+
+#include <string>
+#include <vector>
+#include "ui/gfx/geometry/size.h"
+#include "url/gurl.h"
+
+namespace blink {
+
+// PictureInPictureControlInfo passes information about the desired custom
+// controls for a Picture-in-Picture window from the Web API to the
+// OverlayWindow.
+struct PictureInPictureControlInfo {
+  // These vectors represent the members of a deserialized MediaImage.
+  struct Icon {
+    GURL src;
+    std::vector<gfx::Size> sizes;
+    std::string type;
+  };
+
+  // |id| is the unique name of the custom control.
+  std::string id;
+
+  // |label| is the descriptive text used for accessibility and hover text.
+  std::string label;
+
+  // |icons| contains the images used for the custom control.
+  std::vector<Icon> icons;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_PICTURE_IN_PICTURE_PICTURE_IN_PICTURE_CONTROL_INFO_H_
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn
index d66f88f8..a21665f 100644
--- a/third_party/blink/public/mojom/BUILD.gn
+++ b/third_party/blink/public/mojom/BUILD.gn
@@ -69,6 +69,7 @@
     # get fixed.
     "//services/network/public/mojom:data_pipe_interfaces",
     "//skia/public/interfaces",
+    "//third_party/blink/public/mojom/usb",
     "//ui/gfx/geometry/mojo",
     "//url/mojom:url_mojom_gurl",
     "//url/mojom:url_mojom_origin",
diff --git a/third_party/blink/public/mojom/usb/BUILD.gn b/third_party/blink/public/mojom/usb/BUILD.gn
new file mode 100644
index 0000000..0e8769d
--- /dev/null
+++ b/third_party/blink/public/mojom/usb/BUILD.gn
@@ -0,0 +1,36 @@
+# 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.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("usb") {
+  # Ideally, this mojom file should be compiled directly in "mojom_platform"
+  # target in the parent directory. But as we need |scramble_message_ids| to
+  # be "false" for its mojom JS file will be used in external WPT layout tests.
+  # To limit this option's influence scope, we make it a separate target.
+  sources = [
+    "web_usb_service.mojom",
+  ]
+
+  deps = [
+    "//mojo/public/mojom/base",
+
+    # TODO(donna.wu@intel.com): Change the following line to //service/device/
+    # after it has been moved to //services/device.
+    "//device/usb/public/mojom",
+  ]
+
+  # USB Mojom interfaces are exposed publicly to layout tests which use
+  # prepackaged redistributable JS bindings. It is therefore not desirable to
+  # scramble these messages.
+  scramble_message_ids = false
+
+  export_class_attribute = "BLINK_COMMON_EXPORT"
+  export_define = "BLINK_COMMON_IMPLEMENTATION=1"
+  export_header = "third_party/blink/common/common_export.h"
+
+  export_class_attribute_blink = "PLATFORM_EXPORT"
+  export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1"
+  export_header_blink = "third_party/blink/renderer/platform/platform_export.h"
+}
diff --git a/third_party/blink/public/mojom/usb/OWNERS b/third_party/blink/public/mojom/usb/OWNERS
new file mode 100644
index 0000000..08850f4
--- /dev/null
+++ b/third_party/blink/public/mojom/usb/OWNERS
@@ -0,0 +1,2 @@
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/public/mojom/usb/web_usb_service.mojom b/third_party/blink/public/mojom/usb/web_usb_service.mojom
new file mode 100644
index 0000000..27bb474f
--- /dev/null
+++ b/third_party/blink/public/mojom/usb/web_usb_service.mojom
@@ -0,0 +1,23 @@
+// 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.
+
+module blink.mojom;
+
+import "device/usb/public/mojom/device.mojom";
+import "device/usb/public/mojom/device_manager.mojom";
+
+// This is a parallel interface with UsbDeviceManager aimed to handle extra work
+// such as permission checking, chooser showing, etc. in browser.
+// WebUsbServiceImpl in //chrome/browser/usb will implement this interface, and
+// it will be used by webusb module in //third_party/blink/renderer/modules/.
+interface WebUsbService {
+  // Retrieves information about all devices available.
+  GetDevices() => (array<device.mojom.UsbDeviceInfo> results);
+
+  // Requests a device by guid.
+  GetDevice(string guid, device.mojom.UsbDevice& device_requestd);
+
+  // Sets the client for this WebUsbService.
+  SetClient(device.mojom.UsbDeviceManagerClient client);
+};
diff --git a/third_party/blink/public/platform/autoplay.mojom b/third_party/blink/public/platform/autoplay.mojom
index 6dfc7492..2198b49 100644
--- a/third_party/blink/public/platform/autoplay.mojom
+++ b/third_party/blink/public/platform/autoplay.mojom
@@ -14,6 +14,10 @@
 // This flag indicates a page should always be allowed to autoplay.
 const int32 kAutoplayFlagForceAllow          = 0x00002;
 
+// This flag indicates a page should be allowed to autoplay because the
+// user has added an exception for it.
+const int32 kAutoplayFlagUserException       = 0x00004;
+
 interface AutoplayConfigurationClient {
   // The browser tells the renderer that an origin has specific autoplay flags.
   AddAutoplayFlags(url.mojom.Origin origin, int32 flags);
diff --git a/third_party/blink/public/platform/web_media_player.h b/third_party/blink/public/platform/web_media_player.h
index 59c2fd3..e2171b3 100644
--- a/third_party/blink/public/platform/web_media_player.h
+++ b/third_party/blink/public/platform/web_media_player.h
@@ -60,6 +60,7 @@
 enum class WebFullscreenVideoStatus;
 struct WebRect;
 struct WebSize;
+struct PictureInPictureControlInfo;
 
 class WebMediaPlayer {
  public:
@@ -148,6 +149,9 @@
   virtual void EnterPictureInPicture(PipWindowOpenedCallback) = 0;
   // Exit Picture-in-Picture and notifies Blink when it's done.
   virtual void ExitPictureInPicture(PipWindowClosedCallback) = 0;
+  // Assign custom controls to the Picture-in-Picture window.
+  virtual void SetPictureInPictureCustomControls(
+      const std::vector<PictureInPictureControlInfo>&) = 0;
   // Register a callback that will be run when the Picture-in-Picture window
   // is resized.
   virtual void RegisterPictureInPictureWindowResizeCallback(
diff --git a/third_party/blink/renderer/bindings/core/v8/BUILD.gn b/third_party/blink/renderer/bindings/core/v8/BUILD.gn
index 521f6d6..cfd89e7c 100644
--- a/third_party/blink/renderer/bindings/core/v8/BUILD.gn
+++ b/third_party/blink/renderer/bindings/core/v8/BUILD.gn
@@ -128,6 +128,8 @@
   "$bindings_core_v8_output_dir/v8_blob_callback.h",
   "$bindings_core_v8_output_dir/v8_frame_request_callback.cc",
   "$bindings_core_v8_output_dir/v8_frame_request_callback.h",
+  "$bindings_core_v8_output_dir/v8_function.cc",
+  "$bindings_core_v8_output_dir/v8_function.h",
   "$bindings_core_v8_output_dir/v8_function_string_callback.cc",
   "$bindings_core_v8_output_dir/v8_function_string_callback.h",
   "$bindings_core_v8_output_dir/v8_idle_request_callback.cc",
diff --git a/third_party/blink/renderer/bindings/core/v8/script_wrappable_visitor_test.cc b/third_party/blink/renderer/bindings/core/v8/script_wrappable_visitor_test.cc
index 415b8a43..419953f 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_wrappable_visitor_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_wrappable_visitor_test.cc
@@ -25,6 +25,8 @@
   void VisitBackingStoreStrongly(void* object,
                                  void** object_slot,
                                  TraceDescriptor desc) override {
+    if (!object)
+      return;
     desc.callback(this, desc.base_object_payload);
   }
 
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc b/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
index 016b2461..bff1e7fa 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
@@ -156,6 +156,8 @@
 void V8EmbedderGraphBuilder::VisitBackingStoreStrongly(void* object,
                                                        void** object_slot,
                                                        TraceDescriptor desc) {
+  if (!object)
+    return;
   desc.callback(this, desc.base_object_payload);
 }
 
diff --git a/third_party/blink/renderer/bindings/scripts/idl_types.py b/third_party/blink/renderer/bindings/scripts/idl_types.py
index 4c645d4..cf202b3 100644
--- a/third_party/blink/renderer/bindings/scripts/idl_types.py
+++ b/third_party/blink/renderer/bindings/scripts/idl_types.py
@@ -84,9 +84,11 @@
     'USVString',
 ])
 
-STANDARD_CALLBACK_FUNCTIONS = frozenset([
-    # http://heycam.github.io/webidl/#common-Function
-    'Function',
+NON_STANDARD_CALLBACK_FUNCTIONS = frozenset([
+    # |CallbackFunctionTreatedAsScriptValue| is interpreted as a callback
+    # function type, but converted to |ScriptValue| instead of a subclass of
+    # |CallbackFunctionBase|.
+    'CallbackFunctionTreatedAsScriptValue',
 ])
 
 
@@ -171,12 +173,13 @@
 
     @property
     def is_callback_function(self):  # pylint: disable=C0103
-        return self.base_type in IdlType.callback_functions or self.base_type in STANDARD_CALLBACK_FUNCTIONS
+        return self.base_type in IdlType.callback_functions or self.base_type in NON_STANDARD_CALLBACK_FUNCTIONS
 
     @property
     def is_custom_callback_function(self):
-        # Treat standard callback functions as custom as they aren't generated.
-        if self.base_type in STANDARD_CALLBACK_FUNCTIONS:
+        # Treat non standard callback functions as custom as they have different
+        # cpp_type, etc.
+        if self.base_type in NON_STANDARD_CALLBACK_FUNCTIONS:
             return True
         entry = IdlType.callback_functions.get(self.base_type)
         callback_function = entry.get('callback_function')
diff --git a/third_party/blink/renderer/bindings/scripts/v8_interface.py b/third_party/blink/renderer/bindings/scripts/v8_interface.py
index 12b5fa3..038eefe1 100644
--- a/third_party/blink/renderer/bindings/scripts/v8_interface.py
+++ b/third_party/blink/renderer/bindings/scripts/v8_interface.py
@@ -682,7 +682,8 @@
 
                     # void forEach(Function callback, [Default=Undefined] optional any thisArg)
                     generated_method(IdlType('void'), 'forEach',
-                                     arguments=[generated_argument(IdlType('Function'), 'callback'),
+                                     # TODO(yukishiino): |callback| should be type of Function.
+                                     arguments=[generated_argument(IdlType('CallbackFunctionTreatedAsScriptValue'), 'callback'),
                                                 generated_argument(IdlType('any'), 'thisArg',
                                                                    is_optional=True,
                                                                    extended_attributes={'Default': 'Undefined'})],
diff --git a/third_party/blink/renderer/bindings/scripts/v8_types.py b/third_party/blink/renderer/bindings/scripts/v8_types.py
index dd76e70..9ca54bb 100644
--- a/third_party/blink/renderer/bindings/scripts/v8_types.py
+++ b/third_party/blink/renderer/bindings/scripts/v8_types.py
@@ -280,9 +280,12 @@
                                   for member in idl_type.member_types)
         return 'const %s&' % idl_type_name if used_as_rvalue_type else idl_type_name
     if idl_type.is_callback_function:
+        v8_type_name = 'V8' + base_idl_type
         if idl_type.is_custom_callback_function:
-            return 'V8%s' % base_idl_type
-        return 'V8%s*' % base_idl_type
+            return v8_type_name
+        if not used_in_cpp_sequence:
+            return v8_type_name + '*'
+        return cpp_template_type('TraceWrapperMember', v8_type_name)
 
     if base_idl_type == 'void':
         return base_idl_type
@@ -387,7 +390,7 @@
 
 
 def is_traceable(idl_type):
-    return (idl_type.is_garbage_collected or idl_type.is_dictionary)
+    return idl_type.is_garbage_collected or idl_type.is_dictionary or idl_type.is_callback_function
 
 IdlTypeBase.is_traceable = property(is_traceable)
 IdlUnionType.is_traceable = property(lambda self: True)
@@ -520,6 +523,9 @@
     base_idl_type = idl_type.base_type
     if idl_type.is_string_type:
         includes_for_type.add('platform/wtf/text/wtf_string.h')
+    if idl_type.is_callback_function:
+        component = IdlType.callback_functions[base_idl_type]['component_dir']
+        return set(['bindings/%s/v8/%s' % (component, binding_header_filename(base_idl_type))])
     if base_idl_type in interfaces_info:
         interface_info = interfaces_info[base_idl_type]
         includes_for_type.add(interface_info['include_path'])
diff --git a/third_party/blink/renderer/bindings/tests/idls/core/test_dictionary.idl b/third_party/blink/renderer/bindings/tests/idls/core/test_dictionary.idl
index c894045..d4e9f27 100644
--- a/third_party/blink/renderer/bindings/tests/idls/core/test_dictionary.idl
+++ b/third_party/blink/renderer/bindings/tests/idls/core/test_dictionary.idl
@@ -61,4 +61,6 @@
     record<DOMString, DOMString?> stringOrNullRecordMember;
     record<DOMString, Element?> elementOrNullRecordMember;
     record<DOMString, (double or DOMString)?> unionOrNullRecordMember;
+    VoidCallbackFunction callbackFunctionMember;
+    required VoidCallbackFunction requiredCallbackFunctionMember;
 };
diff --git a/third_party/blink/renderer/bindings/tests/idls/core/test_object.idl b/third_party/blink/renderer/bindings/tests/idls/core/test_object.idl
index de05fdaa..e020fbc 100644
--- a/third_party/blink/renderer/bindings/tests/idls/core/test_object.idl
+++ b/third_party/blink/renderer/bindings/tests/idls/core/test_object.idl
@@ -419,7 +419,7 @@
     void overloadedMethodI(double doubleArg);
     void overloadedMethodJ(DOMString stringArg);
     void overloadedMethodJ(TestDictionary testDictionaryArg);
-    void overloadedMethodK(Function functionArg);
+    void overloadedMethodK(CallbackFunctionTreatedAsScriptValue functionArg);
     void overloadedMethodK(DOMString stringArg);
     void overloadedMethodL(long longArg, any... restArgs);
     void overloadedMethodL(DOMString stringArg, any... restArgs);
diff --git a/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.cc b/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.cc
index acf98d3..4f892fd 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.cc
+++ b/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.cc
@@ -47,6 +47,10 @@
   any_member_ = value;
 }
 
+void TestDictionary::setCallbackFunctionMember(V8VoidCallbackFunction* value) {
+  callback_function_member_ = value;
+}
+
 void TestDictionary::setDictionaryMember(Dictionary value) {
   dictionary_member_ = value;
 }
@@ -120,6 +124,10 @@
   has_record_member_ = true;
 }
 
+void TestDictionary::setRequiredCallbackFunctionMember(V8VoidCallbackFunction* value) {
+  required_callback_function_member_ = value;
+}
+
 void TestDictionary::setStringOrNullRecordMember(const Vector<std::pair<String, String>>& value) {
   string_or_null_record_member_ = value;
   has_string_or_null_record_member_ = true;
@@ -190,6 +198,7 @@
 }
 
 void TestDictionary::Trace(blink::Visitor* visitor) {
+  visitor->Trace(callback_function_member_);
   visitor->Trace(double_or_null_or_double_or_null_sequence_member_);
   visitor->Trace(double_or_string_member_);
   visitor->Trace(double_or_string_sequence_member_);
@@ -200,6 +209,7 @@
   visitor->Trace(garbage_collected_record_member_);
   visitor->Trace(internal_dictionary_sequence_member_);
   visitor->Trace(other_double_or_string_member_);
+  visitor->Trace(required_callback_function_member_);
   visitor->Trace(test_enum_or_null_or_test_enum_sequence_member_);
   visitor->Trace(test_enum_or_test_enum_or_null_sequence_member_);
   visitor->Trace(test_enum_or_test_enum_sequence_member_);
diff --git a/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.h b/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.h
index 5fbba92..14e20ae0 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.h
@@ -22,6 +22,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/test_enum_or_test_enum_or_null_sequence.h"
 #include "third_party/blink/renderer/bindings/core/v8/test_enum_or_test_enum_sequence.h"
 #include "third_party/blink/renderer/bindings/core/v8/test_interface_2_or_uint8_array.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_void_callback_function.h"
 #include "third_party/blink/renderer/bindings/tests/idls/core/test_interface_2.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/testing/internal_dictionary.h"
@@ -85,6 +86,12 @@
   }
   inline void setByteStringMember(const String&);
 
+  bool hasCallbackFunctionMember() const { return callback_function_member_; }
+  V8VoidCallbackFunction* callbackFunctionMember() const {
+    return callback_function_member_;
+  }
+  void setCallbackFunctionMember(V8VoidCallbackFunction*);
+
   bool hasCreateMember() const { return has_create_member_; }
   bool createMember() const {
     DCHECK(has_create_member_);
@@ -254,6 +261,12 @@
   }
   void setRecordMember(const Vector<std::pair<String, int8_t>>&);
 
+  bool hasRequiredCallbackFunctionMember() const { return required_callback_function_member_; }
+  V8VoidCallbackFunction* requiredCallbackFunctionMember() const {
+    return required_callback_function_member_;
+  }
+  void setRequiredCallbackFunctionMember(V8VoidCallbackFunction*);
+
   bool hasRestrictedDoubleMember() const { return has_restricted_double_member_; }
   double restrictedDoubleMember() const {
     DCHECK(has_restricted_double_member_);
@@ -464,6 +477,7 @@
   String applicable_to_type_string_member_;
   bool boolean_member_;
   String byte_string_member_;
+  TraceWrapperMember<V8VoidCallbackFunction> callback_function_member_;
   bool create_member_;
   Dictionary dictionary_member_;
   double double_or_null_member_;
@@ -489,6 +503,7 @@
   bool origin_trial_second_member_;
   DoubleOrString other_double_or_string_member_;
   Vector<std::pair<String, int8_t>> record_member_;
+  TraceWrapperMember<V8VoidCallbackFunction> required_callback_function_member_;
   double restricted_double_member_;
   bool runtime_member_;
   bool runtime_second_member_;
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_test_dictionary.cc b/third_party/blink/renderer/bindings/tests/results/core/v8_test_dictionary.cc
index 3f977ac..d2bd0500 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_test_dictionary.cc
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_test_dictionary.cc
@@ -23,6 +23,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_test_interface_2.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_test_object.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_uint8_array.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_void_callback_function.h"
 #include "third_party/blink/renderer/core/frame/deprecation.h"
 #include "third_party/blink/renderer/core/origin_trials/origin_trials.h"
 #include "third_party/blink/renderer/core/typed_arrays/array_buffer_view_helpers.h"
@@ -40,6 +41,7 @@
     "applicableToTypeStringMember",
     "booleanMember",
     "byteStringMember",
+    "callbackFunctionMember",
     "create",
     "deprecatedCreateMember",
     "dictionaryMember",
@@ -66,6 +68,7 @@
     "otherDoubleOrStringMember",
     "public",
     "recordMember",
+    "requiredCallbackFunctionMember",
     "restrictedDoubleMember",
     "runtimeMember",
     "runtimeSecondMember",
@@ -98,6 +101,7 @@
 
 void V8TestDictionary::ToImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, TestDictionary& impl, ExceptionState& exceptionState) {
   if (IsUndefinedOrNull(v8Value)) {
+    exceptionState.ThrowTypeError("Missing required member(s): requiredCallbackFunctionMember.");
     return;
   }
   if (!v8Value->IsObject()) {
@@ -194,8 +198,20 @@
     impl.setByteStringMember(byteStringMemberCppValue);
   }
 
+  v8::Local<v8::Value> callbackFunctionMemberValue;
+  if (!v8Object->Get(context, keys[6].Get(isolate)).ToLocal(&callbackFunctionMemberValue)) {
+    exceptionState.RethrowV8Exception(block.Exception());
+    return;
+  }
+  if (callbackFunctionMemberValue.IsEmpty() || callbackFunctionMemberValue->IsUndefined()) {
+    // Do nothing.
+  } else {
+    V8VoidCallbackFunction* callbackFunctionMemberCppValue = V8VoidCallbackFunction::Create(callbackFunctionMemberValue.As<v8::Function>());
+    impl.setCallbackFunctionMember(callbackFunctionMemberCppValue);
+  }
+
   v8::Local<v8::Value> createValue;
-  if (!v8Object->Get(context, keys[6].Get(isolate)).ToLocal(&createValue)) {
+  if (!v8Object->Get(context, keys[7].Get(isolate)).ToLocal(&createValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -209,7 +225,7 @@
   }
 
   v8::Local<v8::Value> deprecatedCreateMemberValue;
-  if (!v8Object->Get(context, keys[7].Get(isolate)).ToLocal(&deprecatedCreateMemberValue)) {
+  if (!v8Object->Get(context, keys[8].Get(isolate)).ToLocal(&deprecatedCreateMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -224,7 +240,7 @@
   }
 
   v8::Local<v8::Value> dictionaryMemberValue;
-  if (!v8Object->Get(context, keys[8].Get(isolate)).ToLocal(&dictionaryMemberValue)) {
+  if (!v8Object->Get(context, keys[9].Get(isolate)).ToLocal(&dictionaryMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -242,7 +258,7 @@
   }
 
   v8::Local<v8::Value> doubleOrNullMemberValue;
-  if (!v8Object->Get(context, keys[9].Get(isolate)).ToLocal(&doubleOrNullMemberValue)) {
+  if (!v8Object->Get(context, keys[10].Get(isolate)).ToLocal(&doubleOrNullMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -258,7 +274,7 @@
   }
 
   v8::Local<v8::Value> doubleOrNullOrDoubleOrNullSequenceMemberValue;
-  if (!v8Object->Get(context, keys[10].Get(isolate)).ToLocal(&doubleOrNullOrDoubleOrNullSequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[11].Get(isolate)).ToLocal(&doubleOrNullOrDoubleOrNullSequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -273,7 +289,7 @@
   }
 
   v8::Local<v8::Value> doubleOrNullRecordMemberValue;
-  if (!v8Object->Get(context, keys[11].Get(isolate)).ToLocal(&doubleOrNullRecordMemberValue)) {
+  if (!v8Object->Get(context, keys[12].Get(isolate)).ToLocal(&doubleOrNullRecordMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -287,7 +303,7 @@
   }
 
   v8::Local<v8::Value> doubleOrNullSequenceMemberValue;
-  if (!v8Object->Get(context, keys[12].Get(isolate)).ToLocal(&doubleOrNullSequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[13].Get(isolate)).ToLocal(&doubleOrNullSequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -301,7 +317,7 @@
   }
 
   v8::Local<v8::Value> doubleOrStringMemberValue;
-  if (!v8Object->Get(context, keys[13].Get(isolate)).ToLocal(&doubleOrStringMemberValue)) {
+  if (!v8Object->Get(context, keys[14].Get(isolate)).ToLocal(&doubleOrStringMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -316,7 +332,7 @@
   }
 
   v8::Local<v8::Value> doubleOrStringSequenceMemberValue;
-  if (!v8Object->Get(context, keys[14].Get(isolate)).ToLocal(&doubleOrStringSequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[15].Get(isolate)).ToLocal(&doubleOrStringSequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -330,7 +346,7 @@
   }
 
   v8::Local<v8::Value> elementOrNullMemberValue;
-  if (!v8Object->Get(context, keys[15].Get(isolate)).ToLocal(&elementOrNullMemberValue)) {
+  if (!v8Object->Get(context, keys[16].Get(isolate)).ToLocal(&elementOrNullMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -348,7 +364,7 @@
   }
 
   v8::Local<v8::Value> elementOrNullRecordMemberValue;
-  if (!v8Object->Get(context, keys[16].Get(isolate)).ToLocal(&elementOrNullRecordMemberValue)) {
+  if (!v8Object->Get(context, keys[17].Get(isolate)).ToLocal(&elementOrNullRecordMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -362,7 +378,7 @@
   }
 
   v8::Local<v8::Value> elementOrNullSequenceMemberValue;
-  if (!v8Object->Get(context, keys[17].Get(isolate)).ToLocal(&elementOrNullSequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[18].Get(isolate)).ToLocal(&elementOrNullSequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -376,7 +392,7 @@
   }
 
   v8::Local<v8::Value> enumMemberValue;
-  if (!v8Object->Get(context, keys[18].Get(isolate)).ToLocal(&enumMemberValue)) {
+  if (!v8Object->Get(context, keys[19].Get(isolate)).ToLocal(&enumMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -398,7 +414,7 @@
   }
 
   v8::Local<v8::Value> enumOrNullMemberValue;
-  if (!v8Object->Get(context, keys[19].Get(isolate)).ToLocal(&enumOrNullMemberValue)) {
+  if (!v8Object->Get(context, keys[20].Get(isolate)).ToLocal(&enumOrNullMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -421,7 +437,7 @@
   }
 
   v8::Local<v8::Value> enumSequenceMemberValue;
-  if (!v8Object->Get(context, keys[20].Get(isolate)).ToLocal(&enumSequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[21].Get(isolate)).ToLocal(&enumSequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -443,7 +459,7 @@
   }
 
   v8::Local<v8::Value> eventTargetMemberValue;
-  if (!v8Object->Get(context, keys[21].Get(isolate)).ToLocal(&eventTargetMemberValue)) {
+  if (!v8Object->Get(context, keys[22].Get(isolate)).ToLocal(&eventTargetMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -459,7 +475,7 @@
   }
 
   v8::Local<v8::Value> garbageCollectedRecordMemberValue;
-  if (!v8Object->Get(context, keys[22].Get(isolate)).ToLocal(&garbageCollectedRecordMemberValue)) {
+  if (!v8Object->Get(context, keys[23].Get(isolate)).ToLocal(&garbageCollectedRecordMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -473,7 +489,7 @@
   }
 
   v8::Local<v8::Value> internalDictionarySequenceMemberValue;
-  if (!v8Object->Get(context, keys[23].Get(isolate)).ToLocal(&internalDictionarySequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[24].Get(isolate)).ToLocal(&internalDictionarySequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -487,7 +503,7 @@
   }
 
   v8::Local<v8::Value> longMemberValue;
-  if (!v8Object->Get(context, keys[24].Get(isolate)).ToLocal(&longMemberValue)) {
+  if (!v8Object->Get(context, keys[25].Get(isolate)).ToLocal(&longMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -501,7 +517,7 @@
   }
 
   v8::Local<v8::Value> objectMemberValue;
-  if (!v8Object->Get(context, keys[25].Get(isolate)).ToLocal(&objectMemberValue)) {
+  if (!v8Object->Get(context, keys[26].Get(isolate)).ToLocal(&objectMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -517,7 +533,7 @@
   }
 
   v8::Local<v8::Value> objectOrNullMemberValue;
-  if (!v8Object->Get(context, keys[26].Get(isolate)).ToLocal(&objectOrNullMemberValue)) {
+  if (!v8Object->Get(context, keys[27].Get(isolate)).ToLocal(&objectOrNullMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -535,7 +551,7 @@
   }
 
   v8::Local<v8::Value> otherDoubleOrStringMemberValue;
-  if (!v8Object->Get(context, keys[29].Get(isolate)).ToLocal(&otherDoubleOrStringMemberValue)) {
+  if (!v8Object->Get(context, keys[30].Get(isolate)).ToLocal(&otherDoubleOrStringMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -550,7 +566,7 @@
   }
 
   v8::Local<v8::Value> publicValue;
-  if (!v8Object->Get(context, keys[30].Get(isolate)).ToLocal(&publicValue)) {
+  if (!v8Object->Get(context, keys[31].Get(isolate)).ToLocal(&publicValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -564,7 +580,7 @@
   }
 
   v8::Local<v8::Value> recordMemberValue;
-  if (!v8Object->Get(context, keys[31].Get(isolate)).ToLocal(&recordMemberValue)) {
+  if (!v8Object->Get(context, keys[32].Get(isolate)).ToLocal(&recordMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -577,8 +593,21 @@
     impl.setRecordMember(recordMemberCppValue);
   }
 
+  v8::Local<v8::Value> requiredCallbackFunctionMemberValue;
+  if (!v8Object->Get(context, keys[33].Get(isolate)).ToLocal(&requiredCallbackFunctionMemberValue)) {
+    exceptionState.RethrowV8Exception(block.Exception());
+    return;
+  }
+  if (requiredCallbackFunctionMemberValue.IsEmpty() || requiredCallbackFunctionMemberValue->IsUndefined()) {
+    exceptionState.ThrowTypeError("required member requiredCallbackFunctionMember is undefined.");
+    return;
+  } else {
+    V8VoidCallbackFunction* requiredCallbackFunctionMemberCppValue = V8VoidCallbackFunction::Create(requiredCallbackFunctionMemberValue.As<v8::Function>());
+    impl.setRequiredCallbackFunctionMember(requiredCallbackFunctionMemberCppValue);
+  }
+
   v8::Local<v8::Value> restrictedDoubleMemberValue;
-  if (!v8Object->Get(context, keys[32].Get(isolate)).ToLocal(&restrictedDoubleMemberValue)) {
+  if (!v8Object->Get(context, keys[34].Get(isolate)).ToLocal(&restrictedDoubleMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -592,7 +621,7 @@
   }
 
   v8::Local<v8::Value> stringMemberValue;
-  if (!v8Object->Get(context, keys[35].Get(isolate)).ToLocal(&stringMemberValue)) {
+  if (!v8Object->Get(context, keys[37].Get(isolate)).ToLocal(&stringMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -606,7 +635,7 @@
   }
 
   v8::Local<v8::Value> stringOrNullMemberValue;
-  if (!v8Object->Get(context, keys[36].Get(isolate)).ToLocal(&stringOrNullMemberValue)) {
+  if (!v8Object->Get(context, keys[38].Get(isolate)).ToLocal(&stringOrNullMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -620,7 +649,7 @@
   }
 
   v8::Local<v8::Value> stringOrNullRecordMemberValue;
-  if (!v8Object->Get(context, keys[37].Get(isolate)).ToLocal(&stringOrNullRecordMemberValue)) {
+  if (!v8Object->Get(context, keys[39].Get(isolate)).ToLocal(&stringOrNullRecordMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -634,7 +663,7 @@
   }
 
   v8::Local<v8::Value> stringOrNullSequenceMemberValue;
-  if (!v8Object->Get(context, keys[38].Get(isolate)).ToLocal(&stringOrNullSequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[40].Get(isolate)).ToLocal(&stringOrNullSequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -648,7 +677,7 @@
   }
 
   v8::Local<v8::Value> stringSequenceMemberValue;
-  if (!v8Object->Get(context, keys[39].Get(isolate)).ToLocal(&stringSequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[41].Get(isolate)).ToLocal(&stringSequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -662,7 +691,7 @@
   }
 
   v8::Local<v8::Value> testEnumOrNullOrTestEnumSequenceMemberValue;
-  if (!v8Object->Get(context, keys[40].Get(isolate)).ToLocal(&testEnumOrNullOrTestEnumSequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[42].Get(isolate)).ToLocal(&testEnumOrNullOrTestEnumSequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -677,7 +706,7 @@
   }
 
   v8::Local<v8::Value> testEnumOrTestEnumOrNullSequenceMemberValue;
-  if (!v8Object->Get(context, keys[41].Get(isolate)).ToLocal(&testEnumOrTestEnumOrNullSequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[43].Get(isolate)).ToLocal(&testEnumOrTestEnumOrNullSequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -692,7 +721,7 @@
   }
 
   v8::Local<v8::Value> testEnumOrTestEnumSequenceMemberValue;
-  if (!v8Object->Get(context, keys[42].Get(isolate)).ToLocal(&testEnumOrTestEnumSequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[44].Get(isolate)).ToLocal(&testEnumOrTestEnumSequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -707,7 +736,7 @@
   }
 
   v8::Local<v8::Value> testInterface2OrUint8ArrayMemberValue;
-  if (!v8Object->Get(context, keys[43].Get(isolate)).ToLocal(&testInterface2OrUint8ArrayMemberValue)) {
+  if (!v8Object->Get(context, keys[45].Get(isolate)).ToLocal(&testInterface2OrUint8ArrayMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -722,7 +751,7 @@
   }
 
   v8::Local<v8::Value> testInterfaceMemberValue;
-  if (!v8Object->Get(context, keys[44].Get(isolate)).ToLocal(&testInterfaceMemberValue)) {
+  if (!v8Object->Get(context, keys[46].Get(isolate)).ToLocal(&testInterfaceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -738,7 +767,7 @@
   }
 
   v8::Local<v8::Value> testInterfaceOrNullMemberValue;
-  if (!v8Object->Get(context, keys[45].Get(isolate)).ToLocal(&testInterfaceOrNullMemberValue)) {
+  if (!v8Object->Get(context, keys[47].Get(isolate)).ToLocal(&testInterfaceOrNullMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -756,7 +785,7 @@
   }
 
   v8::Local<v8::Value> testInterfaceSequenceMemberValue;
-  if (!v8Object->Get(context, keys[46].Get(isolate)).ToLocal(&testInterfaceSequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[48].Get(isolate)).ToLocal(&testInterfaceSequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -770,7 +799,7 @@
   }
 
   v8::Local<v8::Value> testObjectSequenceMemberValue;
-  if (!v8Object->Get(context, keys[47].Get(isolate)).ToLocal(&testObjectSequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[49].Get(isolate)).ToLocal(&testObjectSequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -784,7 +813,7 @@
   }
 
   v8::Local<v8::Value> treatNullAsStringSequenceMemberValue;
-  if (!v8Object->Get(context, keys[48].Get(isolate)).ToLocal(&treatNullAsStringSequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[50].Get(isolate)).ToLocal(&treatNullAsStringSequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -798,7 +827,7 @@
   }
 
   v8::Local<v8::Value> uint8ArrayMemberValue;
-  if (!v8Object->Get(context, keys[49].Get(isolate)).ToLocal(&uint8ArrayMemberValue)) {
+  if (!v8Object->Get(context, keys[51].Get(isolate)).ToLocal(&uint8ArrayMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -816,7 +845,7 @@
   }
 
   v8::Local<v8::Value> unionInRecordMemberValue;
-  if (!v8Object->Get(context, keys[50].Get(isolate)).ToLocal(&unionInRecordMemberValue)) {
+  if (!v8Object->Get(context, keys[52].Get(isolate)).ToLocal(&unionInRecordMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -830,7 +859,7 @@
   }
 
   v8::Local<v8::Value> unionMemberWithSequenceDefaultValue;
-  if (!v8Object->Get(context, keys[51].Get(isolate)).ToLocal(&unionMemberWithSequenceDefaultValue)) {
+  if (!v8Object->Get(context, keys[53].Get(isolate)).ToLocal(&unionMemberWithSequenceDefaultValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -845,7 +874,7 @@
   }
 
   v8::Local<v8::Value> unionOrNullRecordMemberValue;
-  if (!v8Object->Get(context, keys[52].Get(isolate)).ToLocal(&unionOrNullRecordMemberValue)) {
+  if (!v8Object->Get(context, keys[54].Get(isolate)).ToLocal(&unionOrNullRecordMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -859,7 +888,7 @@
   }
 
   v8::Local<v8::Value> unionOrNullSequenceMemberValue;
-  if (!v8Object->Get(context, keys[53].Get(isolate)).ToLocal(&unionOrNullSequenceMemberValue)) {
+  if (!v8Object->Get(context, keys[55].Get(isolate)).ToLocal(&unionOrNullSequenceMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -873,7 +902,7 @@
   }
 
   v8::Local<v8::Value> unionWithTypedefsValue;
-  if (!v8Object->Get(context, keys[54].Get(isolate)).ToLocal(&unionWithTypedefsValue)) {
+  if (!v8Object->Get(context, keys[56].Get(isolate)).ToLocal(&unionWithTypedefsValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -888,7 +917,7 @@
   }
 
   v8::Local<v8::Value> unrestrictedDoubleMemberValue;
-  if (!v8Object->Get(context, keys[55].Get(isolate)).ToLocal(&unrestrictedDoubleMemberValue)) {
+  if (!v8Object->Get(context, keys[57].Get(isolate)).ToLocal(&unrestrictedDoubleMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -902,7 +931,7 @@
   }
 
   v8::Local<v8::Value> usvStringOrNullMemberValue;
-  if (!v8Object->Get(context, keys[56].Get(isolate)).ToLocal(&usvStringOrNullMemberValue)) {
+  if (!v8Object->Get(context, keys[58].Get(isolate)).ToLocal(&usvStringOrNullMemberValue)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -917,7 +946,7 @@
 
   if (RuntimeEnabledFeatures::RuntimeFeatureEnabled()) {
     v8::Local<v8::Value> runtimeMemberValue;
-    if (!v8Object->Get(context, keys[33].Get(isolate)).ToLocal(&runtimeMemberValue)) {
+    if (!v8Object->Get(context, keys[35].Get(isolate)).ToLocal(&runtimeMemberValue)) {
       exceptionState.RethrowV8Exception(block.Exception());
       return;
     }
@@ -931,7 +960,7 @@
     }
 
     v8::Local<v8::Value> runtimeSecondMemberValue;
-    if (!v8Object->Get(context, keys[34].Get(isolate)).ToLocal(&runtimeSecondMemberValue)) {
+    if (!v8Object->Get(context, keys[36].Get(isolate)).ToLocal(&runtimeSecondMemberValue)) {
       exceptionState.RethrowV8Exception(block.Exception());
       return;
     }
@@ -947,7 +976,7 @@
 
   if (OriginTrials::FeatureNameEnabled(executionContext)) {
     v8::Local<v8::Value> originTrialMemberValue;
-    if (!v8Object->Get(context, keys[27].Get(isolate)).ToLocal(&originTrialMemberValue)) {
+    if (!v8Object->Get(context, keys[28].Get(isolate)).ToLocal(&originTrialMemberValue)) {
       exceptionState.RethrowV8Exception(block.Exception());
       return;
     }
@@ -963,7 +992,7 @@
 
   if (OriginTrials::FeatureName1Enabled(executionContext)) {
     v8::Local<v8::Value> originTrialSecondMemberValue;
-    if (!v8Object->Get(context, keys[28].Get(isolate)).ToLocal(&originTrialSecondMemberValue)) {
+    if (!v8Object->Get(context, keys[29].Get(isolate)).ToLocal(&originTrialSecondMemberValue)) {
       exceptionState.RethrowV8Exception(block.Exception());
       return;
     }
@@ -1059,6 +1088,17 @@
     return false;
   }
 
+  v8::Local<v8::Value> callbackFunctionMemberValue;
+  bool callbackFunctionMemberHasValueOrDefault = false;
+  if (impl.hasCallbackFunctionMember()) {
+    callbackFunctionMemberValue = ToV8(impl.callbackFunctionMember(), creationContext, isolate);
+    callbackFunctionMemberHasValueOrDefault = true;
+  }
+  if (callbackFunctionMemberHasValueOrDefault &&
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[6].Get(isolate), callbackFunctionMemberValue))) {
+    return false;
+  }
+
   v8::Local<v8::Value> createValue;
   bool createHasValueOrDefault = false;
   if (impl.hasCreateMember()) {
@@ -1066,7 +1106,7 @@
     createHasValueOrDefault = true;
   }
   if (createHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[6].Get(isolate), createValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[7].Get(isolate), createValue))) {
     return false;
   }
 
@@ -1077,7 +1117,7 @@
     deprecatedCreateMemberHasValueOrDefault = true;
   }
   if (deprecatedCreateMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[7].Get(isolate), deprecatedCreateMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[8].Get(isolate), deprecatedCreateMemberValue))) {
     return false;
   }
 
@@ -1089,7 +1129,7 @@
     dictionaryMemberHasValueOrDefault = true;
   }
   if (dictionaryMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[8].Get(isolate), dictionaryMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[9].Get(isolate), dictionaryMemberValue))) {
     return false;
   }
 
@@ -1103,7 +1143,7 @@
     doubleOrNullMemberHasValueOrDefault = true;
   }
   if (doubleOrNullMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[9].Get(isolate), doubleOrNullMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[10].Get(isolate), doubleOrNullMemberValue))) {
     return false;
   }
 
@@ -1114,7 +1154,7 @@
     doubleOrNullOrDoubleOrNullSequenceMemberHasValueOrDefault = true;
   }
   if (doubleOrNullOrDoubleOrNullSequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[10].Get(isolate), doubleOrNullOrDoubleOrNullSequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[11].Get(isolate), doubleOrNullOrDoubleOrNullSequenceMemberValue))) {
     return false;
   }
 
@@ -1125,7 +1165,7 @@
     doubleOrNullRecordMemberHasValueOrDefault = true;
   }
   if (doubleOrNullRecordMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[11].Get(isolate), doubleOrNullRecordMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[12].Get(isolate), doubleOrNullRecordMemberValue))) {
     return false;
   }
 
@@ -1136,7 +1176,7 @@
     doubleOrNullSequenceMemberHasValueOrDefault = true;
   }
   if (doubleOrNullSequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[12].Get(isolate), doubleOrNullSequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[13].Get(isolate), doubleOrNullSequenceMemberValue))) {
     return false;
   }
 
@@ -1150,7 +1190,7 @@
     doubleOrStringMemberHasValueOrDefault = true;
   }
   if (doubleOrStringMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[13].Get(isolate), doubleOrStringMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[14].Get(isolate), doubleOrStringMemberValue))) {
     return false;
   }
 
@@ -1161,7 +1201,7 @@
     doubleOrStringSequenceMemberHasValueOrDefault = true;
   }
   if (doubleOrStringSequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[14].Get(isolate), doubleOrStringSequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[15].Get(isolate), doubleOrStringSequenceMemberValue))) {
     return false;
   }
 
@@ -1172,7 +1212,7 @@
     elementOrNullMemberHasValueOrDefault = true;
   }
   if (elementOrNullMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[15].Get(isolate), elementOrNullMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[16].Get(isolate), elementOrNullMemberValue))) {
     return false;
   }
 
@@ -1183,7 +1223,7 @@
     elementOrNullRecordMemberHasValueOrDefault = true;
   }
   if (elementOrNullRecordMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[16].Get(isolate), elementOrNullRecordMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[17].Get(isolate), elementOrNullRecordMemberValue))) {
     return false;
   }
 
@@ -1194,7 +1234,7 @@
     elementOrNullSequenceMemberHasValueOrDefault = true;
   }
   if (elementOrNullSequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[17].Get(isolate), elementOrNullSequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[18].Get(isolate), elementOrNullSequenceMemberValue))) {
     return false;
   }
 
@@ -1208,7 +1248,7 @@
     enumMemberHasValueOrDefault = true;
   }
   if (enumMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[18].Get(isolate), enumMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[19].Get(isolate), enumMemberValue))) {
     return false;
   }
 
@@ -1222,7 +1262,7 @@
     enumOrNullMemberHasValueOrDefault = true;
   }
   if (enumOrNullMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[19].Get(isolate), enumOrNullMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[20].Get(isolate), enumOrNullMemberValue))) {
     return false;
   }
 
@@ -1233,7 +1273,7 @@
     enumSequenceMemberHasValueOrDefault = true;
   }
   if (enumSequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[20].Get(isolate), enumSequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[21].Get(isolate), enumSequenceMemberValue))) {
     return false;
   }
 
@@ -1244,7 +1284,7 @@
     eventTargetMemberHasValueOrDefault = true;
   }
   if (eventTargetMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[21].Get(isolate), eventTargetMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[22].Get(isolate), eventTargetMemberValue))) {
     return false;
   }
 
@@ -1255,7 +1295,7 @@
     garbageCollectedRecordMemberHasValueOrDefault = true;
   }
   if (garbageCollectedRecordMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[22].Get(isolate), garbageCollectedRecordMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[23].Get(isolate), garbageCollectedRecordMemberValue))) {
     return false;
   }
 
@@ -1266,7 +1306,7 @@
     internalDictionarySequenceMemberHasValueOrDefault = true;
   }
   if (internalDictionarySequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[23].Get(isolate), internalDictionarySequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[24].Get(isolate), internalDictionarySequenceMemberValue))) {
     return false;
   }
 
@@ -1280,7 +1320,7 @@
     longMemberHasValueOrDefault = true;
   }
   if (longMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[24].Get(isolate), longMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[25].Get(isolate), longMemberValue))) {
     return false;
   }
 
@@ -1292,7 +1332,7 @@
     objectMemberHasValueOrDefault = true;
   }
   if (objectMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[25].Get(isolate), objectMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[26].Get(isolate), objectMemberValue))) {
     return false;
   }
 
@@ -1307,7 +1347,7 @@
     objectOrNullMemberHasValueOrDefault = true;
   }
   if (objectOrNullMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[26].Get(isolate), objectOrNullMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[27].Get(isolate), objectOrNullMemberValue))) {
     return false;
   }
 
@@ -1321,7 +1361,7 @@
     otherDoubleOrStringMemberHasValueOrDefault = true;
   }
   if (otherDoubleOrStringMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[29].Get(isolate), otherDoubleOrStringMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[30].Get(isolate), otherDoubleOrStringMemberValue))) {
     return false;
   }
 
@@ -1332,7 +1372,7 @@
     publicHasValueOrDefault = true;
   }
   if (publicHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[30].Get(isolate), publicValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[31].Get(isolate), publicValue))) {
     return false;
   }
 
@@ -1343,7 +1383,20 @@
     recordMemberHasValueOrDefault = true;
   }
   if (recordMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[31].Get(isolate), recordMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[32].Get(isolate), recordMemberValue))) {
+    return false;
+  }
+
+  v8::Local<v8::Value> requiredCallbackFunctionMemberValue;
+  bool requiredCallbackFunctionMemberHasValueOrDefault = false;
+  if (impl.hasRequiredCallbackFunctionMember()) {
+    requiredCallbackFunctionMemberValue = ToV8(impl.requiredCallbackFunctionMember(), creationContext, isolate);
+    requiredCallbackFunctionMemberHasValueOrDefault = true;
+  } else {
+    NOTREACHED();
+  }
+  if (requiredCallbackFunctionMemberHasValueOrDefault &&
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[33].Get(isolate), requiredCallbackFunctionMemberValue))) {
     return false;
   }
 
@@ -1357,7 +1410,7 @@
     restrictedDoubleMemberHasValueOrDefault = true;
   }
   if (restrictedDoubleMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[32].Get(isolate), restrictedDoubleMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[34].Get(isolate), restrictedDoubleMemberValue))) {
     return false;
   }
 
@@ -1368,7 +1421,7 @@
     stringMemberHasValueOrDefault = true;
   }
   if (stringMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[35].Get(isolate), stringMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[37].Get(isolate), stringMemberValue))) {
     return false;
   }
 
@@ -1382,7 +1435,7 @@
     stringOrNullMemberHasValueOrDefault = true;
   }
   if (stringOrNullMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[36].Get(isolate), stringOrNullMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[38].Get(isolate), stringOrNullMemberValue))) {
     return false;
   }
 
@@ -1393,7 +1446,7 @@
     stringOrNullRecordMemberHasValueOrDefault = true;
   }
   if (stringOrNullRecordMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[37].Get(isolate), stringOrNullRecordMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[39].Get(isolate), stringOrNullRecordMemberValue))) {
     return false;
   }
 
@@ -1404,7 +1457,7 @@
     stringOrNullSequenceMemberHasValueOrDefault = true;
   }
   if (stringOrNullSequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[38].Get(isolate), stringOrNullSequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[40].Get(isolate), stringOrNullSequenceMemberValue))) {
     return false;
   }
 
@@ -1418,7 +1471,7 @@
     stringSequenceMemberHasValueOrDefault = true;
   }
   if (stringSequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[39].Get(isolate), stringSequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[41].Get(isolate), stringSequenceMemberValue))) {
     return false;
   }
 
@@ -1429,7 +1482,7 @@
     testEnumOrNullOrTestEnumSequenceMemberHasValueOrDefault = true;
   }
   if (testEnumOrNullOrTestEnumSequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[40].Get(isolate), testEnumOrNullOrTestEnumSequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[42].Get(isolate), testEnumOrNullOrTestEnumSequenceMemberValue))) {
     return false;
   }
 
@@ -1440,7 +1493,7 @@
     testEnumOrTestEnumOrNullSequenceMemberHasValueOrDefault = true;
   }
   if (testEnumOrTestEnumOrNullSequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[41].Get(isolate), testEnumOrTestEnumOrNullSequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[43].Get(isolate), testEnumOrTestEnumOrNullSequenceMemberValue))) {
     return false;
   }
 
@@ -1451,7 +1504,7 @@
     testEnumOrTestEnumSequenceMemberHasValueOrDefault = true;
   }
   if (testEnumOrTestEnumSequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[42].Get(isolate), testEnumOrTestEnumSequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[44].Get(isolate), testEnumOrTestEnumSequenceMemberValue))) {
     return false;
   }
 
@@ -1462,7 +1515,7 @@
     testInterface2OrUint8ArrayMemberHasValueOrDefault = true;
   }
   if (testInterface2OrUint8ArrayMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[43].Get(isolate), testInterface2OrUint8ArrayMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[45].Get(isolate), testInterface2OrUint8ArrayMemberValue))) {
     return false;
   }
 
@@ -1473,7 +1526,7 @@
     testInterfaceMemberHasValueOrDefault = true;
   }
   if (testInterfaceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[44].Get(isolate), testInterfaceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[46].Get(isolate), testInterfaceMemberValue))) {
     return false;
   }
 
@@ -1484,7 +1537,7 @@
     testInterfaceOrNullMemberHasValueOrDefault = true;
   }
   if (testInterfaceOrNullMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[45].Get(isolate), testInterfaceOrNullMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[47].Get(isolate), testInterfaceOrNullMemberValue))) {
     return false;
   }
 
@@ -1498,7 +1551,7 @@
     testInterfaceSequenceMemberHasValueOrDefault = true;
   }
   if (testInterfaceSequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[46].Get(isolate), testInterfaceSequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[48].Get(isolate), testInterfaceSequenceMemberValue))) {
     return false;
   }
 
@@ -1509,7 +1562,7 @@
     testObjectSequenceMemberHasValueOrDefault = true;
   }
   if (testObjectSequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[47].Get(isolate), testObjectSequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[49].Get(isolate), testObjectSequenceMemberValue))) {
     return false;
   }
 
@@ -1523,7 +1576,7 @@
     treatNullAsStringSequenceMemberHasValueOrDefault = true;
   }
   if (treatNullAsStringSequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[48].Get(isolate), treatNullAsStringSequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[50].Get(isolate), treatNullAsStringSequenceMemberValue))) {
     return false;
   }
 
@@ -1534,7 +1587,7 @@
     uint8ArrayMemberHasValueOrDefault = true;
   }
   if (uint8ArrayMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[49].Get(isolate), uint8ArrayMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[51].Get(isolate), uint8ArrayMemberValue))) {
     return false;
   }
 
@@ -1545,7 +1598,7 @@
     unionInRecordMemberHasValueOrDefault = true;
   }
   if (unionInRecordMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[50].Get(isolate), unionInRecordMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[52].Get(isolate), unionInRecordMemberValue))) {
     return false;
   }
 
@@ -1559,7 +1612,7 @@
     unionMemberWithSequenceDefaultHasValueOrDefault = true;
   }
   if (unionMemberWithSequenceDefaultHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[51].Get(isolate), unionMemberWithSequenceDefaultValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[53].Get(isolate), unionMemberWithSequenceDefaultValue))) {
     return false;
   }
 
@@ -1570,7 +1623,7 @@
     unionOrNullRecordMemberHasValueOrDefault = true;
   }
   if (unionOrNullRecordMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[52].Get(isolate), unionOrNullRecordMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[54].Get(isolate), unionOrNullRecordMemberValue))) {
     return false;
   }
 
@@ -1581,7 +1634,7 @@
     unionOrNullSequenceMemberHasValueOrDefault = true;
   }
   if (unionOrNullSequenceMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[53].Get(isolate), unionOrNullSequenceMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[55].Get(isolate), unionOrNullSequenceMemberValue))) {
     return false;
   }
 
@@ -1592,7 +1645,7 @@
     unionWithTypedefsHasValueOrDefault = true;
   }
   if (unionWithTypedefsHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[54].Get(isolate), unionWithTypedefsValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[56].Get(isolate), unionWithTypedefsValue))) {
     return false;
   }
 
@@ -1606,7 +1659,7 @@
     unrestrictedDoubleMemberHasValueOrDefault = true;
   }
   if (unrestrictedDoubleMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[55].Get(isolate), unrestrictedDoubleMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[57].Get(isolate), unrestrictedDoubleMemberValue))) {
     return false;
   }
 
@@ -1620,7 +1673,7 @@
     usvStringOrNullMemberHasValueOrDefault = true;
   }
   if (usvStringOrNullMemberHasValueOrDefault &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[56].Get(isolate), usvStringOrNullMemberValue))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[58].Get(isolate), usvStringOrNullMemberValue))) {
     return false;
   }
 
@@ -1632,7 +1685,7 @@
       runtimeMemberHasValueOrDefault = true;
     }
     if (runtimeMemberHasValueOrDefault &&
-        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[33].Get(isolate), runtimeMemberValue))) {
+        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[35].Get(isolate), runtimeMemberValue))) {
       return false;
     }
 
@@ -1643,7 +1696,7 @@
       runtimeSecondMemberHasValueOrDefault = true;
     }
     if (runtimeSecondMemberHasValueOrDefault &&
-        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[34].Get(isolate), runtimeSecondMemberValue))) {
+        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[36].Get(isolate), runtimeSecondMemberValue))) {
       return false;
     }
   }
@@ -1656,7 +1709,7 @@
       originTrialMemberHasValueOrDefault = true;
     }
     if (originTrialMemberHasValueOrDefault &&
-        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[27].Get(isolate), originTrialMemberValue))) {
+        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[28].Get(isolate), originTrialMemberValue))) {
       return false;
     }
   }
@@ -1669,7 +1722,7 @@
       originTrialSecondMemberHasValueOrDefault = true;
     }
     if (originTrialSecondMemberHasValueOrDefault &&
-        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[28].Get(isolate), originTrialSecondMemberValue))) {
+        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[29].Get(isolate), originTrialSecondMemberValue))) {
       return false;
     }
   }
diff --git a/third_party/blink/renderer/core/css/CSSProperties.json5 b/third_party/blink/renderer/core/css/CSSProperties.json5
index e52d3220..063af795 100644
--- a/third_party/blink/renderer/core/css/CSSProperties.json5
+++ b/third_party/blink/renderer/core/css/CSSProperties.json5
@@ -1393,6 +1393,7 @@
       keywords: ["none", "left", "right", "both"],
       typedom_types: ["Keyword"],
       default_value: "none",
+      style_builder_custom_functions: ["value"],
     },
     {
       name: "clip",
@@ -1691,6 +1692,7 @@
       default_value: "none",
       name_for_methods: "Floating",
       type_name: "EFloat",
+      style_builder_custom_functions: ["value"],
     },
     {
       name: "flood-color",
diff --git a/third_party/blink/renderer/core/css/CSSValueKeywords.json5 b/third_party/blink/renderer/core/css/CSSValueKeywords.json5
index 61ddcf7..b944b4c 100644
--- a/third_party/blink/renderer/core/css/CSSValueKeywords.json5
+++ b/third_party/blink/renderer/core/css/CSSValueKeywords.json5
@@ -265,6 +265,8 @@
     "-webkit-auto",
     "left",
     "right",
+    "inline-start",
+    "inline-end",
     "center",
     "justify",
     "-webkit-left",
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 a8c013f..d4dbe6ad 100644
--- a/third_party/blink/renderer/core/css/css_style_sheet.cc
+++ b/third_party/blink/renderer/core/css/css_style_sheet.cc
@@ -92,6 +92,11 @@
 }
 
 CSSStyleSheet* CSSStyleSheet::Create(Document& document,
+                                     ExceptionState& exception_state) {
+  return CSSStyleSheet::Create(document, CSSStyleSheetInit(), exception_state);
+}
+
+CSSStyleSheet* CSSStyleSheet::Create(Document& document,
                                      const CSSStyleSheetInit& options,
                                      ExceptionState& exception_state) {
   if (!RuntimeEnabledFeatures::ConstructableStylesheetsEnabled()) {
diff --git a/third_party/blink/renderer/core/css/css_style_sheet.h b/third_party/blink/renderer/core/css/css_style_sheet.h
index 7dc0ace..2ee79dd 100644
--- a/third_party/blink/renderer/core/css/css_style_sheet.h
+++ b/third_party/blink/renderer/core/css/css_style_sheet.h
@@ -53,6 +53,7 @@
  public:
   static const Document* SingleOwnerDocument(const CSSStyleSheet*);
 
+  static CSSStyleSheet* Create(Document&, ExceptionState&);
   static CSSStyleSheet* Create(Document&,
                                const CSSStyleSheetInit&,
                                ExceptionState&);
@@ -195,11 +196,6 @@
   FRIEND_TEST_ALL_PREFIXES(
       CSSStyleSheetTest,
       CSSStyleSheetConstructionWithNonEmptyCSSStyleSheetInit);
-  FRIEND_TEST_ALL_PREFIXES(CSSStyleSheetTest,
-                           CreateEmptyCSSStyleSheetWithEmptyCSSStyleSheetInit);
-  FRIEND_TEST_ALL_PREFIXES(
-      CSSStyleSheetTest,
-      CreateEmptyCSSStyleSheetWithNonEmptyCSSStyleSheetInit);
   FRIEND_TEST_ALL_PREFIXES(
       CSSStyleSheetTest,
       CreateCSSStyleSheetWithEmptyCSSStyleSheetInitAndText);
diff --git a/third_party/blink/renderer/core/css/css_style_sheet.idl b/third_party/blink/renderer/core/css/css_style_sheet.idl
index 1251d19..b70b9fe6 100644
--- a/third_party/blink/renderer/core/css/css_style_sheet.idl
+++ b/third_party/blink/renderer/core/css/css_style_sheet.idl
@@ -21,6 +21,9 @@
 // https://drafts.csswg.org/cssom/#the-cssstylesheet-interface
 
 [
+    ConstructorCallWith=Document,
+    RaisesException=Constructor,
+    Constructor(optional CSSStyleSheetInit options),
     Exposed=Window
 ] interface CSSStyleSheet : StyleSheet {
     readonly attribute CSSRule? ownerRule;
diff --git a/third_party/blink/renderer/core/css/css_style_sheet_test.cc b/third_party/blink/renderer/core/css/css_style_sheet_test.cc
index 234c688..d4b1bf77 100644
--- a/third_party/blink/renderer/core/css/css_style_sheet_test.cc
+++ b/third_party/blink/renderer/core/css/css_style_sheet_test.cc
@@ -49,12 +49,26 @@
 TEST_F(CSSStyleSheetTest, ConstructorWithoutRuntimeFlagThrowsException) {
   DummyExceptionStateForTesting exception_state;
   RuntimeEnabledFeatures::SetConstructableStylesheetsEnabled(false);
-  EXPECT_EQ(CSSStyleSheet::Create(GetDocument(), CSSStyleSheetInit(),
-                                  exception_state),
-            nullptr);
+  EXPECT_EQ(CSSStyleSheet::Create(GetDocument(), exception_state), nullptr);
   ASSERT_TRUE(exception_state.HadException());
 }
 
+TEST_F(CSSStyleSheetTest, CSSStyleSheetConstructionWithEmptyCSSStyleSheetInit) {
+  DummyExceptionStateForTesting exception_state;
+  CSSStyleSheet* sheet = CSSStyleSheet::Create(GetDocument(), exception_state);
+  ASSERT_FALSE(exception_state.HadException());
+  EXPECT_TRUE(sheet->href().IsNull());
+  EXPECT_EQ(sheet->parentStyleSheet(), nullptr);
+  EXPECT_EQ(sheet->ownerNode(), nullptr);
+  EXPECT_EQ(sheet->ownerRule(), nullptr);
+  EXPECT_EQ(sheet->media()->length(), 0U);
+  EXPECT_EQ(sheet->title(), StringImpl::empty_);
+  EXPECT_FALSE(sheet->AlternateFromConstructor());
+  EXPECT_FALSE(sheet->disabled());
+  EXPECT_EQ(sheet->cssRules(exception_state)->length(), 0U);
+  ASSERT_FALSE(exception_state.HadException());
+}
+
 TEST_F(CSSStyleSheetTest,
        CSSStyleSheetConstructionWithNonEmptyCSSStyleSheetInit) {
   DummyExceptionStateForTesting exception_state;
@@ -79,48 +93,6 @@
   ASSERT_FALSE(exception_state.HadException());
 }
 
-TEST_F(CSSStyleSheetTest, CreateEmptyCSSStyleSheetWithEmptyCSSStyleSheetInit) {
-  V8TestingScope scope;
-  DummyExceptionStateForTesting exception_state;
-  CSSStyleSheet* sheet = GetDocument().createEmptyCSSStyleSheet(
-      scope.GetScriptState(), CSSStyleSheetInit(), exception_state);
-  ASSERT_FALSE(exception_state.HadException());
-  EXPECT_TRUE(sheet->href().IsNull());
-  EXPECT_EQ(sheet->parentStyleSheet(), nullptr);
-  EXPECT_EQ(sheet->ownerNode(), nullptr);
-  EXPECT_EQ(sheet->ownerRule(), nullptr);
-  EXPECT_EQ(sheet->media()->length(), 0U);
-  EXPECT_EQ(sheet->title(), StringImpl::empty_);
-  EXPECT_FALSE(sheet->AlternateFromConstructor());
-  EXPECT_FALSE(sheet->disabled());
-  EXPECT_EQ(sheet->cssRules(exception_state)->length(), 0U);
-  ASSERT_FALSE(exception_state.HadException());
-}
-
-TEST_F(CSSStyleSheetTest,
-       CreateEmptyCSSStyleSheetWithNonEmptyCSSStyleSheetInit) {
-  CSSStyleSheetInit init;
-  init.setMedia(MediaListOrString::FromString("screen, print"));
-  init.setTitle("test");
-  init.setAlternate(true);
-  init.setDisabled(true);
-  V8TestingScope scope;
-  DummyExceptionStateForTesting exception_state;
-  CSSStyleSheet* sheet = GetDocument().createEmptyCSSStyleSheet(
-      scope.GetScriptState(), init, exception_state);
-  ASSERT_FALSE(exception_state.HadException());
-  EXPECT_TRUE(sheet->href().IsNull());
-  EXPECT_EQ(sheet->parentStyleSheet(), nullptr);
-  EXPECT_EQ(sheet->ownerNode(), nullptr);
-  EXPECT_EQ(sheet->ownerRule(), nullptr);
-  EXPECT_EQ(sheet->media()->length(), 2U);
-  EXPECT_EQ(sheet->media()->mediaText(), init.media().GetAsString());
-  EXPECT_EQ(sheet->title(), init.title());
-  EXPECT_TRUE(sheet->AlternateFromConstructor());
-  EXPECT_TRUE(sheet->disabled());
-  ASSERT_FALSE(exception_state.HadException());
-}
-
 TEST_F(CSSStyleSheetTest,
        CreateCSSStyleSheetWithEmptyCSSStyleSheetInitAndText) {
   V8TestingScope scope;
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
index ff57391..5b80d528 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
@@ -583,7 +583,10 @@
       return value_id == CSSValueTop || value_id == CSSValueBottom;
     case CSSPropertyClear:
       return value_id == CSSValueNone || value_id == CSSValueLeft ||
-             value_id == CSSValueRight || value_id == CSSValueBoth;
+             value_id == CSSValueRight || value_id == CSSValueBoth ||
+             (RuntimeEnabledFeatures::CSSLogicalEnabled() &&
+              (value_id == CSSValueInlineStart ||
+               value_id == CSSValueInlineEnd));
     case CSSPropertyClipRule:
     case CSSPropertyFillRule:
       return value_id == CSSValueNonzero || value_id == CSSValueEvenodd;
@@ -611,6 +614,9 @@
       return value_id == CSSValueShow || value_id == CSSValueHide;
     case CSSPropertyFloat:
       return value_id == CSSValueLeft || value_id == CSSValueRight ||
+             (RuntimeEnabledFeatures::CSSLogicalEnabled() &&
+              (value_id == CSSValueInlineStart ||
+               value_id == CSSValueInlineEnd)) ||
              value_id == CSSValueNone;
     case CSSPropertyImageRendering:
       return value_id == CSSValueAuto ||
@@ -668,6 +674,8 @@
     case CSSPropertyResize:
       return value_id == CSSValueNone || value_id == CSSValueBoth ||
              value_id == CSSValueHorizontal || value_id == CSSValueVertical ||
+             (RuntimeEnabledFeatures::CSSLogicalEnabled() &&
+              (value_id == CSSValueBlock || value_id == CSSValueInline)) ||
              value_id == CSSValueAuto;
     case CSSPropertyScrollBehavior:
       DCHECK(RuntimeEnabledFeatures::CSSOMSmoothScrollEnabled());
diff --git a/third_party/blink/renderer/core/css/properties/longhands/clear_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/clear_custom.cc
index 2764653..0fa6c74 100644
--- a/third_party/blink/renderer/core/css/properties/longhands/clear_custom.cc
+++ b/third_party/blink/renderer/core/css/properties/longhands/clear_custom.cc
@@ -16,5 +16,27 @@
   return CSSIdentifierValue::Create(style.Clear());
 }
 
+void Clear::ApplyValue(StyleResolverState& state, const CSSValue& value) const {
+  const CSSIdentifierValue& identifier_value = ToCSSIdentifierValue(value);
+
+  EClear c;
+  CSSValueID id = identifier_value.GetValueID();
+  switch (id) {
+    case CSSValueInlineStart:
+    case CSSValueInlineEnd:
+      if ((id == CSSValueInlineStart) ==
+          (state.Style()->Direction() == TextDirection::kLtr)) {
+        c = EClear::kLeft;
+      } else {
+        c = EClear::kRight;
+      }
+      break;
+    default:
+      c = identifier_value.ConvertTo<EClear>();
+      break;
+  }
+  state.Style()->SetClear(c);
+}
+
 }  // namespace CSSLonghand
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/float_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/float_custom.cc
index 1f9c40b..37c2bd54 100644
--- a/third_party/blink/renderer/core/css/properties/longhands/float_custom.cc
+++ b/third_party/blink/renderer/core/css/properties/longhands/float_custom.cc
@@ -20,5 +20,27 @@
   return CSSIdentifierValue::Create(style.Floating());
 }
 
+void Float::ApplyValue(StyleResolverState& state, const CSSValue& value) const {
+  const CSSIdentifierValue& identifier_value = ToCSSIdentifierValue(value);
+
+  EFloat f;
+  CSSValueID id = identifier_value.GetValueID();
+  switch (id) {
+    case CSSValueInlineStart:
+    case CSSValueInlineEnd:
+      if ((id == CSSValueInlineStart) ==
+          (state.Style()->Direction() == TextDirection::kLtr)) {
+        f = EFloat::kLeft;
+      } else {
+        f = EFloat::kRight;
+      }
+      break;
+    default:
+      f = identifier_value.ConvertTo<EFloat>();
+      break;
+  }
+  state.Style()->SetFloating(f);
+}
+
 }  // namespace CSSLonghand
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/resize_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/resize_custom.cc
index 646a4d6..9068e5b2 100644
--- a/third_party/blink/renderer/core/css/properties/longhands/resize_custom.cc
+++ b/third_party/blink/renderer/core/css/properties/longhands/resize_custom.cc
@@ -25,14 +25,27 @@
   const CSSIdentifierValue& identifier_value = ToCSSIdentifierValue(value);
 
   EResize r = EResize::kNone;
-  if (identifier_value.GetValueID() == CSSValueAuto) {
-    if (Settings* settings = state.GetDocument().GetSettings()) {
-      r = settings->GetTextAreasAreResizable() ? EResize::kBoth
-                                               : EResize::kNone;
-    }
-    UseCounter::Count(state.GetDocument(), WebFeature::kCSSResizeAuto);
-  } else {
-    r = identifier_value.ConvertTo<EResize>();
+  CSSValueID id = identifier_value.GetValueID();
+  switch (id) {
+    case CSSValueAuto:
+      if (Settings* settings = state.GetDocument().GetSettings()) {
+        r = settings->GetTextAreasAreResizable() ? EResize::kBoth
+                                                 : EResize::kNone;
+      }
+      UseCounter::Count(state.GetDocument(), WebFeature::kCSSResizeAuto);
+      break;
+    case CSSValueBlock:
+    case CSSValueInline:
+      if ((id == CSSValueBlock) ==
+          IsHorizontalWritingMode(state.Style()->GetWritingMode())) {
+        r = EResize::kVertical;
+      } else {
+        r = EResize::kHorizontal;
+      }
+      break;
+    default:
+      r = identifier_value.ConvertTo<EResize>();
+      break;
   }
   state.Style()->SetResize(r);
 }
diff --git a/third_party/blink/renderer/core/dom/common_definitions.idl b/third_party/blink/renderer/core/dom/common_definitions.idl
index 9ba34cae..60c8b6ec 100644
--- a/third_party/blink/renderer/core/dom/common_definitions.idl
+++ b/third_party/blink/renderer/core/dom/common_definitions.idl
@@ -10,8 +10,7 @@
 
 // https://heycam.github.io/webidl/#Function
 
-// TODO(yukishiino): Use the generated V8Function instead of ScriptValue.
-// callback Function = any (any... arguments);
+callback Function = any (any... arguments);
 
 
 // typedefs used in multiple files.
diff --git a/third_party/blink/renderer/core/editing/commands/editing_commands_utilities.cc b/third_party/blink/renderer/core/editing/commands/editing_commands_utilities.cc
index 98e2d27d..86963abf 100644
--- a/third_party/blink/renderer/core/editing/commands/editing_commands_utilities.cc
+++ b/third_party/blink/renderer/core/editing/commands/editing_commands_utilities.cc
@@ -615,11 +615,8 @@
 SelectionInDOMTree CorrectedSelectionAfterCommand(
     const SelectionForUndoStep& passed_selection,
     const Document* document) {
-  if (!passed_selection.Base().IsConnected() ||
-      !passed_selection.Extent().IsConnected() ||
-      passed_selection.Base().GetDocument() != document ||
-      passed_selection.Base().GetDocument() !=
-          passed_selection.Extent().GetDocument())
+  if (!passed_selection.Base().IsValidFor(*document) ||
+      !passed_selection.Extent().IsValidFor(*document))
     return SelectionInDOMTree();
   return passed_selection.AsSelection();
 }
diff --git a/third_party/blink/renderer/core/editing/editor_test.cc b/third_party/blink/renderer/core/editing/editor_test.cc
index 505a0f5..dd0b3ff9 100644
--- a/third_party/blink/renderer/core/editing/editor_test.cc
+++ b/third_party/blink/renderer/core/editing/editor_test.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/core/editing/editor.h"
 
 #include "third_party/blink/renderer/core/clipboard/system_clipboard.h"
+#include "third_party/blink/renderer/core/dom/text.h"
 #include "third_party/blink/renderer/core/editing/commands/editor_command.h"
 #include "third_party/blink/renderer/core/editing/frame_selection.h"
 #include "third_party/blink/renderer/core/editing/selection_template.h"
@@ -106,4 +107,19 @@
   EXPECT_EQ("HENEWLLO", text_control.value());
 }
 
+// http://crbug.com/873037
+TEST_F(EditorTest, UndoWithInvalidSelection) {
+  const SelectionInDOMTree selection = SetSelectionTextToBody(
+      "<div contenteditable><div></div><b>^abc|</b></div>");
+  Selection().SetSelection(selection, SetSelectionOptions());
+  Text& abc = ToText(*selection.Base().ComputeContainerNode());
+  // Push Text node "abc" into undo stack
+  GetDocument().execCommand("italic", false, "", ASSERT_NO_EXCEPTION);
+  // Change Text node "abc" in undo stack
+  abc.setData("");
+  GetDocument().GetFrame()->GetEditor().Undo();
+  EXPECT_EQ("<div contenteditable><div></div><b>|</b></div>",
+            GetSelectionTextFromBody());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index 301304d4c..84badf40 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -286,9 +286,7 @@
   // The compositor throttles the main frame using deferred commits, we can't
   // throttle it here or it seems the root compositor doesn't get setup
   // properly.
-  if (RuntimeEnabledFeatures::
-          RenderingPipelineThrottlingLoadingIframesEnabled())
-    lifecycle_updates_throttled_ = !GetFrame().IsMainFrame();
+  lifecycle_updates_throttled_ = !GetFrame().IsMainFrame();
   has_pending_layout_ = false;
   layout_scheduling_enabled_ = true;
   in_synchronous_post_layout_ = false;
diff --git a/third_party/blink/renderer/core/frame/picture_in_picture_controller.h b/third_party/blink/renderer/core/frame/picture_in_picture_controller.h
index 4565488..cc2da5d 100644
--- a/third_party/blink/renderer/core/frame/picture_in_picture_controller.h
+++ b/third_party/blink/renderer/core/frame/picture_in_picture_controller.h
@@ -13,6 +13,7 @@
 
 class HTMLVideoElement;
 class ScriptPromiseResolver;
+struct PictureInPictureControlInfo;
 
 // PictureInPictureController allows to know if Picture-in-Picture is allowed
 // for a video element in Blink outside of modules/ module. It
@@ -65,6 +66,11 @@
   virtual void OnPictureInPictureControlClicked(
       const WebString& control_id) = 0;
 
+  // Assign custom controls to be added to the Picture-in-Picture window.
+  virtual void SetPictureInPictureCustomControls(
+      HTMLVideoElement*,
+      const std::vector<PictureInPictureControlInfo>&) = 0;
+
   // Returns whether the given element is currently in Picture-in-Picture.
   virtual bool IsPictureInPictureElement(const Element*) const = 0;
 
diff --git a/third_party/blink/renderer/core/frame/window_timers.idl b/third_party/blink/renderer/core/frame/window_timers.idl
index 9f8fc07..1641a39 100644
--- a/third_party/blink/renderer/core/frame/window_timers.idl
+++ b/third_party/blink/renderer/core/frame/window_timers.idl
@@ -25,7 +25,8 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-// https://html.spec.whatwg.org/#timers
+// https://html.spec.whatwg.org/C/webappapis.html#windoworworkerglobalscope-mixin
+// https://html.spec.whatwg.org/C/timers-and-user-prompts.html#timers
 
 [
     ImplementedAs=DOMWindowTimers,
@@ -33,13 +34,13 @@
     NoInterfaceObject, // Always used on target of 'implements'
     Exposed=(Window,Worker)
 ] interface WindowTimers {
-    // FIXME: would be clearer as a union type, like:
-    // typedef (Function or DOMString) Handler
-    // Needs spec update and better union support: http://crbug.com/240176
-    [CallWith=ScriptState, RuntimeCallStatsCounter=WindowSetTimeout] long setTimeout(Function handler, optional long timeout = 0, any... arguments);
+    // TODO(yukishiino): Use TimerHandler (or Function at least) to implement
+    // setTimeout and setInterval.
+    // https://html.spec.whatwg.org/C/webappapis.html#windoworworkerglobalscope-mixin
+    [CallWith=ScriptState, RuntimeCallStatsCounter=WindowSetTimeout] long setTimeout(CallbackFunctionTreatedAsScriptValue handler, optional long timeout = 0, any... arguments);
     [CallWith=ScriptState] long setTimeout(DOMString handler, optional long timeout = 0, any... arguments);
     void clearTimeout(optional long handle = 0);
-    [CallWith=ScriptState] long setInterval(Function handler, optional long timeout = 0, any... arguments);
+    [CallWith=ScriptState] long setInterval(CallbackFunctionTreatedAsScriptValue handler, optional long timeout = 0, any... arguments);
     [CallWith=ScriptState] long setInterval(DOMString handler, optional long timeout = 0, any... arguments);
     void clearInterval(optional long handle = 0);
 };
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_registry.idl b/third_party/blink/renderer/core/html/custom/custom_element_registry.idl
index e9c6d13..51426df 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_registry.idl
+++ b/third_party/blink/renderer/core/html/custom/custom_element_registry.idl
@@ -3,7 +3,9 @@
 // found in the LICENSE file.
 
 interface CustomElementRegistry {
-    [CallWith=ScriptState, CEReactions, CustomElementCallbacks, RaisesException, MeasureAs=CustomElementRegistryDefine] void define(DOMString name, Function constructor, optional ElementDefinitionOptions options);
+    // TODO(yukishiino): |constructor| should be of callback function type
+    // (should be: callback T = any ()).
+    [CallWith=ScriptState, CEReactions, CustomElementCallbacks, RaisesException, MeasureAs=CustomElementRegistryDefine] void define(DOMString name, CallbackFunctionTreatedAsScriptValue constructor, optional ElementDefinitionOptions options);
     any get(DOMString name);
     [CallWith=ScriptState,RaisesException] Promise<void> whenDefined(DOMString name);
     [CEReactions] void upgrade(Node root);
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc b/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc
index bd294a4..b3654203 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc
+++ b/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc
@@ -435,11 +435,9 @@
 
 TEST_F(CustomElementRegistryTest, defineCustomElementWithStyle) {
   RuntimeEnabledFeatures::SetConstructableStylesheetsEnabled(true);
-  V8TestingScope scope;
   NonThrowableExceptionState should_not_throw;
   ElementDefinitionOptions options;
-  CSSStyleSheet* sheet = GetDocument().createEmptyCSSStyleSheet(
-      scope.GetScriptState(), CSSStyleSheetInit(), should_not_throw);
+  CSSStyleSheet* sheet = CSSStyleSheet::Create(GetDocument(), should_not_throw);
   options.setStyle(sheet);
   TestCustomElementDefinitionBuilder builder(sheet);
   CustomElementDefinition* definition_a =
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.cc b/third_party/blink/renderer/core/html/html_iframe_element.cc
index fae0cdf..1c39480 100644
--- a/third_party/blink/renderer/core/html/html_iframe_element.cc
+++ b/third_party/blink/renderer/core/html/html_iframe_element.cc
@@ -173,8 +173,7 @@
       FrameOwnerPropertiesChanged();
       UpdateContainerPolicy();
     }
-  } else if (RuntimeEnabledFeatures::EmbedderCSPEnforcementEnabled() &&
-             name == cspAttr) {
+  } else if (name == cspAttr) {
     if (!ContentSecurityPolicy::IsValidCSPAttr(
             value.GetString(), GetDocument().RequiredCSP().GetString())) {
       required_csp_ = g_null_atom;
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.idl b/third_party/blink/renderer/core/html/html_iframe_element.idl
index c0d5a9c0..c45e0f7 100644
--- a/third_party/blink/renderer/core/html/html_iframe_element.idl
+++ b/third_party/blink/renderer/core/html/html_iframe_element.idl
@@ -39,7 +39,7 @@
     [CheckSecurity=ReturnValue, RaisesException] Document? getSVGDocument();
     [CEReactions, Reflect, ReflectOnly=("","no-referrer","origin","no-referrer-when-downgrade","origin-when-cross-origin","unsafe-url"), ReflectMissing="", ReflectInvalid=""] attribute DOMString referrerPolicy;
     // https://w3c.github.io/webappsec-csp/embedded/#dom-htmliframeelement-csp
-    [RuntimeEnabled=EmbedderCSPEnforcement, CEReactions, Reflect] attribute DOMString csp;
+    [CEReactions, Reflect] attribute DOMString csp;
 
     // Feature Policy
     // https://wicg.github.io/feature-policy/
diff --git a/third_party/blink/renderer/core/html/html_image_element.idl b/third_party/blink/renderer/core/html/html_image_element.idl
index e17cc92d..bbd0cd3 100644
--- a/third_party/blink/renderer/core/html/html_image_element.idl
+++ b/third_party/blink/renderer/core/html/html_image_element.idl
@@ -59,5 +59,5 @@
     [MeasureAs=HTMLImageElementX] readonly attribute long x;
     [MeasureAs=HTMLImageElementY] readonly attribute long y;
 
-    [RuntimeEnabled=JSImageDecode, CallWith=ScriptState, RaisesException] Promise decode();
+    [CallWith=ScriptState, RaisesException] Promise decode();
 };
diff --git a/third_party/blink/renderer/core/html/media/autoplay_policy.cc b/third_party/blink/renderer/core/html/media/autoplay_policy.cc
index 33afa8e..3fc7e25 100644
--- a/third_party/blink/renderer/core/html/media/autoplay_policy.cc
+++ b/third_party/blink/renderer/core/html/media/autoplay_policy.cc
@@ -86,6 +86,9 @@
   if (IsDocumentWhitelisted(document))
     return Type::kNoUserGestureRequired;
 
+  if (DocumentHasUserExceptionFlag(document))
+    return Type::kNoUserGestureRequired;
+
   return document.GetSettings()->GetAutoplayPolicy();
 }
 
@@ -110,8 +113,7 @@
       return true;
     }
 
-    if (!RuntimeEnabledFeatures::FeaturePolicyAutoplayFeatureEnabled() ||
-        !frame->IsFeatureEnabled(mojom::FeaturePolicyFeature::kAutoplay)) {
+    if (!frame->IsFeatureEnabled(mojom::FeaturePolicyFeature::kAutoplay)) {
       return false;
     }
   }
@@ -136,6 +138,14 @@
 }
 
 // static
+bool AutoplayPolicy::DocumentHasUserExceptionFlag(const Document& document) {
+  if (!document.GetPage())
+    return false;
+  return document.GetPage()->AutoplayFlags() &
+         mojom::blink::kAutoplayFlagUserException;
+}
+
+// static
 bool AutoplayPolicy::DocumentShouldAutoplayMutedVideos(
     const Document& document) {
   return GetAutoplayPolicyForDocument(document) !=
diff --git a/third_party/blink/renderer/core/html/media/autoplay_policy.h b/third_party/blink/renderer/core/html/media/autoplay_policy.h
index d6c6026..c8c1ab9c8 100644
--- a/third_party/blink/renderer/core/html/media/autoplay_policy.h
+++ b/third_party/blink/renderer/core/html/media/autoplay_policy.h
@@ -49,6 +49,9 @@
   // Returns true if the given |document| should force allow autoplay.
   static bool DocumentHasForceAllowFlag(const Document&);
 
+  // Returns true if the given |document| has the user exception flag.
+  static bool DocumentHasUserExceptionFlag(const Document&);
+
   // Returns true if the given |document| should autoplay muted videos.
   static bool DocumentShouldAutoplayMutedVideos(const Document&);
 
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 72efe76..17bdb87 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
@@ -603,6 +603,15 @@
     GetWebMediaPlayer()->ExitPictureInPicture(std::move(callback));
 }
 
+void HTMLVideoElement::SendCustomControlsToPipWindow() {
+  // TODO(sawtelle): Allow setting controls multiple times for a video, even
+  // when not active, https://crbug.com/869133
+  if (!GetWebMediaPlayer() || !HasPictureInPictureCustomControls())
+    return;
+  GetWebMediaPlayer()->SetPictureInPictureCustomControls(
+      GetPictureInPictureCustomControls());
+}
+
 void HTMLVideoElement::PictureInPictureStopped() {
   PictureInPictureController::From(GetDocument())
       .OnExitedPictureInPicture(nullptr);
@@ -649,6 +658,20 @@
     GetWebMediaPlayer()->OnDisplayTypeChanged(DisplayType());
 }
 
+void HTMLVideoElement::SetPictureInPictureCustomControls(
+    const std::vector<PictureInPictureControlInfo>& pip_custom_controls) {
+  pip_custom_controls_ = pip_custom_controls;
+}
+
+const std::vector<PictureInPictureControlInfo>&
+HTMLVideoElement::GetPictureInPictureCustomControls() const {
+  return pip_custom_controls_;
+}
+
+bool HTMLVideoElement::HasPictureInPictureCustomControls() const {
+  return !pip_custom_controls_.empty();
+}
+
 void HTMLVideoElement::AddedEventListener(
     const AtomicString& event_type,
     RegisteredEventListener& registered_listener) {
diff --git a/third_party/blink/renderer/core/html/media/html_video_element.h b/third_party/blink/renderer/core/html/media/html_video_element.h
index 824b1464..d4289e6 100644
--- a/third_party/blink/renderer/core/html/media/html_video_element.h
+++ b/third_party/blink/renderer/core/html/media/html_video_element.h
@@ -26,6 +26,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_MEDIA_HTML_VIDEO_ELEMENT_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_MEDIA_HTML_VIDEO_ELEMENT_H_
 
+#include "third_party/blink/public/common/picture_in_picture/picture_in_picture_control_info.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/html/canvas/canvas_image_source.h"
 #include "third_party/blink/renderer/core/html/html_image_loader.h"
@@ -152,6 +153,7 @@
   bool SupportsPictureInPicture() const final;
   void enterPictureInPicture(WebMediaPlayer::PipWindowOpenedCallback callback);
   void exitPictureInPicture(WebMediaPlayer::PipWindowClosedCallback callback);
+  void SendCustomControlsToPipWindow();
   void PictureInPictureStopped() final;
   void PictureInPictureControlClicked(const WebString& control_id) final;
   void MediaRemotingStopped(WebLocalizedString::Name error_msg) final;
@@ -163,6 +165,12 @@
   void OnEnteredPictureInPicture();
   void OnExitedPictureInPicture();
 
+  void SetPictureInPictureCustomControls(
+      const std::vector<PictureInPictureControlInfo>& pip_custom_controls);
+  const std::vector<PictureInPictureControlInfo>&
+  GetPictureInPictureCustomControls() const;
+  bool HasPictureInPictureCustomControls() const;
+
  protected:
   // EventTarget overrides.
   void AddedEventListener(const AtomicString& event_type,
@@ -214,6 +222,10 @@
 
   // Whether this element is in overlay fullscreen mode.
   bool in_overlay_fullscreen_video_;
+
+  // Holds the most recently set custom controls. These will be persistent
+  // across active/inactive windows until new controls are passed in.
+  std::vector<PictureInPictureControlInfo> pip_custom_controls_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/media/html_video_element_test.cc b/third_party/blink/renderer/core/html/media/html_video_element_test.cc
index 534f602..4c0c83d 100644
--- a/third_party/blink/renderer/core/html/media/html_video_element_test.cc
+++ b/third_party/blink/renderer/core/html/media/html_video_element_test.cc
@@ -7,6 +7,7 @@
 #include "cc/layers/layer.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/picture_in_picture/picture_in_picture_control_info.h"
 #include "third_party/blink/renderer/core/dom/shadow_root.h"
 #include "third_party/blink/renderer/core/html_names.h"
 #include "third_party/blink/renderer/core/loader/empty_clients.h"
@@ -91,4 +92,14 @@
   GetDocument().body()->removeChild(video());
 }
 
+TEST_F(HTMLVideoElementTest, setPictureInPictureControls) {
+  EXPECT_FALSE(video()->HasPictureInPictureCustomControls());
+
+  std::vector<PictureInPictureControlInfo> test_controls;
+  test_controls.push_back(PictureInPictureControlInfo());
+  video()->SetPictureInPictureCustomControls(test_controls);
+
+  EXPECT_TRUE(video()->HasPictureInPictureCustomControls());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/custom/layout_worklet_global_scope.idl b/third_party/blink/renderer/core/layout/custom/layout_worklet_global_scope.idl
index 3bdcf12..0ed4c1e 100644
--- a/third_party/blink/renderer/core/layout/custom/layout_worklet_global_scope.idl
+++ b/third_party/blink/renderer/core/layout/custom/layout_worklet_global_scope.idl
@@ -9,5 +9,7 @@
     Global=(Worklet,LayoutWorklet),
     RuntimeEnabled=CSSLayoutAPI
 ] interface LayoutWorkletGlobalScope : WorkletGlobalScope {
-    [RaisesException] void registerLayout(DOMString name, Function layoutCtor);
+    // TODO(yukishiino): |layoutCtor| should be of callback function type
+    // (should be: callback T = any ()).
+    [RaisesException] void registerLayout(DOMString name, CallbackFunctionTreatedAsScriptValue layoutCtor);
 };
diff --git a/third_party/blink/renderer/core/layout/layout_box.h b/third_party/blink/renderer/core/layout/layout_box.h
index e54ad16..f38d253 100644
--- a/third_party/blink/renderer/core/layout/layout_box.h
+++ b/third_party/blink/renderer/core/layout/layout_box.h
@@ -488,6 +488,11 @@
   }
 
   LayoutRect VisualOverflowRect() const override;
+  LayoutRect PhysicalVisualOverflowRect() const {
+    LayoutRect overflow_rect = VisualOverflowRect();
+    FlipForWritingMode(overflow_rect);
+    return overflow_rect;
+  }
   LayoutUnit LogicalLeftVisualOverflow() const {
     return Style()->IsHorizontalWritingMode() ? VisualOverflowRect().X()
                                               : VisualOverflowRect().Y();
diff --git a/third_party/blink/renderer/core/layout/layout_image.cc b/third_party/blink/renderer/core/layout/layout_image.cc
index 46c2078..4449067 100644
--- a/third_party/blink/renderer/core/layout/layout_image.cc
+++ b/third_party/blink/renderer/core/layout/layout_image.cc
@@ -186,6 +186,9 @@
     did_increment_visually_non_empty_pixel_count_ = true;
   }
 
+  // The replaced content transform depends on the intrinsic size (see:
+  // FragmentPaintPropertyTreeBuilder::UpdateReplacedContentTransform).
+  SetNeedsPaintPropertyUpdate();
   InvalidatePaintAndMarkForLayoutIfNeeded(defer);
 }
 
diff --git a/third_party/blink/renderer/core/layout/layout_image.h b/third_party/blink/renderer/core/layout/layout_image.h
index e8742be..5f85f7b 100644
--- a/third_party/blink/renderer/core/layout/layout_image.h
+++ b/third_party/blink/renderer/core/layout/layout_image.h
@@ -78,6 +78,9 @@
   float ImageDevicePixelRatio() const { return image_device_pixel_ratio_; }
 
   void IntrinsicSizeChanged() override {
+    // The replaced content transform depends on the intrinsic size (see:
+    // FragmentPaintPropertyTreeBuilder::UpdateReplacedContentTransform).
+    SetNeedsPaintPropertyUpdate();
     if (image_resource_)
       ImageChanged(image_resource_->ImagePtr(), CanDeferInvalidation::kNo);
   }
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc
index 2f3f7f6e..347dd58 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc
@@ -80,6 +80,7 @@
     current_style_ = break_token->Style();
     item_index_ = break_token->ItemIndex();
     offset_ = break_token->TextOffset();
+    break_iterator_.SetStartOffset(offset_);
     previous_line_had_forced_break_ = break_token->IsForcedBreak();
     items_data_.AssertOffset(item_index_, offset_);
     ignore_floats_ = break_token->IgnoreFloats();
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index 8203771d..3e6793e 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -635,7 +635,6 @@
   }
 
   if (!frame_->GetSettings()->BypassCSP() &&
-      RuntimeEnabledFeatures::EmbedderCSPEnforcementEnabled() &&
       !GetFrameLoader().RequiredCSP().IsEmpty()) {
     const SecurityOrigin* parent_security_origin =
         frame_->Tree().Parent()->GetSecurityContext()->GetSecurityOrigin();
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
index 07da0cc5..3832d6d 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -1613,8 +1613,7 @@
 
 void FrameLoader::ModifyRequestForCSP(ResourceRequest& resource_request,
                                       Document* origin_document) const {
-  if (RuntimeEnabledFeatures::EmbedderCSPEnforcementEnabled() &&
-      !RequiredCSP().IsEmpty()) {
+  if (!RequiredCSP().IsEmpty()) {
     DCHECK(
         ContentSecurityPolicy::IsValidCSPAttr(RequiredCSP().GetString(), ""));
     resource_request.SetHTTPHeaderField(HTTPNames::Sec_Required_CSP,
diff --git a/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc b/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc
index 69f1678..9ba4cfc 100644
--- a/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc
+++ b/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc
@@ -147,6 +147,9 @@
 
   // [SMSR] "... its referrer policy to options's referrer policy." [spec text]
   // Note: For now this is done below with SetHTTPReferrer()
+  ReferrerPolicy referrer_policy = module_request.Options().GetReferrerPolicy();
+  if (referrer_policy == kReferrerPolicyDefault)
+    referrer_policy = fetch_client_settings_object->GetReferrerPolicy();
 
   // Step 5. "... mode is "cors", ..."
   // [SMSR] "... and its credentials mode to options's credentials mode."
@@ -164,9 +167,9 @@
   // TODO(domfarolino): Stop storing ResourceRequest's referrer as a
   // blink::Referrer (https://crbug.com/850813).
   fetch_params.MutableResourceRequest().SetHTTPReferrer(
-      SecurityPolicy::GenerateReferrer(
-          module_request.Options().GetReferrerPolicy(),
-          fetch_params.GetResourceRequest().Url(), referrer_string));
+      SecurityPolicy::GenerateReferrer(referrer_policy,
+                                       fetch_params.GetResourceRequest().Url(),
+                                       referrer_string));
 
   // Step 5. "... and client is fetch client settings object." [spec text]
   // -> set by ResourceFetcher
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 3ff148e..9e3f6f2 100644
--- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
+++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
@@ -529,10 +529,10 @@
   return true;
 }
 
-bool ScrollingCoordinator::ScrollableAreaScrollLayerDidChange(
+void ScrollingCoordinator::ScrollableAreaScrollLayerDidChange(
     ScrollableArea* scrollable_area) {
   if (!page_ || !page_->MainFrame())
-    return false;
+    return;
 
   UpdateUserInputScrollable(scrollable_area);
 
@@ -615,7 +615,7 @@
   }
   scrollable_area->LayerForScrollingDidChange(timeline);
 
-  return !!cc_layer;
+  return;
 }
 
 using GraphicsLayerHitTestRects =
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h
index 68c9153..fd49c170 100644
--- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h
+++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h
@@ -139,7 +139,7 @@
   // blink uses a separate layer. To ensure the compositor scroll layer has the
   // updated scroll container bounds, this needs to be called when the scrolling
   // contents layer is resized.
-  bool ScrollableAreaScrollLayerDidChange(ScrollableArea*);
+  void ScrollableAreaScrollLayerDidChange(ScrollableArea*);
   void ScrollableAreaScrollbarLayerDidChange(ScrollableArea*,
                                              ScrollbarOrientation);
   void UpdateLayerPositionConstraint(PaintLayer*);
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
index c3a3fea..36b3c46 100644
--- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
+++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
@@ -207,12 +207,22 @@
     is_main_frame_layout_view_layer_ = true;
 
   CreatePrimaryGraphicsLayer();
+
+  // ImagePainter has a micro-optimization to embed object-fit and clip into
+  // the drawing so the property nodes were omitted if not composited.
+  if (GetLayoutObject().IsLayoutImage())
+    GetLayoutObject().SetNeedsPaintPropertyUpdate();
 }
 
 CompositedLayerMapping::~CompositedLayerMapping() {
   // Hits in compositing/squashing/squash-onto-nephew.html.
   DisableCompositingQueryAsserts disabler;
 
+  // ImagePainter has a micro-optimization to embed object-fit and clip into
+  // the drawing so the property nodes should be omitted if not composited.
+  if (GetLayoutObject().IsLayoutImage())
+    GetLayoutObject().SetNeedsPaintPropertyUpdate();
+
   // Do not leave the destroyed pointer dangling on any Layers that painted to
   // this mapping's squashing layer.
   for (size_t i = 0; i < squashed_layers_.size(); ++i) {
@@ -1675,17 +1685,9 @@
   if (scrolling_contents_offset != scrolling_contents_offset_ ||
       scroll_size != scrolling_contents_layer_->Size() ||
       scroll_container_size_changed) {
-    bool coordinator_handles_offset = false;
     auto* scrolling_coordinator = owning_layer_.GetScrollingCoordinator();
-    auto* scrollable_area = owning_layer_.GetScrollableArea();
-    if (scrolling_coordinator && scrollable_area) {
-      coordinator_handles_offset =
-          scrolling_coordinator->ScrollableAreaScrollLayerDidChange(
-              scrollable_area);
-    }
-    scrolling_contents_layer_->SetPosition(
-        coordinator_handles_offset ? FloatPoint()
-                                   : FloatPoint(-ToFloatSize(scroll_position)));
+    scrolling_coordinator->ScrollableAreaScrollLayerDidChange(scrollable_area);
+    scrolling_contents_layer_->SetPosition(FloatPoint());
   }
   scrolling_contents_offset_ = scrolling_contents_offset;
 
diff --git a/third_party/blink/renderer/core/paint/details_marker_painter.cc b/third_party/blink/renderer/core/paint/details_marker_painter.cc
index 2c525dcf..4346363 100644
--- a/third_party/blink/renderer/core/paint/details_marker_painter.cc
+++ b/third_party/blink/renderer/core/paint/details_marker_painter.cc
@@ -27,9 +27,8 @@
 
   PaintInfoWithOffset paint_info_with_offset(layout_details_marker_,
                                              paint_info);
-  // TODO(wangxianzhu): Flip VisualOverflowRect into physical coordinates.
   if (!paint_info_with_offset.LocalRectIntersectsCullRect(
-          layout_details_marker_.VisualOverflowRect()))
+          layout_details_marker_.PhysicalVisualOverflowRect()))
     return;
 
   const auto& local_paint_info = paint_info_with_offset.GetPaintInfo();
diff --git a/third_party/blink/renderer/core/paint/fragment_data.cc b/third_party/blink/renderer/core/paint/fragment_data.cc
index 77d262be..6040846 100644
--- a/third_party/blink/renderer/core/paint/fragment_data.cc
+++ b/third_party/blink/renderer/core/paint/fragment_data.cc
@@ -44,6 +44,8 @@
   if (const auto* properties = PaintProperties()) {
     if (properties->ScrollTranslation())
       return properties->ScrollTranslation();
+    if (properties->ReplacedContentTransform())
+      return properties->ReplacedContentTransform();
     if (properties->Perspective())
       return properties->Perspective();
   }
diff --git a/third_party/blink/renderer/core/paint/list_marker_painter.cc b/third_party/blink/renderer/core/paint/list_marker_painter.cc
index 0981a540..2dcc4dcc 100644
--- a/third_party/blink/renderer/core/paint/list_marker_painter.cc
+++ b/third_party/blink/renderer/core/paint/list_marker_painter.cc
@@ -62,9 +62,8 @@
     return;
 
   PaintInfoWithOffset paint_info_with_offset(layout_list_marker_, paint_info);
-  // TODO(wangxianzhu): Flip VisualOverflowRect into physical coordinates.
   if (!paint_info_with_offset.LocalRectIntersectsCullRect(
-          layout_list_marker_.VisualOverflowRect()))
+          layout_list_marker_.PhysicalVisualOverflowRect()))
     return;
 
   const auto& local_paint_info = paint_info_with_offset.GetPaintInfo();
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
index 1707b6c..d7a4370 100644
--- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
+++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -36,6 +36,7 @@
 #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h"
 #include "third_party/blink/renderer/core/paint/paint_property_tree_printer.h"
 #include "third_party/blink/renderer/core/paint/svg_root_painter.h"
+#include "third_party/blink/renderer/platform/graphics/bitmap_image.h"
 #include "third_party/blink/renderer/platform/transforms/transform_state.h"
 #include "third_party/blink/renderer/platform/transforms/transformation_matrix.h"
 
@@ -220,7 +221,22 @@
 }
 
 static bool NeedsReplacedContentTransform(const LayoutObject& object) {
-  return object.IsSVGRoot();
+  // Quick reject.
+  if (!object.IsLayoutReplaced())
+    return false;
+
+  if (object.IsSVGRoot())
+    return true;
+
+  // Non-composited images have a micro-optimization to embed object-fit into
+  // the drawings instead of using a transform node.
+  bool is_spv1_composited =
+      object.HasLayer() &&
+      ToLayoutBoxModelObject(object).Layer()->GetCompositedLayerMapping();
+  if (object.IsLayoutImage() && !object.IsVideo() && is_spv1_composited)
+    return true;
+
+  return false;
 }
 
 static bool NeedsPaintOffsetTranslationForScrollbars(
@@ -960,6 +976,13 @@
   if (replaced.StyleRef().HasBorderRadius())
     return true;
 
+  // Non-composited images have a micro-optimization to embed clip rects into
+  // the drawings instead of using a clip node.
+  bool is_spv1_composited =
+      replaced.HasLayer() && replaced.Layer()->GetCompositedLayerMapping();
+  if (replaced.IsLayoutImage() && !replaced.IsVideo() && !is_spv1_composited)
+    return false;
+
   // Embedded objects are always sized to fit the content rect.
   if (replaced.IsLayoutEmbeddedContent())
     return false;
@@ -1215,33 +1238,72 @@
   }
 }
 
+static bool ImageWasTransposed(const LayoutImage& layout_image,
+                               const Image& image) {
+  return LayoutObject::ShouldRespectImageOrientation(&layout_image) ==
+             kRespectImageOrientation &&
+         image.IsBitmapImage() &&
+         ToBitmapImage(image).CurrentFrameOrientation().UsesWidthAsHeight();
+}
+
+static AffineTransform RectToRect(const FloatRect& src_rect,
+                                  const FloatRect& dst_rect) {
+  float x_scale = dst_rect.Width() / src_rect.Width();
+  float y_scale = dst_rect.Height() / src_rect.Height();
+  float x_offset = dst_rect.X() - src_rect.X() * x_scale;
+  float y_offset = dst_rect.Y() - src_rect.Y() * y_scale;
+  return AffineTransform(x_scale, 0.f, 0.f, y_scale, x_offset, y_offset);
+}
+
 void FragmentPaintPropertyTreeBuilder::UpdateReplacedContentTransform() {
   DCHECK(properties_);
-  if (!object_.IsSVGRoot())
-    return;
 
-  if (NeedsPaintPropertyUpdate()) {
-    AffineTransform transform_to_border_box =
-        SVGRootPainter(ToLayoutSVGRoot(object_))
-            .TransformToPixelSnappedBorderBox(context_.current.paint_offset);
-    if (!transform_to_border_box.IsIdentity() &&
-        NeedsReplacedContentTransform(object_)) {
+  if (NeedsPaintPropertyUpdate() && !NeedsReplacedContentTransform(object_)) {
+    OnClear(properties_->ClearReplacedContentTransform());
+  } else if (NeedsPaintPropertyUpdate()) {
+    AffineTransform content_to_parent_space;
+    if (object_.IsSVGRoot()) {
+      content_to_parent_space =
+          SVGRootPainter(ToLayoutSVGRoot(object_))
+              .TransformToPixelSnappedBorderBox(context_.current.paint_offset);
+    } else if (object_.IsLayoutImage() && !object_.IsVideo()) {
+      const LayoutImage& layout_image = ToLayoutImage(object_);
+      LayoutRect layout_replaced_rect = layout_image.ReplacedContentRect();
+      layout_replaced_rect.MoveBy(context_.current.paint_offset);
+      IntRect replaced_rect = PixelSnappedIntRect(layout_replaced_rect);
+      scoped_refptr<Image> image = layout_image.ImageResource()->GetImage(
+          LayoutSize(replaced_rect.Size()));
+      if (image && !image->IsNull()) {
+        IntRect src_rect = image->Rect();
+        if (ImageWasTransposed(layout_image, *image))
+          src_rect = src_rect.TransposedRect();
+        content_to_parent_space =
+            RectToRect(FloatRect(src_rect), FloatRect(replaced_rect));
+      }
+    }
+    if (!content_to_parent_space.IsIdentity()) {
       OnUpdate(properties_->UpdateReplacedContentTransform(
           *context_.current.transform,
-          TransformPaintPropertyNode::State{transform_to_border_box}));
+          TransformPaintPropertyNode::State{content_to_parent_space}));
     } else {
       OnClear(properties_->ClearReplacedContentTransform());
     }
   }
 
-  if (properties_->ReplacedContentTransform()) {
-    context_.current.transform = properties_->ReplacedContentTransform();
-    context_.current.should_flatten_inherited_transform = false;
-    context_.current.rendering_context_id = 0;
+  if (object_.IsSVGRoot()) {
+    // SVG painters don't use paint offset. The paint offset is baked into
+    // the transform node instead.
+    context_.current.paint_offset = LayoutPoint();
+
+    // Only <svg> paints its subtree as replaced contents. Other replaced
+    // element type may have shadow DOM that should not be affected by the
+    // replaced object fit.
+    if (properties_->ReplacedContentTransform()) {
+      context_.current.transform = properties_->ReplacedContentTransform();
+      context_.current.should_flatten_inherited_transform = false;
+      context_.current.rendering_context_id = 0;
+    }
   }
-  // The paint offset is included in |transformToBorderBox| so SVG does not need
-  // to handle paint offset internally.
-  context_.current.paint_offset = LayoutPoint();
 }
 
 static MainThreadScrollingReasons GetMainThreadScrollingReasons(
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
index 550b002..2345c090 100644
--- a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
+++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
@@ -3197,24 +3197,25 @@
 
   LayoutObject& svg_with_view_box =
       *GetLayoutObjectByElementId("svgWithViewBox");
-  EXPECT_EQ(DocPreTranslation(), svg_with_view_box.FirstFragment()
-                                     .LocalBorderBoxProperties()
-                                     .Transform()
-                                     ->Parent());
-  EXPECT_EQ(FloatSize(30, 20), svg_with_view_box.FirstFragment()
-                                   .LocalBorderBoxProperties()
-                                   .Transform()
-                                   ->Matrix()
-                                   .To2DTranslation());
-
+  const auto* paint_offset_translation = svg_with_view_box.FirstFragment()
+                                             .PaintProperties()
+                                             ->PaintOffsetTranslation();
+  EXPECT_EQ(
+      paint_offset_translation,
+      svg_with_view_box.FirstFragment().LocalBorderBoxProperties().Transform());
+  EXPECT_EQ(DocPreTranslation(), paint_offset_translation->Parent());
+  EXPECT_EQ(FloatSize(30, 20),
+            paint_offset_translation->Matrix().To2DTranslation());
   EXPECT_EQ(LayoutPoint(0, 0), svg_with_view_box.FirstFragment().PaintOffset());
-  auto contents_properties =
-      svg_with_view_box.FirstFragment().ContentsProperties();
-  EXPECT_EQ(svg_with_view_box.FirstFragment()
-                .PaintProperties()
-                ->PaintOffsetTranslation(),
-            contents_properties.Transform());
-  EXPECT_EQ(DocPreTranslation(), contents_properties.Transform()->Parent());
+
+  const auto* replaced_content_transform = svg_with_view_box.FirstFragment()
+                                               .PaintProperties()
+                                               ->ReplacedContentTransform();
+  EXPECT_EQ(replaced_content_transform,
+            svg_with_view_box.FirstFragment().ContentsProperties().Transform());
+  EXPECT_EQ(paint_offset_translation, replaced_content_transform->Parent());
+  EXPECT_EQ(FloatSize(-50, -50),
+            replaced_content_transform->Matrix().To2DTranslation());
 }
 
 TEST_P(PaintPropertyTreeBuilderTest, OverflowHiddenScrollProperties) {
@@ -5542,7 +5543,7 @@
   ToLayoutImage(GetLayoutObjectByElementId("img"))
       ->UpdateShouldInvertColorForTest(false);
   GetDocument().View()->UpdateAllLifecyclePhases();
-  EXPECT_EQ(nullptr, PaintPropertiesForElement("img")->Filter());
+  EXPECT_FALSE(PaintPropertiesForElement("img"));
 }
 
 TEST_P(PaintPropertyTreeBuilderTest, LayeredImageWithInvertFilter) {
@@ -5575,7 +5576,7 @@
   ToLayoutImage(GetLayoutObjectByElementId("img"))
       ->UpdateShouldInvertColorForTest(false);
   GetDocument().View()->UpdateAllLifecyclePhases();
-  EXPECT_EQ(nullptr, PaintPropertiesForElement("img")->Filter());
+  EXPECT_FALSE(PaintPropertiesForElement("img"));
 }
 
 TEST_P(PaintPropertyTreeBuilderTest,
@@ -5633,6 +5634,11 @@
 }
 
 TEST_P(PaintPropertyTreeBuilderTest, ClipInvalidationForReplacedElement) {
+  // Non-composited LayoutImage has a micro-optimization to embed object-fit
+  // and clip to the drawing, thus not creating nodes.
+  // SPv2 makes everything non-composited essentially.
+  if (RuntimeEnabledFeatures::SlimmingPaintV2Enabled())
+    return;
   // This test verifies clip nodes are correctly updated in response to
   // content box mutation.
   SetBodyInnerHTML(R"HTML(
@@ -5642,6 +5648,7 @@
       width: 8px;
       height: 8px;
       object-fit: none;
+      will-change: transform;
     }
     </style>
     <!-- An image of 10x10 white pixels. -->
@@ -5655,7 +5662,7 @@
     const auto* properties = PaintPropertiesForElement("target");
     ASSERT_TRUE(properties);
     ASSERT_TRUE(properties->OverflowClip());
-    EXPECT_EQ(FloatRect(8, 8, 8, 8),
+    EXPECT_EQ(FloatRect(0, 0, 8, 8),
               properties->OverflowClip()->ClipRect().Rect());
   }
 
@@ -5667,7 +5674,7 @@
     const auto* properties = PaintPropertiesForElement("target");
     ASSERT_TRUE(properties);
     ASSERT_TRUE(properties->OverflowClip());
-    EXPECT_EQ(FloatRect(12, 9, 2, 4),
+    EXPECT_EQ(FloatRect(4, 1, 2, 4),
               properties->OverflowClip()->ClipRect().Rect());
   }
 }
diff --git a/third_party/blink/renderer/core/paint/replaced_painter.cc b/third_party/blink/renderer/core/paint/replaced_painter.cc
index 8a6cfc7..f117c72 100644
--- a/third_party/blink/renderer/core/paint/replaced_painter.cc
+++ b/third_party/blink/renderer/core/paint/replaced_painter.cc
@@ -92,8 +92,11 @@
         PropertyTreeState new_properties =
             local_paint_info.context.GetPaintController()
                 .CurrentPaintChunkProperties();
+        bool painter_implements_object_fit_and_clip =
+            layout_replaced_.IsLayoutImage();
         bool property_changed = false;
-        if (paint_properties->ReplacedContentTransform()) {
+        if (paint_properties->ReplacedContentTransform() &&
+            !painter_implements_object_fit_and_clip) {
           new_properties.SetTransform(
               paint_properties->ReplacedContentTransform());
           DCHECK(paint_properties->ReplacedContentTransform()
@@ -106,7 +109,7 @@
           property_changed = true;
         }
         if (paint_properties->OverflowClip() &&
-            (!layout_replaced_.IsLayoutImage() ||
+            (!painter_implements_object_fit_and_clip ||
              layout_replaced_.StyleRef().HasBorderRadius())) {
           new_properties.SetClip(paint_properties->OverflowClip());
           property_changed = true;
@@ -182,6 +185,7 @@
 
   LayoutRect local_rect(layout_replaced_.VisualOverflowRect());
   local_rect.Unite(layout_replaced_.LocalSelectionRect());
+  layout_replaced_.FlipForWritingMode(local_rect);
   if (!paint_info_with_offset.LocalRectIntersectsCullRect(local_rect))
     return false;
 
diff --git a/third_party/blink/renderer/core/script/script_loader.cc b/third_party/blink/renderer/core/script/script_loader.cc
index 90b13713..dbb4163 100644
--- a/third_party/blink/renderer/core/script/script_loader.cc
+++ b/third_party/blink/renderer/core/script/script_loader.cc
@@ -364,10 +364,8 @@
 
   // <spec step="20">Let referrer policy be the current state of the element's
   // referrerpolicy content attribute.</spec>
-  // TODO(domfarolino): We should be able to set this to kReferrerPolicyDefault
-  // and have later logic use the right referrer policy.
   String referrerpolicy_attr = element_->ReferrerPolicyAttributeValue();
-  ReferrerPolicy referrer_policy = element_document.GetReferrerPolicy();
+  ReferrerPolicy referrer_policy = kReferrerPolicyDefault;
   if (!referrerpolicy_attr.IsEmpty()) {
     SecurityPolicy::ReferrerPolicyFromString(
         referrerpolicy_attr, kDoNotSupportReferrerPolicyLegacyKeywords,
diff --git a/third_party/blink/renderer/core/svg/svg_image_element.idl b/third_party/blink/renderer/core/svg/svg_image_element.idl
index f8a393b..2d60cf0 100644
--- a/third_party/blink/renderer/core/svg/svg_image_element.idl
+++ b/third_party/blink/renderer/core/svg/svg_image_element.idl
@@ -35,7 +35,7 @@
     [MeasureAs=SVG1DOMImageElement] readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio;
     [CEReactions, Reflect, ReflectOnly=("async", "sync", "auto"), ReflectMissing="auto", ReflectInvalid="auto"] attribute DOMString decoding;
 
-    [RuntimeEnabled=JSImageDecode, CallWith=ScriptState, RaisesException] Promise decode();
+    [CallWith=ScriptState, RaisesException] Promise decode();
 };
 
 SVGImageElement implements SVGURIReference;
diff --git a/third_party/blink/renderer/core/testing/dictionary_test.cc b/third_party/blink/renderer/core/testing/dictionary_test.cc
index 9eafb7c..a8f5e173 100644
--- a/third_party/blink/renderer/core/testing/dictionary_test.cc
+++ b/third_party/blink/renderer/core/testing/dictionary_test.cc
@@ -100,6 +100,7 @@
         testing_dictionary.internalEnumOrInternalEnumSequenceMember();
   }
   any_member_ = testing_dictionary.anyMember();
+  callback_function_member_ = testing_dictionary.callbackFunctionMember();
 }
 
 void DictionaryTest::get(InternalDictionary& result) {
@@ -155,6 +156,7 @@
   result.setInternalEnumOrInternalEnumSequenceMember(
       internal_enum_or_internal_enum_sequence_);
   result.setAnyMember(any_member_);
+  result.setCallbackFunctionMember(callback_function_member_);
 }
 
 ScriptValue DictionaryTest::getDictionaryMemberProperties(
@@ -258,6 +260,7 @@
   internal_enum_or_internal_enum_sequence_ =
       InternalEnumOrInternalEnumSequence();
   any_member_ = ScriptValue();
+  callback_function_member_ = nullptr;
 }
 
 void DictionaryTest::Trace(blink::Visitor* visitor) {
@@ -265,6 +268,7 @@
   visitor->Trace(element_or_null_member_);
   visitor->Trace(double_or_string_sequence_member_);
   visitor->Trace(event_target_or_null_member_);
+  visitor->Trace(callback_function_member_);
   ScriptWrappable::Trace(visitor);
 }
 
diff --git a/third_party/blink/renderer/core/testing/dictionary_test.h b/third_party/blink/renderer/core/testing/dictionary_test.h
index 34157aa..eb66e37 100644
--- a/third_party/blink/renderer/core/testing/dictionary_test.h
+++ b/third_party/blink/renderer/core/testing/dictionary_test.h
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/double_or_string.h"
 #include "third_party/blink/renderer/bindings/core/v8/internal_enum_or_internal_enum_sequence.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_test_callback.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
@@ -92,6 +93,7 @@
   base::Optional<HashMap<String, String>> dictionary_member_properties_;
   InternalEnumOrInternalEnumSequence internal_enum_or_internal_enum_sequence_;
   ScriptValue any_member_;
+  TraceWrapperMember<V8TestCallback> callback_function_member_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/testing/internal_dictionary.idl b/third_party/blink/renderer/core/testing/internal_dictionary.idl
index ef18a2c..6a87abd 100644
--- a/third_party/blink/renderer/core/testing/internal_dictionary.idl
+++ b/third_party/blink/renderer/core/testing/internal_dictionary.idl
@@ -36,4 +36,5 @@
     Dictionary dictionaryMember;
     (InternalEnum or sequence<InternalEnum>) internalEnumOrInternalEnumSequenceMember;
     any anyMember;
+    TestCallback callbackFunctionMember;
 };
diff --git a/third_party/blink/renderer/core/timing/performance.cc b/third_party/blink/renderer/core/timing/performance.cc
index 8c15e40..e07bc57d 100644
--- a/third_party/blink/renderer/core/timing/performance.cc
+++ b/third_party/blink/renderer/core/timing/performance.cc
@@ -518,9 +518,6 @@
 
 void Performance::AddPaintTiming(PerformancePaintTiming::PaintType type,
                                  TimeTicks start_time) {
-  if (!RuntimeEnabledFeatures::PerformancePaintTimingEnabled())
-    return;
-
   PerformanceEntry* entry = new PerformancePaintTiming(
       type, MonotonicTimeToDOMHighResTimeStamp(start_time));
   // Always buffer First Paint & First Contentful Paint.
diff --git a/third_party/blink/renderer/core/timing/performance_paint_timing.idl b/third_party/blink/renderer/core/timing/performance_paint_timing.idl
index a09c5a021..e6094b6 100644
--- a/third_party/blink/renderer/core/timing/performance_paint_timing.idl
+++ b/third_party/blink/renderer/core/timing/performance_paint_timing.idl
@@ -4,7 +4,5 @@
 
 // https://w3c.github.io/paint-timing/#sec-PerformancePaintTiming
 
-[
-    RuntimeEnabled=PerformancePaintTiming
-] interface PerformancePaintTiming : PerformanceEntry {
+interface PerformancePaintTiming : PerformanceEntry {
 };
diff --git a/third_party/blink/renderer/devtools/front_end/bindings/BlackboxManager.js b/third_party/blink/renderer/devtools/front_end/bindings/BlackboxManager.js
index 07c43e4..cb64fad 100644
--- a/third_party/blink/renderer/devtools/front_end/bindings/BlackboxManager.js
+++ b/third_party/blink/renderer/devtools/front_end/bindings/BlackboxManager.js
@@ -46,6 +46,9 @@
    */
   modelAdded(debuggerModel) {
     this._setBlackboxPatterns(debuggerModel);
+    const sourceMapManager = debuggerModel.sourceMapManager();
+    sourceMapManager.addEventListener(SDK.SourceMapManager.Events.SourceMapAttached, this._sourceMapAttached, this);
+    sourceMapManager.addEventListener(SDK.SourceMapManager.Events.SourceMapDetached, this._sourceMapDetached, this);
   }
 
   /**
@@ -54,6 +57,9 @@
    */
   modelRemoved(debuggerModel) {
     this._clearCacheIfNeeded();
+    const sourceMapManager = debuggerModel.sourceMapManager();
+    sourceMapManager.removeEventListener(SDK.SourceMapManager.Events.SourceMapAttached, this._sourceMapAttached, this);
+    sourceMapManager.removeEventListener(SDK.SourceMapManager.Events.SourceMapDetached, this._sourceMapDetached, this);
   }
 
   _clearCacheIfNeeded() {
@@ -76,32 +82,6 @@
   }
 
   /**
-   * @param {!SDK.DebuggerModel.Location} location
-   * @return {boolean}
-   */
-  isBlackboxedRawLocation(location) {
-    const script = location.script();
-    if (!script)
-      return false;
-    const ranges = script[Bindings.BlackboxManager._blackboxedRanges];
-    if (!ranges)
-      return this.isBlackboxedURL(script.sourceURL, script.isContentScript());
-    const index = ranges.lowerBound(location, comparator);
-    return !!(index % 2);
-
-    /**
-     * @param {!SDK.DebuggerModel.Location} a
-     * @param {!Protocol.Debugger.ScriptPosition} b
-     * @return {number}
-     */
-    function comparator(a, b) {
-      if (a.lineNumber !== b.lineNumber)
-        return a.lineNumber - b.lineNumber;
-      return a.columnNumber - b.columnNumber;
-    }
-  }
-
-  /**
    * @param {!Workspace.UISourceCode} uiSourceCode
    * @return {boolean}
    */
@@ -131,12 +111,31 @@
   }
 
   /**
+   * @param {!Common.Event} event
+   */
+  _sourceMapAttached(event) {
+    const script = /** @type {!SDK.Script} */ (event.data.client);
+    const sourceMap = /** @type {!SDK.SourceMap} */ (event.data.sourceMap);
+    this._updateScriptRanges(script, sourceMap);
+  }
+
+  /**
+   * @param {!Common.Event} event
+   */
+  _sourceMapDetached(event) {
+    const script = /** @type {!SDK.Script} */ (event.data.client);
+    this._updateScriptRanges(script, null);
+  }
+
+  /**
    * @param {!SDK.Script} script
    * @param {?SDK.SourceMap} sourceMap
    * @return {!Promise<undefined>}
    */
-  async sourceMapLoaded(script, sourceMap) {
-    const hasBlackboxedMappings = sourceMap ? sourceMap.sourceURLs().some(url => this.isBlackboxedURL(url)) : false;
+  async _updateScriptRanges(script, sourceMap) {
+    let hasBlackboxedMappings = false;
+    if (!Bindings.blackboxManager.isBlackboxedURL(script.sourceURL, script.isContentScript()))
+      hasBlackboxedMappings = sourceMap ? sourceMap.sourceURLs().some(url => this.isBlackboxedURL(url)) : false;
     if (!hasBlackboxedMappings) {
       if (script[Bindings.BlackboxManager._blackboxedRanges] && await script.setBlackboxedRanges([]))
         delete script[Bindings.BlackboxManager._blackboxedRanges];
@@ -274,8 +273,9 @@
     const promises = [];
     for (const debuggerModel of SDK.targetManager.models(SDK.DebuggerModel)) {
       promises.push(this._setBlackboxPatterns(debuggerModel));
+      const sourceMapManager = debuggerModel.sourceMapManager();
       for (const script of debuggerModel.scripts()) {
-        promises.push(this.sourceMapLoaded(script, this._debuggerWorkspaceBinding.sourceMapForScript(script))
+        promises.push(this._updateScriptRanges(script, sourceMapManager.sourceMapForClient(script))
                           .then(() => this._debuggerWorkspaceBinding.updateLocations(script)));
       }
     }
diff --git a/third_party/blink/renderer/devtools/front_end/bindings/CompilerScriptMapping.js b/third_party/blink/renderer/devtools/front_end/bindings/CompilerScriptMapping.js
index cd13fd1..846be51 100644
--- a/third_party/blink/renderer/devtools/front_end/bindings/CompilerScriptMapping.js
+++ b/third_party/blink/renderer/devtools/front_end/bindings/CompilerScriptMapping.js
@@ -213,7 +213,6 @@
 
     if (Bindings.blackboxManager.isBlackboxedURL(script.sourceURL, script.isContentScript()))
       return;
-    Bindings.blackboxManager.sourceMapLoaded(script, sourceMap);
 
     this._populateSourceMapSources(script, sourceMap);
     this._sourceMapAttachedForTest(sourceMap);
diff --git a/third_party/blink/renderer/devtools/front_end/bindings/DebuggerWorkspaceBinding.js b/third_party/blink/renderer/devtools/front_end/bindings/DebuggerWorkspaceBinding.js
index f9417f9..b3bba8a 100644
--- a/third_party/blink/renderer/devtools/front_end/bindings/DebuggerWorkspaceBinding.js
+++ b/third_party/blink/renderer/devtools/front_end/bindings/DebuggerWorkspaceBinding.js
@@ -181,16 +181,6 @@
   }
 
   /**
-   * @param {!SDK.Script} script
-   */
-  maybeLoadSourceMap(script) {
-    const modelData = this._debuggerModelToData.get(script.debuggerModel);
-    if (!modelData)
-      return;
-    modelData._compilerMapping.maybeLoadSourceMap(script);
-  }
-
-  /**
    * @param {!Common.Event} event
    */
   _globalObjectCleared(event) {
@@ -390,7 +380,8 @@
    * @return {boolean}
    */
   isBlackboxed() {
-    return Bindings.blackboxManager.isBlackboxedRawLocation(this._rawLocation);
+    const uiLocation = this.uiLocation();
+    return uiLocation ? Bindings.blackboxManager.isBlackboxedUISourceCode(uiLocation.uiSourceCode) : false;
   }
 };
 
diff --git a/third_party/blink/renderer/devtools/front_end/components/JSPresentationUtils.js b/third_party/blink/renderer/devtools/front_end/components/JSPresentationUtils.js
index 9dd411d5..9ad1948 100644
--- a/third_party/blink/renderer/devtools/front_end/components/JSPresentationUtils.js
+++ b/third_party/blink/renderer/devtools/front_end/components/JSPresentationUtils.js
@@ -43,7 +43,6 @@
   element.style.display = 'inline-block';
   const shadowRoot = UI.createShadowRootWithCoreStyles(element, 'components/jsUtils.css');
   const contentElement = shadowRoot.createChild('table', 'stack-preview-container');
-  const debuggerModel = target ? target.model(SDK.DebuggerModel) : null;
   let totalHiddenCallFramesCount = 0;
 
   /**
@@ -59,15 +58,11 @@
       const link = linkifier.maybeLinkifyConsoleCallFrame(target, stackFrame);
       if (link) {
         link.addEventListener('contextmenu', populateContextMenu.bind(null, link));
-        if (debuggerModel) {
-          const location = debuggerModel.createRawLocationByScriptId(
-              stackFrame.scriptId, stackFrame.lineNumber, stackFrame.columnNumber);
-          if (location && Bindings.blackboxManager.isBlackboxedRawLocation(location)) {
-            row.classList.add('blackboxed');
-            ++hiddenCallFrames;
-          }
+        const uiLocation = Components.Linkifier.uiLocation(link);
+        if (uiLocation && Bindings.blackboxManager.isBlackboxedUISourceCode(uiLocation.uiSourceCode)) {
+          row.classList.add('blackboxed');
+          ++hiddenCallFrames;
         }
-
         row.createChild('td').textContent = ' @ ';
         row.createChild('td').appendChild(link);
       }
diff --git a/third_party/blink/renderer/devtools/front_end/sources/CallStackSidebarPane.js b/third_party/blink/renderer/devtools/front_end/sources/CallStackSidebarPane.js
index 0f4a03f1..865ea35 100644
--- a/third_party/blink/renderer/devtools/front_end/sources/CallStackSidebarPane.js
+++ b/third_party/blink/renderer/devtools/front_end/sources/CallStackSidebarPane.js
@@ -52,12 +52,14 @@
     this.contentElement.appendChild(this._showMoreMessageElement);
 
     this._showBlackboxed = false;
-    Bindings.blackboxManager.addChangeListener(this._update.bind(this));
     this._locationPool = new Bindings.LiveLocationPool();
 
     this._updateThrottler = new Common.Throttler(100);
     this._maxAsyncStackChainDepth = Sources.CallStackSidebarPane._defaultMaxAsyncStackChainDepth;
     this._update();
+
+    this._updateItemThrottler = new Common.Throttler(100);
+    this._scheduledForUpdateItems = new Set();
   }
 
   /**
@@ -93,17 +95,12 @@
     let debuggerModel = details.debuggerModel;
     this._notPausedMessageElement.classList.add('hidden');
 
-    const showBlackboxed = this._showBlackboxed ||
-        details.callFrames.every(frame => Bindings.blackboxManager.isBlackboxedRawLocation(frame.location()));
-
-    let hiddenCallFramesCount = 0;
-    let items = details.callFrames.map(frame => ({debuggerCallFrame: frame, debuggerModel: debuggerModel}));
-    if (!showBlackboxed) {
-      items = items.filter(
-          item => !Bindings.blackboxManager.isBlackboxedRawLocation(
-              /** @type {!SDK.DebuggerModel.Location} */ (this._itemLocation(item))));
-      hiddenCallFramesCount += details.callFrames.length - items.length;
-    }
+    const items = details.callFrames.map(frame => {
+      const item = Sources.CallStackSidebarPane.Item.createForDebuggerCallFrame(
+          frame, this._locationPool, this._refreshItem.bind(this));
+      item[Sources.CallStackSidebarPane._debuggerCallFrameSymbol] = frame;
+      return item;
+    });
 
     let asyncStackTrace = details.asyncStackTrace;
     if (!asyncStackTrace && details.asyncStackTraceId) {
@@ -124,19 +121,8 @@
         title = UI.asyncStackTraceLabel(asyncStackTrace.description);
       }
 
-      let asyncItems =
-          asyncStackTrace.callFrames.map(frame => ({runtimeCallFrame: frame, debuggerModel: debuggerModel}));
-      if (!showBlackboxed) {
-        asyncItems = asyncItems.filter(
-            item => !Bindings.blackboxManager.isBlackboxedRawLocation(
-                /** @type {!SDK.DebuggerModel.Location} */ (this._itemLocation(item))));
-        hiddenCallFramesCount += asyncStackTrace.callFrames.length - asyncItems.length;
-      }
-
-      if (asyncItems.length) {
-        items.push({asyncStackHeader: title});
-        items = items.concat(asyncItems);
-      }
+      items.push(...Sources.CallStackSidebarPane.Item.createItemsForAsyncStack(
+          title, debuggerModel, asyncStackTrace.callFrames, this._locationPool, this._refreshItem.bind(this)));
 
       --maxAsyncStackChainDepth;
       peviousStackTrace = asyncStackTrace.callFrames;
@@ -150,24 +136,7 @@
         asyncStackTrace = null;
       }
     }
-    if (asyncStackTrace)
-      this._showMoreMessageElement.classList.remove('hidden');
-    else
-      this._showMoreMessageElement.classList.add('hidden');
-
-    if (!hiddenCallFramesCount) {
-      this._blackboxedMessageElement.classList.add('hidden');
-    } else {
-      if (hiddenCallFramesCount === 1) {
-        this._blackboxedMessageElement.firstChild.textContent =
-            Common.UIString('1 stack frame is hidden (blackboxed).');
-      } else {
-        this._blackboxedMessageElement.firstChild.textContent =
-            Common.UIString('%d stack frames are hidden (blackboxed).', hiddenCallFramesCount);
-      }
-      this._blackboxedMessageElement.classList.remove('hidden');
-    }
-
+    this._showMoreMessageElement.classList.toggle('hidden', !asyncStackTrace);
     this._items.replaceAll(items);
     if (this._maxAsyncStackChainDepth === Sources.CallStackSidebarPane._defaultMaxAsyncStackChainDepth)
       this._list.selectNextItem(true /* canWrap */, false /* center */);
@@ -178,6 +147,42 @@
   }
 
   /**
+   * @param {!Sources.CallStackSidebarPane.Item} item
+   */
+  _refreshItem(item) {
+    this._scheduledForUpdateItems.add(item);
+    this._updateItemThrottler.schedule(innerUpdate.bind(this));
+
+    /**
+     * @this {!Sources.CallStackSidebarPane}
+     * @return {!Promise<undefined>}
+     */
+    function innerUpdate() {
+      const items = Array.from(this._scheduledForUpdateItems);
+      this._scheduledForUpdateItems.clear();
+
+      this._muteActivateItem = true;
+      if (!this._showBlackboxed && this._items.every(item => item.isBlackboxed)) {
+        this._showBlackboxed = true;
+        this._items.replaceAll(Array.from(this._items));
+        this._blackboxedMessageElement.classList.toggle('hidden', true);
+      } else {
+        const itemsSet = new Set(items);
+        let hasBlackboxed = false;
+        for (let i = 0; i < this._items.length; ++i) {
+          const item = this._items.at(i);
+          if (itemsSet.has(item))
+            this._items.replace(i, item);
+          hasBlackboxed = hasBlackboxed || item.isBlackboxed;
+        }
+        this._blackboxedMessageElement.classList.toggle('hidden', this._showBlackboxed || !hasBlackboxed);
+      }
+      delete this._muteActivateItem;
+      return Promise.resolve();
+    }
+  }
+
+  /**
    * @override
    * @param {!Sources.CallStackSidebarPane.Item} item
    * @return {!Element}
@@ -185,31 +190,16 @@
   createElementForItem(item) {
     const element = createElementWithClass('div', 'call-frame-item');
     const title = element.createChild('div', 'call-frame-item-title');
-    title.createChild('div', 'call-frame-title-text').textContent = this._itemTitle(item);
-    if (item.asyncStackHeader)
+    title.createChild('div', 'call-frame-title-text').textContent = item.title;
+    if (item.isAsyncHeader) {
       element.classList.add('async-header');
-
-    const location = this._itemLocation(item);
-    if (location) {
-      if (Bindings.blackboxManager.isBlackboxedRawLocation(location))
-        element.classList.add('blackboxed-call-frame');
-
-      /**
-       * @param {!Bindings.LiveLocation} liveLocation
-       */
-      function updateLocation(liveLocation) {
-        const uiLocation = liveLocation.uiLocation();
-        if (!uiLocation)
-          return;
-        const text = uiLocation.linkText();
-        linkElement.textContent = text.trimMiddle(30);
-        linkElement.title = text;
-      }
-
+    } else {
       const linkElement = element.createChild('div', 'call-frame-location');
-      Bindings.debuggerWorkspaceBinding.createCallFrameLiveLocation(location, updateLocation, this._locationPool);
+      linkElement.textContent = item.linkText.trimMiddle(30);
+      linkElement.title = item.linkText;
+      element.classList.toggle('blackboxed-call-frame', item.isBlackboxed);
     }
-
+    element.classList.toggle('hidden', !this._showBlackboxed && item.isBlackboxed);
     element.appendChild(UI.Icon.create('smallicon-thick-right-arrow', 'selected-call-frame-icon'));
     return element;
   }
@@ -230,7 +220,7 @@
    * @return {boolean}
    */
   isItemSelectable(item) {
-    return !!item.debuggerCallFrame;
+    return !!item[Sources.CallStackSidebarPane._debuggerCallFrameSymbol];
   }
 
   /**
@@ -250,45 +240,19 @@
   }
 
   /**
-   * @param {!Sources.CallStackSidebarPane.Item} item
-   * @return {string}
-   */
-  _itemTitle(item) {
-    if (item.debuggerCallFrame)
-      return UI.beautifyFunctionName(item.debuggerCallFrame.functionName);
-    if (item.runtimeCallFrame)
-      return UI.beautifyFunctionName(item.runtimeCallFrame.functionName);
-    return item.asyncStackHeader || '';
-  }
-
-  /**
-   * @param {!Sources.CallStackSidebarPane.Item} item
-   * @return {?SDK.DebuggerModel.Location}
-   */
-  _itemLocation(item) {
-    if (item.debuggerCallFrame)
-      return item.debuggerCallFrame.location();
-    if (!item.debuggerModel)
-      return null;
-    if (item.runtimeCallFrame) {
-      const frame = item.runtimeCallFrame;
-      return new SDK.DebuggerModel.Location(item.debuggerModel, frame.scriptId, frame.lineNumber, frame.columnNumber);
-    }
-    return null;
-  }
-
-  /**
    * @return {!Element}
    */
   _createBlackboxedMessageElement() {
     const element = createElementWithClass('div', 'blackboxed-message');
     element.createChild('span');
     const showAllLink = element.createChild('span', 'link');
-    showAllLink.textContent = Common.UIString('Show');
+    showAllLink.textContent = Common.UIString('Show blackboxed frames');
     showAllLink.addEventListener('click', () => {
       this._showBlackboxed = true;
-      this._update();
-    }, false);
+      for (const item of this._items)
+        this._refreshItem(item);
+      this._blackboxedMessageElement.classList.toggle('hidden', true);
+    });
     return element;
   }
 
@@ -315,13 +279,12 @@
     if (!item)
       return;
     const contextMenu = new UI.ContextMenu(event);
-    if (item.debuggerCallFrame)
-      contextMenu.defaultSection().appendItem(Common.UIString('Restart frame'), () => item.debuggerCallFrame.restart());
+    const debuggerCallFrame = item[Sources.CallStackSidebarPane._debuggerCallFrameSymbol];
+    if (debuggerCallFrame)
+      contextMenu.defaultSection().appendItem(Common.UIString('Restart frame'), () => debuggerCallFrame.restart());
     contextMenu.defaultSection().appendItem(Common.UIString('Copy stack trace'), this._copyStackTrace.bind(this));
-    const location = this._itemLocation(item);
-    const uiLocation = location ? Bindings.debuggerWorkspaceBinding.rawLocationToUILocation(location) : null;
-    if (uiLocation)
-      this.appendBlackboxURLContextMenuItems(contextMenu, uiLocation.uiSourceCode);
+    if (item.uiLocation)
+      this.appendBlackboxURLContextMenuItems(contextMenu, item.uiLocation.uiSourceCode);
     contextMenu.show();
   }
 
@@ -338,14 +301,15 @@
    * @param {!Sources.CallStackSidebarPane.Item} item
    */
   _activateItem(item) {
-    const location = this._itemLocation(item);
-    if (!location)
+    const uiLocation = item.uiLocation;
+    if (this._muteActivateItem || !uiLocation)
       return;
-    if (item.debuggerCallFrame && UI.context.flavor(SDK.DebuggerModel.CallFrame) !== item.debuggerCallFrame) {
-      item.debuggerModel.setSelectedCallFrame(item.debuggerCallFrame);
-      UI.context.setFlavor(SDK.DebuggerModel.CallFrame, item.debuggerCallFrame);
+    const debuggerCallFrame = item[Sources.CallStackSidebarPane._debuggerCallFrameSymbol];
+    if (debuggerCallFrame && UI.context.flavor(SDK.DebuggerModel.CallFrame) !== debuggerCallFrame) {
+      debuggerCallFrame.debuggerModel.setSelectedCallFrame(debuggerCallFrame);
+      UI.context.setFlavor(SDK.DebuggerModel.CallFrame, debuggerCallFrame);
     } else {
-      Common.Revealer.reveal(Bindings.debuggerWorkspaceBinding.rawLocationToUILocation(location));
+      Common.Revealer.reveal(uiLocation);
     }
   }
 
@@ -401,30 +365,20 @@
   _copyStackTrace() {
     const text = [];
     for (const item of this._items) {
-      let itemText = this._itemTitle(item);
-      const location = this._itemLocation(item);
-      const uiLocation = location ? Bindings.debuggerWorkspaceBinding.rawLocationToUILocation(location) : null;
-      if (uiLocation)
-        itemText += ' (' + uiLocation.linkText(true /* skipTrim */) + ')';
+      let itemText = item.title;
+      if (item.uiLocation)
+        itemText += ' (' + item.uiLocation.linkText(true /* skipTrim */) + ')';
       text.push(itemText);
     }
     InspectorFrontendHost.copyText(text.join('\n'));
   }
 };
 
+Sources.CallStackSidebarPane._debuggerCallFrameSymbol = Symbol('debuggerCallFrame');
+Sources.CallStackSidebarPane._elementSymbol = Symbol('element');
 Sources.CallStackSidebarPane._defaultMaxAsyncStackChainDepth = 32;
 
 /**
- * @typedef {{
- *     debuggerCallFrame: (SDK.DebuggerModel.CallFrame|undefined),
- *     asyncStackHeader: (string|undefined),
- *     runtimeCallFrame: (Protocol.Runtime.CallFrame|undefined),
- *     debuggerModel: (!SDK.DebuggerModel|undefined)
- * }}
- */
-Sources.CallStackSidebarPane.Item;
-
-/**
  * @implements {UI.ActionDelegate}
  */
 Sources.CallStackSidebarPane.ActionDelegate = class {
@@ -447,3 +401,94 @@
     return false;
   }
 };
+
+Sources.CallStackSidebarPane.Item = class {
+  /**
+   * @param {!SDK.DebuggerModel.CallFrame} frame
+   * @param {!Bindings.LiveLocationPool} locationPool
+   * @param {function(!Sources.CallStackSidebarPane.Item)} updateDelegate
+   * @return {!Sources.CallStackSidebarPane.Item}
+   */
+  static createForDebuggerCallFrame(frame, locationPool, updateDelegate) {
+    const item = new Sources.CallStackSidebarPane.Item(UI.beautifyFunctionName(frame.functionName), updateDelegate);
+    Bindings.debuggerWorkspaceBinding.createCallFrameLiveLocation(
+        frame.location(), item._update.bind(item), locationPool);
+    return item;
+  }
+
+  /**
+   * @param {string} title
+   * @param {?SDK.DebuggerModel} debuggerModel
+   * @param {!Array<!Protocol.Runtime.CallFrame>} frames
+   * @param {!Bindings.LiveLocationPool} locationPool
+   * @param {function(!Sources.CallStackSidebarPane.Item)} updateDelegate
+   * @return {!Array<!Sources.CallStackSidebarPane.Item>}
+   */
+  static createItemsForAsyncStack(title, debuggerModel, frames, locationPool, updateDelegate) {
+    const whiteboxedItemsSymbol = Symbol('whiteboxedItems');
+    const asyncHeaderItem = new Sources.CallStackSidebarPane.Item(title, updateDelegate);
+    asyncHeaderItem[whiteboxedItemsSymbol] = new Set();
+    asyncHeaderItem.isAsyncHeader = true;
+
+    const asyncFrameItems = frames.map(frame => {
+      const item = new Sources.CallStackSidebarPane.Item(UI.beautifyFunctionName(frame.functionName), update);
+      const rawLocation = debuggerModel ?
+          debuggerModel.createRawLocationByScriptId(frame.scriptId, frame.lineNumber, frame.columnNumber) :
+          null;
+      if (!rawLocation) {
+        item.linkText = (frame.url || '<unknown>') + ':' + (frame.lineNumber + 1);
+        item.updateDelegate(item);
+      } else {
+        Bindings.debuggerWorkspaceBinding.createCallFrameLiveLocation(
+            rawLocation, item._update.bind(item), locationPool);
+      }
+      return item;
+    });
+
+    updateDelegate(asyncHeaderItem);
+    return [asyncHeaderItem, ...asyncFrameItems];
+
+    /**
+     * @param {!Sources.CallStackSidebarPane.Item} item
+     */
+    function update(item) {
+      updateDelegate(item);
+      let shouldUpdate = false;
+      const items = asyncHeaderItem[whiteboxedItemsSymbol];
+      if (item.isBlackboxed) {
+        items.delete(item);
+        shouldUpdate = items.size === 0;
+      } else {
+        shouldUpdate = items.size === 0;
+        items.add(item);
+      }
+      asyncHeaderItem.isBlackboxed = asyncHeaderItem[whiteboxedItemsSymbol].size === 0;
+      if (shouldUpdate)
+        updateDelegate(asyncHeaderItem);
+    }
+  }
+
+  /**
+   * @param {string} title
+   * @param {function(!Sources.CallStackSidebarPane.Item)} updateDelegate
+   */
+  constructor(title, updateDelegate) {
+    this.isBlackboxed = false;
+    this.title = title;
+    this.linkText = '';
+    this.uiLocation = null;
+    this.isAsyncHeader = false;
+    this.updateDelegate = updateDelegate;
+  }
+
+  /**
+   * @param {!Bindings.LiveLocation} liveLocation
+   */
+  _update(liveLocation) {
+    const uiLocation = liveLocation.uiLocation();
+    this.isBlackboxed = uiLocation ? Bindings.blackboxManager.isBlackboxedUISourceCode(uiLocation.uiSourceCode) : false;
+    this.linkText = uiLocation ? uiLocation.linkText() : '';
+    this.uiLocation = uiLocation;
+    this.updateDelegate(this);
+  }
+};
diff --git a/third_party/blink/renderer/devtools/front_end/sources_test_runner/DebuggerTestRunner.js b/third_party/blink/renderer/devtools/front_end/sources_test_runner/DebuggerTestRunner.js
index b6a62667..b52d660 100644
--- a/third_party/blink/renderer/devtools/front_end/sources_test_runner/DebuggerTestRunner.js
+++ b/third_party/blink/renderer/devtools/front_end/sources_test_runner/DebuggerTestRunner.js
@@ -299,7 +299,8 @@
       const location = locationFunction.call(frame);
       const script = location.script();
       const uiLocation = Bindings.debuggerWorkspaceBinding.rawLocationToUILocation(location);
-      const isFramework = Bindings.blackboxManager.isBlackboxedRawLocation(location);
+      const isFramework =
+          uiLocation ? Bindings.blackboxManager.isBlackboxedUISourceCode(uiLocation.uiSourceCode) : false;
 
       if (options.dropFrameworkCallFrames && isFramework)
         continue;
diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn
index 6561c4f..da9a3a1 100644
--- a/third_party/blink/renderer/modules/BUILD.gn
+++ b/third_party/blink/renderer/modules/BUILD.gn
@@ -295,6 +295,7 @@
     "payments/payments_validators_test.cc",
     "peerconnection/rtc_data_channel_test.cc",
     "peerconnection/rtc_peer_connection_test.cc",
+    "picture_in_picture/html_video_element_picture_in_picture_test.cc",
     "presentation/mock_presentation_service.h",
     "presentation/presentation_availability_state_test.cc",
     "presentation/presentation_availability_test.cc",
diff --git a/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope.idl b/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope.idl
index 7383d14..ad2d2f2d 100644
--- a/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope.idl
+++ b/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope.idl
@@ -2,10 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// https://wicg.github.io/animation-worklet/#animationworkletglobalscope
+
 [
     Exposed=AnimationWorklet,
     Global=(Worklet,AnimationWorklet),
     OriginTrialEnabled=AnimationWorklet
 ] interface AnimationWorkletGlobalScope : WorkletGlobalScope {
-    [MeasureAs=AnimationWorkletRegisterAnimator, RaisesException] void registerAnimator(DOMString name, Function animatorConstructor);
+    // TODO(yukishiino): |animatorConstructor| should be of callback function
+    // type (should be: callback T = any ()).
+    [MeasureAs=AnimationWorkletRegisterAnimator, RaisesException] void registerAnimator(DOMString name, CallbackFunctionTreatedAsScriptValue animatorConstructor);
 };
diff --git a/third_party/blink/renderer/modules/csspaint/paint_worklet_global_scope.idl b/third_party/blink/renderer/modules/csspaint/paint_worklet_global_scope.idl
index cef58d7..fa669fad 100644
--- a/third_party/blink/renderer/modules/csspaint/paint_worklet_global_scope.idl
+++ b/third_party/blink/renderer/modules/csspaint/paint_worklet_global_scope.idl
@@ -9,5 +9,7 @@
     Global=(Worklet,PaintWorklet)
 ] interface PaintWorkletGlobalScope : WorkletGlobalScope {
     [Measure] readonly attribute unrestricted double devicePixelRatio;
-    [Measure, RaisesException] void registerPaint(DOMString name, Function paintCtor);
+    // TODO(yukishiino): |paintCtor| should be of callback function type
+    // (should be: callback T = any ()).
+    [Measure, RaisesException] void registerPaint(DOMString name, CallbackFunctionTreatedAsScriptValue paintCtor);
 };
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.h b/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.h
index 8f5a631f..0e1c05cd 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.h
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.h
@@ -46,9 +46,9 @@
 
   Element& GetTrackElement();
 
- private:
   float ZoomFactor() const;
 
+ private:
   Position before_segment_position_;
   Position after_segment_position_;
 
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element.cc
index de4110fd..2c66e7b 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element.cc
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element.cc
@@ -146,7 +146,8 @@
       return;
 
     const Touch* touch = touch_event->touches()->item(0);
-    double position = max(0.0, fmin(1.0, touch->clientX() / TrackWidth()));
+    double position =
+        max(0.0, fmin(1.0, touch->clientX() / TrackWidth() * ZoomFactor()));
     SetPosition(position * MediaElement().duration());
   } else if (event->type() != EventTypeNames::input) {
     return;
diff --git a/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css b/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css
index 247682f6..7724e6e 100644
--- a/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css
+++ b/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css
@@ -715,25 +715,6 @@
 }
 
 /* TODO(https://crbug.com/857120): All these are the same, so these are unnecessary. */
-video::-webkit-media-controls.sizing-small label[pseudo="-internal-media-controls-overflow-menu-list-item" i] {
-  font-size: 14px;
-  height: 48px;
-  padding: 0 16px 0;
-}
-
-video::-webkit-media-controls.sizing-medium label[pseudo="-internal-media-controls-overflow-menu-list-item" i] {
-  font-size: 14px;
-  height: 48px;
-  padding: 0 16px 0;
-}
-
-video::-webkit-media-controls.sizing-large label[pseudo="-internal-media-controls-overflow-menu-list-item" i] {
-  font-size: 14px;
-  height: 48px;
-  padding: 0 16px 0;
-}
-
-/* TODO(https://crbug.com/857120): All these are the same, so these are unnecessary. */
 video::-webkit-media-controls.sizing-small label[pseudo="-internal-media-controls-overflow-menu-list-item" i] input {
   margin-left: 0;
   margin-right: 16px;
diff --git a/third_party/blink/renderer/modules/modules_idl_files.gni b/third_party/blink/renderer/modules/modules_idl_files.gni
index 46150507..a3cc621 100644
--- a/third_party/blink/renderer/modules/modules_idl_files.gni
+++ b/third_party/blink/renderer/modules/modules_idl_files.gni
@@ -615,6 +615,7 @@
           "permissions/midi_permission_descriptor.idl",
           "permissions/permission_descriptor.idl",
           "permissions/push_permission_descriptor.idl",
+          "picture_in_picture/picture_in_picture_control.idl",
           "presentation/presentation_connection_available_event_init.idl",
           "presentation/presentation_connection_close_event_init.idl",
           "push_messaging/push_event_init.idl",
diff --git a/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture.cc b/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture.cc
index 6a78896..4b86916 100644
--- a/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture.cc
+++ b/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture.cc
@@ -4,11 +4,14 @@
 
 #include "third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture.h"
 
+#include "third_party/blink/public/common/picture_in_picture/picture_in_picture_control_info.h"
+#include "third_party/blink/public/platform/web_icon_sizes_parser.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/dom/events/event.h"
 #include "third_party/blink/renderer/core/html/media/html_video_element.h"
+#include "third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_control.h"
 #include "third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.h"
 #include "third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_window.h"
 #include "third_party/blink/renderer/platform/feature_policy/feature_policy.h"
@@ -107,6 +110,18 @@
   return promise;
 }
 
+void HTMLVideoElementPictureInPicture::setPictureInPictureControls(
+    HTMLVideoElement& element,
+    const HeapVector<PictureInPictureControl>& controls) {
+  Document& document = element.GetDocument();
+
+  PictureInPictureControllerImpl& controller =
+      PictureInPictureControllerImpl::From(document);
+
+  controller.SetPictureInPictureCustomControls(
+      &element, ToPictureInPictureControlInfoVector(controls));
+}
+
 // static
 bool HTMLVideoElementPictureInPicture::FastHasAttribute(
     const QualifiedName& name,
@@ -135,4 +150,37 @@
   }
 }
 
+// static
+std::vector<PictureInPictureControlInfo>
+HTMLVideoElementPictureInPicture::ToPictureInPictureControlInfoVector(
+    const HeapVector<PictureInPictureControl>& controls) {
+  std::vector<PictureInPictureControlInfo> converted_controls;
+  for (size_t i = 0; i < controls.size(); ++i) {
+    PictureInPictureControlInfo current_converted_control;
+    HeapVector<MediaImage> current_icons = controls[i].icons();
+
+    // Only two icons are supported, so cap the loop at running that many times
+    // to avoid potential problems.
+    for (size_t j = 0; j < current_icons.size() && j < 2; ++j) {
+      PictureInPictureControlInfo::Icon current_icon;
+      current_icon.src = KURL(WebString(current_icons[j].src()));
+
+      WebVector<WebSize> sizes = WebIconSizesParser::ParseIconSizes(
+          WebString(current_icons[j].sizes()));
+      std::vector<gfx::Size> converted_sizes;
+      for (size_t i = 0; i < sizes.size(); ++i)
+        converted_sizes.push_back(static_cast<gfx::Size>(sizes[i]));
+
+      current_icon.sizes = converted_sizes;
+      current_icon.type = WebString(current_icons[j].type()).Utf8();
+      current_converted_control.icons.push_back(current_icon);
+    }
+
+    current_converted_control.id = WebString(controls[i].id()).Utf8();
+    current_converted_control.label = WebString(controls[i].label()).Utf8();
+    converted_controls.push_back(current_converted_control);
+  }
+  return converted_controls;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture.h b/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture.h
index 9771834..8cdd5b4 100644
--- a/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture.h
+++ b/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture.h
@@ -14,13 +14,19 @@
 class HTMLVideoElement;
 class ScriptPromise;
 class ScriptState;
+class PictureInPictureControl;
+struct PictureInPictureControlInfo;
 
-class HTMLVideoElementPictureInPicture {
+class MODULES_EXPORT HTMLVideoElementPictureInPicture {
   STATIC_ONLY(HTMLVideoElementPictureInPicture);
 
  public:
   static ScriptPromise requestPictureInPicture(ScriptState*, HTMLVideoElement&);
 
+  static void setPictureInPictureControls(
+      HTMLVideoElement&,
+      const HeapVector<PictureInPictureControl>&);
+
   static bool FastHasAttribute(const QualifiedName&, const HTMLVideoElement&);
 
   static void SetBooleanAttribute(const QualifiedName&,
@@ -30,6 +36,10 @@
   DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(enterpictureinpicture);
   DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(leavepictureinpicture);
   DEFINE_STATIC_ATTRIBUTE_EVENT_LISTENER(pictureinpicturecontrolclick);
+
+  static std::vector<PictureInPictureControlInfo>
+  ToPictureInPictureControlInfoVector(
+      const HeapVector<PictureInPictureControl>&);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture.idl b/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture.idl
index 34ee29bc..f46c613 100644
--- a/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture.idl
+++ b/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture.idl
@@ -9,6 +9,7 @@
 ]
 partial interface HTMLVideoElement {
     [CallWith=ScriptState, Measure, NewObject] Promise<PictureInPictureWindow> requestPictureInPicture();
+    [RuntimeEnabled=PictureInPictureControl] void setPictureInPictureControls(sequence<PictureInPictureControl> pipControls);
 
     attribute EventHandler onenterpictureinpicture;
     attribute EventHandler onleavepictureinpicture;
diff --git a/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture_test.cc b/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture_test.cc
new file mode 100644
index 0000000..4587e41
--- /dev/null
+++ b/third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture_test.cc
@@ -0,0 +1,113 @@
+// 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 "third_party/blink/renderer/modules/picture_in_picture/html_video_element_picture_in_picture.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/picture_in_picture/picture_in_picture_control_info.h"
+#include "third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_control.h"
+
+namespace blink {
+
+TEST(HTMLVideoElementPictureInPictureTest,
+     ToPictureInPictureControlInfoVector_Basic) {
+  MediaImage image;
+  image.setSrc("https://dummyimage.com/144x144/7d727d/fafafa.gif");
+  image.setSizes("144x144");
+  image.setType("image/gif");
+  HeapVector<MediaImage> images;
+  images.push_back(image);
+
+  PictureInPictureControl control;
+  control.setId(WTF::String("Test id"));
+  control.setLabel(WTF::String("Test label"));
+  control.setIcons(images);
+
+  HeapVector<PictureInPictureControl> controls;
+  controls.push_back(control);
+
+  std::vector<PictureInPictureControlInfo> converted_controls =
+      HTMLVideoElementPictureInPicture::ToPictureInPictureControlInfoVector(
+          controls);
+
+  ASSERT_EQ(1U, converted_controls.size());
+  EXPECT_EQ(144, converted_controls[0].icons[0].sizes[0].width());
+  EXPECT_EQ(144, converted_controls[0].icons[0].sizes[0].height());
+}
+
+TEST(HTMLVideoElementPictureInPictureTest,
+     ToPictureInPictureControlInfoVector_MultipleImages) {
+  MediaImage image;
+  image.setSrc("https://dummyimage.com/144x144/7d727d/fafafa.gif");
+  image.setSizes("144x144");
+  image.setType("image/gif");
+
+  MediaImage image2;
+  image2.setSrc("https://dummyimage.com/96x96/7d727d/fafafa.gif");
+  image2.setSizes("96x96");
+  image2.setType("image/gif");
+
+  HeapVector<MediaImage> images;
+  images.push_back(image);
+  images.push_back(image2);
+
+  PictureInPictureControl control;
+  control.setId(WTF::String("Test id"));
+  control.setLabel(WTF::String("Test label"));
+  control.setIcons(images);
+
+  HeapVector<PictureInPictureControl> controls;
+  controls.push_back(control);
+
+  std::vector<PictureInPictureControlInfo> converted_controls =
+      HTMLVideoElementPictureInPicture::ToPictureInPictureControlInfoVector(
+          controls);
+
+  ASSERT_EQ(1U, converted_controls.size());
+  EXPECT_EQ(144, converted_controls[0].icons[0].sizes[0].width());
+  EXPECT_EQ(144, converted_controls[0].icons[0].sizes[0].height());
+  EXPECT_EQ(96, converted_controls[0].icons[1].sizes[0].width());
+  EXPECT_EQ(96, converted_controls[0].icons[1].sizes[0].height());
+}
+
+TEST(HTMLVideoElementPictureInPictureTest,
+     ToPictureInPictureControlInfoVector_InvalidSize) {
+  MediaImage image;
+  image.setSrc("https://dummyimage.com/144x144/7d727d/fafafa.gif");
+  image.setSizes("144");
+  image.setType("image/gif");
+  HeapVector<MediaImage> images;
+  images.push_back(image);
+
+  PictureInPictureControl control;
+  control.setId(WTF::String("Test id"));
+  control.setLabel(WTF::String("Test label"));
+  control.setIcons(images);
+
+  HeapVector<PictureInPictureControl> controls;
+  controls.push_back(control);
+
+  std::vector<PictureInPictureControlInfo> converted_controls =
+      HTMLVideoElementPictureInPicture::ToPictureInPictureControlInfoVector(
+          controls);
+
+  ASSERT_EQ(1U, converted_controls.size());
+
+  ASSERT_EQ(1U, converted_controls[0].icons.size());
+
+  EXPECT_EQ(0U, converted_controls[0].icons[0].sizes.size());
+}
+
+TEST(HTMLVideoElementPictureInPictureTest,
+     ToPictureInPictureControlInfoVector_Empty) {
+  HeapVector<PictureInPictureControl> controls;
+
+  std::vector<PictureInPictureControlInfo> converted_controls =
+      HTMLVideoElementPictureInPicture::ToPictureInPictureControlInfoVector(
+          controls);
+
+  EXPECT_EQ(0U, converted_controls.size());
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_control.idl b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_control.idl
new file mode 100644
index 0000000..964c0cdb
--- /dev/null
+++ b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_control.idl
@@ -0,0 +1,9 @@
+// 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.
+
+dictionary PictureInPictureControl {
+    DOMString id = "";
+    DOMString label = "";
+    sequence<MediaImage> icons = [];
+};
diff --git a/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.cc b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.cc
index 00e759b..9fe33f5 100644
--- a/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.cc
+++ b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.cc
@@ -93,6 +93,9 @@
         WTF::Bind(&PictureInPictureControllerImpl::OnEnteredPictureInPicture,
                   WrapPersistent(this), WrapPersistent(element),
                   WrapPersistent(resolver)));
+    // If the media element has already been given custom controls, this will
+    // ensure that they get set. Otherwise, this will do nothing.
+    element->SendCustomControlsToPipWindow();
     return;
   }
 
@@ -143,6 +146,14 @@
                 WrapPersistent(this), WrapPersistent(resolver)));
 }
 
+void PictureInPictureControllerImpl::SetPictureInPictureCustomControls(
+    HTMLVideoElement* element,
+    const std::vector<PictureInPictureControlInfo>& controls) {
+  element->SetPictureInPictureCustomControls(controls);
+  if (IsPictureInPictureElement(element))
+    element->SendCustomControlsToPipWindow();
+}
+
 void PictureInPictureControllerImpl::OnExitedPictureInPicture(
     ScriptPromiseResolver* resolver) {
   DCHECK(GetSupplementable());
diff --git a/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.h b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.h
index 45b0e6a..b7bcf09 100644
--- a/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.h
+++ b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.h
@@ -45,12 +45,6 @@
   // request Picture-in-Picture.
   Status IsDocumentAllowed() const;
 
-  // Meant to be called internally when an element has entered successfully
-  // Picture-in-Picture.
-  void OnEnteredPictureInPicture(HTMLVideoElement*,
-                                 ScriptPromiseResolver*,
-                                 const WebSize& picture_in_picture_window_size);
-
   // Returns element currently in Picture-in-Picture if any. Null otherwise.
   Element* PictureInPictureElement(TreeScope&) const;
 
@@ -58,14 +52,21 @@
   void EnterPictureInPicture(HTMLVideoElement*,
                              ScriptPromiseResolver*) override;
   void ExitPictureInPicture(HTMLVideoElement*, ScriptPromiseResolver*) override;
-  void OnExitedPictureInPicture(ScriptPromiseResolver*) override;
-  void OnPictureInPictureControlClicked(const WebString& control_id) override;
+  void SetPictureInPictureCustomControls(
+      HTMLVideoElement*,
+      const std::vector<PictureInPictureControlInfo>&) override;
   Status IsElementAllowed(const HTMLVideoElement&) const override;
   bool IsPictureInPictureElement(const Element*) const override;
 
   void Trace(blink::Visitor*) override;
 
  private:
+  void OnEnteredPictureInPicture(HTMLVideoElement*,
+                                 ScriptPromiseResolver*,
+                                 const WebSize& picture_in_picture_window_size);
+  void OnExitedPictureInPicture(ScriptPromiseResolver*) override;
+  void OnPictureInPictureControlClicked(const WebString& control_id) override;
+
   explicit PictureInPictureControllerImpl(Document&);
 
   // The Picture-in-Picture element for the associated document.
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.idl b/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.idl
index ccdbf87..150a401 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.idl
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.idl
@@ -8,7 +8,9 @@
     Exposed=AudioWorklet,
     Global=(Worklet,AudioWorklet)
 ] interface AudioWorkletGlobalScope : WorkletGlobalScope {
-    [RaisesException, MeasureAs=AudioWorkletGlobalScopeRegisterProcessor] void registerProcessor(DOMString name, Function processorConstructor);
+    // TODO(yukishiino): |processorConstructor| should be of callback function
+    // type (should be: callback T = any ()).
+    [RaisesException, MeasureAs=AudioWorkletGlobalScopeRegisterProcessor] void registerProcessor(DOMString name, CallbackFunctionTreatedAsScriptValue processorConstructor);
     readonly attribute unsigned long long currentFrame;
     readonly attribute double currentTime;
     readonly attribute float sampleRate;
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
index 33061f0..2fd3b9f 100644
--- a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
+++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
@@ -69,16 +69,21 @@
 #include "third_party/blink/renderer/modules/webaudio/script_processor_node.h"
 #include "third_party/blink/renderer/modules/webaudio/stereo_panner_node.h"
 #include "third_party/blink/renderer/modules/webaudio/wave_shaper_node.h"
-#include "third_party/blink/renderer/platform/uuid.h"
 #include "third_party/blink/renderer/platform/audio/iir_filter.h"
+#include "third_party/blink/renderer/platform/audio/vector_math.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/cross_thread_functional.h"
 #include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/uuid.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
 
+// Recording of audio audibility stops after the context has been running for
+// this long.  We don't need this information for the lifetime of the context.
+const double kStopRecordingAudibilityTime = 10;
+
 BaseAudioContext* BaseAudioContext::Create(
     Document& document,
     const AudioContextOptions& context_options,
@@ -695,7 +700,24 @@
   }
 }
 
-void BaseAudioContext::HandlePostRenderTasks() {
+// Determine if the rendered data is audible.
+static bool IsAudible(const AudioBus* rendered_data) {
+  // Compute the energy in each channel and sum up the energy in each channel
+  // for the total energy.
+  float energy = 0;
+
+  unsigned data_size = rendered_data->length();
+  for (unsigned k = 0; k < rendered_data->NumberOfChannels(); ++k) {
+    const float* data = rendered_data->Channel(k)->Data();
+    float channel_energy;
+    VectorMath::Vsvesq(data, 1, &channel_energy, data_size);
+    energy += channel_energy;
+  }
+
+  return energy > 0;
+}
+
+void BaseAudioContext::HandlePostRenderTasks(const AudioBus* destination_bus) {
   DCHECK(IsAudioThread());
 
   // Must use a tryLock() here too.  Don't worry, the lock will very rarely be
@@ -712,6 +734,37 @@
 
     unlock();
   }
+
+  // Notify browser if audible audio has started or stopped.
+  if (HasRealtimeConstraint()) {
+    // Detect silence (or not) for MEI
+    bool is_audible = IsAudible(destination_bus);
+
+    // We want to keep track of the total audible audio, but we don't need to
+    // record the start and stop of audible audio after
+    // |kStopRecordingAudibilityTime|.
+    if (is_audible) {
+      ++total_audible_renders_;
+    }
+
+    if (currentTime() <= kStopRecordingAudibilityTime) {
+      if (was_audible_ != is_audible) {
+        // Audibility changed in this render, so report the change.
+        was_audible_ = is_audible;
+        if (is_audible) {
+          PostCrossThreadTask(
+              *Platform::Current()->MainThread()->GetTaskRunner(), FROM_HERE,
+              CrossThreadBind(&BaseAudioContext::NotifyAudibleAudioStarted,
+                              WrapCrossThreadPersistent(this)));
+        } else {
+          PostCrossThreadTask(
+              *Platform::Current()->MainThread()->GetTaskRunner(), FROM_HERE,
+              CrossThreadBind(&BaseAudioContext::NotifyAudibleAudioStopped,
+                              WrapCrossThreadPersistent(this)));
+        }
+      }
+    }
+  }
 }
 
 void BaseAudioContext::PerformCleanupOnMainThread() {
@@ -941,4 +994,18 @@
   return true;
 }
 
+void BaseAudioContext::NotifyAudibleAudioStarted() {
+  DCHECK(IsMainThread());
+  // TODO(crbug.com/855069): Actually notify the browser that audible audio has
+  // started.
+  VLOG(1) << this << ": Audible audio started @" << currentTime();
+}
+
+void BaseAudioContext::NotifyAudibleAudioStopped() {
+  DCHECK(IsMainThread());
+  // TODO(crbug.com/855069): Actually notify the browser that audible audio has
+  // started.
+  VLOG(1) << this << ": Audible audio stopped @" << currentTime();
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.h b/third_party/blink/renderer/modules/webaudio/base_audio_context.h
index f55e32c4..9af60781 100644
--- a/third_party/blink/renderer/modules/webaudio/base_audio_context.h
+++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.h
@@ -245,7 +245,7 @@
   void HandlePreRenderTasks(const AudioIOPosition& output_position);
 
   // Called at the end of each render quantum.
-  void HandlePostRenderTasks();
+  void HandlePostRenderTasks(const AudioBus* destination_bus);
 
   DeferredTaskHandler& GetDeferredTaskHandler() const {
     return *deferred_task_handler_;
@@ -452,6 +452,19 @@
   // This cannot be nullptr once it is assigned from AudioWorkletThread until
   // the BaseAudioContext goes away.
   WorkerThread* audio_worklet_thread_ = nullptr;
+
+  // Notifies browser when audible audio started or stopped.
+  void NotifyAudibleAudioStarted();
+  void NotifyAudibleAudioStopped();
+
+  // Keeps track if the output of this destination was audible, before the
+  // current rendering quantum.  Used for recording "playback" time.
+  bool was_audible_ = false;
+
+  // Counts the number of render quanta where audible sound was played.  We
+  // determine audibility on render quantum boundaries, so counting quanta is
+  // all that's needed.
+  size_t total_audible_renders_ = 0;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webaudio/default_audio_destination_node.cc b/third_party/blink/renderer/modules/webaudio/default_audio_destination_node.cc
index a5427bff..0e5675e 100644
--- a/third_party/blink/renderer/modules/webaudio/default_audio_destination_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/default_audio_destination_node.cc
@@ -197,7 +197,7 @@
   Context()->GetDeferredTaskHandler().ProcessAutomaticPullNodes(
       number_of_frames);
 
-  Context()->HandlePostRenderTasks();
+  Context()->HandlePostRenderTasks(destination_bus);
 
   // Advances the current sample-frame.
   size_t new_sample_frame = current_sample_frame_ + number_of_frames;
diff --git a/third_party/blink/renderer/modules/webusb/BUILD.gn b/third_party/blink/renderer/modules/webusb/BUILD.gn
index 5f8e5b1..31718fec 100644
--- a/third_party/blink/renderer/modules/webusb/BUILD.gn
+++ b/third_party/blink/renderer/modules/webusb/BUILD.gn
@@ -31,8 +31,4 @@
     "worker_navigator_usb.cc",
     "worker_navigator_usb.h",
   ]
-
-  deps = [
-    "//device/usb/public/mojom:mojom_blink",
-  ]
 }
diff --git a/third_party/blink/renderer/modules/webusb/usb.cc b/third_party/blink/renderer/modules/webusb/usb.cc
index 9f416570..51068379 100644
--- a/third_party/blink/renderer/modules/webusb/usb.cc
+++ b/third_party/blink/renderer/modules/webusb/usb.cc
@@ -61,10 +61,10 @@
     : ContextLifecycleObserver(&context), client_binding_(this) {}
 
 USB::~USB() {
-  // |m_deviceManager| and |m_chooserService| may still be valid but there
+  // |service_| and |chooser_service_| may still be valid but there
   // should be no more outstanding requests to them because each holds a
   // persistent handle to this object.
-  DCHECK(device_manager_requests_.IsEmpty());
+  DCHECK(service_requests_.IsEmpty());
   DCHECK(chooser_service_requests_.IsEmpty());
 }
 
@@ -86,12 +86,11 @@
                                            kFeaturePolicyBlocked));
   }
 
-  EnsureDeviceManagerConnection();
+  EnsureServiceConnection();
   ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state);
-  device_manager_requests_.insert(resolver);
-  device_manager_->GetDevices(
-      nullptr, WTF::Bind(&USB::OnGetDevices, WrapPersistent(this),
-                         WrapPersistent(resolver)));
+  service_requests_.insert(resolver);
+  service_->GetDevices(WTF::Bind(&USB::OnGetDevices, WrapPersistent(this),
+                                 WrapPersistent(resolver)));
   return resolver->Promise();
 }
 
@@ -149,8 +148,8 @@
 }
 
 void USB::ContextDestroyed(ExecutionContext*) {
-  device_manager_.reset();
-  device_manager_requests_.clear();
+  service_.reset();
+  service_requests_.clear();
   chooser_service_.reset();
   chooser_service_requests_.clear();
 }
@@ -160,7 +159,7 @@
   if (!device) {
     String guid = device_info->guid;
     UsbDevicePtr pipe;
-    device_manager_->GetDevice(guid, mojo::MakeRequest(&pipe));
+    service_->GetDevice(guid, mojo::MakeRequest(&pipe));
     device = USBDevice::Create(std::move(device_info), std::move(pipe),
                                GetExecutionContext());
     device_cache_.insert(guid, device);
@@ -170,16 +169,16 @@
 
 void USB::OnGetDevices(ScriptPromiseResolver* resolver,
                        Vector<UsbDeviceInfoPtr> device_infos) {
-  auto request_entry = device_manager_requests_.find(resolver);
-  if (request_entry == device_manager_requests_.end())
+  auto request_entry = service_requests_.find(resolver);
+  if (request_entry == service_requests_.end())
     return;
-  device_manager_requests_.erase(request_entry);
+  service_requests_.erase(request_entry);
 
   HeapVector<Member<USBDevice>> devices;
   for (auto& device_info : device_infos)
     devices.push_back(GetOrCreateDevice(std::move(device_info)));
   resolver->Resolve(devices);
-  device_manager_requests_.erase(resolver);
+  service_requests_.erase(resolver);
 }
 
 void USB::OnGetPermission(ScriptPromiseResolver* resolver,
@@ -189,9 +188,9 @@
     return;
   chooser_service_requests_.erase(request_entry);
 
-  EnsureDeviceManagerConnection();
+  EnsureServiceConnection();
 
-  if (device_manager_ && device_info) {
+  if (service_ && device_info) {
     resolver->Resolve(GetOrCreateDevice(std::move(device_info)));
   } else {
     resolver->Reject(DOMException::Create(DOMExceptionCode::kNotFoundError,
@@ -200,7 +199,7 @@
 }
 
 void USB::OnDeviceAdded(UsbDeviceInfoPtr device_info) {
-  if (!device_manager_)
+  if (!service_)
     return;
 
   DispatchEvent(*USBConnectionEvent::Create(
@@ -219,12 +218,12 @@
   device_cache_.erase(guid);
 }
 
-void USB::OnDeviceManagerConnectionError() {
-  device_manager_.reset();
+void USB::OnServiceConnectionError() {
+  service_.reset();
   client_binding_.Close();
-  for (ScriptPromiseResolver* resolver : device_manager_requests_)
+  for (ScriptPromiseResolver* resolver : service_requests_)
     resolver->Resolve(HeapVector<Member<USBDevice>>(0));
-  device_manager_requests_.clear();
+  service_requests_.clear();
 }
 
 void USB::OnChooserServiceConnectionError() {
@@ -247,25 +246,25 @@
   if (!IsContextSupported() || !IsFeatureEnabled())
     return;
 
-  EnsureDeviceManagerConnection();
+  EnsureServiceConnection();
 }
 
-void USB::EnsureDeviceManagerConnection() {
-  if (device_manager_)
+void USB::EnsureServiceConnection() {
+  if (service_)
     return;
 
   DCHECK(IsContextSupported());
   DCHECK(IsFeatureEnabled());
   GetExecutionContext()->GetInterfaceProvider()->GetInterface(
-      mojo::MakeRequest(&device_manager_));
-  device_manager_.set_connection_error_handler(WTF::Bind(
-      &USB::OnDeviceManagerConnectionError, WrapWeakPersistent(this)));
+      mojo::MakeRequest(&service_));
+  service_.set_connection_error_handler(
+      WTF::Bind(&USB::OnServiceConnectionError, WrapWeakPersistent(this)));
 
   DCHECK(!client_binding_.is_bound());
 
   device::mojom::blink::UsbDeviceManagerClientPtr client;
   client_binding_.Bind(mojo::MakeRequest(&client));
-  device_manager_->SetClient(std::move(client));
+  service_->SetClient(std::move(client));
 }
 
 bool USB::IsContextSupported() const {
@@ -291,7 +290,7 @@
 }
 
 void USB::Trace(blink::Visitor* visitor) {
-  visitor->Trace(device_manager_requests_);
+  visitor->Trace(service_requests_);
   visitor->Trace(chooser_service_requests_);
   visitor->Trace(device_cache_);
   EventTargetWithInlineData::Trace(visitor);
diff --git a/third_party/blink/renderer/modules/webusb/usb.h b/third_party/blink/renderer/modules/webusb/usb.h
index 56c55843..7b494980 100644
--- a/third_party/blink/renderer/modules/webusb/usb.h
+++ b/third_party/blink/renderer/modules/webusb/usb.h
@@ -8,6 +8,7 @@
 #include "device/usb/public/mojom/chooser_service.mojom-blink.h"
 #include "device/usb/public/mojom/device_manager.mojom-blink.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "third_party/blink/public/mojom/usb/web_usb_service.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/core/dom/context_lifecycle_observer.h"
 #include "third_party/blink/renderer/core/dom/events/event_target.h"
@@ -51,8 +52,8 @@
 
   USBDevice* GetOrCreateDevice(device::mojom::blink::UsbDeviceInfoPtr);
 
-  device::mojom::blink::UsbDeviceManager* GetDeviceManager() const {
-    return device_manager_.get();
+  mojom::blink::WebUsbService* GetWebUsbService() const {
+    return service_.get();
   }
 
   void OnGetDevices(ScriptPromiseResolver*,
@@ -64,7 +65,7 @@
   void OnDeviceAdded(device::mojom::blink::UsbDeviceInfoPtr) override;
   void OnDeviceRemoved(device::mojom::blink::UsbDeviceInfoPtr) override;
 
-  void OnDeviceManagerConnectionError();
+  void OnServiceConnectionError();
   void OnChooserServiceConnectionError();
 
   void Trace(blink::Visitor*) override;
@@ -77,13 +78,13 @@
  private:
   explicit USB(ExecutionContext&);
 
-  void EnsureDeviceManagerConnection();
+  void EnsureServiceConnection();
 
   bool IsContextSupported() const;
   bool IsFeatureEnabled() const;
 
-  device::mojom::blink::UsbDeviceManagerPtr device_manager_;
-  HeapHashSet<Member<ScriptPromiseResolver>> device_manager_requests_;
+  mojom::blink::WebUsbServicePtr service_;
+  HeapHashSet<Member<ScriptPromiseResolver>> service_requests_;
   device::mojom::blink::UsbChooserServicePtr chooser_service_;
   HeapHashSet<Member<ScriptPromiseResolver>> chooser_service_requests_;
   mojo::Binding<device::mojom::blink::UsbDeviceManagerClient> client_binding_;
diff --git a/third_party/blink/renderer/platform/audio/audio_destination.cc b/third_party/blink/renderer/platform/audio/audio_destination.cc
index 1c98e7c..5e74051 100644
--- a/third_party/blink/renderer/platform/audio/audio_destination.cc
+++ b/third_party/blink/renderer/platform/audio/audio_destination.cc
@@ -150,22 +150,6 @@
                    delay_timestamp, "delay (s)", delay);
 }
 
-// Determine if the rendered data is audible.
-static bool IsAudible(const AudioBus* rendered_data) {
-  // Compute the energy in each channel and sum up the energy in each channel
-  // for the total energy.
-  float energy = 0;
-
-  unsigned data_size = rendered_data->length();
-  for (unsigned k = 0; k < rendered_data->NumberOfChannels(); ++k) {
-    const float* data = rendered_data->Channel(k)->Data();
-    float channel_energy;
-    VectorMath::Vsvesq(data, 1, &channel_energy, data_size);
-    energy += channel_energy;
-  }
-
-  return energy > 0;
-}
 
 void AudioDestination::RequestRender(size_t frames_requested,
                                      size_t frames_to_render,
@@ -204,23 +188,6 @@
     callback_.Render(render_bus_.get(),
                      AudioUtilities::kRenderQuantumFrames, output_position);
 
-    // Detect silence (or not) for MEI
-    bool is_audible = IsAudible(render_bus_.get());
-
-    if (is_audible) {
-      ++total_audible_renders_;
-    }
-
-    if (was_audible_) {
-      if (!is_audible) {
-        was_audible_ = false;
-      }
-    } else {
-      if (is_audible) {
-        was_audible_ = true;
-      }
-    }
-
     fifo_->Push(render_bus_.get());
   }
 
diff --git a/third_party/blink/renderer/platform/audio/audio_destination.h b/third_party/blink/renderer/platform/audio/audio_destination.h
index 71388f7..a42f2ee 100644
--- a/third_party/blink/renderer/platform/audio/audio_destination.h
+++ b/third_party/blink/renderer/platform/audio/audio_destination.h
@@ -138,15 +138,6 @@
   // graph into the FIFO.
   scoped_refptr<AudioBus> render_bus_;
 
-  // Keeps track if the output of this destination was audible, before the
-  // current rendering quantum.  Used for recording "playback" time.
-  bool was_audible_ = false;
-
-  // Counts the number of render quanta where audible sound was played.  We
-  // determine audibility on render quantum boundaries, so counting quanta is
-  // all that's needed.
-  size_t total_audible_renders_ = 0;
-
   // Accessed by rendering thread: the render callback function of WebAudio
   // engine. (i.e. DestinationNode)
   AudioIOCallback& callback_;
diff --git a/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc b/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc
index 641c62e8..c683f8f2 100644
--- a/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc
+++ b/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc
@@ -276,6 +276,8 @@
     void* object,
     void** object_slot,
     TraceDescriptor desc) {
+  if (!object)
+    return;
   desc.callback(this, desc.base_object_payload);
 }
 
diff --git a/third_party/blink/renderer/platform/bindings/script_wrappable_visitor.h b/third_party/blink/renderer/platform/bindings/script_wrappable_visitor.h
index 4caa74f..bc4a094 100644
--- a/third_party/blink/renderer/platform/bindings/script_wrappable_visitor.h
+++ b/third_party/blink/renderer/platform/bindings/script_wrappable_visitor.h
@@ -30,7 +30,8 @@
                                WeakCallback,
                                void*) final {}
   void VisitBackingStoreOnly(void*, void**) final {}
-  void RegisterBackingStoreCallback(void*, MovingObjectCallback, void*) final {}
+  void RegisterBackingStoreCallback(void**, MovingObjectCallback, void*) final {
+  }
   void RegisterWeakCallback(void*, WeakCallback) final {}
 
  protected:
diff --git a/third_party/blink/renderer/platform/feature_policy/feature_policy.cc b/third_party/blink/renderer/platform/feature_policy/feature_policy.cc
index 79d0ba6..ac18a953 100644
--- a/third_party/blink/renderer/platform/feature_policy/feature_policy.cc
+++ b/third_party/blink/renderer/platform/feature_policy/feature_policy.cc
@@ -210,6 +210,8 @@
 const FeatureNameMap& GetDefaultFeatureNameMap() {
   DEFINE_STATIC_LOCAL(FeatureNameMap, default_feature_name_map, ());
   if (default_feature_name_map.IsEmpty()) {
+    default_feature_name_map.Set("autoplay",
+                                 mojom::FeaturePolicyFeature::kAutoplay);
     default_feature_name_map.Set("camera",
                                  mojom::FeaturePolicyFeature::kCamera);
     default_feature_name_map.Set("encrypted-media",
@@ -249,10 +251,6 @@
       default_feature_name_map.Set("sync-script",
                                    mojom::FeaturePolicyFeature::kSyncScript);
     }
-    if (RuntimeEnabledFeatures::FeaturePolicyAutoplayFeatureEnabled()) {
-      default_feature_name_map.Set("autoplay",
-                                   mojom::FeaturePolicyFeature::kAutoplay);
-    }
     if (RuntimeEnabledFeatures::PaymentRequestEnabled()) {
       default_feature_name_map.Set("payment",
                                    mojom::FeaturePolicyFeature::kPayment);
diff --git a/third_party/blink/renderer/platform/graphics/bitmap_image.cc b/third_party/blink/renderer/platform/graphics/bitmap_image.cc
index 1e9d7546..8faf016 100644
--- a/third_party/blink/renderer/platform/graphics/bitmap_image.cc
+++ b/third_party/blink/renderer/platform/graphics/bitmap_image.cc
@@ -366,7 +366,7 @@
   return true;
 }
 
-ImageOrientation BitmapImage::CurrentFrameOrientation() {
+ImageOrientation BitmapImage::CurrentFrameOrientation() const {
   return decoder_ ? decoder_->OrientationAtIndex(PaintImage::kDefaultFrameIndex)
                   : kDefaultImageOrientation;
 }
diff --git a/third_party/blink/renderer/platform/graphics/bitmap_image.h b/third_party/blink/renderer/platform/graphics/bitmap_image.h
index 2960a04..eb3d0f6 100644
--- a/third_party/blink/renderer/platform/graphics/bitmap_image.h
+++ b/third_party/blink/renderer/platform/graphics/bitmap_image.h
@@ -91,7 +91,7 @@
   bool CurrentFrameIsLazyDecoded() override;
   size_t FrameCount() override;
   PaintImage PaintImageForCurrentFrame() override;
-  ImageOrientation CurrentFrameOrientation();
+  ImageOrientation CurrentFrameOrientation() const;
 
   PaintImage PaintImageForTesting();
   void AdvanceAnimationForTesting() override {
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
index f75d8d1..12f0b08 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
@@ -57,8 +57,7 @@
                                         mojo::MakeRequest(&sink_));
   }
   offscreen_canvas_resource_provider_ =
-      std::make_unique<OffscreenCanvasResourceProvider>(size_.Width(),
-                                                        size_.Height(), this);
+      std::make_unique<OffscreenCanvasResourceProvider>();
 }
 
 CanvasResourceDispatcher::~CanvasResourceDispatcher() = default;
@@ -448,15 +447,12 @@
 }
 
 bool CanvasResourceDispatcher::VerifyImageSize(const IntSize image_size) {
-  if (image_size == size_)
-    return true;
-  return false;
+  return image_size == size_;
 }
 
 void CanvasResourceDispatcher::Reshape(const IntSize& size) {
   if (size_ != size) {
     size_ = size;
-    offscreen_canvas_resource_provider_->Reshape(size_.Width(), size_.Height());
     change_size_for_next_commit_ = true;
   }
 }
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.cc b/third_party/blink/renderer/platform/graphics/graphics_layer.cc
index 4ca1c6e4..a7b0b51 100644
--- a/third_party/blink/renderer/platform/graphics/graphics_layer.cc
+++ b/third_party/blink/renderer/platform/graphics/graphics_layer.cc
@@ -1005,6 +1005,9 @@
   }
   layer_state_->state = layer_state;
   layer_state_->offset = layer_offset;
+
+  CHECK(layer_state_->state.Transform() && layer_state_->state.Clip() &&
+        layer_state_->state.Effect());
 }
 
 void GraphicsLayer::SetContentsLayerState(const PropertyTreeState& layer_state,
diff --git a/third_party/blink/renderer/platform/graphics/offscreen_canvas_placeholder.cc b/third_party/blink/renderer/platform/graphics/offscreen_canvas_placeholder.cc
index d92901f..bb5b343 100644
--- a/third_party/blink/renderer/platform/graphics/offscreen_canvas_placeholder.cc
+++ b/third_party/blink/renderer/platform/graphics/offscreen_canvas_placeholder.cc
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.h"
 #include "third_party/blink/renderer/platform/web_task_runner.h"
 #include "third_party/blink/renderer/platform/wtf/hash_map.h"
+#include "third_party/blink/renderer/platform/wtf/wtf.h"
 
 namespace {
 
diff --git a/third_party/blink/renderer/platform/graphics/offscreen_canvas_resource_provider.cc b/third_party/blink/renderer/platform/graphics/offscreen_canvas_resource_provider.cc
index 6ad642b..8b132c3 100644
--- a/third_party/blink/renderer/platform/graphics/offscreen_canvas_resource_provider.cc
+++ b/third_party/blink/renderer/platform/graphics/offscreen_canvas_resource_provider.cc
@@ -4,33 +4,31 @@
 
 #include "third_party/blink/renderer/platform/graphics/offscreen_canvas_resource_provider.h"
 
+#include "components/viz/common/resources/returned_resource.h"
 #include "components/viz/common/resources/single_release_callback.h"
+#include "components/viz/common/resources/transferable_resource.h"
 #include "third_party/blink/renderer/platform/graphics/canvas_resource.h"
 #include "third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.h"
 
 namespace blink {
 
-OffscreenCanvasResourceProvider::OffscreenCanvasResourceProvider(
-    int width,
-    int height,
-    CanvasResourceDispatcher* frame_dispatcher)
-    : frame_dispatcher_(frame_dispatcher), width_(width), height_(height) {}
+OffscreenCanvasResourceProvider::OffscreenCanvasResourceProvider() = default;
 
 OffscreenCanvasResourceProvider::~OffscreenCanvasResourceProvider() = default;
 
 std::unique_ptr<OffscreenCanvasResourceProvider::FrameResource>
 OffscreenCanvasResourceProvider::CreateOrRecycleFrameResource() {
-  if (recyclable_resource_) {
-    recyclable_resource_->spare_lock = true;
-    return std::move(recyclable_resource_);
-  }
-  return std::make_unique<FrameResource>();
+  if (!recyclable_resource_)
+    return std::make_unique<FrameResource>();
+
+  recyclable_resource_->spare_lock = true;
+  return std::move(recyclable_resource_);
 }
 
 void OffscreenCanvasResourceProvider::SetTransferableResource(
     viz::TransferableResource* out_resource,
-    scoped_refptr<CanvasResource> image) {
-  DCHECK(image->IsValid());
+    scoped_refptr<CanvasResource> canvas_resource) {
+  DCHECK(canvas_resource->IsValid());
 
   std::unique_ptr<FrameResource> frame_resource =
       CreateOrRecycleFrameResource();
@@ -38,7 +36,7 @@
   // TODO(junov): Using verified sync tokens for each offscreencanvas is
   // suboptimal in the case where there are multiple offscreen canvases
   // commiting frames.  Would be more efficient to batch the verifications.
-  image->PrepareTransferableResource(
+  canvas_resource->PrepareTransferableResource(
       out_resource, &frame_resource->release_callback, kVerifiedSyncToken);
   out_resource->id = next_resource_id_;
 
@@ -62,27 +60,26 @@
 
 void OffscreenCanvasResourceProvider::ReclaimResource(unsigned resource_id) {
   auto it = resources_.find(resource_id);
-  if (it != resources_.end()) {
+  if (it != resources_.end())
     ReclaimResourceInternal(it);
-  }
 }
 
 void OffscreenCanvasResourceProvider::ReclaimResourceInternal(
     const ResourceMap::iterator& it) {
   if (it->value->spare_lock) {
     it->value->spare_lock = false;
-  } else {
-    if (it->value->release_callback) {
-      it->value->release_callback->Run(it->value->sync_token,
-                                       it->value->is_lost);
-    }
-    // Recycle resource.
-    recyclable_resource_ = std::move(it->value);
-    recyclable_resource_->release_callback = nullptr;
-    recyclable_resource_->sync_token.Clear();
-    recyclable_resource_->is_lost = false;
-    resources_.erase(it);
+    return;
   }
+
+  if (it->value->release_callback)
+    it->value->release_callback->Run(it->value->sync_token, it->value->is_lost);
+
+  // Recycle resource.
+  recyclable_resource_ = std::move(it->value);
+  recyclable_resource_->release_callback = nullptr;
+  recyclable_resource_->sync_token.Clear();
+  recyclable_resource_->is_lost = false;
+  resources_.erase(it);
 }
 
 OffscreenCanvasResourceProvider::FrameResource::~FrameResource() {
diff --git a/third_party/blink/renderer/platform/graphics/offscreen_canvas_resource_provider.h b/third_party/blink/renderer/platform/graphics/offscreen_canvas_resource_provider.h
index 6ef51de4..63a3ce2 100644
--- a/third_party/blink/renderer/platform/graphics/offscreen_canvas_resource_provider.h
+++ b/third_party/blink/renderer/platform/graphics/offscreen_canvas_resource_provider.h
@@ -5,33 +5,25 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_OFFSCREEN_CANVAS_RESOURCE_PROVIDER_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_OFFSCREEN_CANVAS_RESOURCE_PROVIDER_H_
 
-#include "components/viz/common/resources/returned_resource.h"
-#include "components/viz/common/resources/transferable_resource.h"
-#include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
+#include "gpu/command_buffer/common/sync_token.h"
+#include "third_party/blink/renderer/platform/platform_export.h"
+#include "third_party/blink/renderer/platform/wtf/hash_map.h"
+#include "third_party/blink/renderer/platform/wtf/ref_counted.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace viz {
+struct ReturnedResource;
 class SingleReleaseCallback;
-namespace mojom {
-namespace blink {
-class CompositorFrameSink;
+struct TransferableResource;
 }
-}  // namespace mojom
-}  // namespace viz
 
 namespace blink {
 
 class CanvasResource;
-class CanvasResourceDispatcher;
 
 class PLATFORM_EXPORT OffscreenCanvasResourceProvider {
  public:
-  // The CompositorFrameSink given here must be kept alive as long as this
-  // class is, as it is used to free the software-backed resources in the
-  // display compositor.
-  OffscreenCanvasResourceProvider(int width,
-                                  int height,
-                                  CanvasResourceDispatcher*);
-
+  OffscreenCanvasResourceProvider();
   ~OffscreenCanvasResourceProvider();
 
   void SetTransferableResource(viz::TransferableResource* out_resource,
@@ -42,12 +34,6 @@
   void IncNextResourceId() { next_resource_id_++; }
   unsigned GetNextResourceId() { return next_resource_id_; }
 
-  void Reshape(int width, int height) {
-    width_ = width;
-    height_ = height;
-    // TODO(junov): Prevent recycling resources of the wrong size.
-  }
-
  private:
   struct FrameResource {
     FrameResource() = default;
@@ -56,9 +42,6 @@
     // TODO(junov):  What does this do?
     bool spare_lock = true;
 
-    // Back-pointer to the OffscreenCanvasResourceProvider. FrameResource does
-    // not outlive the provider.
-    OffscreenCanvasResourceProvider* provider = nullptr;
     std::unique_ptr<viz::SingleReleaseCallback> release_callback;
     gpu::SyncToken sync_token;
     bool is_lost = false;
@@ -70,9 +53,6 @@
   std::unique_ptr<FrameResource> CreateOrRecycleFrameResource();
   void ReclaimResourceInternal(const ResourceMap::iterator&);
 
-  CanvasResourceDispatcher* frame_dispatcher_;
-  int width_;
-  int height_;
   unsigned next_resource_id_ = 0;
   std::unique_ptr<FrameResource> recyclable_resource_;
   ResourceMap resources_;
diff --git a/third_party/blink/renderer/platform/heap/heap.cc b/third_party/blink/renderer/platform/heap/heap.cc
index 0e70af6..ba99288 100644
--- a/third_party/blink/renderer/platform/heap/heap.cc
+++ b/third_party/blink/renderer/platform/heap/heap.cc
@@ -199,16 +199,13 @@
 }
 
 void ThreadHeap::RegisterMovingObjectReference(MovableReference* slot) {
-  DCHECK(slot);
   Compaction()->RegisterMovingObjectReference(slot);
 }
 
-void ThreadHeap::RegisterMovingObjectCallback(MovableReference reference,
+void ThreadHeap::RegisterMovingObjectCallback(MovableReference* slot,
                                               MovingObjectCallback callback,
                                               void* callback_data) {
-  DCHECK(reference);
-  Compaction()->RegisterMovingObjectCallback(reference, callback,
-                                             callback_data);
+  Compaction()->RegisterMovingObjectCallback(slot, callback, callback_data);
 }
 
 void ThreadHeap::MarkNotFullyConstructedObjects(MarkingVisitor* visitor) {
@@ -334,7 +331,6 @@
 }
 
 BasePage* ThreadHeap::LookupPageForAddress(Address address) {
-  DCHECK(thread_state_->InAtomicMarkingPause());
   if (PageMemoryRegion* region = region_tree_->Lookup(address)) {
     return region->PageFromAddress(address);
   }
diff --git a/third_party/blink/renderer/platform/heap/heap.h b/third_party/blink/renderer/platform/heap/heap.h
index f8c442d..708710a 100644
--- a/third_party/blink/renderer/platform/heap/heap.h
+++ b/third_party/blink/renderer/platform/heap/heap.h
@@ -262,7 +262,7 @@
   //
   // For Blink, |HeapLinkedHashSet<>| is currently the only abstraction which
   // relies on this feature.
-  void RegisterMovingObjectCallback(MovableReference,
+  void RegisterMovingObjectCallback(MovableReference*,
                                     MovingObjectCallback,
                                     void* callback_data);
 
diff --git a/third_party/blink/renderer/platform/heap/heap_allocator.h b/third_party/blink/renderer/platform/heap/heap_allocator.h
index 116a9e0..ec3b126 100644
--- a/third_party/blink/renderer/platform/heap/heap_allocator.h
+++ b/third_party/blink/renderer/platform/heap/heap_allocator.h
@@ -192,11 +192,11 @@
 
   template <typename T, typename VisitorDispatcher>
   static void RegisterBackingStoreCallback(VisitorDispatcher visitor,
-                                           T* backing_store,
+                                           T** backing_store_slot,
                                            MovingObjectCallback callback,
                                            void* callback_data) {
-    visitor->RegisterBackingStoreCallback(backing_store, callback,
-                                          callback_data);
+    visitor->RegisterBackingStoreCallback(
+        reinterpret_cast<void**>(backing_store_slot), callback, callback_data);
   }
 
   static void EnterGCForbiddenScope() {
diff --git a/third_party/blink/renderer/platform/heap/heap_compact.cc b/third_party/blink/renderer/platform/heap/heap_compact.cc
index 9b9ebbd..f4fab530 100644
--- a/third_party/blink/renderer/platform/heap/heap_compact.cc
+++ b/third_party/blink/renderer/platform/heap/heap_compact.cc
@@ -28,8 +28,8 @@
 // heap compaction-enhanced GC.
 class HeapCompact::MovableObjectFixups final {
  public:
-  static std::unique_ptr<MovableObjectFixups> Create() {
-    return base::WrapUnique(new MovableObjectFixups);
+  static std::unique_ptr<MovableObjectFixups> Create(ThreadHeap* heap) {
+    return base::WrapUnique(new MovableObjectFixups(heap));
   }
 
   ~MovableObjectFixups() = default;
@@ -62,13 +62,21 @@
   void Add(MovableReference* slot) {
     DCHECK(*slot);
     MovableReference reference = *slot;
-    BasePage* ref_page = PageFromObject(reference);
+    BasePage* ref_page =
+        heap_->LookupPageForAddress(reinterpret_cast<Address>(reference));
+
+    // ref_page is null if *slot is pointing to an off-heap region. This may
+    // happy if *slot is pointing to an inline buffer of HeapVector with inline
+    // capacity.
+    if (!ref_page)
+      return;
     // Nothing to compact on a large object's page.
     if (ref_page->IsLargeObjectPage())
       return;
 
+    if (!HeapCompact::IsCompactableArena(ref_page->Arena()->ArenaIndex()))
+      return;
 #if DCHECK_IS_ON()
-    DCHECK(HeapCompact::IsCompactableArena(ref_page->Arena()->ArenaIndex()));
     auto it = fixups_.find(reference);
     DCHECK(it == fixups_.end() || it->value == slot);
 #endif
@@ -107,12 +115,12 @@
     AddInteriorFixup(slot);
   }
 
-  void AddFixupCallback(MovableReference reference,
+  void AddFixupCallback(MovableReference* slot,
                         MovingObjectCallback callback,
                         void* callback_data) {
-    DCHECK(!fixup_callbacks_.Contains(reference));
-    fixup_callbacks_.insert(reference, std::pair<void*, MovingObjectCallback>(
-                                           callback_data, callback));
+    DCHECK(!fixup_callbacks_.Contains(slot));
+    fixup_callbacks_.insert(
+        slot, std::pair<void*, MovingObjectCallback>(callback_data, callback));
   }
 
   void RelocateInteriorFixups(Address from, Address to, size_t size) {
@@ -201,7 +209,13 @@
       //    compacted.)
       if (!*slot)
         return;
-      BasePage* slot_page = PageFromObject(*slot);
+      BasePage* slot_page =
+          heap_->LookupPageForAddress(reinterpret_cast<Address>(*slot));
+      // ref_page is null if *slot is pointing to an off-heap region. This may
+      // happy if *slot is pointing to an inline buffer of HeapVector with
+      // inline capacity.
+      if (!slot_page)
+        return;
       DCHECK(
           slot_page->IsLargeObjectPage() ||
           (HeapCompact::IsCompactableArena(slot_page->Arena()->ArenaIndex()) &&
@@ -212,7 +226,9 @@
     *slot = to;
 
     size_t size = 0;
-    auto callback = fixup_callbacks_.find(from);
+    MovableReference* callback_slot =
+        reinterpret_cast<MovableReference*>(it->value);
+    auto callback = fixup_callbacks_.find(callback_slot);
     if (UNLIKELY(callback != fixup_callbacks_.end())) {
       size = HeapObjectHeader::FromPayload(to)->PayloadSize();
       callback->value.second(callback->value.first, from, to, size);
@@ -238,7 +254,8 @@
 #endif
 
  private:
-  MovableObjectFixups() = default;
+  MovableObjectFixups(ThreadHeap* heap) : heap_(heap) {}
+  ThreadHeap* heap_;
 
   // Tracking movable and updatable references. For now, we keep a
   // map which for each movable object, recording the slot that
@@ -250,7 +267,7 @@
 
   // Map from movable reference to callbacks that need to be invoked
   // when the object moves.
-  HashMap<MovableReference, std::pair<void*, MovingObjectCallback>>
+  HashMap<MovableReference*, std::pair<void*, MovingObjectCallback>>
       fixup_callbacks_;
 
   // Slot => relocated slot/final location.
@@ -290,7 +307,7 @@
 
 HeapCompact::MovableObjectFixups& HeapCompact::Fixups() {
   if (!fixups_)
-    fixups_ = MovableObjectFixups::Create();
+    fixups_ = MovableObjectFixups::Create(heap_);
   return *fixups_;
 }
 
@@ -367,13 +384,13 @@
   traced_slots_.insert(slot);
 }
 
-void HeapCompact::RegisterMovingObjectCallback(MovableReference reference,
+void HeapCompact::RegisterMovingObjectCallback(MovableReference* slot,
                                                MovingObjectCallback callback,
                                                void* callback_data) {
   if (!do_compact_)
     return;
 
-  Fixups().AddFixupCallback(reference, callback, callback_data);
+  Fixups().AddFixupCallback(slot, callback, callback_data);
 }
 
 void HeapCompact::UpdateHeapResidency() {
diff --git a/third_party/blink/renderer/platform/heap/heap_compact.h b/third_party/blink/renderer/platform/heap/heap_compact.h
index b11f12e0..bf24885e 100644
--- a/third_party/blink/renderer/platform/heap/heap_compact.h
+++ b/third_party/blink/renderer/platform/heap/heap_compact.h
@@ -81,7 +81,7 @@
   void RegisterMovingObjectReference(MovableReference* slot);
 
   // See |Heap::registerMovingObjectCallback()| documentation.
-  void RegisterMovingObjectCallback(MovableReference,
+  void RegisterMovingObjectCallback(MovableReference*,
                                     MovingObjectCallback,
                                     void* callback_data);
 
@@ -165,7 +165,7 @@
   // the range of BlinkGC::ArenaIndices.
   unsigned compactable_arenas_;
 
-  // The set is to remember slots traced during the incremental and atomic
+  // The set is to remember slots that traced during
   // marking phases. The mapping between the slots and the backing stores are
   // created at the atomic pause phase.
   HashSet<MovableReference*> traced_slots_;
diff --git a/third_party/blink/renderer/platform/heap/incremental_marking_test.cc b/third_party/blink/renderer/platform/heap/incremental_marking_test.cc
index 4bc04a8..b70d4e3 100644
--- a/third_party/blink/renderer/platform/heap/incremental_marking_test.cc
+++ b/third_party/blink/renderer/platform/heap/incremental_marking_test.cc
@@ -65,7 +65,7 @@
                                WeakCallback,
                                void*) final {}
   void VisitBackingStoreOnly(void*, void**) final {}
-  void RegisterBackingStoreCallback(void* backing_store,
+  void RegisterBackingStoreCallback(void** slot,
                                     MovingObjectCallback,
                                     void* callback_data) final {}
   void RegisterWeakCallback(void* closure, WeakCallback) final {}
diff --git a/third_party/blink/renderer/platform/heap/marking_verifier.h b/third_party/blink/renderer/platform/heap/marking_verifier.h
index d5b01125..33f084dc 100644
--- a/third_party/blink/renderer/platform/heap/marking_verifier.h
+++ b/third_party/blink/renderer/platform/heap/marking_verifier.h
@@ -53,7 +53,8 @@
                                WeakCallback,
                                void*) final {}
   void VisitBackingStoreOnly(void*, void**) final {}
-  void RegisterBackingStoreCallback(void*, MovingObjectCallback, void*) final {}
+  void RegisterBackingStoreCallback(void**, MovingObjectCallback, void*) final {
+  }
   void RegisterWeakCallback(void*, WeakCallback) final {}
   void Visit(const TraceWrapperV8Reference<v8::Value>&) final {}
   void Visit(DOMWrapperMap<ScriptWrappable>*,
diff --git a/third_party/blink/renderer/platform/heap/marking_visitor.cc b/third_party/blink/renderer/platform/heap/marking_visitor.cc
index eb320b7..d803593 100644
--- a/third_party/blink/renderer/platform/heap/marking_visitor.cc
+++ b/third_party/blink/renderer/platform/heap/marking_visitor.cc
@@ -117,21 +117,20 @@
   weak_callback_worklist_.Push({object, callback});
 }
 
-void MarkingVisitor::RegisterBackingStoreReference(void* slot) {
+void MarkingVisitor::RegisterBackingStoreReference(void** slot) {
   if (marking_mode_ != kGlobalMarkingWithCompaction)
     return;
   Heap().RegisterMovingObjectReference(
       reinterpret_cast<MovableReference*>(slot));
 }
 
-void MarkingVisitor::RegisterBackingStoreCallback(void* backing_store,
+void MarkingVisitor::RegisterBackingStoreCallback(void** slot,
                                                   MovingObjectCallback callback,
                                                   void* callback_data) {
   if (marking_mode_ != kGlobalMarkingWithCompaction)
     return;
-  Heap().RegisterMovingObjectCallback(
-      reinterpret_cast<MovableReference>(backing_store), callback,
-      callback_data);
+  Heap().RegisterMovingObjectCallback(reinterpret_cast<MovableReference*>(slot),
+                                      callback, callback_data);
 }
 
 bool MarkingVisitor::RegisterWeakTable(const void* closure,
diff --git a/third_party/blink/renderer/platform/heap/marking_visitor.h b/third_party/blink/renderer/platform/heap/marking_visitor.h
index e62a9640..18eedcdf 100644
--- a/third_party/blink/renderer/platform/heap/marking_visitor.h
+++ b/third_party/blink/renderer/platform/heap/marking_visitor.h
@@ -142,11 +142,13 @@
   // processing. In this case, the contents are processed separately using
   // the corresponding traits but the backing store requires marking.
   void VisitBackingStoreOnly(void* object, void** object_slot) final {
-    MarkHeaderNoTracing(HeapObjectHeader::FromPayload(object));
     RegisterBackingStoreReference(object_slot);
+    if (!object)
+      return;
+    MarkHeaderNoTracing(HeapObjectHeader::FromPayload(object));
   }
 
-  void RegisterBackingStoreCallback(void* backing_store,
+  void RegisterBackingStoreCallback(void** slot,
                                     MovingObjectCallback,
                                     void* callback_data) final;
   bool RegisterWeakTable(const void* closure,
@@ -163,7 +165,7 @@
   static void WriteBarrierSlow(void*);
   static void TraceMarkedBackingStoreSlow(void*);
 
-  void RegisterBackingStoreReference(void* slot);
+  void RegisterBackingStoreReference(void** slot);
 
   void ConservativelyMarkHeader(HeapObjectHeader*);
 
diff --git a/third_party/blink/renderer/platform/heap/visitor.h b/third_party/blink/renderer/platform/heap/visitor.h
index b998bfd..e0723f7 100644
--- a/third_party/blink/renderer/platform/heap/visitor.h
+++ b/third_party/blink/renderer/platform/heap/visitor.h
@@ -149,8 +149,6 @@
     static_assert(IsGarbageCollectedType<T>::value,
                   "T needs to be a garbage collected object");
 
-    if (!backing_store)
-      return;
     VisitBackingStoreOnly(reinterpret_cast<void*>(backing_store),
                           reinterpret_cast<void**>(backing_store_slot));
   }
@@ -268,7 +266,7 @@
 
   // Registers backing store pointers so that they can be moved and properly
   // updated.
-  virtual void RegisterBackingStoreCallback(void* backing_store,
+  virtual void RegisterBackingStoreCallback(void** slot,
                                             MovingObjectCallback,
                                             void* callback_data) = 0;
 
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index fcddb4c3..f3cb78c 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -386,10 +386,6 @@
       name: "EditingNG",
     },
     {
-      name: "EmbedderCSPEnforcement",
-      status: "stable",
-    },
-    {
       name: "EncryptedMediaEncryptionSchemeQuery",
       status: "test",
     },
@@ -456,10 +452,6 @@
       name: "FastMobileScrolling",
     },
     {
-      name: "FeaturePolicyAutoplayFeature",
-      status: "stable"
-    },
-    {
       name: "FeaturePolicyJavaScriptInterface",
       origin_trial_feature_name: "FeaturePolicyJSAPI",
       status: "experimental"
@@ -607,10 +599,6 @@
       status: "experimental",
     },
     {
-      name: "JSImageDecode",
-      status: "stable",
-    },
-    {
       name: "KeyboardMap",
       status: "stable",
     },
@@ -650,10 +638,6 @@
       status: "experimental",
     },
     {
-      name: "LongTaskObserver",
-      status: "stable",
-    },
-    {
       name: "LongTaskV2",
     },
     {
@@ -939,10 +923,6 @@
       status: "stable",
     },
     {
-      name: "PerformancePaintTiming",
-      status: "stable",
-    },
-    {
       name: "PermissionDelegation",
       status: "test",
     },
@@ -970,10 +950,6 @@
     {
       name: "PreciseMemoryInfo",
     },
-    {
-      name: "PreferredImageRasterBounds",
-      settable_from_internals: true,
-    },
     // This feature is deprecated and we are evangelizing affected sites.
     // See https://crbug.com/346236 for current status.
     {
@@ -1029,10 +1005,6 @@
       status: "stable",
     },
     {
-      name: "RenderingPipelineThrottlingLoadingIframes",
-      status: "stable",
-    },
-    {
       name: "ReportingObserver",
       implied_by: ["DeprecationReporting", "InterventionReporting"],
       status: "stable",
diff --git a/third_party/blink/renderer/platform/testing/empty_web_media_player.h b/third_party/blink/renderer/platform/testing/empty_web_media_player.h
index 460b43b..89981be1 100644
--- a/third_party/blink/renderer/platform/testing/empty_web_media_player.h
+++ b/third_party/blink/renderer/platform/testing/empty_web_media_player.h
@@ -30,6 +30,8 @@
   void SetVolume(double) override {}
   void EnterPictureInPicture(PipWindowOpenedCallback) override {}
   void ExitPictureInPicture(PipWindowClosedCallback) override {}
+  void SetPictureInPictureCustomControls(
+      const std::vector<PictureInPictureControlInfo>&) override {}
   void RegisterPictureInPictureWindowResizeCallback(
       PipWindowResizedCallback) override {}
   WebTimeRanges Buffered() const override;
diff --git a/third_party/blink/renderer/platform/text/text_break_iterator.cc b/third_party/blink/renderer/platform/text/text_break_iterator.cc
index c9920471..e39e8df0 100644
--- a/third_party/blink/renderer/platform/text/text_break_iterator.cc
+++ b/third_party/blink/renderer/platform/text/text_break_iterator.cc
@@ -300,6 +300,8 @@
     int pos,
     const CharacterType* str,
     int len) const {
+  DCHECK_GE(pos, 0);
+  DCHECK_GE(static_cast<unsigned>(pos), start_offset_);
   int next_break = -1;
   UChar last_last_ch = pos > 1 ? str[pos - 2] : SecondToLastCharacter();
   UChar last_ch = pos > 0 ? str[pos - 1] : LastCharacter();
@@ -307,7 +309,7 @@
   ULineBreak last_line_break;
   if (lineBreakType == LineBreakType::kBreakAll)
     last_line_break = LineBreakPropertyValue(last_last_ch, last_ch);
-  unsigned prior_context_length = PriorContextLength();
+  PriorContext prior_context = GetPriorContext();
   CharacterType ch;
   bool is_space;
   for (int i = pos; i < len;
@@ -353,13 +355,15 @@
       if (next_break < i) {
         // Don't break if positioned at start of primary context and there is no
         // prior context.
-        if (i || prior_context_length) {
-          TextBreakIterator* break_iterator = Get(prior_context_length);
-          if (break_iterator) {
-            next_break =
-                break_iterator->following(i - 1 + prior_context_length);
+        if (i || prior_context.length) {
+          if (TextBreakIterator* break_iterator = GetIterator(prior_context)) {
+            // Adjust the offset by |start_offset_| because |break_iterator| has
+            // text after |start_offset_|.
+            DCHECK_GE(i + prior_context.length, start_offset_);
+            next_break = break_iterator->following(
+                i - 1 + prior_context.length - start_offset_);
             if (next_break >= 0) {
-              next_break -= prior_context_length;
+              next_break = next_break + start_offset_ - prior_context.length;
             }
           }
         }
@@ -407,9 +411,13 @@
 }
 
 int LazyLineBreakIterator::NextBreakablePositionBreakCharacter(int pos) const {
-  NonSharedCharacterBreakIterator iterator(string_);
+  DCHECK_LE(start_offset_, string_.length());
+  NonSharedCharacterBreakIterator iterator(StringView(string_, start_offset_));
+  DCHECK_GE(pos, 0);
+  DCHECK_GE(static_cast<unsigned>(pos), start_offset_);
+  pos -= start_offset_;
   int next = iterator.Following(std::max(pos - 1, 0));
-  return next != kTextBreakDone ? next : string_.length();
+  return next != kTextBreakDone ? next + start_offset_ : string_.length();
 }
 
 int LazyLineBreakIterator::NextBreakablePosition(int pos,
diff --git a/third_party/blink/renderer/platform/text/text_break_iterator.h b/third_party/blink/renderer/platform/text/text_break_iterator.h
index dee25350..f7f02eb 100644
--- a/third_party/blink/renderer/platform/text/text_break_iterator.h
+++ b/third_party/blink/renderer/platform/text/text_break_iterator.h
@@ -121,8 +121,6 @@
  public:
   LazyLineBreakIterator()
       : iterator_(nullptr),
-        cached_prior_context_(nullptr),
-        cached_prior_context_length_(0),
         break_type_(LineBreakType::kNormal) {
     ResetPriorContext();
   }
@@ -133,8 +131,6 @@
       : string_(string),
         locale_(locale),
         iterator_(nullptr),
-        cached_prior_context_(nullptr),
-        cached_prior_context_length_(0),
         break_type_(break_type) {
     ResetPriorContext();
   }
@@ -179,55 +175,42 @@
     prior_context_[1] = 0;
   }
 
-  unsigned PriorContextLength() const {
-    unsigned prior_context_length = 0;
+  struct PriorContext {
+    const UChar* text = nullptr;
+    unsigned length = 0;
+  };
+
+  PriorContext GetPriorContext() const {
     static_assert(arraysize(prior_context_) == 2,
                   "TextBreakIterator has unexpected prior context length");
     if (prior_context_[1]) {
-      ++prior_context_length;
       if (prior_context_[0])
-        ++prior_context_length;
+        return PriorContext{&prior_context_[0], 2};
+      return PriorContext{&prior_context_[1], 1};
     }
-    return prior_context_length;
+    return PriorContext{nullptr, 0};
   }
 
-  // Obtain text break iterator, possibly previously cached, where this iterator
-  // is (or has been) initialized to use the previously stored string as the
-  // primary breaking context and using previously stored prior context if
-  // non-empty.
-  TextBreakIterator* Get(unsigned prior_context_length) const {
-    DCHECK(prior_context_length <= kPriorContextCapacity);
-    const UChar* prior_context =
-        prior_context_length
-            ? &prior_context_[kPriorContextCapacity - prior_context_length]
-            : nullptr;
-    if (!iterator_) {
-      if (string_.Is8Bit())
-        iterator_ = AcquireLineBreakIterator(
-            string_.Characters8(), string_.length(), locale_, prior_context,
-            prior_context_length);
-      else
-        iterator_ = AcquireLineBreakIterator(
-            string_.Characters16(), string_.length(), locale_, prior_context,
-            prior_context_length);
-      cached_prior_context_ = prior_context;
-      cached_prior_context_length_ = prior_context_length;
-    } else if (prior_context != cached_prior_context_ ||
-               prior_context_length != cached_prior_context_length_) {
-      ReleaseIterator();
-      return Get(prior_context_length);
-    }
-    return iterator_;
-  }
+  unsigned PriorContextLength() const { return GetPriorContext().length; }
 
   void ResetStringAndReleaseIterator(String string,
                                      const AtomicString& locale) {
     string_ = string;
+    start_offset_ = 0;
     locale_ = locale;
 
     ReleaseIterator();
   }
 
+  // Set the start offset. Text before this offset is disregarded. Properly
+  // setting the start offset improves the performance significantly, because
+  // ICU break iterator computes all the text from the beginning.
+  void SetStartOffset(unsigned offset) {
+    CHECK_LE(offset, string_.length());
+    start_offset_ = offset;
+    ReleaseIterator();
+  }
+
   void SetLocale(const AtomicString& locale) {
     if (locale == locale_)
       return;
@@ -281,8 +264,45 @@
     if (iterator_)
       ReleaseLineBreakIterator(iterator_);
     iterator_ = nullptr;
-    cached_prior_context_ = nullptr;
-    cached_prior_context_length_ = 0;
+    cached_prior_context_.text = nullptr;
+    cached_prior_context_.length = 0;
+  }
+
+  // Obtain text break iterator, possibly previously cached, where this iterator
+  // is (or has been) initialized to use the previously stored string as the
+  // primary breaking context and using previously stored prior context if
+  // non-empty.
+  TextBreakIterator* GetIterator(const PriorContext& prior_context) const {
+    DCHECK(prior_context.length <= kPriorContextCapacity);
+    if (iterator_) {
+      if (prior_context.length == cached_prior_context_.length) {
+        DCHECK_EQ(prior_context.text, cached_prior_context_.text);
+        return iterator_;
+      }
+      ReleaseIterator();
+    }
+
+    // Create the iterator, or get one from the cache, for the text after
+    // |start_offset_|. Because ICU TextBreakIterator computes all characters
+    // from the beginning of the given text, using |start_offset_| improves the
+    // performance significantly.
+    //
+    // For this reason, the offset for the TextBreakIterator must be adjusted by
+    // |start_offset_|.
+    cached_prior_context_ = prior_context;
+    CHECK_LE(start_offset_, string_.length());
+    if (string_.Is8Bit()) {
+      iterator_ =
+          AcquireLineBreakIterator(string_.Characters8() + start_offset_,
+                                   string_.length() - start_offset_, locale_,
+                                   prior_context.text, prior_context.length);
+    } else {
+      iterator_ =
+          AcquireLineBreakIterator(string_.Characters16() + start_offset_,
+                                   string_.length() - start_offset_, locale_,
+                                   prior_context.text, prior_context.length);
+    }
+    return iterator_;
   }
 
   template <typename CharacterType, LineBreakType, BreakSpaceType>
@@ -300,8 +320,8 @@
   AtomicString locale_;
   mutable TextBreakIterator* iterator_;
   UChar prior_context_[kPriorContextCapacity];
-  mutable const UChar* cached_prior_context_;
-  mutable unsigned cached_prior_context_length_;
+  mutable PriorContext cached_prior_context_;
+  unsigned start_offset_ = 0;
   LineBreakType break_type_;
   BreakSpaceType break_space_ = BreakSpaceType::kBeforeEverySpace;
 };
diff --git a/third_party/blink/renderer/platform/wtf/deque.h b/third_party/blink/renderer/platform/wtf/deque.h
index a9dc7a8..6a5eb0bb 100644
--- a/third_party/blink/renderer/platform/wtf/deque.h
+++ b/third_party/blink/renderer/platform/wtf/deque.h
@@ -678,6 +678,8 @@
     Allocator::TraceVectorBacking(visitor, buffer_.Buffer(),
                                   buffer_.BufferSlot());
   } else {
+    Allocator::TraceVectorBacking(visitor, static_cast<T*>(nullptr),
+                                  buffer_.BufferSlot());
     const T* buffer_begin = buffer_.Buffer();
     const T* end = buffer_begin + end_;
     if (IsTraceableInCollectionTrait<VectorTraits<T>>::value) {
diff --git a/third_party/blink/renderer/platform/wtf/hash_table.h b/third_party/blink/renderer/platform/wtf/hash_table.h
index 119f4ebb..3ba8d32 100644
--- a/third_party/blink/renderer/platform/wtf/hash_table.h
+++ b/third_party/blink/renderer/platform/wtf/hash_table.h
@@ -2065,9 +2065,6 @@
     if (!table->table_)
       return;
 
-    // Only trace the backing store. Its fields will be processed below.
-    Allocator::template TraceHashTableBackingOnly<ValueType, HashTableType>(
-        visitor, table->table_, &(table->table_));
     // Now perform weak processing (this is a no-op if the backing was
     // accessible through an iterator and was already marked strongly).
     for (ValueType* element = table->table_ + table->table_size_ - 1;
@@ -2122,15 +2119,18 @@
 std::enable_if_t<A::kIsGarbageCollected>
 HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits, Allocator>::
     Trace(VisitorDispatcher visitor) {
-  if (!table_)
-    return;
-
   if (Traits::kWeakHandlingFlag == kNoWeakHandling) {
     // Strong HashTable.
     DCHECK(IsTraceableInCollectionTrait<Traits>::value);
     Allocator::template TraceHashTableBackingStrongly<ValueType, HashTable>(
         visitor, table_, &table_);
   } else {
+    // Only trace the backing store. The elements will be processed in the weak
+    // processing callback.
+    Allocator::template TraceHashTableBackingOnly<ValueType, HashTable>(
+        visitor, table_, &table_);
+    if (!table_)
+      return;
     // Weak HashTable. The HashTable may be held alive strongly from somewhere
     // else, e.g., an iterator.
 
diff --git a/third_party/blink/renderer/platform/wtf/linked_hash_set.h b/third_party/blink/renderer/platform/wtf/linked_hash_set.h
index 293687a..cbb0cbd8 100644
--- a/third_party/blink/renderer/platform/wtf/linked_hash_set.h
+++ b/third_party/blink/renderer/platform/wtf/linked_hash_set.h
@@ -307,11 +307,9 @@
     impl_.Trace(visitor);
     // Should the underlying table be moved by GC, register a callback
     // that fixes up the interior pointers that the (Heap)LinkedHashSet keeps.
-    if (impl_.table_) {
-      Allocator::RegisterBackingStoreCallback(
-          visitor, impl_.table_, MoveBackingCallback,
-          reinterpret_cast<void*>(&anchor_));
-    }
+    Allocator::RegisterBackingStoreCallback(visitor, &impl_.table_,
+                                            MoveBackingCallback,
+                                            reinterpret_cast<void*>(&anchor_));
   }
 
   int64_t Modifications() const { return impl_.Modifications(); }
diff --git a/third_party/blink/renderer/platform/wtf/vector.h b/third_party/blink/renderer/platform/wtf/vector.h
index db5ec2f..ee3086d 100644
--- a/third_party/blink/renderer/platform/wtf/vector.h
+++ b/third_party/blink/renderer/platform/wtf/vector.h
@@ -1962,11 +1962,16 @@
 Vector<T, inlineCapacity, Allocator>::Trace(VisitorDispatcher visitor) {
   static_assert(Allocator::kIsGarbageCollected,
                 "Garbage collector must be enabled.");
-  if (!Buffer())
-    return;
+
   if (this->HasOutOfLineBuffer()) {
     Allocator::TraceVectorBacking(visitor, Buffer(), Base::BufferSlot());
   } else {
+    // We should not visit inline buffers, but we still need to register the
+    // slot for heap compaction. So, we pass nullptr to this method.
+    Allocator::TraceVectorBacking(visitor, static_cast<T*>(nullptr),
+                                  Base::BufferSlot());
+    if (!Buffer())
+      return;
     // Inline buffer requires tracing immediately.
     const T* buffer_begin = Buffer();
     const T* buffer_end = Buffer() + size();
diff --git a/third_party/closure_compiler/README.chromium b/third_party/closure_compiler/README.chromium
index d0274ffc..5a5315b7 100644
--- a/third_party/closure_compiler/README.chromium
+++ b/third_party/closure_compiler/README.chromium
@@ -19,3 +19,5 @@
   third_party/closure_compiler/externs/chrome_extensions.js.
 - Some externs here are for chrome-specific use; these primarily include the
   *_private.js files.
+- Fix bug in js_binary.py causing it to drop externs.
+- Cache dependency subtrees in js_binary.py for a huge performance boost.
diff --git a/third_party/closure_compiler/js_binary.py b/third_party/closure_compiler/js_binary.py
index 34e346c..5e17c7ce 100644
--- a/third_party/closure_compiler/js_binary.py
+++ b/third_party/closure_compiler/js_binary.py
@@ -34,26 +34,48 @@
           lines[externs_start+1:])
 
 
-def CrawlDepsTree(deps, sources, externs):
+# Cache, to avoid reading the same file twice in the dependency tree and
+# processing its dependencies again.
+depcache = {}
+
+def AppendUnique(items, new_items):
+  """Append items in |new_items| to |items|, avoiding duplicates."""
+  # Note this is O(n*n), and assumes |new_items| is already unique, but this is
+  # not a bottleneck overall.
+  items += [i for i in new_items if i not in items]
+
+def CrawlDepsTree(deps):
   """Parses the dependency tree creating a post-order listing of sources."""
+  global depcache
+
+  if len(deps) == 0:
+    return ([], [])
+
+  new_sources = []
+  new_externs = []
   for dep in deps:
-    cur_sources, cur_deps, cur_externs = ParseDepList(dep)
-
-    child_sources, child_externs = CrawlDepsTree(
-      cur_deps, cur_sources, cur_externs)
-
-    # Add child dependencies of this node first.
-    new_sources = child_sources
+    if dep in depcache:
+      cur_sources, cur_externs = depcache[dep]
+    else:
+      dep_sources, dep_deps, dep_externs = ParseDepList(dep)
+      cur_sources, cur_externs = CrawlDepsTree(dep_deps)
+      # Add child dependencies of this node before the current node, then cache.
+      AppendUnique(cur_sources, dep_sources)
+      AppendUnique(cur_externs, dep_externs)
+      depcache[dep] = (cur_sources, cur_externs)
 
     # Add the current node's sources and dedupe.
-    new_sources += [s for s in cur_sources if s not in new_sources]
+    AppendUnique(new_sources, cur_sources)
+    AppendUnique(new_externs, cur_externs)
 
-    # Add the original sources, none of which will be dependencies of this node,
-    # and dedupe.
-    new_sources += [s for s in sources if s not in new_sources]
-    sources = new_sources
+  return new_sources, new_externs
 
-    externs += [e for e in cur_externs if e not in externs]
+
+def CrawlRootDepsTree(deps, target_sources, target_externs):
+  """Parses the dependency tree and adds target sources."""
+  sources, externs = CrawlDepsTree(deps)
+  AppendUnique(sources, target_sources)
+  AppendUnique(externs, target_externs)
   return sources, externs
 
 
@@ -81,10 +103,10 @@
                       help='Only performs checks and writes an empty output')
 
   args = parser.parse_args()
-  sources, externs = CrawlDepsTree(args.deps, args.sources, args.externs)
+  sources, externs = CrawlRootDepsTree(args.deps, args.sources, args.externs)
 
   compiler_args = ['--%s' % flag for flag in args.flags]
-  compiler_args += ['--externs=%s' % e for e in args.externs]
+  compiler_args += ['--externs=%s' % e for e in externs]
   compiler_args += [
       '--js_output_file',
       args.output,
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index e4e54350..6ad0abd 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -27,7 +27,7 @@
 # Do NOT CHANGE this if you don't know what you're doing -- see
 # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md
 # Reverting problematic clang rolls is safe, though.
-CLANG_REVISION = '338452'
+CLANG_REVISION = '337439'
 
 use_head_revision = bool(os.environ.get('LLVM_FORCE_HEAD_REVISION', '0')
                          in ('1', 'YES'))
diff --git a/tools/idl_parser/idl_parser.py b/tools/idl_parser/idl_parser.py
index 89df17ef..028170c 100755
--- a/tools/idl_parser/idl_parser.py
+++ b/tools/idl_parser/idl_parser.py
@@ -464,9 +464,9 @@
     p[0] = self.BuildError(p, 'Enum')
 
   def p_EnumValueList(self, p):
-    """EnumValueList : ExtendedAttributeList string EnumValueListComma"""
-    enum = self.BuildNamed('EnumItem', p, 2, p[1])
-    p[0] = ListFromConcat(enum, p[3])
+    """EnumValueList : string EnumValueListComma"""
+    enum = self.BuildNamed('EnumItem', p, 1)
+    p[0] = ListFromConcat(enum, p[2])
 
   def p_EnumValueListComma(self, p):
     """EnumValueListComma : ',' EnumValueListString
@@ -475,11 +475,11 @@
       p[0] = p[2]
 
   def p_EnumValueListString(self, p):
-    """EnumValueListString : ExtendedAttributeList string EnumValueListComma
+    """EnumValueListString : string EnumValueListComma
                            |"""
     if len(p) > 1:
-      enum = self.BuildNamed('EnumItem', p, 2, p[1])
-      p[0] = ListFromConcat(enum, p[3])
+      enum = self.BuildNamed('EnumItem', p, 1)
+      p[0] = ListFromConcat(enum, p[2])
 
   def p_CallbackRest(self, p):
     """CallbackRest : identifier '=' ReturnType '(' ArgumentList ')' ';'"""
diff --git a/tools/metrics/histograms/README.md b/tools/metrics/histograms/README.md
index c11f432..1bd62943 100644
--- a/tools/metrics/histograms/README.md
+++ b/tools/metrics/histograms/README.md
@@ -84,7 +84,7 @@
 You may append to your enum if the possible states/actions grows.  However, you
 should not reorder, renumber, or otherwise reuse existing values. Definitions
 for enums recorded in histograms should be prefixed by the following warning:
-```
+```c++
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused.
 ```
@@ -94,9 +94,9 @@
 easy to match the values between the C++ definition and
 [histograms.xml](./histograms.xml).
 
-There are two common patterns for defining enums. If an enum is used in a
-`switch` statement, it should be defined like this:
-```
+For new enums used in histograms, prefer using an enum class with a kMaxValue
+element, like this:
+```c++ {.good}
 enum class NewTabPageAction {
   kUseOmnibox = 0,
   kClickTitle = 1,
@@ -106,8 +106,10 @@
 ```
 `kMaxValue` is a special enumerator value that shares the value of the highest
 enumerator: this should be done by assigning it the name of the enumerator with
-the highest explicit integral value. `switch` statements will not need to handle
-an otherwise unused sentinel value.
+the highest explicit integral value. There is a presubmit check which will
+enforce this semantic. Enums defined this way have better type checking support
+from the compiler, allow inferring kMaxValue from the type, and allow `switch`
+statements over them will not need to handle an otherwise unused sentinel value.
 
 Enumerators defined in this way should be recorded using the two argument
 version of `UMA_HISTOGRAM_ENUMERATION`:
@@ -116,19 +118,23 @@
 ```
 which automatically deduces the range of the enum from `kMaxValue`.
 
-Alternatively, enums can be defined with a sentinel enumerator value at the end:
+If you need to record a histogram based on an enum without kMaxValue, you can
+use the three argument version, which takes the number of buckets as the argument, e.g:
+```c++
+UMA_HISTOGRAM_ENUMERATION("NewTabPageAction", action,
+                          NewTabPageAction_MaxValue + 1);
 ```
+
+This is often seen with enums defined with a sentinal enumerator value at the
+end, relying on the compiler to keep the value up to date:
+```c++
 enum class NewTabPageAction {
   kUseOmnibox = 0,
   kClickTitle = 1,
   kOpenBookmark = 2,
   kCount,
 };
-```
-The `kCount` enumerator should not include an explicit value--this lets the
-compiler keep `kCount` up-to-date. Enumerators defined in this way should be
-recoded using the three argument version of `UMA_HISTOGRAM_ENUMERATION`:
-```
+
 UMA_HISTOGRAM_ENUMERATION("NewTabPageAction", action, NewTabPageAction::kCount);
 ```
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index c7c6693d..dd84536 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -2214,6 +2214,7 @@
   <int value="0" label="Password"/>
   <int value="1" label="PIN"/>
   <int value="2" label="Smartlock"/>
+  <int value="3" label="Fingerprint"/>
 </enum>
 
 <enum name="AuthMethodSwitchType">
@@ -2223,6 +2224,12 @@
   <int value="3" label="PIN to Smartlock"/>
   <int value="4" label="Smartlock to Password"/>
   <int value="5" label="Smartlock to PIN"/>
+  <int value="6" label="Password to Fingerprint"/>
+  <int value="7" label="Pin to Fingerprint"/>
+  <int value="8" label="Smartlock to Fingerprint"/>
+  <int value="9" label="Fingerprint to Password"/>
+  <int value="10" label="Fingerprint to PIN"/>
+  <int value="11" label="Fingerprint to Smartlock"/>
 </enum>
 
 <enum name="AuthPolicyErrorType">
@@ -13989,6 +13996,7 @@
   <int value="462" label="NetworkFileSharesAllowed"/>
   <int value="463" label="DeviceLocalAccountManagedSessionEnabled"/>
   <int value="464" label="WebRtcEventLogCollectionAllowed"/>
+  <int value="465" label="PowerSmartDimEnabled"/>
 </enum>
 
 <enum name="EnterprisePolicyInvalidations">
@@ -16239,6 +16247,7 @@
   <int value="1264" label="VIRTUALKEYBOARDPRIVATE_SETHITTESTBOUNDS"/>
   <int value="1265" label="ARCAPPSPRIVATE_GETLAUNCHABLEAPPS"/>
   <int value="1266" label="ARCAPPSPRIVATE_LAUNCHAPP"/>
+  <int value="1267" label="AUTOTESTPRIVATE_RUNCROSTINIINSTALLER"/>
 </enum>
 
 <enum name="ExtensionIconState">
@@ -34952,6 +34961,7 @@
   <int value="7" label="Clicking notification"/>
   <int value="8" label="File URL intent"/>
   <int value="9" label="Content URL intent"/>
+  <int value="10" label="Progress bar"/>
 </enum>
 
 <enum name="OfflinePagesAggregatedRequestResult">
@@ -36147,6 +36157,12 @@
   <int value="4" label="Internal error"/>
 </enum>
 
+<enum name="OverlayFormat">
+  <int value="0" label="BGRA"/>
+  <int value="1" label="YUY2"/>
+  <int value="2" label="NV12"/>
+</enum>
+
 <enum name="OverlayStrategies">
   <int value="0" label="Unknown"/>
   <int value="1" label="No overlay"/>
@@ -36268,13 +36284,13 @@
 <enum name="PageLifecycleStateTransition">
   <int value="0" label="Active to hidden and foregrounded"/>
   <int value="1" label="Active to hidden and backgrounded"/>
-  <int value="2" label="Hidden and foregrounded to visible"/>
+  <int value="2" label="Hidden and foregrounded to active"/>
   <int value="3" label="Hidden and foregrounded to hidden and backgrounded"/>
   <int value="4" label="Hidden and foregrounded to frozen"/>
-  <int value="5" label="Hidden and backgrounded to visible"/>
+  <int value="5" label="Hidden and backgrounded to active"/>
   <int value="6" label="Hidden and backgrounded to hidden and foregrounded"/>
   <int value="7" label="Hidden and backgrounded to frozen"/>
-  <int value="8" label="Frozen to visible"/>
+  <int value="8" label="Frozen to active"/>
   <int value="9" label="Frozen to hidden and foregrounded"/>
   <int value="10" label="Frozen to hidden and backgrounded"/>
 </enum>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 174af7b..c746b2f45 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -4202,16 +4202,16 @@
     enum="AuthMethod">
   <owner>xiaoyinh@google.com</owner>
   <summary>
-    The usage of different auth methods (PIN / Password / Smartlock) in ChromeOS
-    lock screen clamshell mode.
+    The usage of different auth methods (PIN / Password / Smartlock /
+    Fingerprint) in ChromeOS lock screen clamshell mode.
   </summary>
 </histogram>
 
 <histogram name="Ash.Login.Lock.AuthMethod.Used.TabletMode" enum="AuthMethod">
   <owner>xiaoyinh@google.com</owner>
   <summary>
-    The usage of different auth methods (PIN / Password / Smartlock) in ChromeOS
-    lock screen tablet mode.
+    The usage of different auth methods (PIN / Password / Smartlock /
+    Fingerprint) in ChromeOS lock screen tablet mode.
   </summary>
 </histogram>
 
@@ -31499,6 +31499,35 @@
   </summary>
 </histogram>
 
+<histogram name="Fingerprint.Unlock.AttemptsCountBeforeSuccess" units="count"
+    expires_after="2019-08-09">
+  <owner>xiaoyinh@chromium.org</owner>
+  <owner>zalcorn@chromium.org</owner>
+  <summary>
+    Counts the number of fingerprint attempts until successful screen unlock.
+  </summary>
+</histogram>
+
+<histogram name="Fingerprint.Unlock.AuthSuccessful" enum="BooleanSuccess"
+    expires_after="2019-08-09">
+  <owner>xiaoyinh@chromium.org</owner>
+  <owner>zalcorn@chromium.org</owner>
+  <summary>
+    Counts the number of times that the fingerprint match successfully vs.
+    rejected.
+  </summary>
+</histogram>
+
+<histogram name="Fingerprint.UnlockEnabled" enum="BooleanEnabled"
+    expires_after="2019-08-09">
+  <owner>xiaoyinh@chromium.org</owner>
+  <owner>zalcorn@chromium.org</owner>
+  <summary>
+    Track whether fingerprint is enabled to unlock the screen, when the user
+    logs in.
+  </summary>
+</histogram>
+
 <histogram name="FirstRun.LaunchSource" enum="FirstRunLaunchSource">
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -32992,6 +33021,11 @@
   </summary>
 </histogram>
 
+<histogram name="GPU.DirectComposition.OverlayFormatUsed" enum="OverlayFormat">
+  <owner>sunnyps@chromium.org</owner>
+  <summary>Which overlay format was chosen for YUV overlays.</summary>
+</histogram>
+
 <histogram name="GPU.DirectComposition.OverlaysSupported"
     enum="BooleanOverlaySupported">
   <owner>jbauman@chromium.org</owner>
@@ -65781,7 +65815,7 @@
   </summary>
 </histogram>
 
-<histogram name="Omnibox.PasteAndGo" units="count" expires_after="2018-08-30">
+<histogram name="Omnibox.PasteAndGo" units="count" expires_after="2019-07-30">
   <owner>mpearson@chromium.org</owner>
   <summary>
     The number of paste-and-go commands on the text in the omnibox. Reported
@@ -65953,8 +65987,10 @@
   </summary>
 </histogram>
 
-<histogram name="Omnibox.SearchProvider.ConvertResultsTime" units="ms"
-    expires_after="2018-08-30">
+<histogram name="Omnibox.SearchProvider.ConvertResultsTime" units="ms">
+  <obsolete>
+    Deleted in August 2018 in M-70.
+  </obsolete>
   <owner>mpearson@chromium.org</owner>
   <summary>
     Time it takes to convert all the results to matches and add them to a map,
@@ -65964,7 +66000,10 @@
 
 <histogram
     name="Omnibox.SearchProvider.GetMostRecentKeywordTermsDefaultProviderTime"
-    units="ms" expires_after="2018-08-30">
+    units="ms">
+  <obsolete>
+    Deleted in August 2018 in M-70.
+  </obsolete>
   <owner>mpearson@chromium.org</owner>
   <summary>
     Time it takes for the omnibox to search the previous query history database
@@ -91464,6 +91503,9 @@
     The size of Service-Worker-Navigation-Preload header when the navigation
     preload request is to be sent. The default value of the header is
     &quot;true&quot;, so the default size is 4.
+
+    This is recorded regardless of whether NetS13nSW (https://crbug.com/715640)
+    is enabled or disabled.
   </summary>
 </histogram>
 
diff --git a/tools/perf/benchmarks/loading.py b/tools/perf/benchmarks/loading.py
index 9de446e..61caa2c 100644
--- a/tools/perf/benchmarks/loading.py
+++ b/tools/perf/benchmarks/loading.py
@@ -18,6 +18,11 @@
 
   options = {'pageset_repeat': 2}
 
+  def SetExtraBrowserOptions(self, options):
+    options.AppendExtraBrowserArgs([
+        '--enable-features=TracingPerfettoBackend',
+    ])
+
   def CreateCoreTimelineBasedMeasurementOptions(self):
     tbm_options = timeline_based_measurement.Options()
     loading_metrics_category.AugmentOptionsForLoadingMetrics(tbm_options)
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py
new file mode 100644
index 0000000..c0b086ec
--- /dev/null
+++ b/tools/perf/core/bot_platforms.py
@@ -0,0 +1,47 @@
+# 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.
+
+import urllib
+
+
+class PerfPlatform(object):
+  def __init__(self, name, is_fyi=False):
+    self._name = name
+    self._is_fyi = is_fyi
+
+  @property
+  def name(self):
+    return self._name
+
+  @property
+  def buildbot_url(self):
+    return ('https://ci.chromium.org/buildbot/chromium.perf/%s/' %
+             urllib.quote(self._name))
+
+# Linux
+LINUX = PerfPlatform('linux-perf')
+
+# Mac
+MAC_HIGH_END = PerfPlatform('mac-10_13_laptop_high_end-perf')
+MAC_LOW_END = PerfPlatform('mac-10_12_laptop_low_end-perf')
+
+# Win
+WIN_10 = PerfPlatform('win-10-perf')
+WIN_7 = PerfPlatform('Win 7 Perf')
+WIN_7_GPU = PerfPlatform('Win 7 Nvidia GPU Perf')
+
+# Android
+ANDROID_GO = PerfPlatform('android-go-perf')
+ANDROID_NEXUS_5 = PerfPlatform('Android Nexus5 Perf')
+ANDROID_NEXUS_5X = PerfPlatform('android-nexus5x-perf')
+ANDROID_NEXUS_5X_WEBVIEW = PerfPlatform('Android Nexus5X WebView Perf')
+ANDROID_NEXUS_6_WEBVIEW = PerfPlatform('Android Nexus6 WebView Perf')
+
+ALL_PLATFORMS = {
+    p for p in locals().values() if isinstance(p, PerfPlatform)
+}
+
+ALL_PLATFORM_NAMES = {
+    p.name for p in ALL_PLATFORMS
+}
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py
index 391405e..9d5d890 100755
--- a/tools/perf/core/perf_data_generator.py
+++ b/tools/perf/core/perf_data_generator.py
@@ -922,7 +922,7 @@
     # Always say this is true regardless of whether the tester
     # supports swarming. It doesn't hurt.
     'can_use_on_swarming_builders': True,
-    'expiration': 6 * 60 * 60, # 6 hours timeout
+    'expiration': 2 * 60 * 60, # 2 hours pending max
     'hard_timeout': 7 * 60 * 60, # 7 hours timeout for full suite
     'ignore_task_failure': False,
     'io_timeout': 30 * 60, # 30 minutes
diff --git a/tools/perf/core/perf_data_generator_unittest.py b/tools/perf/core/perf_data_generator_unittest.py
index dc3e65b..b89eefca 100644
--- a/tools/perf/core/perf_data_generator_unittest.py
+++ b/tools/perf/core/perf_data_generator_unittest.py
@@ -123,7 +123,7 @@
         'swarming': {
           'ignore_task_failure': False,
           'can_use_on_swarming_builders': True,
-          'expiration': 21600,
+          'expiration': 7200,
           'io_timeout': 1800,
           'hard_timeout': 25200,
           'upload_test_results': True,
@@ -177,7 +177,7 @@
         'swarming': {
           'ignore_task_failure': False,
           'can_use_on_swarming_builders': True,
-          'expiration': 21600,
+          'expiration': 7200,
           'io_timeout': 1800,
           'hard_timeout': 25200,
           'upload_test_results': True,
@@ -230,7 +230,7 @@
         'swarming': {
           'ignore_task_failure': False,
           'can_use_on_swarming_builders': True,
-          'expiration': 21600,
+          'expiration': 7200,
           'io_timeout': 1800,
           'hard_timeout': 25200,
           'upload_test_results': True,
diff --git a/tools/perf/core/perf_json_config_validator.py b/tools/perf/core/perf_json_config_validator.py
index 2c3dbbf..3eb2e616 100644
--- a/tools/perf/core/perf_json_config_validator.py
+++ b/tools/perf/core/perf_json_config_validator.py
@@ -7,6 +7,7 @@
 import json
 
 from core import path_util
+from core import bot_platforms
 
 _VALID_SWARMING_DIMENSIONS = {
     'gpu', 'device_ids', 'os', 'pool', 'perf_tests', 'perf_tests_with_args',
@@ -124,8 +125,9 @@
   return 'isolated_scripts' in builder_data
 
 
-def ValidatePerfConfigFile(file_handle):
+def ValidatePerfConfigFile(file_handle, is_main_perf_waterfall):
   perf_data = json.load(file_handle)
+  perf_testing_builder_names = set()
   for key, value in perf_data.iteritems():
     if not _IsBuilderName(key):
       continue
@@ -133,8 +135,18 @@
       pass
     elif _IsTestingBuilder(builder_name=key, builder_data=value):
       ValidateTestingBuilder(builder_name=key, builder_data=value)
+      perf_testing_builder_names.add(key)
     else:
       raise ValueError('%s has unrecognizable type: %s' % key)
+  if (is_main_perf_waterfall and
+      perf_testing_builder_names != bot_platforms.ALL_PLATFORM_NAMES):
+    raise ValueError(
+        'Found mismatches between actual perf waterfall builders and platforms '
+        'in core.bot_platforms. Please update the platforms in '
+        'bot_platforms.py.\nPlatforms should be aded to core.bot_platforms:%s'
+        '\nPlatforms should be removed from core.bot_platforms:%s' % (
+          perf_testing_builder_names - bot_platforms.ALL_PLATFORM_NAMES,
+          bot_platforms.ALL_PLATFORM_NAMES - perf_testing_builder_names))
 
 
 def main(args):
@@ -148,7 +160,7 @@
 
 
   with open(fyi_waterfall_file) as f:
-    ValidatePerfConfigFile(f)
+    ValidatePerfConfigFile(f, False)
 
   with open(waterfall_file) as f:
-    ValidatePerfConfigFile(f)
+    ValidatePerfConfigFile(f, True)
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 21c6830..4400c427 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -75,7 +75,6 @@
 crbug.com/867836 [ All ] loading.desktop/Elmundo_warm [ Skip ]
 
 # Benchmark: loading.mobile
-crbug.com/676612 [ Nexus6_Webview ] loading.mobile/* [ Skip ]
 crbug.com/776092 [ Android_One ] loading.mobile/GoogleRedirectToGoogleJapan [ Skip ]
 crbug.com/656861 [ All ] loading.mobile/G1 [ Skip ]
 crbug.com/857108 [ Nexus_5 ] loading.mobile/G1_3g [ Skip ]
@@ -113,6 +112,8 @@
 crbug.com/859597 [ Nexus5X_Webview ] loading.mobile/GoogleBrazil_3g [ Skip ]
 crbug.com/867103 [ Nexus5X_Webview ] loading.mobile/FlipBoard_warm_3g [ Skip ]
 crbug.com/871421 [ Android_One ] loading.mobile/Dramaq_3g [ Skip ]
+crbug.com/873032 [ Android_Webview ] loading.mobile/GoogleRedirectToGoogleJapan_3g [ Skip ]
+crbug.com/873033 [ Android_but_not_webview ] loading.mobile/FlipKart_warm_3g [ Skip ]
 
 # Benchmark: memory.long_running_idle_gmail_tbmv2
 crbug.com/611167 [ Android_Svelte ] memory.long_running_idle_gmail_tbmv2/* [ Skip ]
@@ -184,6 +185,8 @@
 crbug.com/338838 [ All ] rendering.mobile/basic_stream [ Skip ]
 crbug.com/867072 [ Android_One ] rendering.mobile/microsoft_fireflies [ Skip ]
 crbug.com/867075 [ Android_One ] rendering.mobile/microsoft_snow [ Skip ]
+crbug.com/873013 [ Android_Webview ] rendering.mobile/yahoo_answers_mobile_2018 [ Skip ]
+crbug.com/873014 [ Android_Webview ] rendering.mobile/yahoo_answers_mobile_sync_scroll_2018 [ Skip ]
 
 # Benchmark: rasterize_and_record_micro.top_25
 crbug.com/768010 [ Android_One ] rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html [ Skip ]
@@ -191,6 +194,8 @@
 crbug.com/815193 [ Android ] rasterize_and_record_micro.top_25/file://static_top_25/wikipedia.html [ Skip ]
 crbug.com/842175 [ Android_One ] rasterize_and_record_micro.top_25/file://static_top_25/espn.html [ Skip ]
 
+crbug.com/873011 [ Android_Webview ] rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html [ Skip ]
+
 # Benchmark: system_health.common_desktop
 crbug.com/828917 [ Mac ] system_health.common_desktop/multitab:misc:typical24 [ Skip ]
 crbug.com/773084 [ Mac ] system_health.common_desktop/browse:tools:maps [ Skip ]
diff --git a/tools/perf/process_perf_results.py b/tools/perf/process_perf_results.py
index 3d279c3..d0b405a 100755
--- a/tools/perf/process_perf_results.py
+++ b/tools/perf/process_perf_results.py
@@ -404,8 +404,10 @@
           build_properties, output_json_file, service_account_file))
 
     # Kick off the uploads in mutliple processes
-    cpus = mp.cpu_count()
-    pool = mp.Pool(cpus)
+    # Maximimze the parallelization by setting the number of parallel processes
+    # to the number of invocations. This is because a significant part of
+    # uploading are I/Os bounds.
+    pool = mp.Pool(len(invocations))
     try:
       async_result = pool.map_async(
           _upload_individual_benchmark, invocations)
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc
index ed5b650..d66dfea 100644
--- a/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -553,8 +553,9 @@
 // IAccessible implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::accHitTest(
-    LONG x_left, LONG y_top, VARIANT* child) {
+IFACEMETHODIMP AXPlatformNodeWin::accHitTest(LONG x_left,
+                                             LONG y_top,
+                                             VARIANT* child) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_HIT_TEST);
   COM_OBJECT_VALIDATE_1_ARG(child);
 
@@ -597,7 +598,7 @@
   return result;
 }
 
-HRESULT AXPlatformNodeWin::accDoDefaultAction(VARIANT var_id) {
+IFACEMETHODIMP AXPlatformNodeWin::accDoDefaultAction(VARIANT var_id) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_DO_DEFAULT_ACTION);
   AXPlatformNodeWin* target;
   COM_OBJECT_VALIDATE_VAR_ID_AND_GET_TARGET(var_id, target);
@@ -609,8 +610,11 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::accLocation(
-    LONG* x_left, LONG* y_top, LONG* width, LONG* height, VARIANT var_id) {
+IFACEMETHODIMP AXPlatformNodeWin::accLocation(LONG* x_left,
+                                              LONG* y_top,
+                                              LONG* width,
+                                              LONG* height,
+                                              VARIANT var_id) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_LOCATION);
   AXPlatformNodeWin* target;
   COM_OBJECT_VALIDATE_VAR_ID_4_ARGS_AND_GET_TARGET(var_id, x_left, y_top, width,
@@ -628,8 +632,9 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::accNavigate(
-    LONG nav_dir, VARIANT start, VARIANT* end) {
+IFACEMETHODIMP AXPlatformNodeWin::accNavigate(LONG nav_dir,
+                                              VARIANT start,
+                                              VARIANT* end) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_NAVIGATE);
   AXPlatformNodeWin* target;
   COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(start, end, target);
@@ -739,8 +744,8 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accChild(VARIANT var_child,
-                                             IDispatch** disp_child) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accChild(VARIANT var_child,
+                                               IDispatch** disp_child) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_CHILD);
 
   *disp_child = nullptr;
@@ -752,15 +757,15 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accChildCount(LONG* child_count) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accChildCount(LONG* child_count) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_CHILD_COUNT);
   COM_OBJECT_VALIDATE_1_ARG(child_count);
   *child_count = delegate_->GetChildCount();
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accDefaultAction(
-    VARIANT var_id, BSTR* def_action) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accDefaultAction(VARIANT var_id,
+                                                       BSTR* def_action) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_DEFAULT_ACTION);
   AXPlatformNodeWin* target;
   COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, def_action, target);
@@ -785,8 +790,8 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accDescription(
-    VARIANT var_id, BSTR* desc) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accDescription(VARIANT var_id,
+                                                     BSTR* desc) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_DESCRIPTION);
   AXPlatformNodeWin* target;
   COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, desc, target);
@@ -795,7 +800,7 @@
       ax::mojom::StringAttribute::kDescription, desc);
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accFocus(VARIANT* focus_child) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accFocus(VARIANT* focus_child) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_FOCUS);
   COM_OBJECT_VALIDATE_1_ARG(focus_child);
   gfx::NativeViewAccessible focus_accessible = delegate_->GetFocus();
@@ -814,8 +819,8 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accKeyboardShortcut(
-    VARIANT var_id, BSTR* acc_key) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accKeyboardShortcut(VARIANT var_id,
+                                                          BSTR* acc_key) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_KEYBOARD_SHORTCUT);
   AXPlatformNodeWin* target;
   COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, acc_key, target);
@@ -824,8 +829,7 @@
       ax::mojom::StringAttribute::kKeyShortcuts, acc_key);
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accName(
-    VARIANT var_id, BSTR* name) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accName(VARIANT var_id, BSTR* name) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_NAME);
   AXPlatformNodeWin* target;
   COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, name, target);
@@ -855,8 +859,7 @@
   return result;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accParent(
-    IDispatch** disp_parent) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accParent(IDispatch** disp_parent) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_PARENT);
   COM_OBJECT_VALIDATE_1_ARG(disp_parent);
   *disp_parent = GetParent();
@@ -868,8 +871,7 @@
   return S_FALSE;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accRole(
-    VARIANT var_id, VARIANT* role) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accRole(VARIANT var_id, VARIANT* role) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_ROLE);
   AXPlatformNodeWin* target;
   COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, role, target);
@@ -891,8 +893,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accState(
-    VARIANT var_id, VARIANT* state) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accState(VARIANT var_id, VARIANT* state) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_STATE);
   AXPlatformNodeWin* target;
   COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, state, target);
@@ -901,14 +902,13 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accHelp(
-    VARIANT var_id, BSTR* help) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accHelp(VARIANT var_id, BSTR* help) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_HELP);
   COM_OBJECT_VALIDATE_1_ARG(help);
   return S_FALSE;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accValue(VARIANT var_id, BSTR* value) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accValue(VARIANT var_id, BSTR* value) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_VALUE);
   AXPlatformNodeWin* target;
   COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, value, target);
@@ -988,8 +988,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::put_accValue(VARIANT var_id,
-                                             BSTR new_value) {
+IFACEMETHODIMP AXPlatformNodeWin::put_accValue(VARIANT var_id, BSTR new_value) {
   AXPlatformNodeWin* target;
   COM_OBJECT_VALIDATE_VAR_ID_AND_GET_TARGET(var_id, target);
 
@@ -1001,7 +1000,7 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accSelection(VARIANT* selected) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accSelection(VARIANT* selected) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_SELECTION);
   COM_OBJECT_VALIDATE_1_ARG(selected);
   std::vector<Microsoft::WRL::ComPtr<IDispatch>> selected_nodes;
@@ -1038,8 +1037,7 @@
   return hr;
 }
 
-STDMETHODIMP AXPlatformNodeWin::accSelect(
-    LONG flagsSelect, VARIANT var_id) {
+IFACEMETHODIMP AXPlatformNodeWin::accSelect(LONG flagsSelect, VARIANT var_id) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_SELECT);
   AXPlatformNodeWin* target;
   COM_OBJECT_VALIDATE_VAR_ID_AND_GET_TARGET(var_id, target);
@@ -1054,8 +1052,9 @@
   return S_FALSE;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accHelpTopic(
-    BSTR* help_file, VARIANT var_id, LONG* topic_id) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accHelpTopic(BSTR* help_file,
+                                                   VARIANT var_id,
+                                                   LONG* topic_id) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_HELP_TOPIC);
   AXPlatformNodeWin* target;
   COM_OBJECT_VALIDATE_VAR_ID_2_ARGS_AND_GET_TARGET(var_id, help_file, topic_id,
@@ -1069,8 +1068,7 @@
   return E_NOTIMPL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::put_accName(
-    VARIANT var_id, BSTR put_name) {
+IFACEMETHODIMP AXPlatformNodeWin::put_accName(VARIANT var_id, BSTR put_name) {
   // TODO(dougt): We may want to collect an API histogram here.
   // Deprecated.
   return E_NOTIMPL;
@@ -1080,7 +1078,7 @@
 // IAccessible2 implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::role(LONG* role) {
+IFACEMETHODIMP AXPlatformNodeWin::role(LONG* role) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ROLE);
   COM_OBJECT_VALIDATE_1_ARG(role);
 
@@ -1092,7 +1090,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_states(AccessibleStates* states) {
+IFACEMETHODIMP AXPlatformNodeWin::get_states(AccessibleStates* states) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_STATES);
   COM_OBJECT_VALIDATE_1_ARG(states);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
@@ -1101,24 +1099,24 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_uniqueID(LONG* id) {
+IFACEMETHODIMP AXPlatformNodeWin::get_uniqueID(LONG* id) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_UNIQUE_ID);
   COM_OBJECT_VALIDATE_1_ARG(id);
   *id = -GetUniqueId();
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_windowHandle(HWND* window_handle) {
+IFACEMETHODIMP AXPlatformNodeWin::get_windowHandle(HWND* window_handle) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_WINDOW_HANDLE);
   COM_OBJECT_VALIDATE_1_ARG(window_handle);
   *window_handle = delegate_->GetTargetForNativeAccessibilityEvent();
   return *window_handle ? S_OK : S_FALSE;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_relationTargetsOfType(BSTR type_bstr,
-                                                          LONG max_targets,
-                                                          IUnknown*** targets,
-                                                          LONG* n_targets) {
+IFACEMETHODIMP AXPlatformNodeWin::get_relationTargetsOfType(BSTR type_bstr,
+                                                            LONG max_targets,
+                                                            IUnknown*** targets,
+                                                            LONG* n_targets) {
   COM_OBJECT_VALIDATE_2_ARGS(targets, n_targets);
 
   *n_targets = 0;
@@ -1188,7 +1186,7 @@
   return index > 0 ? S_OK : S_FALSE;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_attributes(BSTR* attributes) {
+IFACEMETHODIMP AXPlatformNodeWin::get_attributes(BSTR* attributes) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_IA2_GET_ATTRIBUTES);
   COM_OBJECT_VALIDATE_1_ARG(attributes);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
@@ -1207,7 +1205,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_indexInParent(LONG* index_in_parent) {
+IFACEMETHODIMP AXPlatformNodeWin::get_indexInParent(LONG* index_in_parent) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_INDEX_IN_PARENT);
   COM_OBJECT_VALIDATE_1_ARG(index_in_parent);
   *index_in_parent = GetIndexInParent();
@@ -1217,7 +1215,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_nRelations(LONG* n_relations) {
+IFACEMETHODIMP AXPlatformNodeWin::get_nRelations(LONG* n_relations) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_RELATIONS);
   COM_OBJECT_VALIDATE_1_ARG(n_relations);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
@@ -1228,8 +1226,8 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_relation(LONG relation_index,
-                                             IAccessibleRelation** relation) {
+IFACEMETHODIMP AXPlatformNodeWin::get_relation(LONG relation_index,
+                                               IAccessibleRelation** relation) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_RELATION);
   COM_OBJECT_VALIDATE_1_ARG(relation);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
@@ -1262,9 +1260,9 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_relations(LONG max_relations,
-                                              IAccessibleRelation** relations,
-                                              LONG* n_relations) {
+IFACEMETHODIMP AXPlatformNodeWin::get_relations(LONG max_relations,
+                                                IAccessibleRelation** relations,
+                                                LONG* n_relations) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_RELATIONS);
   COM_OBJECT_VALIDATE_2_ARGS(relations, n_relations);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
@@ -1284,9 +1282,10 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_groupPosition(LONG* group_level,
-                                                  LONG* similar_items_in_group,
-                                                  LONG* position_in_group) {
+IFACEMETHODIMP AXPlatformNodeWin::get_groupPosition(
+    LONG* group_level,
+    LONG* similar_items_in_group,
+    LONG* position_in_group) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_GROUP_POSITION);
   COM_OBJECT_VALIDATE_3_ARGS(group_level, similar_items_in_group,
                              position_in_group);
@@ -1301,7 +1300,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_localizedExtendedRole(
+IFACEMETHODIMP AXPlatformNodeWin::get_localizedExtendedRole(
     BSTR* localized_extended_role) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_LOCALIZED_EXTENDED_ROLE);
   COM_OBJECT_VALIDATE_1_ARG(localized_extended_role);
@@ -1315,14 +1314,14 @@
 // IAccessible2 methods not implemented.
 //
 
-STDMETHODIMP AXPlatformNodeWin::get_attribute(BSTR name, VARIANT* attribute) {
+IFACEMETHODIMP AXPlatformNodeWin::get_attribute(BSTR name, VARIANT* attribute) {
   return E_NOTIMPL;
 }
-STDMETHODIMP AXPlatformNodeWin::get_extendedRole(BSTR* extended_role) {
+IFACEMETHODIMP AXPlatformNodeWin::get_extendedRole(BSTR* extended_role) {
   return E_NOTIMPL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::scrollTo(enum IA2ScrollType scroll_type) {
+IFACEMETHODIMP AXPlatformNodeWin::scrollTo(enum IA2ScrollType scroll_type) {
   COM_OBJECT_VALIDATE();
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_IA2_SCROLL_TO);
 
@@ -1361,7 +1360,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::scrollToPoint(
+IFACEMETHODIMP AXPlatformNodeWin::scrollToPoint(
     enum IA2CoordinateType coordinate_type,
     LONG x,
     LONG y) {
@@ -1389,19 +1388,19 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_nExtendedStates(LONG* n_extended_states) {
+IFACEMETHODIMP AXPlatformNodeWin::get_nExtendedStates(LONG* n_extended_states) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_EXTENDED_STATES);
   return E_NOTIMPL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_extendedStates(LONG max_extended_states,
-                                                   BSTR** extended_states,
-                                                   LONG* n_extended_states) {
+IFACEMETHODIMP AXPlatformNodeWin::get_extendedStates(LONG max_extended_states,
+                                                     BSTR** extended_states,
+                                                     LONG* n_extended_states) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_EXTENDED_STATES);
   return E_NOTIMPL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_localizedExtendedStates(
+IFACEMETHODIMP AXPlatformNodeWin::get_localizedExtendedStates(
     LONG max_localized_extended_states,
     BSTR** localized_extended_states,
     LONG* n_localized_extended_states) {
@@ -1410,13 +1409,13 @@
   return E_NOTIMPL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_locale(IA2Locale* locale) {
+IFACEMETHODIMP AXPlatformNodeWin::get_locale(IA2Locale* locale) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_LOCALE);
   return E_NOTIMPL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_accessibleWithCaret(IUnknown** accessible,
-                                                        LONG* caret_offset) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accessibleWithCaret(IUnknown** accessible,
+                                                          LONG* caret_offset) {
   return E_NOTIMPL;
 }
 
@@ -1424,8 +1423,8 @@
 // IAccessibleEx implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::GetObjectForChild(LONG child_id,
-                                                  IAccessibleEx** result) {
+IFACEMETHODIMP AXPlatformNodeWin::GetObjectForChild(LONG child_id,
+                                                    IAccessibleEx** result) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_OBJECT_FOR_CHILD);
   // No support for child IDs in this implementation.
   COM_OBJECT_VALIDATE_1_ARG(result);
@@ -1433,8 +1432,8 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::GetIAccessiblePair(IAccessible** accessible,
-                                                   LONG* child_id) {
+IFACEMETHODIMP AXPlatformNodeWin::GetIAccessiblePair(IAccessible** accessible,
+                                                     LONG* child_id) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_IACCESSIBLE_PAIR);
   COM_OBJECT_VALIDATE_2_ARGS(accessible, child_id);
   *accessible = static_cast<IAccessible*>(this);
@@ -1447,7 +1446,7 @@
 // IExpandCollapseProvider implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::Collapse() {
+IFACEMETHODIMP AXPlatformNodeWin::Collapse() {
   AXActionData action_data;
   action_data.action = ax::mojom::Action::kDoDefault;
 
@@ -1456,7 +1455,7 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::Expand() {
+IFACEMETHODIMP AXPlatformNodeWin::Expand() {
   AXActionData action_data;
   action_data.action = ax::mojom::Action::kDoDefault;
 
@@ -1465,7 +1464,7 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_ExpandCollapseState(
+IFACEMETHODIMP AXPlatformNodeWin::get_ExpandCollapseState(
     ExpandCollapseState* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   const AXNodeData& data = GetData();
@@ -1484,19 +1483,19 @@
 // IGridItemProvider implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::get_Column(int* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_Column(int* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   *result = GetTableColumn();
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_ColumnSpan(int* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_ColumnSpan(int* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   *result = GetTableColumnSpan();
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_ContainingGrid(
+IFACEMETHODIMP AXPlatformNodeWin::get_ContainingGrid(
     IRawElementProviderSimple** result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
 
@@ -1510,13 +1509,13 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_Row(int* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_Row(int* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   *result = GetTableRow();
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_RowSpan(int* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_RowSpan(int* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   *result = GetTableRowSpan();
   return S_OK;
@@ -1526,9 +1525,9 @@
 // IGridProvider implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::GetItem(int row,
-                                        int column,
-                                        IRawElementProviderSimple** result) {
+IFACEMETHODIMP AXPlatformNodeWin::GetItem(int row,
+                                          int column,
+                                          IRawElementProviderSimple** result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
 
   AXPlatformNodeBase* cell = GetTableCell(row, column);
@@ -1541,13 +1540,13 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_RowCount(int* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_RowCount(int* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   *result = GetTableRowCount();
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_ColumnCount(int* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_ColumnCount(int* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   *result = GetTableColumnCount();
   return S_OK;
@@ -1557,7 +1556,7 @@
 // IScrollItemProvider implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::ScrollIntoView() {
+IFACEMETHODIMP AXPlatformNodeWin::ScrollIntoView() {
   COM_OBJECT_VALIDATE();
   gfx::Rect r = gfx::ToEnclosingRect(GetData().location);
   r -= r.OffsetFromOrigin();
@@ -1575,8 +1574,8 @@
 // IScrollProvider implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::Scroll(ScrollAmount horizontal_amount,
-                                       ScrollAmount vertical_amount) {
+IFACEMETHODIMP AXPlatformNodeWin::Scroll(ScrollAmount horizontal_amount,
+                                         ScrollAmount vertical_amount) {
   COM_OBJECT_VALIDATE();
   if (!IsScrollable())
     return E_FAIL;
@@ -1591,8 +1590,8 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::SetScrollPercent(double horizontal_percent,
-                                                 double vertical_percent) {
+IFACEMETHODIMP AXPlatformNodeWin::SetScrollPercent(double horizontal_percent,
+                                                   double vertical_percent) {
   COM_OBJECT_VALIDATE();
   if (!IsScrollable())
     return E_FAIL;
@@ -1614,13 +1613,13 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_HorizontallyScrollable(BOOL* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_HorizontallyScrollable(BOOL* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   *result = IsHorizontallyScrollable();
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_HorizontalScrollPercent(double* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_HorizontalScrollPercent(double* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   if (!IsHorizontallyScrollable()) {
     *result = UIA_ScrollPatternNoScroll;
@@ -1636,7 +1635,7 @@
 
 // Horizontal size of the viewable region as a percentage of the total content
 // area.
-STDMETHODIMP AXPlatformNodeWin::get_HorizontalViewSize(double* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_HorizontalViewSize(double* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   if (!IsHorizontallyScrollable()) {
     *result = 100.;
@@ -1652,13 +1651,13 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_VerticallyScrollable(BOOL* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_VerticallyScrollable(BOOL* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   *result = IsVerticallyScrollable();
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_VerticalScrollPercent(double* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_VerticalScrollPercent(double* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   if (!IsVerticallyScrollable()) {
     *result = UIA_ScrollPatternNoScroll;
@@ -1674,7 +1673,7 @@
 
 // Vertical size of the viewable region as a percentage of the total content
 // area.
-STDMETHODIMP AXPlatformNodeWin::get_VerticalViewSize(double* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_VerticalViewSize(double* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   if (!IsVerticallyScrollable()) {
     *result = 100.0;
@@ -1694,7 +1693,7 @@
 // ISelectionItemProvider implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::AddToSelection() {
+IFACEMETHODIMP AXPlatformNodeWin::AddToSelection() {
   if (!IsUIASelectable(GetData().role))
     return E_FAIL;
 
@@ -1711,11 +1710,11 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::RemoveFromSelection() {
+IFACEMETHODIMP AXPlatformNodeWin::RemoveFromSelection() {
   return E_NOTIMPL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::Select() {
+IFACEMETHODIMP AXPlatformNodeWin::Select() {
   if (!IsUIASelectable(GetData().role))
     return E_FAIL;
 
@@ -1732,7 +1731,7 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_IsSelected(BOOL* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_IsSelected(BOOL* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
 
   if (!IsUIASelectable(GetData().role))
@@ -1746,7 +1745,7 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_SelectionContainer(
+IFACEMETHODIMP AXPlatformNodeWin::get_SelectionContainer(
     IRawElementProviderSimple** result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
 
@@ -1763,7 +1762,7 @@
 // ISelectionProvider implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::GetSelection(SAFEARRAY** result) {
+IFACEMETHODIMP AXPlatformNodeWin::GetSelection(SAFEARRAY** result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   int child_count = delegate_->GetChildCount();
   *result = SafeArrayCreateVector(VT_UNKNOWN, 0, child_count);
@@ -1778,13 +1777,13 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_CanSelectMultiple(BOOL* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_CanSelectMultiple(BOOL* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   *result = GetData().HasState(ax::mojom::State::kMultiselectable);
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_IsSelectionRequired(BOOL* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_IsSelectionRequired(BOOL* result) {
   return E_NOTIMPL;
 }
 
@@ -1792,7 +1791,7 @@
 // ITableItemProvider methods.
 //
 
-STDMETHODIMP AXPlatformNodeWin::GetColumnHeaderItems(SAFEARRAY** result) {
+IFACEMETHODIMP AXPlatformNodeWin::GetColumnHeaderItems(SAFEARRAY** result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
 
   if (!IsCellOrTableHeaderRole(GetData().role) || !GetTable())
@@ -1806,7 +1805,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::GetRowHeaderItems(SAFEARRAY** result) {
+IFACEMETHODIMP AXPlatformNodeWin::GetRowHeaderItems(SAFEARRAY** result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
 
   if (!IsCellOrTableHeaderRole(GetData().role) || !GetTable())
@@ -1824,7 +1823,7 @@
 // ITableProvider methods.
 //
 
-STDMETHODIMP AXPlatformNodeWin::GetColumnHeaders(SAFEARRAY** result) {
+IFACEMETHODIMP AXPlatformNodeWin::GetColumnHeaders(SAFEARRAY** result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
 
   if (!GetTable())
@@ -1835,7 +1834,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::GetRowHeaders(SAFEARRAY** result) {
+IFACEMETHODIMP AXPlatformNodeWin::GetRowHeaders(SAFEARRAY** result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
 
   if (!GetTable())
@@ -1846,7 +1845,8 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_RowOrColumnMajor(RowOrColumnMajor* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_RowOrColumnMajor(
+    RowOrColumnMajor* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   return E_NOTIMPL;
 }
@@ -1855,7 +1855,7 @@
 // IToggleProvider implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::Toggle() {
+IFACEMETHODIMP AXPlatformNodeWin::Toggle() {
   AXActionData action_data;
   action_data.action = ax::mojom::Action::kDoDefault;
 
@@ -1864,7 +1864,7 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_ToggleState(ToggleState* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_ToggleState(ToggleState* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   const auto checked_state = GetData().GetCheckedState();
   if (checked_state == ax::mojom::CheckedState::kTrue) {
@@ -1881,7 +1881,7 @@
 // IValueProvider implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::SetValue(LPCWSTR value) {
+IFACEMETHODIMP AXPlatformNodeWin::SetValue(LPCWSTR value) {
   if (!value)
     return E_INVALIDARG;
 
@@ -1893,7 +1893,7 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_IsReadOnly(BOOL* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_IsReadOnly(BOOL* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   int restriction;
   if (GetIntAttribute(ax::mojom::IntAttribute::kRestriction, &restriction)) {
@@ -1904,7 +1904,7 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_Value(BSTR* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_Value(BSTR* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   if (GetStringAttributeAsBstr(ax::mojom::StringAttribute::kValue, result))
     return S_OK;
@@ -1915,7 +1915,7 @@
 // IRangeValueProvider implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::SetValue(double value) {
+IFACEMETHODIMP AXPlatformNodeWin::SetValue(double value) {
   AXActionData data;
   data.action = ax::mojom::Action::kSetValue;
   data.value = base::NumberToString(value);
@@ -1924,7 +1924,7 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_LargeChange(double* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_LargeChange(double* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   float attribute;
   if (GetFloatAttribute(ax::mojom::FloatAttribute::kStepValueForRange,
@@ -1935,7 +1935,7 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_Maximum(double* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_Maximum(double* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   float attribute;
   if (GetFloatAttribute(ax::mojom::FloatAttribute::kMaxValueForRange,
@@ -1946,7 +1946,7 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_Minimum(double* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_Minimum(double* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   float attribute;
   if (GetFloatAttribute(ax::mojom::FloatAttribute::kMinValueForRange,
@@ -1957,7 +1957,7 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_SmallChange(double* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_SmallChange(double* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   float attribute;
   if (GetFloatAttribute(ax::mojom::FloatAttribute::kStepValueForRange,
@@ -1968,7 +1968,7 @@
   return E_FAIL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_Value(double* result) {
+IFACEMETHODIMP AXPlatformNodeWin::get_Value(double* result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
   float attribute;
   if (GetFloatAttribute(ax::mojom::FloatAttribute::kValueForRange,
@@ -1980,12 +1980,12 @@
 }
 
 // IAccessibleEx methods not implemented.
-STDMETHODIMP AXPlatformNodeWin::GetRuntimeId(SAFEARRAY** runtime_id) {
+IFACEMETHODIMP AXPlatformNodeWin::GetRuntimeId(SAFEARRAY** runtime_id) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_RUNTIME_ID);
   return E_NOTIMPL;
 }
 
-STDMETHODIMP
+IFACEMETHODIMP
 AXPlatformNodeWin::ConvertReturnedElement(IRawElementProviderSimple* element,
                                           IAccessibleEx** acc) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_CONVERT_RETURNED_ELEMENT);
@@ -1996,9 +1996,9 @@
 // IAccessibleTable methods.
 //
 
-STDMETHODIMP AXPlatformNodeWin::get_accessibleAt(LONG row,
-                                                 LONG column,
-                                                 IUnknown** accessible) {
+IFACEMETHODIMP AXPlatformNodeWin::get_accessibleAt(LONG row,
+                                                   LONG column,
+                                                   IUnknown** accessible) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACCESSIBLE_AT);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2019,7 +2019,7 @@
   return E_INVALIDARG;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_caption(IUnknown** accessible) {
+IFACEMETHODIMP AXPlatformNodeWin::get_caption(IUnknown** accessible) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_CAPTION);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2031,9 +2031,9 @@
   return S_FALSE;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_childIndex(LONG row,
-                                               LONG column,
-                                               LONG* cell_index) {
+IFACEMETHODIMP AXPlatformNodeWin::get_childIndex(LONG row,
+                                                 LONG column,
+                                                 LONG* cell_index) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_CHILD_INDEX);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2051,8 +2051,8 @@
   return E_INVALIDARG;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_columnDescription(LONG column,
-                                                      BSTR* description) {
+IFACEMETHODIMP AXPlatformNodeWin::get_columnDescription(LONG column,
+                                                        BSTR* description) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_COLUMN_DESCRIPTION);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2092,9 +2092,9 @@
   return S_FALSE;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_columnExtentAt(LONG row,
-                                                   LONG column,
-                                                   LONG* n_columns_spanned) {
+IFACEMETHODIMP AXPlatformNodeWin::get_columnExtentAt(LONG row,
+                                                     LONG column,
+                                                     LONG* n_columns_spanned) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_COLUMN_EXTENT_AT);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2110,7 +2110,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_columnHeader(
+IFACEMETHODIMP AXPlatformNodeWin::get_columnHeader(
     IAccessibleTable** accessible_table,
     LONG* starting_row_index) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_COLUMN_HEADER);
@@ -2120,8 +2120,8 @@
   return E_NOTIMPL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_columnIndex(LONG cell_index,
-                                                LONG* column_index) {
+IFACEMETHODIMP AXPlatformNodeWin::get_columnIndex(LONG cell_index,
+                                                  LONG* column_index) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_COLUMN_INDEX);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2135,7 +2135,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_nColumns(LONG* column_count) {
+IFACEMETHODIMP AXPlatformNodeWin::get_nColumns(LONG* column_count) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_COLUMNS);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2146,7 +2146,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_nRows(LONG* row_count) {
+IFACEMETHODIMP AXPlatformNodeWin::get_nRows(LONG* row_count) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_ROWS);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2157,7 +2157,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_nSelectedChildren(LONG* cell_count) {
+IFACEMETHODIMP AXPlatformNodeWin::get_nSelectedChildren(LONG* cell_count) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_SELECTED_CHILDREN);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2183,7 +2183,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_nSelectedColumns(LONG* column_count) {
+IFACEMETHODIMP AXPlatformNodeWin::get_nSelectedColumns(LONG* column_count) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_SELECTED_COLUMNS);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2214,7 +2214,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_nSelectedRows(LONG* row_count) {
+IFACEMETHODIMP AXPlatformNodeWin::get_nSelectedRows(LONG* row_count) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_SELECTED_ROWS);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2245,8 +2245,8 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_rowDescription(LONG row,
-                                                   BSTR* description) {
+IFACEMETHODIMP AXPlatformNodeWin::get_rowDescription(LONG row,
+                                                     BSTR* description) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ROW_DESCRIPTION);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2284,9 +2284,9 @@
   return S_FALSE;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_rowExtentAt(LONG row,
-                                                LONG column,
-                                                LONG* n_rows_spanned) {
+IFACEMETHODIMP AXPlatformNodeWin::get_rowExtentAt(LONG row,
+                                                  LONG column,
+                                                  LONG* n_rows_spanned) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ROW_EXTENT_AT);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2301,7 +2301,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_rowHeader(
+IFACEMETHODIMP AXPlatformNodeWin::get_rowHeader(
     IAccessibleTable** accessible_table,
     LONG* starting_column_index) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ROW_HEADER);
@@ -2311,7 +2311,8 @@
   return E_NOTIMPL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_rowIndex(LONG cell_index, LONG* row_index) {
+IFACEMETHODIMP AXPlatformNodeWin::get_rowIndex(LONG cell_index,
+                                               LONG* row_index) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2326,9 +2327,9 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_selectedChildren(LONG max_children,
-                                                     LONG** children,
-                                                     LONG* n_children) {
+IFACEMETHODIMP AXPlatformNodeWin::get_selectedChildren(LONG max_children,
+                                                       LONG** children,
+                                                       LONG* n_children) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2355,9 +2356,9 @@
                                     n_children);
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_selectedColumns(LONG max_columns,
-                                                    LONG** columns,
-                                                    LONG* n_columns) {
+IFACEMETHODIMP AXPlatformNodeWin::get_selectedColumns(LONG max_columns,
+                                                      LONG** columns,
+                                                      LONG* n_columns) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2385,9 +2386,9 @@
   return AllocateComArrayFromVector(results, max_columns, columns, n_columns);
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_selectedRows(LONG max_rows,
-                                                 LONG** rows,
-                                                 LONG* n_rows) {
+IFACEMETHODIMP AXPlatformNodeWin::get_selectedRows(LONG max_rows,
+                                                   LONG** rows,
+                                                   LONG* n_rows) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!rows || !n_rows || max_rows <= 0)
@@ -2414,7 +2415,7 @@
   return AllocateComArrayFromVector(results, max_rows, rows, n_rows);
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_summary(IUnknown** accessible) {
+IFACEMETHODIMP AXPlatformNodeWin::get_summary(IUnknown** accessible) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2426,8 +2427,8 @@
   return S_FALSE;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_isColumnSelected(LONG column,
-                                                     boolean* is_selected) {
+IFACEMETHODIMP AXPlatformNodeWin::get_isColumnSelected(LONG column,
+                                                       boolean* is_selected) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!is_selected)
@@ -2450,8 +2451,8 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_isRowSelected(LONG row,
-                                                  boolean* is_selected) {
+IFACEMETHODIMP AXPlatformNodeWin::get_isRowSelected(LONG row,
+                                                    boolean* is_selected) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!is_selected)
@@ -2474,9 +2475,9 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_isSelected(LONG row,
-                                               LONG column,
-                                               boolean* is_selected) {
+IFACEMETHODIMP AXPlatformNodeWin::get_isSelected(LONG row,
+                                                 LONG column,
+                                                 boolean* is_selected) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!is_selected)
@@ -2497,7 +2498,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_rowColumnExtentsAtIndex(
+IFACEMETHODIMP AXPlatformNodeWin::get_rowColumnExtentsAtIndex(
     LONG index,
     LONG* row,
     LONG* column,
@@ -2523,35 +2524,35 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::selectRow(LONG row) {
+IFACEMETHODIMP AXPlatformNodeWin::selectRow(LONG row) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
   return E_NOTIMPL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::selectColumn(LONG column) {
+IFACEMETHODIMP AXPlatformNodeWin::selectColumn(LONG column) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
   return E_NOTIMPL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::unselectRow(LONG row) {
+IFACEMETHODIMP AXPlatformNodeWin::unselectRow(LONG row) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
   return E_NOTIMPL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::unselectColumn(LONG column) {
+IFACEMETHODIMP AXPlatformNodeWin::unselectColumn(LONG column) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
   return E_NOTIMPL;
 }
 
-STDMETHODIMP
+IFACEMETHODIMP
 AXPlatformNodeWin::get_modelChange(IA2TableModelChange* model_change) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   return E_NOTIMPL;
@@ -2561,9 +2562,9 @@
 // IAccessibleTable2 methods.
 //
 
-STDMETHODIMP AXPlatformNodeWin::get_cellAt(LONG row,
-                                           LONG column,
-                                           IUnknown** cell) {
+IFACEMETHODIMP AXPlatformNodeWin::get_cellAt(LONG row,
+                                             LONG column,
+                                             IUnknown** cell) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(AXMode::kScreenReader);
   if (!cell)
@@ -2582,15 +2583,15 @@
   return E_INVALIDARG;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_nSelectedCells(LONG* cell_count) {
+IFACEMETHODIMP AXPlatformNodeWin::get_nSelectedCells(LONG* cell_count) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   // Note that this method does not need to set any ax mode since it
   // calls into get_nSelectedChildren() which does.
   return get_nSelectedChildren(cell_count);
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_selectedCells(IUnknown*** cells,
-                                                  LONG* n_selected_cells) {
+IFACEMETHODIMP AXPlatformNodeWin::get_selectedCells(IUnknown*** cells,
+                                                    LONG* n_selected_cells) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!cells || !n_selected_cells)
@@ -2626,12 +2627,12 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_selectedColumns(LONG** columns,
-                                                    LONG* n_columns) {
+IFACEMETHODIMP AXPlatformNodeWin::get_selectedColumns(LONG** columns,
+                                                      LONG* n_columns) {
   return get_selectedColumns(INT_MAX, columns, n_columns);
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_selectedRows(LONG** rows, LONG* n_rows) {
+IFACEMETHODIMP AXPlatformNodeWin::get_selectedRows(LONG** rows, LONG* n_rows) {
   return get_selectedRows(INT_MAX, rows, n_rows);
 }
 
@@ -2639,7 +2640,7 @@
 // IAccessibleTableCell methods.
 //
 
-STDMETHODIMP AXPlatformNodeWin::get_columnExtent(LONG* n_columns_spanned) {
+IFACEMETHODIMP AXPlatformNodeWin::get_columnExtent(LONG* n_columns_spanned) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
   if (!n_columns_spanned)
@@ -2649,7 +2650,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_columnHeaderCells(
+IFACEMETHODIMP AXPlatformNodeWin::get_columnHeaderCells(
     IUnknown*** cell_accessibles,
     LONG* n_column_header_cells) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
@@ -2695,7 +2696,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_columnIndex(LONG* column_index) {
+IFACEMETHODIMP AXPlatformNodeWin::get_columnIndex(LONG* column_index) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2706,7 +2707,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_rowExtent(LONG* n_rows_spanned) {
+IFACEMETHODIMP AXPlatformNodeWin::get_rowExtent(LONG* n_rows_spanned) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2717,8 +2718,9 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_rowHeaderCells(IUnknown*** cell_accessibles,
-                                                   LONG* n_row_header_cells) {
+IFACEMETHODIMP AXPlatformNodeWin::get_rowHeaderCells(
+    IUnknown*** cell_accessibles,
+    LONG* n_row_header_cells) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2763,7 +2765,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_rowIndex(LONG* row_index) {
+IFACEMETHODIMP AXPlatformNodeWin::get_rowIndex(LONG* row_index) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2774,7 +2776,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_isSelected(boolean* is_selected) {
+IFACEMETHODIMP AXPlatformNodeWin::get_isSelected(boolean* is_selected) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2785,11 +2787,11 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_rowColumnExtents(LONG* row_index,
-                                                     LONG* column_index,
-                                                     LONG* row_extents,
-                                                     LONG* column_extents,
-                                                     boolean* is_selected) {
+IFACEMETHODIMP AXPlatformNodeWin::get_rowColumnExtents(LONG* row_index,
+                                                       LONG* column_index,
+                                                       LONG* row_extents,
+                                                       LONG* column_extents,
+                                                       boolean* is_selected) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2807,7 +2809,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_table(IUnknown** table) {
+IFACEMETHODIMP AXPlatformNodeWin::get_table(IUnknown** table) {
   // TODO(dougt) WIN_ACCESSIBILITY_API_HISTOGRAM?
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
@@ -2833,7 +2835,7 @@
 // IAccessibleText
 //
 
-STDMETHODIMP AXPlatformNodeWin::get_nCharacters(LONG* n_characters) {
+IFACEMETHODIMP AXPlatformNodeWin::get_nCharacters(LONG* n_characters) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_CHARACTERS);
   COM_OBJECT_VALIDATE_1_ARG(n_characters);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes |
@@ -2845,7 +2847,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_caretOffset(LONG* offset) {
+IFACEMETHODIMP AXPlatformNodeWin::get_caretOffset(LONG* offset) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_CARET_OFFSET);
   COM_OBJECT_VALIDATE_1_ARG(offset);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
@@ -2864,7 +2866,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_nSelections(LONG* n_selections) {
+IFACEMETHODIMP AXPlatformNodeWin::get_nSelections(LONG* n_selections) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_SELECTIONS);
   COM_OBJECT_VALIDATE_1_ARG(n_selections);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
@@ -2879,9 +2881,9 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_selection(LONG selection_index,
-                                              LONG* start_offset,
-                                              LONG* end_offset) {
+IFACEMETHODIMP AXPlatformNodeWin::get_selection(LONG selection_index,
+                                                LONG* start_offset,
+                                                LONG* end_offset) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_SELECTION);
   COM_OBJECT_VALIDATE_2_ARGS(start_offset, end_offset);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
@@ -2910,9 +2912,9 @@
   return E_INVALIDARG;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_text(LONG start_offset,
-                                         LONG end_offset,
-                                         BSTR* text) {
+IFACEMETHODIMP AXPlatformNodeWin::get_text(LONG start_offset,
+                                           LONG end_offset,
+                                           BSTR* text) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_TEXT);
   COM_OBJECT_VALIDATE_1_ARG(text);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
@@ -2939,10 +2941,11 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_textAtOffset(
+IFACEMETHODIMP AXPlatformNodeWin::get_textAtOffset(
     LONG offset,
     enum IA2TextBoundaryType boundary_type,
-    LONG* start_offset, LONG* end_offset,
+    LONG* start_offset,
+    LONG* end_offset,
     BSTR* text) {
   COM_OBJECT_VALIDATE_3_ARGS(start_offset, end_offset, text);
   // The IAccessible2 spec says we don't have to implement the "sentence"
@@ -2963,10 +2966,11 @@
   return get_text(*start_offset, *end_offset, text);
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_textBeforeOffset(
+IFACEMETHODIMP AXPlatformNodeWin::get_textBeforeOffset(
     LONG offset,
     enum IA2TextBoundaryType boundary_type,
-    LONG* start_offset, LONG* end_offset,
+    LONG* start_offset,
+    LONG* end_offset,
     BSTR* text) {
   if (!start_offset || !end_offset || !text)
     return E_INVALIDARG;
@@ -2988,10 +2992,11 @@
   return get_text(*start_offset, *end_offset, text);
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_textAfterOffset(
+IFACEMETHODIMP AXPlatformNodeWin::get_textAfterOffset(
     LONG offset,
     enum IA2TextBoundaryType boundary_type,
-    LONG* start_offset, LONG* end_offset,
+    LONG* start_offset,
+    LONG* end_offset,
     BSTR* text) {
   if (!start_offset || !end_offset || !text)
     return E_INVALIDARG;
@@ -3013,8 +3018,11 @@
   return get_text(*start_offset, *end_offset, text);
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_offsetAtPoint(
-    LONG x, LONG y, enum IA2CoordinateType coord_type, LONG* offset) {
+IFACEMETHODIMP AXPlatformNodeWin::get_offsetAtPoint(
+    LONG x,
+    LONG y,
+    enum IA2CoordinateType coord_type,
+    LONG* offset) {
   COM_OBJECT_VALIDATE_1_ARG(offset);
   // We don't support this method, but we have to return something
   // rather than E_NOTIMPL or screen readers will complain.
@@ -3022,8 +3030,8 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::addSelection(LONG start_offset,
-                                             LONG end_offset) {
+IFACEMETHODIMP AXPlatformNodeWin::addSelection(LONG start_offset,
+                                               LONG end_offset) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ADD_SELECTION);
   COM_OBJECT_VALIDATE();
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
@@ -3032,7 +3040,7 @@
   return setSelection(0, start_offset, end_offset);
 }
 
-STDMETHODIMP AXPlatformNodeWin::removeSelection(LONG selection_index) {
+IFACEMETHODIMP AXPlatformNodeWin::removeSelection(LONG selection_index) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_REMOVE_SELECTION);
   COM_OBJECT_VALIDATE();
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
@@ -3044,13 +3052,13 @@
   return setCaretOffset(GetIntAttribute(ax::mojom::IntAttribute::kTextSelEnd));
 }
 
-STDMETHODIMP AXPlatformNodeWin::setCaretOffset(LONG offset) {
+IFACEMETHODIMP AXPlatformNodeWin::setCaretOffset(LONG offset) {
   return setSelection(0, offset, offset);
 }
 
-STDMETHODIMP AXPlatformNodeWin::setSelection(LONG selection_index,
-                                             LONG start_offset,
-                                             LONG end_offset) {
+IFACEMETHODIMP AXPlatformNodeWin::setSelection(LONG selection_index,
+                                               LONG start_offset,
+                                               LONG end_offset) {
   if (selection_index != 0)
     return E_INVALIDARG;
 
@@ -3076,13 +3084,13 @@
 // IAccessibleText methods not implemented.
 //
 
-STDMETHODIMP AXPlatformNodeWin::get_newText(IA2TextSegment* new_text) {
+IFACEMETHODIMP AXPlatformNodeWin::get_newText(IA2TextSegment* new_text) {
   return E_NOTIMPL;
 }
-STDMETHODIMP AXPlatformNodeWin::get_oldText(IA2TextSegment* old_text) {
+IFACEMETHODIMP AXPlatformNodeWin::get_oldText(IA2TextSegment* old_text) {
   return E_NOTIMPL;
 }
-STDMETHODIMP AXPlatformNodeWin::get_characterExtents(
+IFACEMETHODIMP AXPlatformNodeWin::get_characterExtents(
     LONG offset,
     enum IA2CoordinateType coord_type,
     LONG* x,
@@ -3091,13 +3099,13 @@
     LONG* height) {
   return E_NOTIMPL;
 }
-STDMETHODIMP AXPlatformNodeWin::scrollSubstringTo(
+IFACEMETHODIMP AXPlatformNodeWin::scrollSubstringTo(
     LONG start_index,
     LONG end_index,
     enum IA2ScrollType scroll_type) {
   return E_NOTIMPL;
 }
-STDMETHODIMP AXPlatformNodeWin::scrollSubstringToPoint(
+IFACEMETHODIMP AXPlatformNodeWin::scrollSubstringToPoint(
     LONG start_index,
     LONG end_index,
     enum IA2CoordinateType coordinate_type,
@@ -3105,10 +3113,10 @@
     LONG y) {
   return E_NOTIMPL;
 }
-STDMETHODIMP AXPlatformNodeWin::get_attributes(LONG offset,
-                                               LONG* start_offset,
-                                               LONG* end_offset,
-                                               BSTR* text_attributes) {
+IFACEMETHODIMP AXPlatformNodeWin::get_attributes(LONG offset,
+                                                 LONG* start_offset,
+                                                 LONG* end_offset,
+                                                 BSTR* text_attributes) {
   return E_NOTIMPL;
 }
 
@@ -3116,8 +3124,8 @@
 // IRawElementProviderSimple implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::GetPatternProvider(PATTERNID pattern_id,
-                                                   IUnknown** result) {
+IFACEMETHODIMP AXPlatformNodeWin::GetPatternProvider(PATTERNID pattern_id,
+                                                     IUnknown** result) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_PATTERN_PROVIDER);
   COM_OBJECT_VALIDATE_1_ARG(result);
 
@@ -3241,8 +3249,8 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::GetPropertyValue(PROPERTYID property_id,
-                                                 VARIANT* result) {
+IFACEMETHODIMP AXPlatformNodeWin::GetPropertyValue(PROPERTYID property_id,
+                                                   VARIANT* result) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_PROPERTY_VALUE);
   COM_OBJECT_VALIDATE_1_ARG(result);
 
@@ -3415,12 +3423,12 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_ProviderOptions(ProviderOptions* ret) {
+IFACEMETHODIMP AXPlatformNodeWin::get_ProviderOptions(ProviderOptions* ret) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_PROVIDER_OPTIONS);
   return E_NOTIMPL;
 }
 
-STDMETHODIMP AXPlatformNodeWin::get_HostRawElementProvider(
+IFACEMETHODIMP AXPlatformNodeWin::get_HostRawElementProvider(
     IRawElementProviderSimple** provider) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_HOST_RAW_ELEMENT_PROVIDER);
   return E_NOTIMPL;
@@ -3430,8 +3438,9 @@
 // IServiceProvider implementation.
 //
 
-STDMETHODIMP AXPlatformNodeWin::QueryService(
-    REFGUID guidService, REFIID riid, void** object) {
+IFACEMETHODIMP AXPlatformNodeWin::QueryService(REFGUID guidService,
+                                               REFIID riid,
+                                               void** object) {
   COM_OBJECT_VALIDATE_1_ARG(object);
 
   if (riid == IID_IAccessible2) {
diff --git a/ui/accessibility/platform/ax_platform_node_win.h b/ui/accessibility/platform/ax_platform_node_win.h
index b5a8c40..3c8e560 100644
--- a/ui/accessibility/platform/ax_platform_node_win.h
+++ b/ui/accessibility/platform/ax_platform_node_win.h
@@ -317,282 +317,286 @@
   //
 
   // Retrieves the child element or child object at a given point on the screen.
-  STDMETHODIMP accHitTest(LONG x_left, LONG y_top, VARIANT* child) override;
+  IFACEMETHODIMP accHitTest(LONG x_left, LONG y_top, VARIANT* child) override;
 
   // Performs the object's default action.
-  STDMETHODIMP accDoDefaultAction(VARIANT var_id) override;
+  IFACEMETHODIMP accDoDefaultAction(VARIANT var_id) override;
 
   // Retrieves the specified object's current screen location.
-  STDMETHODIMP accLocation(LONG* x_left,
-                           LONG* y_top,
-                           LONG* width,
-                           LONG* height,
-                           VARIANT var_id) override;
+  IFACEMETHODIMP accLocation(LONG* x_left,
+                             LONG* y_top,
+                             LONG* width,
+                             LONG* height,
+                             VARIANT var_id) override;
 
   // Traverses to another UI element and retrieves the object.
-  STDMETHODIMP accNavigate(LONG nav_dir, VARIANT start, VARIANT* end) override;
+  IFACEMETHODIMP accNavigate(LONG nav_dir,
+                             VARIANT start,
+                             VARIANT* end) override;
 
   // Retrieves an IDispatch interface pointer for the specified child.
-  STDMETHODIMP get_accChild(VARIANT var_child, IDispatch** disp_child) override;
+  IFACEMETHODIMP get_accChild(VARIANT var_child,
+                              IDispatch** disp_child) override;
 
   // Retrieves the number of accessible children.
-  STDMETHODIMP get_accChildCount(LONG* child_count) override;
+  IFACEMETHODIMP get_accChildCount(LONG* child_count) override;
 
   // Retrieves a string that describes the object's default action.
-  STDMETHODIMP get_accDefaultAction(VARIANT var_id,
-                                    BSTR* default_action) override;
+  IFACEMETHODIMP get_accDefaultAction(VARIANT var_id,
+                                      BSTR* default_action) override;
 
   // Retrieves the tooltip description.
-  STDMETHODIMP get_accDescription(VARIANT var_id, BSTR* desc) override;
+  IFACEMETHODIMP get_accDescription(VARIANT var_id, BSTR* desc) override;
 
   // Retrieves the object that has the keyboard focus.
-  STDMETHODIMP get_accFocus(VARIANT* focus_child) override;
+  IFACEMETHODIMP get_accFocus(VARIANT* focus_child) override;
 
   // Retrieves the specified object's shortcut.
-  STDMETHODIMP get_accKeyboardShortcut(VARIANT var_id,
-                                       BSTR* access_key) override;
+  IFACEMETHODIMP get_accKeyboardShortcut(VARIANT var_id,
+                                         BSTR* access_key) override;
 
   // Retrieves the name of the specified object.
-  STDMETHODIMP get_accName(VARIANT var_id, BSTR* name) override;
+  IFACEMETHODIMP get_accName(VARIANT var_id, BSTR* name) override;
 
   // Retrieves the IDispatch interface of the object's parent.
-  STDMETHODIMP get_accParent(IDispatch** disp_parent) override;
+  IFACEMETHODIMP get_accParent(IDispatch** disp_parent) override;
 
   // Retrieves information describing the role of the specified object.
-  STDMETHODIMP get_accRole(VARIANT var_id, VARIANT* role) override;
+  IFACEMETHODIMP get_accRole(VARIANT var_id, VARIANT* role) override;
 
   // Retrieves the current state of the specified object.
-  STDMETHODIMP get_accState(VARIANT var_id, VARIANT* state) override;
+  IFACEMETHODIMP get_accState(VARIANT var_id, VARIANT* state) override;
 
   // Gets the help string for the specified object.
-  STDMETHODIMP get_accHelp(VARIANT var_id, BSTR* help) override;
+  IFACEMETHODIMP get_accHelp(VARIANT var_id, BSTR* help) override;
 
   // Retrieve or set the string value associated with the specified object.
   // Setting the value is not typically used by screen readers, but it's
   // used frequently by automation software.
-  STDMETHODIMP get_accValue(VARIANT var_id, BSTR* value) override;
-  STDMETHODIMP put_accValue(VARIANT var_id, BSTR new_value) override;
+  IFACEMETHODIMP get_accValue(VARIANT var_id, BSTR* value) override;
+  IFACEMETHODIMP put_accValue(VARIANT var_id, BSTR new_value) override;
 
   // IAccessible methods not implemented.
-  STDMETHODIMP get_accSelection(VARIANT* selected) override;
-  STDMETHODIMP accSelect(LONG flags_sel, VARIANT var_id) override;
-  STDMETHODIMP get_accHelpTopic(BSTR* help_file,
-                                VARIANT var_id,
-                                LONG* topic_id) override;
-  STDMETHODIMP put_accName(VARIANT var_id, BSTR put_name) override;
+  IFACEMETHODIMP get_accSelection(VARIANT* selected) override;
+  IFACEMETHODIMP accSelect(LONG flags_sel, VARIANT var_id) override;
+  IFACEMETHODIMP get_accHelpTopic(BSTR* help_file,
+                                  VARIANT var_id,
+                                  LONG* topic_id) override;
+  IFACEMETHODIMP put_accName(VARIANT var_id, BSTR put_name) override;
 
   //
   // IAccessible2 methods.
   //
 
-  STDMETHODIMP role(LONG* role) override;
+  IFACEMETHODIMP role(LONG* role) override;
 
-  STDMETHODIMP get_states(AccessibleStates* states) override;
+  IFACEMETHODIMP get_states(AccessibleStates* states) override;
 
-  STDMETHODIMP get_uniqueID(LONG* unique_id) override;
+  IFACEMETHODIMP get_uniqueID(LONG* unique_id) override;
 
-  STDMETHODIMP get_windowHandle(HWND* window_handle) override;
+  IFACEMETHODIMP get_windowHandle(HWND* window_handle) override;
 
-  STDMETHODIMP get_relationTargetsOfType(BSTR type,
-                                         LONG max_targets,
-                                         IUnknown*** targets,
-                                         LONG* n_targets) override;
+  IFACEMETHODIMP get_relationTargetsOfType(BSTR type,
+                                           LONG max_targets,
+                                           IUnknown*** targets,
+                                           LONG* n_targets) override;
 
-  STDMETHODIMP get_attributes(BSTR* attributes) override;
+  IFACEMETHODIMP get_attributes(BSTR* attributes) override;
 
-  STDMETHODIMP get_indexInParent(LONG* index_in_parent) override;
+  IFACEMETHODIMP get_indexInParent(LONG* index_in_parent) override;
 
-  STDMETHODIMP get_nRelations(LONG* n_relations) override;
+  IFACEMETHODIMP get_nRelations(LONG* n_relations) override;
 
-  STDMETHODIMP get_relation(LONG relation_index,
-                            IAccessibleRelation** relation) override;
+  IFACEMETHODIMP get_relation(LONG relation_index,
+                              IAccessibleRelation** relation) override;
 
-  STDMETHODIMP get_relations(LONG max_relations,
-                             IAccessibleRelation** relations,
-                             LONG* n_relations) override;
+  IFACEMETHODIMP get_relations(LONG max_relations,
+                               IAccessibleRelation** relations,
+                               LONG* n_relations) override;
 
-  STDMETHODIMP get_attribute(BSTR name, VARIANT* attribute) override;
-  STDMETHODIMP get_extendedRole(BSTR* extended_role) override;
-  STDMETHODIMP scrollTo(enum IA2ScrollType scroll_type) override;
-  STDMETHODIMP scrollToPoint(enum IA2CoordinateType coordinate_type,
-                             LONG x,
-                             LONG y) override;
-  STDMETHODIMP get_groupPosition(LONG* group_level,
-                                 LONG* similar_items_in_group,
-                                 LONG* position_in_group) override;
-  STDMETHODIMP get_localizedExtendedRole(
+  IFACEMETHODIMP get_attribute(BSTR name, VARIANT* attribute) override;
+  IFACEMETHODIMP get_extendedRole(BSTR* extended_role) override;
+  IFACEMETHODIMP scrollTo(enum IA2ScrollType scroll_type) override;
+  IFACEMETHODIMP scrollToPoint(enum IA2CoordinateType coordinate_type,
+                               LONG x,
+                               LONG y) override;
+  IFACEMETHODIMP get_groupPosition(LONG* group_level,
+                                   LONG* similar_items_in_group,
+                                   LONG* position_in_group) override;
+  IFACEMETHODIMP get_localizedExtendedRole(
       BSTR* localized_extended_role) override;
-  STDMETHODIMP get_nExtendedStates(LONG* n_extended_states) override;
-  STDMETHODIMP get_extendedStates(LONG max_extended_states,
-                                  BSTR** extended_states,
-                                  LONG* n_extended_states) override;
-  STDMETHODIMP get_localizedExtendedStates(
+  IFACEMETHODIMP get_nExtendedStates(LONG* n_extended_states) override;
+  IFACEMETHODIMP get_extendedStates(LONG max_extended_states,
+                                    BSTR** extended_states,
+                                    LONG* n_extended_states) override;
+  IFACEMETHODIMP get_localizedExtendedStates(
       LONG max_localized_extended_states,
       BSTR** localized_extended_states,
       LONG* n_localized_extended_states) override;
-  STDMETHODIMP get_locale(IA2Locale* locale) override;
-  STDMETHODIMP get_accessibleWithCaret(IUnknown** accessible,
-                                       LONG* caret_offset) override;
+  IFACEMETHODIMP get_locale(IA2Locale* locale) override;
+  IFACEMETHODIMP get_accessibleWithCaret(IUnknown** accessible,
+                                         LONG* caret_offset) override;
 
   //
   // IAccessibleEx methods.
   //
 
-  STDMETHODIMP GetObjectForChild(LONG child_id,
-                                 IAccessibleEx** result) override;
+  IFACEMETHODIMP GetObjectForChild(LONG child_id,
+                                   IAccessibleEx** result) override;
 
-  STDMETHODIMP GetIAccessiblePair(IAccessible** accessible,
-                                  LONG* child_id) override;
+  IFACEMETHODIMP GetIAccessiblePair(IAccessible** accessible,
+                                    LONG* child_id) override;
 
   //
   // IExpandCollapseProvider methods.
   //
 
-  STDMETHODIMP Collapse() override;
+  IFACEMETHODIMP Collapse() override;
 
-  STDMETHODIMP Expand() override;
+  IFACEMETHODIMP Expand() override;
 
-  STDMETHODIMP get_ExpandCollapseState(ExpandCollapseState* result) override;
+  IFACEMETHODIMP get_ExpandCollapseState(ExpandCollapseState* result) override;
 
   //
   // IGridItemProvider methods.
   //
 
-  STDMETHODIMP get_Column(int* result) override;
+  IFACEMETHODIMP get_Column(int* result) override;
 
-  STDMETHODIMP get_ColumnSpan(int* result) override;
+  IFACEMETHODIMP get_ColumnSpan(int* result) override;
 
-  STDMETHODIMP get_ContainingGrid(IRawElementProviderSimple** result) override;
+  IFACEMETHODIMP get_ContainingGrid(
+      IRawElementProviderSimple** result) override;
 
-  STDMETHODIMP get_Row(int* result) override;
+  IFACEMETHODIMP get_Row(int* result) override;
 
-  STDMETHODIMP get_RowSpan(int* result) override;
+  IFACEMETHODIMP get_RowSpan(int* result) override;
 
   //
   // IGridProvider methods.
   //
 
-  STDMETHODIMP GetItem(int row,
-                       int column,
-                       IRawElementProviderSimple** result) override;
+  IFACEMETHODIMP GetItem(int row,
+                         int column,
+                         IRawElementProviderSimple** result) override;
 
-  STDMETHODIMP get_RowCount(int* result) override;
+  IFACEMETHODIMP get_RowCount(int* result) override;
 
-  STDMETHODIMP get_ColumnCount(int* result) override;
+  IFACEMETHODIMP get_ColumnCount(int* result) override;
 
   //
   // IScrollItemProvider methods.
   //
 
-  STDMETHODIMP ScrollIntoView() override;
+  IFACEMETHODIMP ScrollIntoView() override;
 
   //
   // IScrollProvider methods.
   //
 
-  STDMETHODIMP Scroll(ScrollAmount horizontal_amount,
-                      ScrollAmount vertical_amount) override;
+  IFACEMETHODIMP Scroll(ScrollAmount horizontal_amount,
+                        ScrollAmount vertical_amount) override;
 
-  STDMETHODIMP SetScrollPercent(double horizontal_percent,
-                                double vertical_percent) override;
+  IFACEMETHODIMP SetScrollPercent(double horizontal_percent,
+                                  double vertical_percent) override;
 
-  STDMETHODIMP get_HorizontallyScrollable(BOOL* result) override;
+  IFACEMETHODIMP get_HorizontallyScrollable(BOOL* result) override;
 
-  STDMETHODIMP get_HorizontalScrollPercent(double* result) override;
+  IFACEMETHODIMP get_HorizontalScrollPercent(double* result) override;
 
   // Horizontal size of the viewable region as a percentage of the total content
   // area.
-  STDMETHODIMP get_HorizontalViewSize(double* result) override;
+  IFACEMETHODIMP get_HorizontalViewSize(double* result) override;
 
-  STDMETHODIMP get_VerticallyScrollable(BOOL* result) override;
+  IFACEMETHODIMP get_VerticallyScrollable(BOOL* result) override;
 
-  STDMETHODIMP get_VerticalScrollPercent(double* result) override;
+  IFACEMETHODIMP get_VerticalScrollPercent(double* result) override;
 
   // Vertical size of the viewable region as a percentage of the total content
   // area.
-  STDMETHODIMP get_VerticalViewSize(double* result) override;
+  IFACEMETHODIMP get_VerticalViewSize(double* result) override;
 
   //
   // ISelectionItemProvider methods.
   //
 
-  STDMETHODIMP AddToSelection() override;
+  IFACEMETHODIMP AddToSelection() override;
 
-  STDMETHODIMP RemoveFromSelection() override;
+  IFACEMETHODIMP RemoveFromSelection() override;
 
-  STDMETHODIMP Select() override;
+  IFACEMETHODIMP Select() override;
 
-  STDMETHODIMP get_IsSelected(BOOL* result) override;
+  IFACEMETHODIMP get_IsSelected(BOOL* result) override;
 
-  STDMETHODIMP get_SelectionContainer(
+  IFACEMETHODIMP get_SelectionContainer(
       IRawElementProviderSimple** result) override;
 
   //
   // ISelectionProvider methods.
   //
 
-  STDMETHODIMP GetSelection(SAFEARRAY** result) override;
+  IFACEMETHODIMP GetSelection(SAFEARRAY** result) override;
 
-  STDMETHODIMP get_CanSelectMultiple(BOOL* result) override;
+  IFACEMETHODIMP get_CanSelectMultiple(BOOL* result) override;
 
-  STDMETHODIMP get_IsSelectionRequired(BOOL* result) override;
+  IFACEMETHODIMP get_IsSelectionRequired(BOOL* result) override;
 
   //
   // ITableItemProvider methods.
   //
 
-  STDMETHODIMP GetColumnHeaderItems(SAFEARRAY** result) override;
+  IFACEMETHODIMP GetColumnHeaderItems(SAFEARRAY** result) override;
 
-  STDMETHODIMP GetRowHeaderItems(SAFEARRAY** result) override;
+  IFACEMETHODIMP GetRowHeaderItems(SAFEARRAY** result) override;
 
   //
   // ITableProvider methods.
   //
 
-  STDMETHODIMP GetColumnHeaders(SAFEARRAY** result) override;
+  IFACEMETHODIMP GetColumnHeaders(SAFEARRAY** result) override;
 
-  STDMETHODIMP GetRowHeaders(SAFEARRAY** result) override;
+  IFACEMETHODIMP GetRowHeaders(SAFEARRAY** result) override;
 
-  STDMETHODIMP get_RowOrColumnMajor(RowOrColumnMajor* result) override;
+  IFACEMETHODIMP get_RowOrColumnMajor(RowOrColumnMajor* result) override;
 
   //
   // IToggleProvider methods.
   //
 
-  STDMETHODIMP Toggle() override;
+  IFACEMETHODIMP Toggle() override;
 
-  STDMETHODIMP get_ToggleState(ToggleState* result) override;
+  IFACEMETHODIMP get_ToggleState(ToggleState* result) override;
 
   //
   // IValueProvider methods.
   //
 
-  STDMETHODIMP SetValue(LPCWSTR val) override;
+  IFACEMETHODIMP SetValue(LPCWSTR val) override;
 
-  STDMETHODIMP get_IsReadOnly(BOOL* result) override;
+  IFACEMETHODIMP get_IsReadOnly(BOOL* result) override;
 
-  STDMETHODIMP get_Value(BSTR* result) override;
+  IFACEMETHODIMP get_Value(BSTR* result) override;
 
   //
   // IRangeValueProvider methods.
   //
 
-  STDMETHODIMP SetValue(double val) override;
+  IFACEMETHODIMP SetValue(double val) override;
 
-  STDMETHODIMP get_LargeChange(double* result) override;
+  IFACEMETHODIMP get_LargeChange(double* result) override;
 
-  STDMETHODIMP get_Maximum(double* result) override;
+  IFACEMETHODIMP get_Maximum(double* result) override;
 
-  STDMETHODIMP get_Minimum(double* result) override;
+  IFACEMETHODIMP get_Minimum(double* result) override;
 
-  STDMETHODIMP get_SmallChange(double* result) override;
+  IFACEMETHODIMP get_SmallChange(double* result) override;
 
-  STDMETHODIMP get_Value(double* result) override;
+  IFACEMETHODIMP get_Value(double* result) override;
 
   // IAccessibleEx methods not implemented.
-  STDMETHODIMP GetRuntimeId(SAFEARRAY** runtime_id) override;
+  IFACEMETHODIMP GetRuntimeId(SAFEARRAY** runtime_id) override;
 
-  STDMETHODIMP
+  IFACEMETHODIMP
   ConvertReturnedElement(IRawElementProviderSimple* element,
                          IAccessibleEx** acc) override;
 
@@ -600,42 +604,42 @@
   // IAccessibleText methods.
   //
 
-  STDMETHODIMP get_nCharacters(LONG* n_characters) override;
+  IFACEMETHODIMP get_nCharacters(LONG* n_characters) override;
 
-  STDMETHODIMP get_caretOffset(LONG* offset) override;
+  IFACEMETHODIMP get_caretOffset(LONG* offset) override;
 
-  STDMETHODIMP get_nSelections(LONG* n_selections) override;
+  IFACEMETHODIMP get_nSelections(LONG* n_selections) override;
 
-  STDMETHODIMP get_selection(LONG selection_index,
-                             LONG* start_offset,
-                             LONG* end_offset) override;
+  IFACEMETHODIMP get_selection(LONG selection_index,
+                               LONG* start_offset,
+                               LONG* end_offset) override;
 
-  STDMETHODIMP get_text(LONG start_offset,
-                        LONG end_offset,
-                        BSTR* text) override;
+  IFACEMETHODIMP get_text(LONG start_offset,
+                          LONG end_offset,
+                          BSTR* text) override;
 
-  STDMETHODIMP get_textAtOffset(LONG offset,
-                                enum IA2TextBoundaryType boundary_type,
-                                LONG* start_offset,
-                                LONG* end_offset,
-                                BSTR* text) override;
+  IFACEMETHODIMP get_textAtOffset(LONG offset,
+                                  enum IA2TextBoundaryType boundary_type,
+                                  LONG* start_offset,
+                                  LONG* end_offset,
+                                  BSTR* text) override;
 
-  STDMETHODIMP get_textBeforeOffset(LONG offset,
-                                    enum IA2TextBoundaryType boundary_type,
-                                    LONG* start_offset,
-                                    LONG* end_offset,
-                                    BSTR* text) override;
+  IFACEMETHODIMP get_textBeforeOffset(LONG offset,
+                                      enum IA2TextBoundaryType boundary_type,
+                                      LONG* start_offset,
+                                      LONG* end_offset,
+                                      BSTR* text) override;
 
-  STDMETHODIMP get_textAfterOffset(LONG offset,
-                                   enum IA2TextBoundaryType boundary_type,
-                                   LONG* start_offset,
-                                   LONG* end_offset,
-                                   BSTR* text) override;
+  IFACEMETHODIMP get_textAfterOffset(LONG offset,
+                                     enum IA2TextBoundaryType boundary_type,
+                                     LONG* start_offset,
+                                     LONG* end_offset,
+                                     BSTR* text) override;
 
-  STDMETHODIMP get_offsetAtPoint(LONG x,
-                                 LONG y,
-                                 enum IA2CoordinateType coord_type,
-                                 LONG* offset) override;
+  IFACEMETHODIMP get_offsetAtPoint(LONG x,
+                                   LONG y,
+                                   enum IA2CoordinateType coord_type,
+                                   LONG* offset) override;
 
   //
   // IAccessibleTable methods.
@@ -643,73 +647,73 @@
 
   // get_description - also used by IAccessibleImage
 
-  STDMETHODIMP get_accessibleAt(LONG row,
-                                LONG column,
-                                IUnknown** accessible) override;
+  IFACEMETHODIMP get_accessibleAt(LONG row,
+                                  LONG column,
+                                  IUnknown** accessible) override;
 
-  STDMETHODIMP get_caption(IUnknown** accessible) override;
+  IFACEMETHODIMP get_caption(IUnknown** accessible) override;
 
-  STDMETHODIMP get_childIndex(LONG row_index,
-                              LONG column_index,
-                              LONG* cell_index) override;
+  IFACEMETHODIMP get_childIndex(LONG row_index,
+                                LONG column_index,
+                                LONG* cell_index) override;
 
-  STDMETHODIMP get_columnDescription(LONG column, BSTR* description) override;
+  IFACEMETHODIMP get_columnDescription(LONG column, BSTR* description) override;
 
-  STDMETHODIMP
+  IFACEMETHODIMP
   get_columnExtentAt(LONG row, LONG column, LONG* n_columns_spanned) override;
 
-  STDMETHODIMP
+  IFACEMETHODIMP
   get_columnHeader(IAccessibleTable** accessible_table,
                    LONG* starting_row_index) override;
 
-  STDMETHODIMP get_columnIndex(LONG cell_index, LONG* column_index) override;
+  IFACEMETHODIMP get_columnIndex(LONG cell_index, LONG* column_index) override;
 
-  STDMETHODIMP get_nColumns(LONG* column_count) override;
+  IFACEMETHODIMP get_nColumns(LONG* column_count) override;
 
-  STDMETHODIMP get_nRows(LONG* row_count) override;
+  IFACEMETHODIMP get_nRows(LONG* row_count) override;
 
-  STDMETHODIMP get_nSelectedChildren(LONG* cell_count) override;
+  IFACEMETHODIMP get_nSelectedChildren(LONG* cell_count) override;
 
-  STDMETHODIMP get_nSelectedColumns(LONG* column_count) override;
+  IFACEMETHODIMP get_nSelectedColumns(LONG* column_count) override;
 
-  STDMETHODIMP get_nSelectedRows(LONG* row_count) override;
+  IFACEMETHODIMP get_nSelectedRows(LONG* row_count) override;
 
-  STDMETHODIMP get_rowDescription(LONG row, BSTR* description) override;
+  IFACEMETHODIMP get_rowDescription(LONG row, BSTR* description) override;
 
-  STDMETHODIMP get_rowExtentAt(LONG row,
-                               LONG column,
-                               LONG* n_rows_spanned) override;
+  IFACEMETHODIMP get_rowExtentAt(LONG row,
+                                 LONG column,
+                                 LONG* n_rows_spanned) override;
 
-  STDMETHODIMP
+  IFACEMETHODIMP
   get_rowHeader(IAccessibleTable** accessible_table,
                 LONG* starting_column_index) override;
 
-  STDMETHODIMP get_rowIndex(LONG cell_index, LONG* row_index) override;
+  IFACEMETHODIMP get_rowIndex(LONG cell_index, LONG* row_index) override;
 
-  STDMETHODIMP get_selectedChildren(LONG max_children,
-                                    LONG** children,
-                                    LONG* n_children) override;
+  IFACEMETHODIMP get_selectedChildren(LONG max_children,
+                                      LONG** children,
+                                      LONG* n_children) override;
 
-  STDMETHODIMP get_selectedColumns(LONG max_columns,
-                                   LONG** columns,
-                                   LONG* n_columns) override;
+  IFACEMETHODIMP get_selectedColumns(LONG max_columns,
+                                     LONG** columns,
+                                     LONG* n_columns) override;
 
-  STDMETHODIMP get_selectedRows(LONG max_rows,
-                                LONG** rows,
-                                LONG* n_rows) override;
+  IFACEMETHODIMP get_selectedRows(LONG max_rows,
+                                  LONG** rows,
+                                  LONG* n_rows) override;
 
-  STDMETHODIMP get_summary(IUnknown** accessible) override;
+  IFACEMETHODIMP get_summary(IUnknown** accessible) override;
 
-  STDMETHODIMP
+  IFACEMETHODIMP
   get_isColumnSelected(LONG column, boolean* is_selected) override;
 
-  STDMETHODIMP get_isRowSelected(LONG row, boolean* is_selected) override;
+  IFACEMETHODIMP get_isRowSelected(LONG row, boolean* is_selected) override;
 
-  STDMETHODIMP get_isSelected(LONG row,
-                              LONG column,
-                              boolean* is_selected) override;
+  IFACEMETHODIMP get_isSelected(LONG row,
+                                LONG column,
+                                boolean* is_selected) override;
 
-  STDMETHODIMP
+  IFACEMETHODIMP
   get_rowColumnExtentsAtIndex(LONG index,
                               LONG* row,
                               LONG* column,
@@ -717,15 +721,15 @@
                               LONG* column_extents,
                               boolean* is_selected) override;
 
-  STDMETHODIMP selectRow(LONG row) override;
+  IFACEMETHODIMP selectRow(LONG row) override;
 
-  STDMETHODIMP selectColumn(LONG column) override;
+  IFACEMETHODIMP selectColumn(LONG column) override;
 
-  STDMETHODIMP unselectRow(LONG row) override;
+  IFACEMETHODIMP unselectRow(LONG row) override;
 
-  STDMETHODIMP unselectColumn(LONG column) override;
+  IFACEMETHODIMP unselectColumn(LONG column) override;
 
-  STDMETHODIMP
+  IFACEMETHODIMP
   get_modelChange(IA2TableModelChange* model_change) override;
 
   //
@@ -735,105 +739,105 @@
   // unique ones are included here.)
   //
 
-  STDMETHODIMP get_cellAt(LONG row, LONG column, IUnknown** cell) override;
+  IFACEMETHODIMP get_cellAt(LONG row, LONG column, IUnknown** cell) override;
 
-  STDMETHODIMP get_nSelectedCells(LONG* cell_count) override;
+  IFACEMETHODIMP get_nSelectedCells(LONG* cell_count) override;
 
-  STDMETHODIMP
+  IFACEMETHODIMP
   get_selectedCells(IUnknown*** cells, LONG* n_selected_cells) override;
 
-  STDMETHODIMP get_selectedColumns(LONG** columns, LONG* n_columns) override;
+  IFACEMETHODIMP get_selectedColumns(LONG** columns, LONG* n_columns) override;
 
-  STDMETHODIMP get_selectedRows(LONG** rows, LONG* n_rows) override;
+  IFACEMETHODIMP get_selectedRows(LONG** rows, LONG* n_rows) override;
 
   //
   // IAccessibleTableCell methods.
   //
 
-  STDMETHODIMP
+  IFACEMETHODIMP
   get_columnExtent(LONG* n_columns_spanned) override;
 
-  STDMETHODIMP
+  IFACEMETHODIMP
   get_columnHeaderCells(IUnknown*** cell_accessibles,
                         LONG* n_column_header_cells) override;
 
-  STDMETHODIMP get_columnIndex(LONG* column_index) override;
+  IFACEMETHODIMP get_columnIndex(LONG* column_index) override;
 
-  STDMETHODIMP get_rowExtent(LONG* n_rows_spanned) override;
+  IFACEMETHODIMP get_rowExtent(LONG* n_rows_spanned) override;
 
-  STDMETHODIMP
+  IFACEMETHODIMP
   get_rowHeaderCells(IUnknown*** cell_accessibles,
                      LONG* n_row_header_cells) override;
 
-  STDMETHODIMP get_rowIndex(LONG* row_index) override;
+  IFACEMETHODIMP get_rowIndex(LONG* row_index) override;
 
-  STDMETHODIMP get_isSelected(boolean* is_selected) override;
+  IFACEMETHODIMP get_isSelected(boolean* is_selected) override;
 
-  STDMETHODIMP
+  IFACEMETHODIMP
   get_rowColumnExtents(LONG* row,
                        LONG* column,
                        LONG* row_extents,
                        LONG* column_extents,
                        boolean* is_selected) override;
 
-  STDMETHODIMP get_table(IUnknown** table) override;
+  IFACEMETHODIMP get_table(IUnknown** table) override;
 
   //
   // IAccessibleText methods not implemented.
   //
 
-  STDMETHODIMP get_newText(IA2TextSegment* new_text) override;
-  STDMETHODIMP get_oldText(IA2TextSegment* old_text) override;
-  STDMETHODIMP addSelection(LONG start_offset, LONG end_offset) override;
-  STDMETHODIMP get_attributes(LONG offset,
-                              LONG* start_offset,
-                              LONG* end_offset,
-                              BSTR* text_attributes) override;
-  STDMETHODIMP get_characterExtents(LONG offset,
-                                    enum IA2CoordinateType coord_type,
-                                    LONG* x,
-                                    LONG* y,
-                                    LONG* width,
-                                    LONG* height) override;
-  STDMETHODIMP removeSelection(LONG selection_index) override;
-  STDMETHODIMP setCaretOffset(LONG offset) override;
-  STDMETHODIMP setSelection(LONG selection_index,
-                            LONG start_offset,
-                            LONG end_offset) override;
-  STDMETHODIMP scrollSubstringTo(LONG start_index,
-                                 LONG end_index,
-                                 enum IA2ScrollType scroll_type) override;
-  STDMETHODIMP scrollSubstringToPoint(LONG start_index,
-                                      LONG end_index,
-                                      enum IA2CoordinateType coordinate_type,
-                                      LONG x,
-                                      LONG y) override;
+  IFACEMETHODIMP get_newText(IA2TextSegment* new_text) override;
+  IFACEMETHODIMP get_oldText(IA2TextSegment* old_text) override;
+  IFACEMETHODIMP addSelection(LONG start_offset, LONG end_offset) override;
+  IFACEMETHODIMP get_attributes(LONG offset,
+                                LONG* start_offset,
+                                LONG* end_offset,
+                                BSTR* text_attributes) override;
+  IFACEMETHODIMP get_characterExtents(LONG offset,
+                                      enum IA2CoordinateType coord_type,
+                                      LONG* x,
+                                      LONG* y,
+                                      LONG* width,
+                                      LONG* height) override;
+  IFACEMETHODIMP removeSelection(LONG selection_index) override;
+  IFACEMETHODIMP setCaretOffset(LONG offset) override;
+  IFACEMETHODIMP setSelection(LONG selection_index,
+                              LONG start_offset,
+                              LONG end_offset) override;
+  IFACEMETHODIMP scrollSubstringTo(LONG start_index,
+                                   LONG end_index,
+                                   enum IA2ScrollType scroll_type) override;
+  IFACEMETHODIMP scrollSubstringToPoint(LONG start_index,
+                                        LONG end_index,
+                                        enum IA2CoordinateType coordinate_type,
+                                        LONG x,
+                                        LONG y) override;
 
   //
   // IRawElementProviderSimple methods.
   //
 
-  STDMETHODIMP GetPatternProvider(PATTERNID pattern_id,
-                                  IUnknown** result) override;
+  IFACEMETHODIMP GetPatternProvider(PATTERNID pattern_id,
+                                    IUnknown** result) override;
 
-  STDMETHODIMP GetPropertyValue(PROPERTYID property_id,
-                                VARIANT* result) override;
+  IFACEMETHODIMP GetPropertyValue(PROPERTYID property_id,
+                                  VARIANT* result) override;
 
   // IRawElementProviderSimple methods not implemented.
 
-  STDMETHODIMP
+  IFACEMETHODIMP
   get_ProviderOptions(enum ProviderOptions* ret) override;
 
-  STDMETHODIMP
+  IFACEMETHODIMP
   get_HostRawElementProvider(IRawElementProviderSimple** provider) override;
 
   //
   // IServiceProvider methods.
   //
 
-  STDMETHODIMP QueryService(REFGUID guidService,
-                            REFIID riid,
-                            void** object) override;
+  IFACEMETHODIMP QueryService(REFGUID guidService,
+                              REFIID riid,
+                              void** object) override;
 
  protected:
   AXPlatformNodeWin();
diff --git a/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
index 1dcee89d..c7623ed 100644
--- a/ui/accessibility/platform/ax_platform_node_win_unittest.cc
+++ b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -1104,7 +1104,7 @@
   root_obj.CopyTo(result.GetAddressOf());
   ASSERT_NE(nullptr, result.Get());
 
-  long id;
+  LONG id;
   EXPECT_EQ(S_OK, result->get_childIndex(0, 0, &id));
   EXPECT_EQ(id, 0);
 
@@ -1160,7 +1160,7 @@
   root_obj.CopyTo(result.GetAddressOf());
   ASSERT_NE(nullptr, result.Get());
 
-  long columns_spanned;
+  LONG columns_spanned;
   EXPECT_EQ(S_OK, result->get_columnExtentAt(1, 1, &columns_spanned));
   EXPECT_EQ(columns_spanned, 1);
 
@@ -1176,7 +1176,7 @@
   root_obj.CopyTo(result.GetAddressOf());
   ASSERT_NE(nullptr, result.Get());
 
-  long index;
+  LONG index;
   EXPECT_EQ(S_OK, result->get_columnIndex(2, &index));
   EXPECT_EQ(index, 2);
   EXPECT_EQ(S_OK, result->get_columnIndex(3, &index));
@@ -1194,7 +1194,7 @@
   root_obj.CopyTo(result.GetAddressOf());
   ASSERT_NE(nullptr, result.Get());
 
-  long count;
+  LONG count;
   EXPECT_EQ(S_OK, result->get_nColumns(&count));
   EXPECT_EQ(count, 3);
 }
@@ -1208,7 +1208,7 @@
   root_obj.CopyTo(result.GetAddressOf());
   ASSERT_NE(nullptr, result.Get());
 
-  long count;
+  LONG count;
   EXPECT_EQ(S_OK, result->get_nRows(&count));
   EXPECT_EQ(count, 3);
 }
@@ -1250,7 +1250,7 @@
   root_obj.CopyTo(result.GetAddressOf());
   ASSERT_NE(nullptr, result.Get());
 
-  long rows_spanned;
+  LONG rows_spanned;
   EXPECT_EQ(S_OK, result->get_rowExtentAt(0, 1, &rows_spanned));
   EXPECT_EQ(rows_spanned, 0);
 
@@ -1266,7 +1266,7 @@
   root_obj.CopyTo(result.GetAddressOf());
   ASSERT_NE(nullptr, result.Get());
 
-  long index;
+  LONG index;
   EXPECT_EQ(S_OK, result->get_rowIndex(2, &index));
   EXPECT_EQ(index, 0);
   EXPECT_EQ(S_OK, result->get_rowIndex(3, &index));
@@ -1284,7 +1284,7 @@
   root_obj.CopyTo(result.GetAddressOf());
   ASSERT_NE(nullptr, result.Get());
 
-  long row, column, row_extents, column_extents;
+  LONG row, column, row_extents, column_extents;
   boolean is_selected;
   EXPECT_EQ(S_OK,
             result->get_rowColumnExtentsAtIndex(0, &row, &column, &row_extents,
@@ -1327,7 +1327,7 @@
   ComPtr<IAccessibleTableCell> cell = GetCellInTable();
   ASSERT_NE(nullptr, cell.Get());
 
-  long column_spanned;
+  LONG column_spanned;
   EXPECT_EQ(S_OK, cell->get_columnExtent(&column_spanned));
   EXPECT_EQ(column_spanned, 1);
 }
@@ -1340,7 +1340,7 @@
 
   IUnknown** cell_accessibles;
 
-  long number_cells;
+  LONG number_cells;
   EXPECT_EQ(S_OK,
             cell->get_columnHeaderCells(&cell_accessibles, &number_cells));
   EXPECT_EQ(number_cells, 1);
@@ -1352,7 +1352,7 @@
   ComPtr<IAccessibleTableCell> cell = GetCellInTable();
   ASSERT_NE(nullptr, cell.Get());
 
-  long index;
+  LONG index;
   EXPECT_EQ(S_OK, cell->get_columnIndex(&index));
   EXPECT_EQ(index, 1);
 }
@@ -1363,7 +1363,7 @@
   ComPtr<IAccessibleTableCell> cell = GetCellInTable();
   ASSERT_NE(nullptr, cell.Get());
 
-  long rows_spanned;
+  LONG rows_spanned;
   EXPECT_EQ(S_OK, cell->get_rowExtent(&rows_spanned));
   EXPECT_EQ(rows_spanned, 1);
 }
@@ -1376,7 +1376,7 @@
 
   IUnknown** cell_accessibles;
 
-  long number_cells;
+  LONG number_cells;
   EXPECT_EQ(S_OK, cell->get_rowHeaderCells(&cell_accessibles, &number_cells));
   EXPECT_EQ(number_cells, 1);
 }
@@ -1387,7 +1387,7 @@
   ComPtr<IAccessibleTableCell> cell = GetCellInTable();
   ASSERT_NE(nullptr, cell.Get());
 
-  long index;
+  LONG index;
   EXPECT_EQ(S_OK, cell->get_rowIndex(&index));
   EXPECT_EQ(index, 1);
 }
@@ -1398,7 +1398,7 @@
   ComPtr<IAccessibleTableCell> cell = GetCellInTable();
   ASSERT_NE(nullptr, cell.Get());
 
-  long row, column, row_extents, column_extents;
+  LONG row, column, row_extents, column_extents;
   boolean is_selected;
   EXPECT_EQ(S_OK, cell->get_rowColumnExtents(&row, &column, &row_extents,
                                              &column_extents, &is_selected));
@@ -1927,9 +1927,9 @@
   table.CopyTo(result.GetAddressOf());
   ASSERT_NE(nullptr, result.Get());
 
-  long max_columns = 10;
-  long* columns;
-  long n_columns;
+  LONG max_columns = 10;
+  LONG* columns;
+  LONG n_columns;
   EXPECT_EQ(S_OK,
             result->get_selectedColumns(max_columns, &columns, &n_columns));
   EXPECT_EQ(0, n_columns);
@@ -1957,9 +1957,9 @@
   table.CopyTo(result.GetAddressOf());
   ASSERT_NE(nullptr, result.Get());
 
-  long max_columns = 10;
-  long* columns;
-  long n_columns;
+  LONG max_columns = 10;
+  LONG* columns;
+  LONG n_columns;
   EXPECT_EQ(S_OK,
             result->get_selectedColumns(max_columns, &columns, &n_columns));
   EXPECT_EQ(1, n_columns);
@@ -1995,9 +1995,9 @@
   table.CopyTo(result.GetAddressOf());
   ASSERT_NE(nullptr, result.Get());
 
-  long max_columns = 10;
-  long* columns;
-  long n_columns;
+  LONG max_columns = 10;
+  LONG* columns;
+  LONG n_columns;
   EXPECT_EQ(S_OK,
             result->get_selectedColumns(max_columns, &columns, &n_columns));
   EXPECT_EQ(2, n_columns);
@@ -2018,9 +2018,9 @@
   table.CopyTo(result.GetAddressOf());
   ASSERT_NE(nullptr, result.Get());
 
-  long max_rows = 10;
-  long* rows;
-  long n_rows;
+  LONG max_rows = 10;
+  LONG* rows;
+  LONG n_rows;
   EXPECT_EQ(S_OK, result->get_selectedRows(max_rows, &rows, &n_rows));
   EXPECT_EQ(0, n_rows);
 }
@@ -2047,9 +2047,9 @@
   table.CopyTo(result.GetAddressOf());
   ASSERT_NE(nullptr, result.Get());
 
-  long max_rows = 10;
-  long* rows;
-  long n_rows;
+  LONG max_rows = 10;
+  LONG* rows;
+  LONG n_rows;
   EXPECT_EQ(S_OK, result->get_selectedRows(max_rows, &rows, &n_rows));
   EXPECT_EQ(1, n_rows);
   EXPECT_EQ(1, rows[0]);
@@ -2084,9 +2084,9 @@
   table.CopyTo(result.GetAddressOf());
   ASSERT_NE(nullptr, result.Get());
 
-  long max_rows = 10;
-  long* rows;
-  long n_rows;
+  LONG max_rows = 10;
+  LONG* rows;
+  LONG n_rows;
   EXPECT_EQ(S_OK, result->get_selectedRows(max_rows, &rows, &n_rows));
   EXPECT_EQ(2, n_rows);
   EXPECT_EQ(1, rows[0]);
diff --git a/ui/accessibility/platform/ax_platform_relation_win.cc b/ui/accessibility/platform/ax_platform_relation_win.cc
index 8c3402e..de7229a 100644
--- a/ui/accessibility/platform/ax_platform_relation_win.cc
+++ b/ui/accessibility/platform/ax_platform_relation_win.cc
@@ -250,7 +250,7 @@
   targets_.push_back(target);
 }
 
-STDMETHODIMP AXPlatformRelationWin::get_relationType(BSTR* relation_type) {
+IFACEMETHODIMP AXPlatformRelationWin::get_relationType(BSTR* relation_type) {
   if (!relation_type)
     return E_INVALIDARG;
 
@@ -259,7 +259,7 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformRelationWin::get_nTargets(LONG* n_targets) {
+IFACEMETHODIMP AXPlatformRelationWin::get_nTargets(LONG* n_targets) {
   if (!n_targets)
     return E_INVALIDARG;
 
@@ -267,8 +267,8 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformRelationWin::get_target(LONG target_index,
-                                               IUnknown** target) {
+IFACEMETHODIMP AXPlatformRelationWin::get_target(LONG target_index,
+                                                 IUnknown** target) {
   if (!target)
     return E_INVALIDARG;
 
@@ -281,9 +281,9 @@
   return S_OK;
 }
 
-STDMETHODIMP AXPlatformRelationWin::get_targets(LONG max_targets,
-                                                IUnknown** targets,
-                                                LONG* n_targets) {
+IFACEMETHODIMP AXPlatformRelationWin::get_targets(LONG max_targets,
+                                                  IUnknown** targets,
+                                                  LONG* n_targets) {
   if (!targets || !n_targets)
     return E_INVALIDARG;
 
@@ -304,7 +304,7 @@
   return S_OK;
 }
 
-STDMETHODIMP
+IFACEMETHODIMP
 AXPlatformRelationWin::get_localizedRelationType(BSTR* relation_type) {
   return E_NOTIMPL;
 }
diff --git a/ui/accessibility/platform/ax_platform_relation_win.h b/ui/accessibility/platform/ax_platform_relation_win.h
index 668c4ec..80ffd749 100644
--- a/ui/accessibility/platform/ax_platform_relation_win.h
+++ b/ui/accessibility/platform/ax_platform_relation_win.h
@@ -65,13 +65,13 @@
   void AddTarget(AXPlatformNodeWin* target);
 
   // IAccessibleRelation methods.
-  STDMETHODIMP get_relationType(BSTR* relation_type) override;
-  STDMETHODIMP get_nTargets(LONG* n_targets) override;
-  STDMETHODIMP get_target(LONG target_index, IUnknown** target) override;
-  STDMETHODIMP get_targets(LONG max_targets,
-                           IUnknown** targets,
-                           LONG* n_targets) override;
-  STDMETHODIMP get_localizedRelationType(BSTR* relation_type) override;
+  IFACEMETHODIMP get_relationType(BSTR* relation_type) override;
+  IFACEMETHODIMP get_nTargets(LONG* n_targets) override;
+  IFACEMETHODIMP get_target(LONG target_index, IUnknown** target) override;
+  IFACEMETHODIMP get_targets(LONG max_targets,
+                             IUnknown** targets,
+                             LONG* n_targets) override;
+  IFACEMETHODIMP get_localizedRelationType(BSTR* relation_type) override;
 
  private:
   base::string16 type_;
diff --git a/ui/aura/client/aura_constants.cc b/ui/aura/client/aura_constants.cc
index afb1b97..cc951f6 100644
--- a/ui/aura/client/aura_constants.cc
+++ b/ui/aura/client/aura_constants.cc
@@ -16,6 +16,7 @@
 DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(AURA_EXPORT, gfx::ImageSkia*)
 DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(AURA_EXPORT, gfx::Rect*)
 DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(AURA_EXPORT, gfx::Size*)
+DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(AURA_EXPORT, gfx::SizeF*)
 DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(AURA_EXPORT, std::string*)
 DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(AURA_EXPORT, ui::WindowShowState)
 DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(AURA_EXPORT, ui::mojom::WindowType);
@@ -43,6 +44,7 @@
 DEFINE_UI_CLASS_PROPERTY_KEY(bool, kAnimationsDisabledKey, false);
 DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::ImageSkia, kAppIconKey, nullptr);
 DEFINE_UI_CLASS_PROPERTY_KEY(int, kAppType, 0);
+DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::SizeF, kAspectRatio, nullptr);
 DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::ImageSkia, kAvatarIconKey, nullptr);
 DEFINE_UI_CLASS_PROPERTY_KEY(bool, kConstrainedWindowKey, false);
 DEFINE_UI_CLASS_PROPERTY_KEY(bool, kCreatedByUserGesture, false);
diff --git a/ui/aura/client/aura_constants.h b/ui/aura/client/aura_constants.h
index 99dd8ff..9b881c40 100644
--- a/ui/aura/client/aura_constants.h
+++ b/ui/aura/client/aura_constants.h
@@ -59,6 +59,9 @@
 // pointer metrics. See AppType in ash/public/cpp/app_types.h for more details.
 AURA_EXPORT extern const WindowProperty<int>* const kAppType;
 
+// A property key to store the aspect ratio of the window.
+AURA_EXPORT extern const WindowProperty<gfx::SizeF*>* const kAspectRatio;
+
 // A property key to store the avatar icon that will be displayed on the window
 // frame to indicate the owner of the window when needed.
 AURA_EXPORT extern const WindowProperty<gfx::ImageSkia*>* const kAvatarIconKey;
diff --git a/ui/aura/mus/property_converter.cc b/ui/aura/mus/property_converter.cc
index 0ca39cc..39eddf4 100644
--- a/ui/aura/mus/property_converter.cc
+++ b/ui/aura/mus/property_converter.cc
@@ -105,6 +105,10 @@
       client::kWindowCornerRadiusKey,
       ui::mojom::WindowManager::kWindowCornerRadius_Property,
       base::BindRepeating(&ValidateWindowCornerRadius));
+  RegisterPrimitiveProperty(
+      client::kAnimationsDisabledKey,
+      ui::mojom::WindowManager::kAnimationsDisabled_Property,
+      CreateAcceptAnyValueCallback());
 }
 
 PropertyConverter::~PropertyConverter() {}
diff --git a/ui/aura/test/aura_test_base.cc b/ui/aura/test/aura_test_base.cc
index bb70f27..b6118504 100644
--- a/ui/aura/test/aura_test_base.cc
+++ b/ui/aura/test/aura_test_base.cc
@@ -11,6 +11,7 @@
 #include "ui/aura/mus/window_tree_host_mus.h"
 #include "ui/aura/test/aura_test_context_factory.h"
 #include "ui/aura/test/test_window_delegate.h"
+#include "ui/aura/test/test_windows.h"
 #include "ui/aura/window.h"
 #include "ui/base/ime/input_method_initializer.h"
 #include "ui/base/material_design/material_design_controller.h"
@@ -112,15 +113,11 @@
 
 Window* AuraTestBase::CreateNormalWindow(int id, Window* parent,
                                          WindowDelegate* delegate) {
-  Window* window = new Window(
-      delegate ? delegate :
-      test::TestWindowDelegate::CreateSelfDestroyingDelegate());
-  window->set_id(id);
-  window->Init(ui::LAYER_TEXTURED);
-  parent->AddChild(window);
-  window->SetBounds(gfx::Rect(0, 0, 100, 100));
-  window->Show();
-  return window;
+  return CreateTestWindowWithDelegateAndType(
+      delegate ? delegate
+               : test::TestWindowDelegate::CreateSelfDestroyingDelegate(),
+      client::WINDOW_TYPE_UNKNOWN, id, gfx::Rect(0, 0, 100, 100), parent,
+      /* show_on_creation */ true);
 }
 
 void AuraTestBase::EnableMusWithTestWindowTree() {
diff --git a/ui/aura/test/window_occlusion_tracker_test_api.cc b/ui/aura/test/window_occlusion_tracker_test_api.cc
index fdcb990..11dc682e 100644
--- a/ui/aura/test/window_occlusion_tracker_test_api.cc
+++ b/ui/aura/test/window_occlusion_tracker_test_api.cc
@@ -16,14 +16,5 @@
   return WindowOcclusionTracker::GetInstance()->num_times_occlusion_recomputed_;
 }
 
-bool WindowOcclusionTrackerTestApi::WasOcclusionRecomputedTooManyTimes() {
-  const bool local_was_occlusion_recomputed_too_many_times =
-      WindowOcclusionTracker::GetInstance()
-          ->was_occlusion_recomputed_too_many_times_;
-  WindowOcclusionTracker::GetInstance()
-      ->was_occlusion_recomputed_too_many_times_ = false;
-  return local_was_occlusion_recomputed_too_many_times;
-}
-
 }  // namespace test
 }  // namespace aura
diff --git a/ui/aura/test/window_occlusion_tracker_test_api.h b/ui/aura/test/window_occlusion_tracker_test_api.h
index 03f121a..32bce81 100644
--- a/ui/aura/test/window_occlusion_tracker_test_api.h
+++ b/ui/aura/test/window_occlusion_tracker_test_api.h
@@ -18,10 +18,6 @@
   // Returns the number of times that occlusion was recomputed in this process.
   int GetNumTimesOcclusionRecomputed() const;
 
-  // Returns true if WindowOcclusionTracker had to recompute occlusion too many
-  // times before becoming stable since the last call to this.
-  bool WasOcclusionRecomputedTooManyTimes();
-
  private:
   DISALLOW_COPY_AND_ASSIGN(WindowOcclusionTrackerTestApi);
 };
diff --git a/ui/aura/window_occlusion_tracker.cc b/ui/aura/window_occlusion_tracker.cc
index 7fd07e03..e4103fc 100644
--- a/ui/aura/window_occlusion_tracker.cc
+++ b/ui/aura/window_occlusion_tracker.cc
@@ -6,7 +6,6 @@
 
 #include "base/auto_reset.h"
 #include "base/containers/adapters.h"
-#include "base/debug/dump_without_crashing.h"
 #include "base/stl_util.h"
 #include "third_party/skia/include/core/SkRect.h"
 #include "third_party/skia/include/core/SkRegion.h"
@@ -356,23 +355,13 @@
 
 void WindowOcclusionTracker::MarkRootWindowAsDirty(
     RootWindowState* root_window_state) {
-  root_window_state->dirty = true;
+  // If a root window is marked as dirty and occlusion states have already been
+  // recomputed |kMaxRecomputeOcclusion| times, it means that they are not
+  // stabilizing.
+  DCHECK_LT(num_times_occlusion_recomputed_in_current_step_,
+            kMaxRecomputeOcclusion);
 
-  // Generate a crash report when a root window is marked as dirty and occlusion
-  // states have been recomputed |kMaxRecomputeOcclusion| times, because it
-  // indicates that they are not stabilizing. Don't report it when
-  // |num_times_occlusion_recomputed_in_current_step_| is greater than
-  // |kMaxRecomputeOcclusion| to avoid generating multiple reports from the same
-  // client.
-  //
-  // TODO(fdoray): Remove this once we are confident that occlusion states are
-  // stable after |kMaxRecomputeOcclusion| iterations in production.
-  // https://crbug.com/813076
-  if (num_times_occlusion_recomputed_in_current_step_ ==
-      kMaxRecomputeOcclusion) {
-    was_occlusion_recomputed_too_many_times_ = true;
-    base::debug::DumpWithoutCrashing();
-  }
+  root_window_state->dirty = true;
 }
 
 bool WindowOcclusionTracker::WindowOrParentIsAnimated(Window* window) const {
diff --git a/ui/aura/window_occlusion_tracker.h b/ui/aura/window_occlusion_tracker.h
index 4337677..d8eb5f4 100644
--- a/ui/aura/window_occlusion_tracker.h
+++ b/ui/aura/window_occlusion_tracker.h
@@ -206,11 +206,6 @@
   // recomputed occlusion states. Always 0 when not in MaybeComputeOcclusion().
   int num_times_occlusion_recomputed_in_current_step_ = 0;
 
-  // Set to true when occlusion is recomputed too many times before it becomes
-  // stable. Reset in
-  // WindowOcclusionTrackerTestApi::WasOcclusionRecomputedTooManyTimes().
-  bool was_occlusion_recomputed_too_many_times_ = false;
-
   DISALLOW_COPY_AND_ASSIGN(WindowOcclusionTracker);
 };
 
diff --git a/ui/aura/window_occlusion_tracker_unittest.cc b/ui/aura/window_occlusion_tracker_unittest.cc
index a89b3ecd..7d47e609 100644
--- a/ui/aura/window_occlusion_tracker_unittest.cc
+++ b/ui/aura/window_occlusion_tracker_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/macros.h"
 #include "base/run_loop.h"
+#include "base/test/gtest_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/env.h"
 #include "ui/aura/test/aura_test_base.h"
@@ -1448,8 +1449,7 @@
 }  // namespace
 
 // Verify that if a window changes its visibility every time it is notified that
-// its occlusion state changed, the occlusion state of all IsVisible() windows
-// is set to VISIBLE and no infinite loop is entered.
+// its occlusion state changed, a DCHECK occurs.
 TEST_F(WindowOcclusionTrackerTest, OcclusionStatesDontBecomeStable) {
   test::WindowOcclusionTrackerTestApi test_api;
 
@@ -1489,13 +1489,11 @@
   // Once the maximum number of times that occlusion can be recomputed is
   // reached, the occlusion state of all IsVisible() windows should be set to
   // VISIBLE.
-  delegate_a->set_expectation(Window::OcclusionState::VISIBLE);
-  delegate_d->set_expectation(Window::OcclusionState::HIDDEN);
-  EXPECT_FALSE(test_api.WasOcclusionRecomputedTooManyTimes());
-  window_d->Hide();
-  EXPECT_TRUE(test_api.WasOcclusionRecomputedTooManyTimes());
-  EXPECT_FALSE(delegate_a->is_expecting_call());
-  EXPECT_FALSE(delegate_d->is_expecting_call());
+  EXPECT_DCHECK_DEATH({
+    delegate_a->set_expectation(Window::OcclusionState::VISIBLE);
+    delegate_d->set_expectation(Window::OcclusionState::HIDDEN);
+    window_d->Hide();
+  });
 }
 
 // Verify that the occlusion states are correctly updated when a branch of the
@@ -1606,11 +1604,9 @@
 
   delegate_a->set_expectation(Window::OcclusionState::HIDDEN);
   delegate_b->set_expectation(Window::OcclusionState::HIDDEN);
-  EXPECT_FALSE(test_api.WasOcclusionRecomputedTooManyTimes());
-  window_b->Hide();
   // Hiding a child to |window_a| and hiding it shouldn't cause occlusion to be
-  // recomputed too many times.
-  EXPECT_FALSE(test_api.WasOcclusionRecomputedTooManyTimes());
+  // recomputed too many times (i.e. the call below shouldn't DCHECK).
+  window_b->Hide();
   EXPECT_FALSE(delegate_a->is_expecting_call());
   EXPECT_FALSE(delegate_b->is_expecting_call());
 }
diff --git a/ui/chromeos/ime/candidate_window_view.cc b/ui/chromeos/ime/candidate_window_view.cc
index c3f430b..4a504ccf 100644
--- a/ui/chromeos/ime/candidate_window_view.cc
+++ b/ui/chromeos/ime/candidate_window_view.cc
@@ -43,7 +43,6 @@
                             gfx::kPlaceholderColor),
         parent_(parent),
         offset_(0) {
-    set_paint_arrow(views::BubbleBorder::PAINT_NONE);
     set_use_theme_background_color(true);
   }
   ~CandidateWindowBorder() override {}
diff --git a/ui/chromeos/ime/infolist_window.cc b/ui/chromeos/ime/infolist_window.cc
index 91fef0f..98e4d21 100644
--- a/ui/chromeos/ime/infolist_window.cc
+++ b/ui/chromeos/ime/infolist_window.cc
@@ -59,7 +59,6 @@
     : views::BubbleBorder(views::BubbleBorder::LEFT_CENTER,
                           views::BubbleBorder::NO_SHADOW,
                           SK_ColorTRANSPARENT) {
-  set_paint_arrow(views::BubbleBorder::PAINT_NONE);
 }
 
 InfolistBorder::~InfolistBorder() {}
@@ -73,8 +72,7 @@
   // although it doesn't draw the arrow. The arrow offset is the half of
   // |contents_size| by default but can be modified through the off-screen logic
   // in BubbleFrameView.
-  bounds.set_y(anchor_rect.y() + contents_size.height() / 2 -
-               GetArrowOffset(contents_size));
+  bounds.set_y(anchor_rect.y() + contents_size.height() / 2);
   return bounds;
 }
 
diff --git a/ui/chromeos/search_box/search_box_view_base.cc b/ui/chromeos/search_box/search_box_view_base.cc
index bef78f2..39235f95 100644
--- a/ui/chromeos/search_box/search_box_view_base.cc
+++ b/ui/chromeos/search_box/search_box_view_base.cc
@@ -267,6 +267,8 @@
   if (active) {
     search_box_->RequestFocus();
     RecordSearchBoxActivationHistogram(event_type);
+  } else {
+    search_box_->DestroyTouchSelection();
   }
 
   search_box_right_space_->SetVisible(!active);
@@ -311,6 +313,10 @@
   HandleSearchBoxEvent(event);
 }
 
+void SearchBoxViewBase::NotifyGestureEvent() {
+  search_box_->DestroyTouchSelection();
+}
+
 ax::mojom::Role SearchBoxViewBase::GetAccessibleWindowRole() const {
   // Default role of root view is ax::mojom::Role::kWindow which traps ChromeVox
   // focus within the root view. Assign ax::mojom::Role::kGroup here to allow
diff --git a/ui/chromeos/search_box/search_box_view_base.h b/ui/chromeos/search_box/search_box_view_base.h
index 1e34d4ea..8e464355 100644
--- a/ui/chromeos/search_box/search_box_view_base.h
+++ b/ui/chromeos/search_box/search_box_view_base.h
@@ -89,6 +89,10 @@
   void OnGestureEvent(ui::GestureEvent* event) override;
   void OnMouseEvent(ui::MouseEvent* event) override;
 
+  // Allows for search box to be notified of gestures occurring outside, without
+  // deactivating the searchbox.
+  void NotifyGestureEvent();
+
   // Overridden from views::WidgetDelegate:
   ax::mojom::Role GetAccessibleWindowRole() const override;
   bool ShouldAdvanceFocusToTopLevelWidget() const override;
diff --git a/ui/display/display.cc b/ui/display/display.cc
index 99e9241..01b9987 100644
--- a/ui/display/display.cc
+++ b/ui/display/display.cc
@@ -207,6 +207,11 @@
 
 Display::~Display() {}
 
+// static
+Display Display::GetDefaultDisplay() {
+  return Display(kDefaultDisplayId, gfx::Rect(0, 0, 1920, 1080));
+}
+
 int Display::RotationAsDegree() const {
   switch (rotation_) {
     case ROTATE_0:
diff --git a/ui/display/display.h b/ui/display/display.h
index 42d3d83..a788c0e 100644
--- a/ui/display/display.h
+++ b/ui/display/display.h
@@ -79,6 +79,11 @@
   Display(const Display& other);
   ~Display();
 
+  // Returns a valid display with default parameters and ID set to
+  // |kDefaultDisplayId| which is used when there's no actual display connected
+  // to the device.
+  static Display GetDefaultDisplay();
+
   // Returns the forced device scale factor, which is given by
   // "--force-device-scale-factor".
   static float GetForcedDeviceScaleFactor();
diff --git a/ui/display/screen.h b/ui/display/screen.h
index c4c6f14..067edc8 100644
--- a/ui/display/screen.h
+++ b/ui/display/screen.h
@@ -71,7 +71,9 @@
   // Returns the display that most closely intersects the provided bounds.
   virtual Display GetDisplayMatching(const gfx::Rect& match_rect) const = 0;
 
-  // Returns the primary display.
+  // Returns the primary display. It is guaranteed that this will return a
+  // display with a valid display ID even if there is no display connected.
+  // A real display will be reported via DisplayObserver when it is connected.
   virtual Display GetPrimaryDisplay() const = 0;
 
   // Returns a suggested display to use when creating a new window. On most
diff --git a/ui/display/screen_base.cc b/ui/display/screen_base.cc
index ae1f25ac..e794437c 100644
--- a/ui/display/screen_base.cc
+++ b/ui/display/screen_base.cc
@@ -30,7 +30,7 @@
 Display ScreenBase::GetPrimaryDisplay() const {
   auto iter = display_list_.GetPrimaryDisplayIterator();
   if (iter == display_list_.displays().end())
-    return Display();  // Invalid display since we have no primary display.
+    return Display::GetDefaultDisplay();
   return *iter;
 }
 
diff --git a/ui/display/types/display_constants.h b/ui/display/types/display_constants.h
index 75baacb..e80f1e4 100644
--- a/ui/display/types/display_constants.h
+++ b/ui/display/types/display_constants.h
@@ -13,6 +13,10 @@
 // before display IDs are known.
 constexpr int64_t kInvalidDisplayId = -1;
 
+// Display ID that represents a valid display to be used when there's no actual
+// display connected.
+constexpr int64_t kDefaultDisplayId = 0xFF;
+
 // Display ID for a virtual display assigned to a unified desktop.
 constexpr int64_t kUnifiedDisplayId = -10;
 
diff --git a/ui/events/ozone/evdev/touch_event_converter_evdev.cc b/ui/events/ozone/evdev/touch_event_converter_evdev.cc
index a8e74844..247b79c 100644
--- a/ui/events/ozone/evdev/touch_event_converter_evdev.cc
+++ b/ui/events/ozone/evdev/touch_event_converter_evdev.cc
@@ -411,7 +411,7 @@
       events_[current_slot_].major = input.value;
       break;
     case ABS_MT_TOUCH_MINOR:
-      events_[current_slot_].radius_y = input.value * touch_major_scale_ / 2.0f;
+      events_[current_slot_].radius_y = input.value * touch_minor_scale_ / 2.0f;
       break;
     case ABS_MT_POSITION_X:
       events_[current_slot_].x = input.value;
diff --git a/ui/file_manager/externs/BUILD.gn b/ui/file_manager/externs/BUILD.gn
new file mode 100644
index 0000000..1d7d52a
--- /dev/null
+++ b/ui/file_manager/externs/BUILD.gn
@@ -0,0 +1,17 @@
+# 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.
+
+import("//third_party/closure_compiler/compile_js.gni")
+
+js_library("webview_tag") {
+  sources = []
+
+  # The webview extern depends on chrome_extensions, which depends on chrome.
+  # They must appear together, in this order, to avoid flaky dependency chains.
+  externs_list = [
+    "$externs_path/chrome.js",
+    "$externs_path/chrome_extensions.js",
+    "webview_tag.js",
+  ]
+}
diff --git a/ui/file_manager/file_manager/background/js/BUILD.gn b/ui/file_manager/file_manager/background/js/BUILD.gn
index 6b2d8b3..d6a933f 100644
--- a/ui/file_manager/file_manager/background/js/BUILD.gn
+++ b/ui/file_manager/file_manager/background/js/BUILD.gn
@@ -39,7 +39,6 @@
 js_library("closure_compile_externs") {
   sources = []
   externs_list = [
-    "$externs_path/chrome_extensions.js",
     "$externs_path/command_line_private.js",
     "$externs_path/file_manager_private.js",
     "$externs_path/file_system_provider.js",
@@ -241,6 +240,17 @@
     ":app_windows",
     "../../common/js:error_util",
   ]
+
+  # The callback test_util_base.js passes to chrome.runtime.onMessageExternal()
+  # requires chrome_extensions.js, which has a dependency on chrome.js. Ensure
+  # the externs are introduced at the same time (in this order). Note we are
+  # lucky the list below also sorts in this order, or we'd need some other fix.
+  # A compile error results if the dependency walker encounters a target
+  # that puts chrome_extensions.js into the argument list before chrome.js.
+  externs_list = [
+    "$externs_path/chrome.js",
+    "$externs_path/chrome_extensions.js",
+  ]
 }
 
 js_library("volume_info_impl") {
diff --git a/ui/file_manager/file_manager/common/js/BUILD.gn b/ui/file_manager/file_manager/common/js/BUILD.gn
index df44e2b1..506fde5f 100644
--- a/ui/file_manager/file_manager/common/js/BUILD.gn
+++ b/ui/file_manager/file_manager/common/js/BUILD.gn
@@ -27,18 +27,8 @@
 js_library("closure_compile_externs") {
   sources = []
   externs_list = [
-    "$externs_path/chrome_extensions.js",
-    "$externs_path/command_line_private.js",
-    "$externs_path/file_manager_private.js",
-    "$externs_path/file_system_provider.js",
-    "$externs_path/metrics_private.js",
-    "../../../externs/app_window_common.js",
     "../../../externs/background/file_browser_background.js",
     "../../../externs/background_window.js",
-    "../../../externs/entry_location.js",
-    "../../../externs/platform.js",
-    "../../../externs/volume_info.js",
-    "//third_party/analytics/externs.js",
   ]
 }
 
@@ -49,6 +39,7 @@
 }
 
 js_library("files_app_entry_types") {
+  externs_list = [ "../../../externs/volume_info.js" ]
 }
 
 js_library("file_type") {
@@ -69,6 +60,12 @@
     ":metrics_base",
     "//ui/webui/resources/js:assert",
   ]
+  externs_list = [
+    "$externs_path/file_manager_private.js",
+    "$externs_path/file_system_provider.js",
+    "$externs_path/metrics_private.js",
+    "//third_party/analytics/externs.js",
+  ]
 }
 
 js_library("metrics_base") {
@@ -105,6 +102,14 @@
     "//ui/webui/resources/js/cr:event_target",
     "//ui/webui/resources/js/cr:ui",
   ]
+  externs_list = [
+    "$externs_path/chrome.js",
+    "$externs_path/chrome_extensions.js",
+    "$externs_path/command_line_private.js",
+    "../../../externs/app_window_common.js",
+    "../../../externs/entry_location.js",
+    "../../../externs/platform.js",
+  ]
 }
 
 js_library("volume_manager_common") {
diff --git a/ui/file_manager/file_manager/common/js/volume_manager_common.js b/ui/file_manager/file_manager/common/js/volume_manager_common.js
index 1c32499..f1d2a207 100644
--- a/ui/file_manager/file_manager/common/js/volume_manager_common.js
+++ b/ui/file_manager/file_manager/common/js/volume_manager_common.js
@@ -103,7 +103,7 @@
   // 'Add new services' menu item.
   ADD_NEW_SERVICES_MENU: 'add_new_services_menu',
 
-  // Root for crostini 'Linux Files'.
+  // Root for crostini 'Linux files'.
   CROSTINI: 'crostini',
 
   // Root for android files.
diff --git a/ui/file_manager/file_manager/foreground/elements/BUILD.gn b/ui/file_manager/file_manager/foreground/elements/BUILD.gn
index d30d015f..dcb7cb91 100644
--- a/ui/file_manager/file_manager/foreground/elements/BUILD.gn
+++ b/ui/file_manager/file_manager/foreground/elements/BUILD.gn
@@ -6,7 +6,6 @@
 
 js_type_check("closure_compile") {
   deps = [
-    ":closure_compile_externs",
     ":files_icon_button",
     ":files_metadata_box",
     ":files_metadata_entry",
@@ -20,15 +19,6 @@
   ]
 }
 
-js_library("closure_compile_externs") {
-  sources = []
-  externs_list = [
-    "$externs_path/chrome_extensions.js",
-    "$externs_path/web_animations.js",
-    "../../../externs/webview_tag.js",
-  ]
-}
-
 js_library("files_icon_button") {
   deps = [
     "//third_party/polymer/v1_0/components-chromium/iron-behaviors:iron-button-state-extracted",
@@ -45,6 +35,7 @@
 js_library("files_quick_view") {
   deps = [
     ":files_metadata_box",
+    "../../../externs:webview_tag",
   ]
 }
 
@@ -61,6 +52,7 @@
 }
 
 js_library("files_toast") {
+  externs_list = [ "$externs_path/web_animations.js" ]
 }
 
 js_library("files_toggle_ripple") {
diff --git a/ui/file_manager/file_manager/foreground/js/BUILD.gn b/ui/file_manager/file_manager/foreground/js/BUILD.gn
index 77f86318..c4410bd 100644
--- a/ui/file_manager/file_manager/foreground/js/BUILD.gn
+++ b/ui/file_manager/file_manager/foreground/js/BUILD.gn
@@ -82,7 +82,6 @@
     "../../../externs/background/media_import_handler.js",
     "../../../externs/background/media_scanner.js",
     "../../../externs/background/progress_center.js",
-    "../../../externs/background/volume_manager_factory.js",
     "../../../externs/background_window.js",
     "../../../externs/chrome_echo_private.js",
     "../../../externs/chrome_webstore_widget_private.js",
@@ -91,16 +90,11 @@
     "../../../externs/directory_change_event.js",
     "../../../externs/drag_target.js",
     "../../../externs/entries_changed_event.js",
-    "../../../externs/entry_location.js",
     "../../../externs/gallery_foreground.js",
     "../../../externs/menu_item_update_event.js",
     "../../../externs/paper_elements.js",
     "../../../externs/platform.js",
     "../../../externs/search_item.js",
-    "../../../externs/volume_info.js",
-    "../../../externs/volume_info_list.js",
-    "../../../externs/volume_manager.js",
-    "//third_party/analytics/externs.js",
   ]
 }
 
@@ -549,6 +543,7 @@
 
 js_library("share_client") {
   deps = [
+    "../../../externs:webview_tag",
     "../../common/js:volume_manager_common",
     "//ui/webui/resources/js/cr:event_target",
   ]
@@ -615,6 +610,11 @@
     "//ui/webui/resources/js/cr:event_target",
     "//ui/webui/resources/js/cr/ui:array_data_model",
   ]
+  externs_list = [
+    "../../../externs/background/volume_manager_factory.js",
+    "../../../externs/volume_info_list.js",
+    "../../../externs/volume_manager.js",
+  ]
 }
 
 js_library("web_store_utils") {
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn b/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn
index 3184ff8..c2c63bc 100644
--- a/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn
+++ b/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn
@@ -35,14 +35,11 @@
 js_library("closure_compile_externs") {
   sources = []
   externs_list = [
-    "$externs_path/chrome_extensions.js",
     "$externs_path/command_line_private.js",
     "$externs_path/file_manager_private.js",
     "$externs_path/file_system_provider.js",
     "../../../../externs/app_window_common.js",
     "../../../../externs/entry_location.js",
-    "../../../../externs/exif_entry.js",
-    "../../../../externs/metadata_worker_window.js",
     "../../../../externs/platform.js",
     "../../../../externs/volume_info.js",
   ]
@@ -68,6 +65,7 @@
     ":image_parsers",
     ":metadata_parser",
   ]
+  externs_list = [ "../../../../externs/exif_entry.js" ]
 }
 
 js_library("external_metadata_provider") {
@@ -110,6 +108,7 @@
   deps = [
     ":metadata_parser",
   ]
+  externs_list = [ "../../../../externs/metadata_worker_window.js" ]
 }
 
 js_library("metadata_cache_item") {
diff --git a/ui/file_manager/file_manager/foreground/js/navigation_list_model.js b/ui/file_manager/file_manager/foreground/js/navigation_list_model.js
index df77cc9..048f898 100644
--- a/ui/file_manager/file_manager/foreground/js/navigation_list_model.js
+++ b/ui/file_manager/file_manager/foreground/js/navigation_list_model.js
@@ -159,7 +159,7 @@
 };
 
 /**
- * Item of NavigationListModel for a fake item such as Recent or Linux Files.
+ * Item of NavigationListModel for a fake item such as Recent or Linux files.
  *
  * @param {string} label Label on the menu button.
  * @param {NavigationModelItemType} type
@@ -217,7 +217,7 @@
   this.recentModelItem_ = recentModelItem;
 
   /**
-   * Root folder for crostini Linux Files.
+   * Root folder for crostini Linux files.
    * This field will be set asynchronously after calling
    * chrome.fileManagerPrivate.isCrostiniEnabled.
    * @private {NavigationModelFakeItem}
@@ -419,10 +419,10 @@
     return this.shortcutList_;
   },
   /**
-   * Set the crostini Linux Files root and reorder items.
+   * Set the crostini Linux files root and reorder items.
    * This setter is provided separate to the constructor since
    * this field is set async after calling fileManagerPrivate.isCrostiniEnabled.
-   * @param {NavigationModelFakeItem} item Linux Files root.
+   * @param {NavigationModelFakeItem} item Linux files root.
    */
   set linuxFilesItem(item) {
     this.linuxFilesItem_ = item;
@@ -437,7 +437,7 @@
 /**
  * Reorder navigation items when command line flag new-files-app-navigation is
  * enabled it nests Downloads, Linux and Android files under "My Files"; when
- * it's disabled it has a flat structure with Linux Files after Recent menu.
+ * it's disabled it has a flat structure with Linux files after Recent menu.
  */
 NavigationListModel.prototype.reorderNavigationItems_ = function() {
   if (!this.disableMyFilesNavigation_) {
@@ -452,7 +452,7 @@
  *  1. Volumes.
  *  2. If Downloads exists, then immediately after Downloads should be:
  *  2a. Recent if it exists.
- *  2b. Linux Files if it exists and is not mounted.
+ *  2b. Linux files if it exists and is not mounted.
  *      When mounted, it will be located in Volumes at this position.
  *  3. Shortcuts.
  *  4. Add new services if it exists.
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
index 0b7f4e3..6d5662a 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
@@ -1360,7 +1360,7 @@
 // FakeItem
 
 /**
- * FakeItem is used by Recent and Linux Files.
+ * FakeItem is used by Recent and Linux files.
  * @param {!VolumeManagerCommon.RootType} rootType root type.
  * @param {!NavigationModelFakeItem} modelItem
  * @param {!DirectoryTree} tree Current tree, which contains this item.
diff --git a/ui/file_manager/file_manager/test/BUILD.gn b/ui/file_manager/file_manager/test/BUILD.gn
index 4ee3c9f..6ec1da2 100644
--- a/ui/file_manager/file_manager/test/BUILD.gn
+++ b/ui/file_manager/file_manager/test/BUILD.gn
@@ -49,7 +49,6 @@
   sources = []
   externs_list = [
     "js/externs.js",
-    "$externs_path/chrome_extensions.js",
     "$externs_path/command_line_private.js",
     "$externs_path/file_manager_private.js",
     "$externs_path/file_system_provider.js",
diff --git a/ui/file_manager/file_manager/test/crostini.js b/ui/file_manager/file_manager/test/crostini.js
index 2cadf5f4..2034e0e 100644
--- a/ui/file_manager/file_manager/test/crostini.js
+++ b/ui/file_manager/file_manager/test/crostini.js
@@ -27,12 +27,12 @@
   };
   test.setupAndWaitUntilReady()
       .then(() => {
-        // Linux Files fake root is shown.
+        // Linux files fake root is shown.
         return test.waitForElement(
             '#directory-tree .tree-item [root-type-icon="crostini"]');
       })
       .then(() => {
-        // Click on Linux Files.
+        // Click on Linux files.
         assertTrue(
             test.fakeMouseClick(
                 '#directory-tree .tree-item [root-type-icon="crostini"]'),
diff --git a/ui/file_manager/gallery/js/BUILD.gn b/ui/file_manager/gallery/js/BUILD.gn
index b3ecb19..e15fe2e5 100644
--- a/ui/file_manager/gallery/js/BUILD.gn
+++ b/ui/file_manager/gallery/js/BUILD.gn
@@ -26,19 +26,13 @@
 js_library("closure_compile_externs") {
   sources = []
   externs_list = [
-    "$externs_path/chrome_extensions.js",
-    "$externs_path/command_line_private.js",
     "$externs_path/file_manager_private.js",
     "$externs_path/file_system_provider.js",
     "$externs_path/metrics_private.js",
     "$externs_path/web_animations.js",
     "../../externs/entry_location.js",
-    "../../externs/paper_elements.js",
     "../../externs/platform.js",
     "../../externs/volume_info.js",
-    "../../externs/volume_info_list.js",
-    "../../externs/volume_manager.js",
-    "../../externs/webview_tag.js",
     "//third_party/analytics/externs.js",
   ]
 }
diff --git a/ui/file_manager/gallery/js/image_editor/BUILD.gn b/ui/file_manager/gallery/js/image_editor/BUILD.gn
index 52fffc9..0982f7c 100644
--- a/ui/file_manager/gallery/js/image_editor/BUILD.gn
+++ b/ui/file_manager/gallery/js/image_editor/BUILD.gn
@@ -5,12 +5,10 @@
 import("//third_party/closure_compiler/compile_js.gni")
 import("//ui/file_manager/js_unit_tests.gni")
 
-js_type_check("closure_compile") {
+js_type_check("closure_compile_module") {
   deps = [
-    ":closure_compile_externs",
     ":commands",
     ":exif_encoder",
-    ":exif_encoder_unittest",
     ":filter",
     ":image_adjust",
     ":image_buffer",
@@ -19,41 +17,16 @@
     ":image_editor_prompt",
     ":image_editor_toolbar",
     ":image_encoder",
-    ":image_encoder_unittest",
     ":image_loader",
     ":image_resize",
     ":image_transform",
     ":image_util",
     ":image_view",
-    ":image_view_unittest",
     ":test_util",
     ":viewport",
   ]
 }
 
-js_library("closure_compile_externs") {
-  sources = []
-  externs_list = [
-    "$externs_path/chrome_extensions.js",
-    "$externs_path/command_line_private.js",
-    "$externs_path/file_manager_private.js",
-    "$externs_path/file_system_provider.js",
-    "$externs_path/metrics_private.js",
-    "$externs_path/web_animations.js",
-    "../../../externs/app_window_common.js",
-    "../../../externs/background/volume_manager_factory.js",
-    "../../../externs/entry_location.js",
-    "../../../externs/exif_entry.js",
-    "../../../externs/metadata_worker_window.js",
-    "../../../externs/paper_elements.js",
-    "../../../externs/platform.js",
-    "../../../externs/volume_info.js",
-    "../../../externs/volume_info_list.js",
-    "../../../externs/volume_manager.js",
-    "//third_party/analytics/externs.js",
-  ]
-}
-
 js_library("commands") {
   deps = [
     ":filter",
@@ -71,6 +44,7 @@
     "../../../file_manager/foreground/js/metadata:exif_constants",
     "../../../file_manager/foreground/js/metadata:metadata_item",
   ]
+  externs_list = [ "../../../externs/exif_entry.js" ]
 }
 
 js_library("exif_encoder_unittest") {
@@ -78,6 +52,7 @@
     ":exif_encoder",
     ":test_util",
     "../../../file_manager/foreground/js/metadata:exif_parser",
+    "//ui/webui/resources/js:webui_resource_test",
   ]
 }
 
@@ -134,6 +109,7 @@
     "../../../file_manager/common/js:util",
     "../../../file_manager/foreground/elements:files_tooltip",
   ]
+  externs_list = [ "../../../externs/paper_elements.js" ]
 }
 
 js_library("image_encoder") {
@@ -151,6 +127,7 @@
     "../../../file_manager/common/js:unittest_util",
     "../../../file_manager/foreground/js/metadata:metadata_parser",
   ]
+  externs_list = [ "../../../externs/metadata_worker_window.js" ]
 }
 
 js_library("image_loader") {
@@ -228,3 +205,10 @@
   ]
   mocks = [ "../../../file_manager/foreground/js/metadata/metadata_dispatcher_mock_deps.js" ]
 }
+
+group("closure_compile") {
+  deps = [
+    ":closure_compile_module",
+    ":unit_tests",
+  ]
+}
diff --git a/ui/file_manager/integration_tests/file_manager/crostini.js b/ui/file_manager/integration_tests/file_manager/crostini.js
index a0709232..3c5350b0e 100644
--- a/ui/file_manager/integration_tests/file_manager/crostini.js
+++ b/ui/file_manager/integration_tests/file_manager/crostini.js
@@ -20,7 +20,7 @@
       addEntries(['crostini'], BASIC_CROSTINI_ENTRY_SET, this.next);
     },
     function() {
-      // Linux Files fake root is shown.
+      // Linux files fake root is shown.
       remoteCall.waitForElement(appId, fake).then(this.next);
     },
     function() {
diff --git a/ui/file_manager/integration_tests/file_manager/install_linux_package_dialog.js b/ui/file_manager/integration_tests/file_manager/install_linux_package_dialog.js
index 01194f8..68b9856f 100644
--- a/ui/file_manager/integration_tests/file_manager/install_linux_package_dialog.js
+++ b/ui/file_manager/integration_tests/file_manager/install_linux_package_dialog.js
@@ -23,7 +23,7 @@
       appId = results.windowId;
       addEntries(['crostini'], [ENTRIES.debPackage], this.next);
     },
-    // Linux Files fake root is shown.
+    // Linux files fake root is shown.
     function() {
       remoteCall.waitForElement(appId, fake).then(this.next);
     },
diff --git a/ui/file_manager/js_unit_tests.gni b/ui/file_manager/js_unit_tests.gni
index 0e4fc30..edb9a07 100644
--- a/ui/file_manager/js_unit_tests.gni
+++ b/ui/file_manager/js_unit_tests.gni
@@ -2,6 +2,8 @@
 # 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")
+
 # Describes a list of js_library targets that will each have an html file
 # written listing all its (flattened) js dependencies, for loading as a test.
 # Must be declared after the js_library targets it depends on.
@@ -49,10 +51,18 @@
       data = mocks
     }
   }
+  type_check_deps = []
+  foreach(dep, invoker.deps) {
+    type_check_target_name = target_name + "_" + dep + "_type_check"
+    type_check_deps += [ ":$type_check_target_name" ]
+    js_type_check(type_check_target_name) {
+      deps = [
+        dep,
+      ]
+    }
+  }
   group(target_name) {
     data = get_target_outputs(":$html_gen_target_name")
-    deps = [
-      ":$html_gen_target_name",
-    ]
+    deps = [ ":$html_gen_target_name" ] + type_check_deps
   }
 }
diff --git a/ui/gfx/shadow_value.cc b/ui/gfx/shadow_value.cc
index 70de16f..cfa2883 100644
--- a/ui/gfx/shadow_value.cc
+++ b/ui/gfx/shadow_value.cc
@@ -72,8 +72,8 @@
 }
 
 // static
-ShadowValues ShadowValue::MakeRefreshShadowValues(int elevation) {
-  constexpr SkColor shadow_base_color = gfx::kGoogleGrey800;
+ShadowValues ShadowValue::MakeRefreshShadowValues(int elevation,
+                                                  SkColor color) {
   // Refresh uses hand-tweaked shadows corresponding to a small set of
   // elevations. Use the Refresh spec and designer input to add missing shadow
   // values.
@@ -85,28 +85,26 @@
 
   switch (elevation) {
     case 3: {
-      ShadowValue key = {gfx::Vector2d(0, 1), 12,
-                         SkColorSetA(shadow_base_color, 0x66)};
-      ShadowValue ambient = {gfx::Vector2d(0, 4), 64,
-                             SkColorSetA(shadow_base_color, 0x40)};
+      ShadowValue key = {gfx::Vector2d(0, 1), 12, SkColorSetA(color, 0x66)};
+      ShadowValue ambient = {gfx::Vector2d(0, 4), 64, SkColorSetA(color, 0x40)};
       return {key, ambient};
     }
     case 16: {
       gfx::ShadowValue key = {gfx::Vector2d(0, 0), kBlurCorrection * 16,
-                              SkColorSetA(shadow_base_color, 0x1a)};
+                              SkColorSetA(color, 0x1a)};
       gfx::ShadowValue ambient = {gfx::Vector2d(0, 12), kBlurCorrection * 16,
-                                  SkColorSetA(shadow_base_color, 0x3d)};
+                                  SkColorSetA(color, 0x3d)};
       return {key, ambient};
     }
     default:
       // This surface has not been updated for Refresh. Fall back to the
       // deprecated style.
-      return MakeMdShadowValues(elevation);
+      return MakeMdShadowValues(elevation, color);
   }
 }
 
 // static
-ShadowValues ShadowValue::MakeMdShadowValues(int elevation) {
+ShadowValues ShadowValue::MakeMdShadowValues(int elevation, SkColor color) {
   ShadowValues shadow_values;
   // To match the CSS notion of blur (spread outside the bounding box) to the
   // Skia notion of blur (spread outside and inside the bounding box), we have
@@ -115,10 +113,10 @@
   // "Key shadow": y offset is elevation and blur is twice the elevation.
   shadow_values.emplace_back(gfx::Vector2d(0, elevation),
                              kBlurCorrection * elevation * 2,
-                             SkColorSetA(SK_ColorBLACK, 0x3d));
+                             SkColorSetA(color, 0x3d));
   // "Ambient shadow": no offset and blur matches the elevation.
   shadow_values.emplace_back(gfx::Vector2d(), kBlurCorrection * elevation,
-                             SkColorSetA(SK_ColorBLACK, 0x1f));
+                             SkColorSetA(color, 0x1f));
   // To see what this looks like for elevation 24, try this CSS:
   //   box-shadow: 0 24px 48px rgba(0, 0, 0, .24),
   //               0 0 24px rgba(0, 0, 0, .12);
diff --git a/ui/gfx/shadow_value.h b/ui/gfx/shadow_value.h
index e8e32b4..3466de3 100644
--- a/ui/gfx/shadow_value.h
+++ b/ui/gfx/shadow_value.h
@@ -54,9 +54,11 @@
   // a uniform color.
   static Insets GetBlurRegion(const ShadowValues& shadows);
 
-  // Makes ShadowValues matching MD or Refresh shadows for the given elevation.
-  static ShadowValues MakeMdShadowValues(int elevation);
-  static ShadowValues MakeRefreshShadowValues(int elevation);
+  // Makes ShadowValues matching MD or Refresh shadows for the given elevation
+  // and color.
+  static ShadowValues MakeRefreshShadowValues(int elevation, SkColor color);
+  static ShadowValues MakeMdShadowValues(int elevation,
+                                         SkColor color = SK_ColorBLACK);
 
  private:
   gfx::Vector2d offset_;
diff --git a/ui/message_center/views/notification_view_md.cc b/ui/message_center/views/notification_view_md.cc
index 3dfc9d89..e8b5e60 100644
--- a/ui/message_center/views/notification_view_md.cc
+++ b/ui/message_center/views/notification_view_md.cc
@@ -467,7 +467,7 @@
 class InlineSettingsRadioButton : public views::RadioButton {
  public:
   InlineSettingsRadioButton(const base::string16& label_text)
-      : views::RadioButton(label_text, 1 /* group */, true /* force_md */) {
+      : views::RadioButton(label_text, 1 /* group */) {
     label()->SetFontList(GetTextFontList());
     label()->SetEnabledColor(kRegularTextColorMD);
     label()->SetSubpixelRenderingEnabled(false);
diff --git a/ui/native_theme/common_theme.cc b/ui/native_theme/common_theme.cc
index f40cbe53..accf828 100644
--- a/ui/native_theme/common_theme.cc
+++ b/ui/native_theme/common_theme.cc
@@ -6,7 +6,6 @@
 
 #include "base/logging.h"
 #include "third_party/skia/include/core/SkCanvas.h"
-#include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_palette.h"
@@ -45,36 +44,33 @@
   }
 
   // Second wave of MD colors (colors that only appear in secondary UI).
-  if (ui::MaterialDesignController::IsSecondaryUiMaterial()) {
-    static const SkColor kPrimaryTextColor = SK_ColorBLACK;
+  static const SkColor kPrimaryTextColor = SK_ColorBLACK;
 
-    switch (color_id) {
-      // Labels
-      case NativeTheme::kColorId_LabelEnabledColor:
-        return kPrimaryTextColor;
-      case NativeTheme::kColorId_LabelDisabledColor:
-        return SkColorSetA(
-            base_theme->GetSystemColor(NativeTheme::kColorId_LabelEnabledColor),
-            gfx::kDisabledControlAlpha);
+  switch (color_id) {
+    // Labels
+    case NativeTheme::kColorId_LabelEnabledColor:
+      return kPrimaryTextColor;
+    case NativeTheme::kColorId_LabelDisabledColor:
+      return SkColorSetA(
+          base_theme->GetSystemColor(NativeTheme::kColorId_LabelEnabledColor),
+          gfx::kDisabledControlAlpha);
 
-      // FocusableBorder
-      case NativeTheme::kColorId_UnfocusedBorderColor:
-        return SkColorSetA(SK_ColorBLACK, 0x4e);
+    // FocusableBorder
+    case NativeTheme::kColorId_UnfocusedBorderColor:
+      return SkColorSetA(SK_ColorBLACK, 0x4e);
 
-      // Textfields
-      case NativeTheme::kColorId_TextfieldDefaultColor:
-        return kPrimaryTextColor;
-      case NativeTheme::kColorId_TextfieldDefaultBackground:
-        return base_theme->GetSystemColor(
-            NativeTheme::kColorId_DialogBackground);
-      case NativeTheme::kColorId_TextfieldReadOnlyColor:
-        return SkColorSetA(base_theme->GetSystemColor(
-                               NativeTheme::kColorId_TextfieldDefaultColor),
-                           gfx::kDisabledControlAlpha);
+    // Textfields
+    case NativeTheme::kColorId_TextfieldDefaultColor:
+      return kPrimaryTextColor;
+    case NativeTheme::kColorId_TextfieldDefaultBackground:
+      return base_theme->GetSystemColor(NativeTheme::kColorId_DialogBackground);
+    case NativeTheme::kColorId_TextfieldReadOnlyColor:
+      return SkColorSetA(base_theme->GetSystemColor(
+                             NativeTheme::kColorId_TextfieldDefaultColor),
+                         gfx::kDisabledControlAlpha);
 
-      default:
-        break;
-    }
+    default:
+      break;
   }
 
   // Shared constant for disabled text.
diff --git a/ui/native_theme/native_theme_mac.mm b/ui/native_theme/native_theme_mac.mm
index 635b6ff5..eb567ff 100644
--- a/ui/native_theme/native_theme_mac.mm
+++ b/ui/native_theme/native_theme_mac.mm
@@ -11,7 +11,6 @@
 #include "base/mac/sdk_forward_declarations.h"
 #include "base/macros.h"
 #import "skia/ext/skia_utils_mac.h"
-#include "ui/base/material_design/material_design_controller.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/skia_util.h"
@@ -27,14 +26,6 @@
 
 const SkColor kMenuPopupBackgroundColor = SK_ColorWHITE;
 
-// Hardcoded color used for some existing dialogs in Chrome's Cocoa UI.
-const SkColor kDialogBackgroundColor = SkColorSetRGB(251, 251, 251);
-
-// Color for the highlighted text in a control when that control doesn't have
-// keyboard focus.
-const SkColor kUnfocusedSelectedTextBackgroundColor =
-    SkColorSetRGB(220, 220, 220);
-
 // Helper to make indexing an array by an enum class easier.
 template <class KEY, class VALUE>
 struct EnumArray {
@@ -160,87 +151,7 @@
       break;
   }
 
-  if (ui::MaterialDesignController::IsSecondaryUiMaterial())
-    return ApplySystemControlTint(GetAuraColor(color_id, this));
-
-  // TODO(tapted): Add caching for these, and listen for
-  // NSSystemColorsDidChangeNotification.
-  switch (color_id) {
-    case kColorId_WindowBackground:
-      return NSSystemColorToSkColor([NSColor windowBackgroundColor]);
-    case kColorId_DialogBackground:
-      return kDialogBackgroundColor;
-    case kColorId_BubbleBackground:
-      return SK_ColorWHITE;
-
-    case kColorId_FocusedBorderColor:
-      return NSSystemColorToSkColor([NSColor keyboardFocusIndicatorColor]);
-    case kColorId_UnfocusedBorderColor:
-      return NSSystemColorToSkColor([NSColor controlColor]);
-
-    // Buttons and labels.
-    case kColorId_ButtonEnabledColor:
-    case kColorId_LabelEnabledColor:
-      return NSSystemColorToSkColor([NSColor controlTextColor]);
-    // NSColor doesn't offer a color for prominent buttons. Use the Aura color,
-    // but apply the system tint. This is a good match for the blue Cocoa uses
-    // to draw buttons that are given a \n key equivalent.
-    case kColorId_ProminentButtonColor:
-      return ApplySystemControlTint(GetAuraColor(color_id, this));
-    case kColorId_ButtonDisabledColor:
-    case kColorId_LabelDisabledColor:
-      return NSSystemColorToSkColor([NSColor disabledControlTextColor]);
-    case kColorId_ButtonHoverColor:
-      return NSSystemColorToSkColor([NSColor selectedControlTextColor]);
-    case kColorId_LabelTextSelectionColor:
-      return NSSystemColorToSkColor([NSColor selectedTextColor]);
-
-    // Link.
-    case kColorId_LinkDisabled:
-      return SK_ColorBLACK;
-    case kColorId_LinkEnabled:
-      return SK_ColorBLUE;
-    case kColorId_LinkPressed:
-      return SK_ColorRED;
-
-    // Text fields.
-    case kColorId_TextfieldDefaultColor:
-    case kColorId_TextfieldReadOnlyColor:
-      return NSSystemColorToSkColor([NSColor textColor]);
-    case kColorId_TextfieldDefaultBackground:
-    case kColorId_TextfieldReadOnlyBackground:
-      return NSSystemColorToSkColor([NSColor textBackgroundColor]);
-    case kColorId_TextfieldSelectionColor:
-      return NSSystemColorToSkColor([NSColor selectedTextColor]);
-
-    // Trees/Tables. For focused text, use the alternate* versions, which
-    // NSColor documents as "the table and list view equivalent to the
-    // selectedControlTextColor".
-    case kColorId_TreeBackground:
-    case kColorId_TableBackground:
-      return NSSystemColorToSkColor([NSColor controlBackgroundColor]);
-    case kColorId_TreeText:
-    case kColorId_TableText:
-    case kColorId_TableSelectedTextUnfocused:
-    case kColorId_TreeSelectedTextUnfocused:
-      return NSSystemColorToSkColor([NSColor textColor]);
-    case kColorId_TreeSelectedText:
-    case kColorId_TableSelectedText:
-      return NSSystemColorToSkColor(
-          [NSColor alternateSelectedControlTextColor]);
-    case kColorId_TreeSelectionBackgroundFocused:
-    case kColorId_TableSelectionBackgroundFocused:
-      return NSSystemColorToSkColor([NSColor alternateSelectedControlColor]);
-    case kColorId_TreeSelectionBackgroundUnfocused:
-    case kColorId_TableSelectionBackgroundUnfocused:
-      return kUnfocusedSelectedTextBackgroundColor;
-    case kColorId_TableGroupingIndicatorColor:
-      return SkColorSetRGB(140, 140, 140);
-
-    default:
-      // TODO(tapted): Handle all values and remove the default case.
-      return GetAuraColor(color_id, this);
-  }
+  return ApplySystemControlTint(GetAuraColor(color_id, this));
 }
 
 void NativeThemeMac::PaintMenuPopupBackground(
diff --git a/ui/native_theme/native_theme_win.cc b/ui/native_theme/native_theme_win.cc
index 5c0a30b..839974d 100644
--- a/ui/native_theme/native_theme_win.cc
+++ b/ui/native_theme/native_theme_win.cc
@@ -28,7 +28,6 @@
 #include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/include/core/SkShader.h"
 #include "third_party/skia/include/core/SkSurface.h"
-#include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/display/win/screen_win.h"
 #include "ui/gfx/color_palette.h"
@@ -418,11 +417,6 @@
 
 SkColor NativeThemeWin::GetSystemColor(ColorId color_id) const {
   // TODO: Obtain the correct colors using GetSysColor.
-  // Dialogs:
-  const SkColor kDialogBackgroundColor = SkColorSetRGB(251, 251, 251);
-  // FocusableBorder:
-  const SkColor kFocusedBorderColor = SkColorSetRGB(0x4d, 0x90, 0xfe);
-  const SkColor kUnfocusedBorderColor = SkColorSetRGB(0xd9, 0xd9, 0xd9);
   // Button:
   const SkColor kButtonHoverColor = SkColorSetRGB(6, 45, 117);
   const SkColor kProminentButtonColorInvert = gfx::kGoogleBlue300;
@@ -446,21 +440,13 @@
     // Dialogs
     case kColorId_DialogBackground:
     case kColorId_BubbleBackground:
-      if (ui::MaterialDesignController::IsSecondaryUiMaterial())
-        break;
-      return color_utils::IsInvertedColorScheme() ?
-          color_utils::InvertColor(kDialogBackgroundColor) :
-          kDialogBackgroundColor;
+      break;
 
     // FocusableBorder
     case kColorId_FocusedBorderColor:
-      if (ui::MaterialDesignController::IsSecondaryUiMaterial())
-        break;
-      return kFocusedBorderColor;
+      break;
     case kColorId_UnfocusedBorderColor:
-      if (ui::MaterialDesignController::IsSecondaryUiMaterial())
-        break;
-      return kUnfocusedBorderColor;
+      break;
 
     // Button
     case kColorId_ButtonEnabledColor:
diff --git a/ui/ozone/platform/drm/common/drm_util.cc b/ui/ozone/platform/drm/common/drm_util.cc
index 117ab3a..efb043d5 100644
--- a/ui/ozone/platform/drm/common/drm_util.cc
+++ b/ui/ozone/platform/drm/common/drm_util.cc
@@ -204,7 +204,9 @@
     if (!FindDrmProperty(fd, plane_props.get(), "PLANE_CTM"))
       return false;
   }
-  return true;
+
+  // On legacy, if no planes are exposed then the property isn't available.
+  return plane_resources->count_planes > 0;
 }
 
 bool IsDrmModuleName(const int fd, const std::string& name) {
diff --git a/ui/ozone/platform/drm/host/drm_device_handle.cc b/ui/ozone/platform/drm/host/drm_device_handle.cc
index a66efcf..2cca269 100644
--- a/ui/ozone/platform/drm/host/drm_device_handle.cc
+++ b/ui/ozone/platform/drm/host/drm_device_handle.cc
@@ -69,6 +69,9 @@
       struct drm_set_client_cap cap = {DRM_CLIENT_CAP_ATOMIC, 1};
       has_atomic_capabilities_ =
           !drmIoctl(file_.get(), DRM_IOCTL_SET_CLIENT_CAP, &cap);
+
+      cap = {DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1};
+      drmIoctl(file_.get(), DRM_IOCTL_SET_CLIENT_CAP, &cap);
       break;
     }
 
diff --git a/ui/ozone/platform/drm/host/drm_window_host.cc b/ui/ozone/platform/drm/host/drm_window_host.cc
index a5e6bd5..66e8b55 100644
--- a/ui/ozone/platform/drm/host/drm_window_host.cc
+++ b/ui/ozone/platform/drm/host/drm_window_host.cc
@@ -137,6 +137,15 @@
   return nullptr;
 }
 
+void DrmWindowHost::SetRestoredBoundsInPixels(const gfx::Rect& bounds) {
+  NOTREACHED();
+}
+
+gfx::Rect DrmWindowHost::GetRestoredBoundsInPixels() const {
+  NOTREACHED();
+  return gfx::Rect();
+}
+
 bool DrmWindowHost::CanDispatchEvent(const PlatformEvent& event) {
   DCHECK(event);
 
diff --git a/ui/ozone/platform/drm/host/drm_window_host.h b/ui/ozone/platform/drm/host/drm_window_host.h
index 33eac10..073a1ad 100644
--- a/ui/ozone/platform/drm/host/drm_window_host.h
+++ b/ui/ozone/platform/drm/host/drm_window_host.h
@@ -77,6 +77,8 @@
   void MoveCursorTo(const gfx::Point& location) override;
   void ConfineCursorToBounds(const gfx::Rect& bounds) override;
   PlatformImeController* GetPlatformImeController() override;
+  void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override;
+  gfx::Rect GetRestoredBoundsInPixels() const override;
 
   // PlatformEventDispatcher:
   bool CanDispatchEvent(const PlatformEvent& event) override;
diff --git a/ui/ozone/platform/scenic/scenic_window.cc b/ui/ozone/platform/scenic/scenic_window.cc
index 0c22df2..eb96043c 100644
--- a/ui/ozone/platform/scenic/scenic_window.cc
+++ b/ui/ozone/platform/scenic/scenic_window.cc
@@ -180,6 +180,15 @@
   return nullptr;
 }
 
+void ScenicWindow::SetRestoredBoundsInPixels(const gfx::Rect& bounds) {
+  NOTIMPLEMENTED();
+}
+
+gfx::Rect ScenicWindow::GetRestoredBoundsInPixels() const {
+  NOTIMPLEMENTED();
+  return gfx::Rect();
+}
+
 void ScenicWindow::UpdateSize() {
   gfx::SizeF scaled = ScaleSize(size_dips_, device_pixel_ratio_);
   size_pixels_ = gfx::Size(ceilf(scaled.width()), ceilf(scaled.height()));
diff --git a/ui/ozone/platform/scenic/scenic_window.h b/ui/ozone/platform/scenic/scenic_window.h
index 50807b4b..d2c3b5d4 100644
--- a/ui/ozone/platform/scenic/scenic_window.h
+++ b/ui/ozone/platform/scenic/scenic_window.h
@@ -61,6 +61,8 @@
   void MoveCursorTo(const gfx::Point& location) override;
   void ConfineCursorToBounds(const gfx::Rect& bounds) override;
   PlatformImeController* GetPlatformImeController() override;
+  void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override;
+  gfx::Rect GetRestoredBoundsInPixels() const override;
 
  private:
   // views::ViewListener interface.
diff --git a/ui/ozone/platform/wayland/ozone_platform_wayland.cc b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
index 538ebd2..1aa07027 100644
--- a/ui/ozone/platform/wayland/ozone_platform_wayland.cc
+++ b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
@@ -32,7 +32,15 @@
 
 class OzonePlatformWayland : public OzonePlatform {
  public:
-  OzonePlatformWayland() {}
+  OzonePlatformWayland() {
+    // Supporting server-side decorations requires a support of xdg-decorations.
+    // But this protocol has been accepted into the upstream recently, and it
+    // will take time before it is taken by compositors. For now, always use
+    // custom frames and disallow switching to server-side frames.
+    // https://github.com/wayland-project/wayland-protocols/commit/76d1ae8c65739eff3434ef219c58a913ad34e988
+    properties_.custom_frame_pref_default = true;
+    properties_.use_system_title_bar = false;
+  }
   ~OzonePlatformWayland() override {}
 
   // OzonePlatform
@@ -110,6 +118,10 @@
     }
   }
 
+  const PlatformProperties& GetPlatformProperties() override {
+    return properties_;
+  }
+
  private:
   std::unique_ptr<WaylandConnection> connection_;
   std::unique_ptr<WaylandSurfaceFactory> surface_factory_;
@@ -122,6 +134,8 @@
   XkbEvdevCodes xkb_evdev_code_converter_;
 #endif
 
+  PlatformProperties properties_;
+
   DISALLOW_COPY_AND_ASSIGN(OzonePlatformWayland);
 };
 
diff --git a/ui/ozone/platform/wayland/wayland_window.cc b/ui/ozone/platform/wayland/wayland_window.cc
index 65ceb29c..c0d8847a0 100644
--- a/ui/ozone/platform/wayland/wayland_window.cc
+++ b/ui/ozone/platform/wayland/wayland_window.cc
@@ -71,7 +71,7 @@
     : delegate_(delegate),
       connection_(connection),
       xdg_shell_objects_factory_(new XDGShellObjectFactory()),
-      state_(PlatformWindowState::PLATFORM_WINDOW_STATE_UNKNOWN) {}
+      state_(PlatformWindowState::PLATFORM_WINDOW_STATE_NORMAL) {}
 
 WaylandWindow::~WaylandWindow() {
   PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
@@ -289,7 +289,8 @@
     // unless they are empty, because |bounds_| can contain bounds of a
     // maximized window instead.
     if (restored_bounds_.IsEmpty())
-      restored_bounds_ = bounds_;
+      SetRestoredBoundsInPixels(bounds_);
+
     xdg_surface_->SetFullscreen();
   } else {
     // Check the comment above. If it's not handled synchronously, media files
@@ -314,7 +315,7 @@
   // state to a maximize state, and then preserved to be the same, when changing
   // from maximized to fullscreen and back to a maximized state.
   if (restored_bounds_.IsEmpty())
-    restored_bounds_ = bounds_;
+    SetRestoredBoundsInPixels(bounds_);
 
   xdg_surface_->SetMaximized();
   connection_->ScheduleFlush();
@@ -377,6 +378,14 @@
   return nullptr;
 }
 
+void WaylandWindow::SetRestoredBoundsInPixels(const gfx::Rect& bounds) {
+  restored_bounds_ = bounds;
+}
+
+gfx::Rect WaylandWindow::GetRestoredBoundsInPixels() const {
+  return restored_bounds_;
+}
+
 bool WaylandWindow::CanDispatchEvent(const PlatformEvent& event) {
   // This window is a nested popup window, all the events must be forwarded
   // to the main popup window.
@@ -465,9 +474,29 @@
   // most recent bounds, and have WaylandConnection call ApplyPendingBounds
   // when it has finished processing events. We may get many configure events
   // in a row during an interactive resize, and only the last one matters.
-  SetPendingBounds(width, height);
+  //
+  // Width or height set to 0 means that we should decide on width and height by
+  // ourselves, but we don't want to set them to anything else. Use restored
+  // bounds size or the current bounds.
+  //
+  // Note: if the browser was started with --start-fullscreen and a user exits
+  // the fullscreen mode, wayland may set the width and height to be 1. Instead,
+  // explicitly set the bounds to the current desired ones or the previous
+  // bounds.
+  if (width <= 1 || height <= 1) {
+    pending_bounds_.set_size(restored_bounds_.IsEmpty()
+                                 ? GetBounds().size()
+                                 : restored_bounds_.size());
+  } else {
+    pending_bounds_ = gfx::Rect(0, 0, width, height);
+  }
 
-  if (old_state != state_)
+  const bool is_normal = !IsFullscreen() && !IsMaximized();
+  const bool state_changed = old_state != state_;
+  if (is_normal && state_changed)
+    restored_bounds_ = gfx::Rect();
+
+  if (state_changed)
     delegate_->OnWindowStateChanged(state_);
 
   if (did_active_change)
@@ -493,27 +522,6 @@
   return state_ == PlatformWindowState::PLATFORM_WINDOW_STATE_FULLSCREEN;
 }
 
-void WaylandWindow::SetPendingBounds(int32_t width, int32_t height) {
-  // Width or height set to 0 means that we should decide on width and height by
-  // ourselves, but we don't want to set them to anything else. Use restored
-  // bounds size or the current bounds.
-  //
-  // Note: if the browser was started with --start-fullscreen and a user exits
-  // the fullscreen mode, wayland may set the width and height to be 1. Instead,
-  // explicitly set the bounds to the current desired ones or the previous
-  // bounds.
-  if (width <= 1 || height <= 1) {
-    pending_bounds_.set_size(restored_bounds_.IsEmpty()
-                                 ? GetBounds().size()
-                                 : restored_bounds_.size());
-  } else {
-    pending_bounds_ = gfx::Rect(0, 0, width, height);
-  }
-
-  if (!IsFullscreen() && !IsMaximized())
-    restored_bounds_ = gfx::Rect();
-}
-
 WaylandWindow* WaylandWindow::GetParentWindow(
     gfx::AcceleratedWidget parent_widget) {
   WaylandWindow* parent_window = connection_->GetWindow(parent_widget);
diff --git a/ui/ozone/platform/wayland/wayland_window.h b/ui/ozone/platform/wayland/wayland_window.h
index c12b6f5..d652e896a 100644
--- a/ui/ozone/platform/wayland/wayland_window.h
+++ b/ui/ozone/platform/wayland/wayland_window.h
@@ -86,6 +86,8 @@
   void MoveCursorTo(const gfx::Point& location) override;
   void ConfineCursorToBounds(const gfx::Rect& bounds) override;
   PlatformImeController* GetPlatformImeController() override;
+  void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override;
+  gfx::Rect GetRestoredBoundsInPixels() const override;
 
   // PlatformEventDispatcher
   bool CanDispatchEvent(const PlatformEvent& event) override;
@@ -104,8 +106,6 @@
   bool IsMaximized() const;
   bool IsFullscreen() const;
 
-  void SetPendingBounds(int32_t width, int32_t height);
-
   // Creates a popup window, which is visible as a menu window.
   void CreateXdgPopup();
   // Creates a surface window, which is visible as a main window.
diff --git a/ui/ozone/platform/wayland/wayland_window_unittest.cc b/ui/ozone/platform/wayland/wayland_window_unittest.cc
index 2f23bb9c..59c2425 100644
--- a/ui/ozone/platform/wayland/wayland_window_unittest.cc
+++ b/ui/ozone/platform/wayland/wayland_window_unittest.cc
@@ -169,9 +169,8 @@
 TEST_P(WaylandWindowTest, Minimize) {
   ScopedWlArray states;
 
-  // Initialize to normal first.
-  EXPECT_CALL(delegate_,
-              OnWindowStateChanged(Eq(PLATFORM_WINDOW_STATE_NORMAL)));
+  // Make sure the window is initialized to normal state from the beginning.
+  EXPECT_EQ(PLATFORM_WINDOW_STATE_NORMAL, window_->GetPlatformWindowState());
   SendConfigureEvent(0, 0, 1, states.get());
   Sync();
 
@@ -202,8 +201,8 @@
 }
 
 TEST_P(WaylandWindowTest, SetFullscreenAndRestore) {
-  // Ensure the initial state is unknown.
-  EXPECT_EQ(window_->GetPlatformWindowState(), PLATFORM_WINDOW_STATE_UNKNOWN);
+  // Make sure the window is initialized to normal state from the beginning.
+  EXPECT_EQ(PLATFORM_WINDOW_STATE_NORMAL, window_->GetPlatformWindowState());
 
   ScopedWlArray states = InitializeWlArrayWithActivatedState();
 
@@ -266,6 +265,10 @@
 
   ScopedWlArray states = InitializeWlArrayWithActivatedState();
 
+  gfx::Rect restored_bounds = window_->GetRestoredBoundsInPixels();
+  EXPECT_TRUE(restored_bounds.IsEmpty());
+  gfx::Rect bounds = window_->GetBounds();
+
   const gfx::Rect maximized_bounds = gfx::Rect(0, 0, 1024, 768);
   EXPECT_CALL(delegate_, OnBoundsChanged(Eq(maximized_bounds)));
   window_->Maximize();
@@ -273,6 +276,8 @@
   SendConfigureEvent(maximized_bounds.width(), maximized_bounds.height(), 1,
                      states.get());
   Sync();
+  restored_bounds = window_->GetRestoredBoundsInPixels();
+  EXPECT_EQ(bounds, restored_bounds);
 
   EXPECT_CALL(delegate_, OnBoundsChanged(Eq(current_bounds)));
   // Both in XdgV5 and XdgV6, surfaces implement SetWindowGeometry method.
@@ -285,6 +290,10 @@
   states = InitializeWlArrayWithActivatedState();
   SendConfigureEvent(0, 0, 2, states.get());
   Sync();
+  bounds = window_->GetBounds();
+  EXPECT_EQ(bounds, restored_bounds);
+  restored_bounds = window_->GetRestoredBoundsInPixels();
+  EXPECT_EQ(restored_bounds, gfx::Rect());
 }
 
 TEST_P(WaylandWindowTest, RestoreBoundsAfterFullscreen) {
@@ -292,6 +301,10 @@
 
   ScopedWlArray states = InitializeWlArrayWithActivatedState();
 
+  gfx::Rect restored_bounds = window_->GetRestoredBoundsInPixels();
+  EXPECT_EQ(restored_bounds, gfx::Rect());
+  gfx::Rect bounds = window_->GetBounds();
+
   const gfx::Rect fullscreen_bounds = gfx::Rect(0, 0, 1280, 720);
   EXPECT_CALL(delegate_, OnBoundsChanged(Eq(fullscreen_bounds)));
   window_->ToggleFullscreen();
@@ -299,6 +312,8 @@
   SendConfigureEvent(fullscreen_bounds.width(), fullscreen_bounds.height(), 1,
                      states.get());
   Sync();
+  restored_bounds = window_->GetRestoredBoundsInPixels();
+  EXPECT_EQ(bounds, restored_bounds);
 
   EXPECT_CALL(delegate_, OnBoundsChanged(Eq(current_bounds)));
   // Both in XdgV5 and XdgV6, surfaces implement SetWindowGeometry method.
@@ -311,6 +326,10 @@
   states = InitializeWlArrayWithActivatedState();
   SendConfigureEvent(0, 0, 2, states.get());
   Sync();
+  bounds = window_->GetBounds();
+  EXPECT_EQ(bounds, restored_bounds);
+  restored_bounds = window_->GetRestoredBoundsInPixels();
+  EXPECT_EQ(restored_bounds, gfx::Rect());
 }
 
 TEST_P(WaylandWindowTest, RestoreBoundsAfterMaximizeAndFullscreen) {
@@ -318,6 +337,10 @@
 
   ScopedWlArray states = InitializeWlArrayWithActivatedState();
 
+  gfx::Rect restored_bounds = window_->GetRestoredBoundsInPixels();
+  EXPECT_EQ(restored_bounds, gfx::Rect());
+  gfx::Rect bounds = window_->GetBounds();
+
   const gfx::Rect maximized_bounds = gfx::Rect(0, 0, 1024, 768);
   EXPECT_CALL(delegate_, OnBoundsChanged(Eq(maximized_bounds)));
   window_->Maximize();
@@ -325,6 +348,8 @@
   SendConfigureEvent(maximized_bounds.width(), maximized_bounds.height(), 1,
                      states.get());
   Sync();
+  restored_bounds = window_->GetRestoredBoundsInPixels();
+  EXPECT_EQ(bounds, restored_bounds);
 
   const gfx::Rect fullscreen_bounds = gfx::Rect(0, 0, 1280, 720);
   EXPECT_CALL(delegate_, OnBoundsChanged(Eq(fullscreen_bounds)));
@@ -333,6 +358,8 @@
   SendConfigureEvent(fullscreen_bounds.width(), fullscreen_bounds.height(), 2,
                      states.get());
   Sync();
+  gfx::Rect fullscreen_restore_bounds = window_->GetRestoredBoundsInPixels();
+  EXPECT_EQ(restored_bounds, fullscreen_restore_bounds);
 
   EXPECT_CALL(delegate_, OnBoundsChanged(Eq(maximized_bounds)));
   window_->Maximize();
@@ -342,6 +369,8 @@
   SendConfigureEvent(maximized_bounds.width(), maximized_bounds.height(), 3,
                      states.get());
   Sync();
+  restored_bounds = window_->GetRestoredBoundsInPixels();
+  EXPECT_EQ(restored_bounds, fullscreen_restore_bounds);
 
   EXPECT_CALL(delegate_, OnBoundsChanged(Eq(current_bounds)));
   // Both in XdgV5 and XdgV6, surfaces implement SetWindowGeometry method.
@@ -354,6 +383,10 @@
   states = InitializeWlArrayWithActivatedState();
   SendConfigureEvent(0, 0, 4, states.get());
   Sync();
+  bounds = window_->GetBounds();
+  EXPECT_EQ(bounds, restored_bounds);
+  restored_bounds = window_->GetRestoredBoundsInPixels();
+  EXPECT_EQ(restored_bounds, gfx::Rect());
 }
 
 TEST_P(WaylandWindowTest, SendsBoundsOnRequest) {
@@ -374,11 +407,19 @@
   SendConfigureEvent(0, 0, 2, states.get());
   Sync();
 
+  // Restored bounds should keep empty value.
+  gfx::Rect restored_bounds = window_->GetRestoredBoundsInPixels();
+  EXPECT_EQ(restored_bounds, gfx::Rect());
+
   // Second case is when Wayland sends a configure event with 1, 1 height and
   // width. It looks more like a bug in Gnome Shell with Wayland as long as the
   // documentation says it must be set to 0, 0, when wayland requests bounds.
   SendConfigureEvent(0, 0, 3, states.get());
   Sync();
+
+  // Restored bounds should keep empty value.
+  restored_bounds = window_->GetRestoredBoundsInPixels();
+  EXPECT_EQ(restored_bounds, gfx::Rect());
 }
 
 TEST_P(WaylandWindowTest, CanDispatchMouseEventDefault) {
diff --git a/ui/ozone/public/ozone_platform.cc b/ui/ozone/public/ozone_platform.cc
index 828076e..1a731e2 100644
--- a/ui/ozone/public/ozone_platform.cc
+++ b/ui/ozone/public/ozone_platform.cc
@@ -20,9 +20,7 @@
 base::LazyInstance<base::OnceCallback<void(OzonePlatform*)>>::Leaky
     instance_callback = LAZY_INSTANCE_INITIALIZER;
 
-constexpr OzonePlatform::PlatformProperties kDefaultPlatformProperties = {
-    /*needs_view_owner_request=*/false,
-};
+constexpr OzonePlatform::PlatformProperties kDefaultPlatformProperties;
 
 base::Lock& GetOzoneInstanceLock() {
   static base::Lock lock;
diff --git a/ui/ozone/public/ozone_platform.h b/ui/ozone/public/ozone_platform.h
index 2189dc6..c6073ed 100644
--- a/ui/ozone/public/ozone_platform.h
+++ b/ui/ozone/public/ozone_platform.h
@@ -86,7 +86,15 @@
     // Fuchsia only: set to true when the platforms requires
     // |view_owner_request| field in PlatformWindowInitProperties when creating
     // a window.
-    bool needs_view_owner_request;
+    bool needs_view_owner_request = false;
+
+    // Determine whether we should default to native decorations or the custom
+    // frame based on the currently-running window manager.
+    bool custom_frame_pref_default = false;
+
+    // Determine whether switching between system and custom frames is
+    // supported.
+    bool use_system_title_bar = false;
   };
 
   // Ensures the OzonePlatform instance without doing any initialization.
diff --git a/ui/platform_window/platform_window.h b/ui/platform_window/platform_window.h
index 372b7d2c..181ad85f 100644
--- a/ui/platform_window/platform_window.h
+++ b/ui/platform_window/platform_window.h
@@ -66,6 +66,10 @@
   // The PlatformImeController is owned by the PlatformWindow, the ownership is
   // not transferred.
   virtual PlatformImeController* GetPlatformImeController() = 0;
+
+  // Sets and gets the restored bounds of the platform-window.
+  virtual void SetRestoredBoundsInPixels(const gfx::Rect& bounds) = 0;
+  virtual gfx::Rect GetRestoredBoundsInPixels() const = 0;
 };
 
 }  // namespace ui
diff --git a/ui/platform_window/stub/stub_window.cc b/ui/platform_window/stub/stub_window.cc
index 141784f..154d3e2 100644
--- a/ui/platform_window/stub/stub_window.cc
+++ b/ui/platform_window/stub/stub_window.cc
@@ -74,4 +74,10 @@
   return nullptr;
 }
 
+void StubWindow::SetRestoredBoundsInPixels(const gfx::Rect& bounds) {}
+
+gfx::Rect StubWindow::GetRestoredBoundsInPixels() const {
+  return gfx::Rect();
+}
+
 }  // namespace ui
diff --git a/ui/platform_window/stub/stub_window.h b/ui/platform_window/stub/stub_window.h
index 61a20ea..f46c8aa 100644
--- a/ui/platform_window/stub/stub_window.h
+++ b/ui/platform_window/stub/stub_window.h
@@ -48,6 +48,8 @@
   void MoveCursorTo(const gfx::Point& location) override;
   void ConfineCursorToBounds(const gfx::Rect& bounds) override;
   PlatformImeController* GetPlatformImeController() override;
+  void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override;
+  gfx::Rect GetRestoredBoundsInPixels() const override;
 
   PlatformWindowDelegate* delegate_;
   gfx::Rect bounds_;
diff --git a/ui/platform_window/win/win_window.cc b/ui/platform_window/win/win_window.cc
index ea3e223..a16635f 100644
--- a/ui/platform_window/win/win_window.cc
+++ b/ui/platform_window/win/win_window.cc
@@ -140,6 +140,12 @@
   return nullptr;
 }
 
+void WinWindow::SetRestoredBoundsInPixels(const gfx::Rect& bounds) {}
+
+gfx::Rect WinWindow::GetRestoredBoundsInPixels() const {
+  return gfx::Rect();
+}
+
 LRESULT WinWindow::OnMouseRange(UINT message, WPARAM w_param, LPARAM l_param) {
   MSG msg = { hwnd(), message, w_param, l_param,
               static_cast<DWORD>(GetMessageTime()),
diff --git a/ui/platform_window/win/win_window.h b/ui/platform_window/win/win_window.h
index 1e753c4c..786d36d 100644
--- a/ui/platform_window/win/win_window.h
+++ b/ui/platform_window/win/win_window.h
@@ -47,6 +47,8 @@
   void MoveCursorTo(const gfx::Point& location) override;
   void ConfineCursorToBounds(const gfx::Rect& bounds) override;
   PlatformImeController* GetPlatformImeController() override;
+  void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override;
+  gfx::Rect GetRestoredBoundsInPixels() const override;
 
   CR_BEGIN_MSG_MAP_EX(WinWindow)
     CR_MESSAGE_RANGE_HANDLER_EX(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange)
diff --git a/ui/platform_window/x11/x11_window_base.cc b/ui/platform_window/x11/x11_window_base.cc
index 4c15466..4ec56c03 100644
--- a/ui/platform_window/x11/x11_window_base.cc
+++ b/ui/platform_window/x11/x11_window_base.cc
@@ -297,6 +297,17 @@
   return nullptr;
 }
 
+void X11WindowBase::SetRestoredBoundsInPixels(const gfx::Rect& bounds) {
+  // TODO: https://crbug.com/848131
+  NOTIMPLEMENTED();
+}
+
+gfx::Rect X11WindowBase::GetRestoredBoundsInPixels() const {
+  // TODO: https://crbug.com/848131
+  NOTIMPLEMENTED();
+  return gfx::Rect();
+}
+
 void X11WindowBase::UnConfineCursor() {
   if (!has_pointer_barriers_)
     return;
diff --git a/ui/platform_window/x11/x11_window_base.h b/ui/platform_window/x11/x11_window_base.h
index 4337581..10f6a81 100644
--- a/ui/platform_window/x11/x11_window_base.h
+++ b/ui/platform_window/x11/x11_window_base.h
@@ -48,6 +48,8 @@
   void MoveCursorTo(const gfx::Point& location) override;
   void ConfineCursorToBounds(const gfx::Rect& bounds) override;
   PlatformImeController* GetPlatformImeController() override;
+  void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override;
+  gfx::Rect GetRestoredBoundsInPixels() const override;
 
  protected:
   // Creates new underlying XWindow. Does not map XWindow.
diff --git a/ui/views/bubble/bubble_border.cc b/ui/views/bubble/bubble_border.cc
index b746bb4..9fc042c 100644
--- a/ui/views/bubble/bubble_border.cc
+++ b/ui/views/bubble/bubble_border.cc
@@ -27,42 +27,13 @@
 
 namespace views {
 
-namespace internal {
-
-BorderImages::BorderImages(const int border_image_ids[],
-                           const int arrow_image_ids[],
-                           int border_interior_thickness,
-                           int arrow_interior_thickness,
-                           int corner_radius)
-    : border_thickness(border_interior_thickness),
-      border_interior_thickness(border_interior_thickness),
-      arrow_thickness(arrow_interior_thickness),
-      arrow_interior_thickness(arrow_interior_thickness),
-      arrow_width(2 * arrow_interior_thickness),
-      corner_radius(corner_radius) {
-  if (!border_image_ids)
-    return;
-
-  border_painter = Painter::CreateImageGridPainter(border_image_ids);
-  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
-  border_thickness = rb.GetImageSkiaNamed(border_image_ids[0])->width();
-
-  if (arrow_image_ids[0] != 0) {
-    left_arrow = *rb.GetImageSkiaNamed(arrow_image_ids[0]);
-    top_arrow = *rb.GetImageSkiaNamed(arrow_image_ids[1]);
-    right_arrow = *rb.GetImageSkiaNamed(arrow_image_ids[2]);
-    bottom_arrow = *rb.GetImageSkiaNamed(arrow_image_ids[3]);
-    arrow_width = top_arrow.width();
-    arrow_thickness = top_arrow.height();
-  }
-}
-
-BorderImages::~BorderImages() {}
-
-}  // namespace internal
-
 namespace {
 
+// GetShadowValues and GetBorderAndShadowFlags cache their results. The shadow
+// values depend on both the shadow elevation and color, so we create a tuple to
+// key the cache.
+typedef std::tuple<int, SkColor> ShadowCacheKey;
+
 // The border corner radius for material design bubble borders.
 constexpr int kMaterialDesignCornerRadius = 2;
 
@@ -87,82 +58,6 @@
   return gfx::Point(rect.right(), rect.CenterPoint().y());
 }
 
-// Bubble border and arrow image resource ids. They don't use the IMAGE_GRID
-// macro because there is no center image.
-const int kNoShadowImages[] = {
-    IDR_BUBBLE_TL, IDR_BUBBLE_T, IDR_BUBBLE_TR,
-    IDR_BUBBLE_L,  0,            IDR_BUBBLE_R,
-    IDR_BUBBLE_BL, IDR_BUBBLE_B, IDR_BUBBLE_BR };
-const int kNoShadowArrows[] = {
-    IDR_BUBBLE_L_ARROW, IDR_BUBBLE_T_ARROW,
-    IDR_BUBBLE_R_ARROW, IDR_BUBBLE_B_ARROW, };
-
-const int kBigShadowImages[] = {
-    IDR_WINDOW_BUBBLE_SHADOW_BIG_TOP_LEFT,
-    IDR_WINDOW_BUBBLE_SHADOW_BIG_TOP,
-    IDR_WINDOW_BUBBLE_SHADOW_BIG_TOP_RIGHT,
-    IDR_WINDOW_BUBBLE_SHADOW_BIG_LEFT,
-    0,
-    IDR_WINDOW_BUBBLE_SHADOW_BIG_RIGHT,
-    IDR_WINDOW_BUBBLE_SHADOW_BIG_BOTTOM_LEFT,
-    IDR_WINDOW_BUBBLE_SHADOW_BIG_BOTTOM,
-    IDR_WINDOW_BUBBLE_SHADOW_BIG_BOTTOM_RIGHT };
-const int kBigShadowArrows[] = {
-    IDR_WINDOW_BUBBLE_SHADOW_SPIKE_BIG_LEFT,
-    IDR_WINDOW_BUBBLE_SHADOW_SPIKE_BIG_TOP,
-    IDR_WINDOW_BUBBLE_SHADOW_SPIKE_BIG_RIGHT,
-    IDR_WINDOW_BUBBLE_SHADOW_SPIKE_BIG_BOTTOM };
-
-const int kSmallShadowImages[] = {
-    IDR_WINDOW_BUBBLE_SHADOW_SMALL_TOP_LEFT,
-    IDR_WINDOW_BUBBLE_SHADOW_SMALL_TOP,
-    IDR_WINDOW_BUBBLE_SHADOW_SMALL_TOP_RIGHT,
-    IDR_WINDOW_BUBBLE_SHADOW_SMALL_LEFT,
-    0,
-    IDR_WINDOW_BUBBLE_SHADOW_SMALL_RIGHT,
-    IDR_WINDOW_BUBBLE_SHADOW_SMALL_BOTTOM_LEFT,
-    IDR_WINDOW_BUBBLE_SHADOW_SMALL_BOTTOM,
-    IDR_WINDOW_BUBBLE_SHADOW_SMALL_BOTTOM_RIGHT };
-const int kSmallShadowArrows[] = {
-    IDR_WINDOW_BUBBLE_SHADOW_SPIKE_SMALL_LEFT,
-    IDR_WINDOW_BUBBLE_SHADOW_SPIKE_SMALL_TOP,
-    IDR_WINDOW_BUBBLE_SHADOW_SPIKE_SMALL_RIGHT,
-    IDR_WINDOW_BUBBLE_SHADOW_SPIKE_SMALL_BOTTOM };
-
-using internal::BorderImages;
-
-// Returns the cached BorderImages for the given |shadow| type.
-BorderImages* GetBorderImages(BubbleBorder::Shadow shadow) {
-  // Keep a cache of bubble border image-set painters, arrows, and metrics.
-  static BorderImages* kBorderImages[BubbleBorder::SHADOW_COUNT] = { NULL };
-
-  CHECK_LT(shadow, BubbleBorder::SHADOW_COUNT);
-  struct BorderImages*& set = kBorderImages[shadow];
-  if (set)
-    return set;
-
-  switch (shadow) {
-    case BubbleBorder::NO_SHADOW:
-    case BubbleBorder::NO_SHADOW_OPAQUE_BORDER:
-      set = new BorderImages(kNoShadowImages, kNoShadowArrows, 6, 7, 4);
-      break;
-    case BubbleBorder::BIG_SHADOW:
-      set = new BorderImages(kBigShadowImages, kBigShadowArrows, 23, 9, 2);
-      break;
-    case BubbleBorder::SMALL_SHADOW:
-      set = new BorderImages(kSmallShadowImages, kSmallShadowArrows, 5, 6, 2);
-      break;
-    case BubbleBorder::NO_ASSETS:
-      set = new BorderImages(nullptr, nullptr, 17, 8, 2);
-      break;
-    case BubbleBorder::SHADOW_COUNT:
-      NOTREACHED();
-      break;
-  }
-
-  return set;
-}
-
 }  // namespace
 
 const int BubbleBorder::kStroke = 1;
@@ -170,14 +65,10 @@
 BubbleBorder::BubbleBorder(Arrow arrow, Shadow shadow, SkColor color)
     : arrow_(arrow),
       arrow_offset_(0),
-      arrow_paint_type_(PAINT_NORMAL),
-      alignment_(ALIGN_ARROW_TO_MID_ANCHOR),
       shadow_(shadow),
-      images_(nullptr),
       background_color_(color),
       use_theme_background_color_(false) {
   DCHECK(shadow_ < SHADOW_COUNT);
-  Init();
 }
 
 BubbleBorder::~BubbleBorder() {}
@@ -197,23 +88,14 @@
 
 void BubbleBorder::SetCornerRadius(int corner_radius) {
   corner_radius_ = corner_radius;
-  Init();
-}
-
-void BubbleBorder::set_paint_arrow(ArrowPaintType value) {
-  if (UseMaterialDesign())
-    return;
-  arrow_paint_type_ = value;
 }
 
 gfx::Rect BubbleBorder::GetBounds(const gfx::Rect& anchor_rect,
                                   const gfx::Size& contents_size) const {
   // In MD, there are no arrows, so positioning logic is significantly simpler.
   // TODO(estade): handle more anchor positions.
-  if (UseMaterialDesign() &&
-      (arrow_ == TOP_RIGHT || arrow_ == TOP_LEFT || arrow_ == BOTTOM_CENTER ||
-       arrow_ == TOP_CENTER || arrow_ == LEFT_CENTER ||
-       arrow_ == RIGHT_CENTER)) {
+  if (arrow_ == TOP_RIGHT || arrow_ == TOP_LEFT || arrow_ == BOTTOM_CENTER ||
+      arrow_ == TOP_CENTER || arrow_ == LEFT_CENTER || arrow_ == RIGHT_CENTER) {
     gfx::Rect contents_bounds(contents_size);
     // Apply the border part of the inset before calculating coordinates because
     // the border should align with the anchor's border. For the purposes of
@@ -258,44 +140,26 @@
   int w = anchor_rect.width();
   int h = anchor_rect.height();
   const gfx::Size size(GetSizeForContentsSize(contents_size));
-  const int arrow_offset = GetArrowOffset(size);
   const int stroke_width = shadow_ == NO_ASSETS ? 0 : kStroke;
-  // |arrow_shift| is necessary to visually align the tip of the bubble arrow
-  // with the anchor point. This shift is an inverse of the shadow thickness.
-  int arrow_shift = UseMaterialDesign()
-                        ? 0
-                        : images_->arrow_interior_thickness + stroke_width -
-                              images_->arrow_thickness;
-  // When arrow is painted transparently the visible border of the bubble needs
-  // to be positioned at the same bounds as when the arrow is shown.
-  if (arrow_paint_type_ == PAINT_TRANSPARENT)
-    arrow_shift += images_->arrow_interior_thickness;
-  const bool mid_anchor = alignment_ == ALIGN_ARROW_TO_MID_ANCHOR;
 
   // Calculate the bubble coordinates based on the border and arrow settings.
   if (is_arrow_on_horizontal(arrow_)) {
     if (is_arrow_on_left(arrow_)) {
-      x += mid_anchor ? w / 2 - arrow_offset
-                      : stroke_width - GetBorderThickness();
+      x += stroke_width;
     } else if (is_arrow_at_center(arrow_)) {
-      x += w / 2 - arrow_offset;
+      x += w / 2;
     } else {
-      x += mid_anchor ? w / 2 + arrow_offset - size.width()
-                      : w - size.width() + GetBorderThickness() - stroke_width;
+      x += w - size.width() - stroke_width;
     }
-    y += is_arrow_on_top(arrow_) ? h + arrow_shift
-                                 : -arrow_shift - size.height();
+    y += is_arrow_on_top(arrow_) ? h : -size.height();
   } else if (has_arrow(arrow_)) {
-    x += is_arrow_on_left(arrow_) ? w + arrow_shift
-                                  : -arrow_shift - size.width();
+    x += is_arrow_on_left(arrow_) ? w : -size.width();
     if (is_arrow_on_top(arrow_)) {
-      y += mid_anchor ? h / 2 - arrow_offset
-                      : stroke_width - GetBorderThickness();
+      y += stroke_width;
     } else if (is_arrow_at_center(arrow_)) {
-      y += h / 2 - arrow_offset;
+      y += h / 2;
     } else {
-      y += mid_anchor ? h / 2 + arrow_offset - size.height()
-                      : h - size.height() + GetBorderThickness() - stroke_width;
+      y += h - size.height() - stroke_width;
     }
   } else {
     x += (w - size.width()) / 2;
@@ -305,107 +169,28 @@
   return gfx::Rect(x, y, size.width(), size.height());
 }
 
-int BubbleBorder::GetBorderThickness() const {
-  // TODO(estade): this shouldn't be called in MD.
-  return UseMaterialDesign()
-             ? 0
-             : images_->border_thickness - images_->border_interior_thickness;
-}
-
 int BubbleBorder::GetBorderCornerRadius() const {
-  if (UseMaterialDesign())
-    return corner_radius_.value_or(kMaterialDesignCornerRadius);
-  return images_->corner_radius;
-}
-
-int BubbleBorder::GetArrowOffset(const gfx::Size& border_size) const {
-  if (UseMaterialDesign())
-    return 0;
-
-  const int edge_length = is_arrow_on_horizontal(arrow_) ?
-      border_size.width() : border_size.height();
-  if (is_arrow_at_center(arrow_) && arrow_offset_ == 0)
-    return edge_length / 2;
-
-  // Calculate the minimum offset to not overlap arrow and corner images.
-  const int min = images_->border_thickness + (images_->arrow_width / 2);
-  // Ensure the returned value will not cause image overlap, if possible.
-  return std::max(min, std::min(arrow_offset_, edge_length - min));
-}
-
-bool BubbleBorder::GetArrowPath(const gfx::Rect& view_bounds,
-                                gfx::Path* path) const {
-  if (!has_arrow(arrow_) || arrow_paint_type_ != PAINT_NORMAL)
-    return false;
-
-  GetArrowPathFromArrowBounds(GetArrowRect(view_bounds), path);
-  return true;
-}
-
-void BubbleBorder::SetBorderInteriorThickness(int border_interior_thickness) {
-  // TODO(estade): remove this function.
-  DCHECK(!UseMaterialDesign());
-  images_->border_interior_thickness = border_interior_thickness;
-  if (!has_arrow(arrow_) || arrow_paint_type_ != PAINT_NORMAL)
-    images_->border_thickness = border_interior_thickness;
-}
-
-void BubbleBorder::Init() {
-  if (UseMaterialDesign()) {
-    // Harmony bubbles don't use arrows.
-    alignment_ = ALIGN_EDGE_TO_ANCHOR_EDGE;
-    arrow_paint_type_ = PAINT_NONE;
-  } else {
-    images_ = GetBorderImages(shadow_);
-  }
+  return corner_radius_.value_or(kMaterialDesignCornerRadius);
 }
 
 void BubbleBorder::Paint(const views::View& view, gfx::Canvas* canvas) {
-  if (UseMaterialDesign())
-    return PaintMd(view, canvas);
+  if (shadow_ == NO_ASSETS)
+    return PaintNoAssets(view, canvas);
 
-  gfx::Rect bounds(view.GetContentsBounds());
-  bounds.Inset(-GetBorderThickness(), -GetBorderThickness());
-  const gfx::Rect arrow_bounds = GetArrowRect(view.GetLocalBounds());
-  if (arrow_bounds.IsEmpty()) {
-    if (images_->border_painter)
-      Painter::PaintPainterAt(canvas, images_->border_painter.get(), bounds);
-    return;
-  }
-  if (!images_->border_painter) {
-    DrawArrow(canvas, arrow_bounds);
-    return;
-  }
+  gfx::ScopedCanvas scoped(canvas);
 
-  // Clip the arrow bounds out to avoid painting the overlapping edge area.
-  canvas->Save();
-  canvas->ClipRect(arrow_bounds, SkClipOp::kDifference);
-  Painter::PaintPainterAt(canvas, images_->border_painter.get(), bounds);
-  canvas->Restore();
+  SkRRect r_rect = GetClientRect(view);
+  canvas->sk_canvas()->clipRRect(r_rect, SkClipOp::kDifference,
+                                 true /*doAntiAlias*/);
 
-  DrawArrow(canvas, arrow_bounds);
+  DrawBorderAndShadow(std::move(r_rect), &cc::PaintCanvas::drawRRect, canvas,
+                      md_shadow_elevation_, md_shadow_color_);
 }
 
 gfx::Insets BubbleBorder::GetInsets() const {
-  if (UseMaterialDesign()) {
-    return (shadow_ == NO_ASSETS)
-               ? gfx::Insets()
-               : GetBorderAndShadowInsets(md_shadow_elevation_);
-  }
-
-  // The insets contain the stroke and shadow pixels outside the bubble fill.
-  const int inset = GetBorderThickness();
-  if (arrow_paint_type_ != PAINT_NORMAL || !has_arrow(arrow_))
-    return gfx::Insets(inset);
-
-  int first_inset = inset;
-  int second_inset = std::max(inset, images_->arrow_thickness);
-  if (is_arrow_on_horizontal(arrow_) ?
-      is_arrow_on_top(arrow_) : is_arrow_on_left(arrow_))
-    std::swap(first_inset, second_inset);
-  return is_arrow_on_horizontal(arrow_) ?
-      gfx::Insets(first_inset, inset, second_inset, inset) :
-      gfx::Insets(inset, first_inset, inset, second_inset);
+  return (shadow_ == NO_ASSETS)
+             ? gfx::Insets()
+             : GetBorderAndShadowInsets(md_shadow_elevation_);
 }
 
 gfx::Size BubbleBorder::GetMinimumSize() const {
@@ -414,22 +199,26 @@
 
 // static
 const gfx::ShadowValues& BubbleBorder::GetShadowValues(
-    base::Optional<int> elevation) {
-  // The shadows are always the same for any elevation, so construct them once
-  // and cache.
-  static base::NoDestructor<std::map<int, gfx::ShadowValues>> shadow_map;
-  if (shadow_map->find(elevation.value_or(-1)) != shadow_map->end())
-    return shadow_map->find(elevation.value_or(-1))->second;
+    base::Optional<int> elevation,
+    SkColor color) {
+  // The shadows are always the same for any elevation and color combination, so
+  // construct them once and cache.
+  static base::NoDestructor<std::map<ShadowCacheKey, gfx::ShadowValues>>
+      shadow_map;
+  ShadowCacheKey key(elevation.value_or(-1), color);
+
+  if (shadow_map->find(key) != shadow_map->end())
+    return shadow_map->find(key)->second;
 
   gfx::ShadowValues shadows;
   if (elevation.has_value()) {
     DCHECK(elevation.value() >= 0);
-    shadows = LayoutProvider::Get()->MakeShadowValues(elevation.value());
+    shadows = LayoutProvider::Get()->MakeShadowValues(elevation.value(), color);
   } else {
     constexpr int kSmallShadowVerticalOffset = 2;
     constexpr int kSmallShadowBlur = 4;
-    constexpr SkColor kSmallShadowColor = SkColorSetA(SK_ColorBLACK, 0x33);
-    constexpr SkColor kLargeShadowColor = SkColorSetA(SK_ColorBLACK, 0x1A);
+    SkColor kSmallShadowColor = SkColorSetA(color, 0x33);
+    SkColor kLargeShadowColor = SkColorSetA(color, 0x1A);
     // gfx::ShadowValue counts blur pixels both inside and outside the shape,
     // whereas these blur values only describe the outside portion, hence they
     // must be doubled.
@@ -441,30 +230,31 @@
     });
   }
 
-  shadow_map->insert(
-      std::pair<int, gfx::ShadowValues>(elevation.value_or(-1), shadows));
-  return shadow_map->find(elevation.value_or(-1))->second;
+  shadow_map->insert({key, shadows});
+  return shadow_map->find(key)->second;
 }
 
 // static
 const cc::PaintFlags& BubbleBorder::GetBorderAndShadowFlags(
-    base::Optional<int> elevation) {
-  // The flags are always the same for any elevation, so construct them once and
-  // cache.
-  static base::NoDestructor<std::map<int, cc::PaintFlags>> flag_map;
+    base::Optional<int> elevation,
+    SkColor color) {
+  // The flags are always the same for any elevation and color combination, so
+  // construct them once and cache.
+  static base::NoDestructor<std::map<ShadowCacheKey, cc::PaintFlags>> flag_map;
+  ShadowCacheKey key(elevation.value_or(-1), color);
 
-  if (flag_map->find(elevation.value_or(-1)) != flag_map->end())
-    return flag_map->find(elevation.value_or(-1))->second;
+  if (flag_map->find(key) != flag_map->end())
+    return flag_map->find(key)->second;
 
   cc::PaintFlags flags;
   constexpr SkColor kBorderColor = SkColorSetA(SK_ColorBLACK, 0x26);
   flags.setColor(kBorderColor);
   flags.setAntiAlias(true);
-  flags.setLooper(gfx::CreateShadowDrawLooper(GetShadowValues(elevation)));
-  flag_map->insert(
-      std::pair<int, cc::PaintFlags>(elevation.value_or(-1), flags));
+  flags.setLooper(
+      gfx::CreateShadowDrawLooper(GetShadowValues(elevation, color)));
 
-  return flag_map->find(elevation.value_or(-1))->second;
+  flag_map->insert({key, flags});
+  return flag_map->find(key)->second;
 }
 
 gfx::Size BubbleBorder::GetSizeForContentsSize(
@@ -473,116 +263,9 @@
   gfx::Size size(contents_size);
   const gfx::Insets insets = GetInsets();
   size.Enlarge(insets.width(), insets.height());
-  if (UseMaterialDesign())
-    return size;
-
-  // Ensure the bubble is large enough to not overlap border and arrow images.
-  const int min = 2 * images_->border_thickness;
-  // Only take arrow image sizes into account when the bubble tip is shown.
-  if (arrow_paint_type_ != PAINT_NORMAL || !has_arrow(arrow_)) {
-    size.SetToMax(gfx::Size(min, min));
-    return size;
-  }
-  const int min_with_arrow_width = min + images_->arrow_width;
-  const int min_with_arrow_thickness = images_->border_thickness +
-      std::max(images_->arrow_thickness + images_->border_interior_thickness,
-               images_->border_thickness);
-  if (is_arrow_on_horizontal(arrow_))
-    size.SetToMax(gfx::Size(min_with_arrow_width, min_with_arrow_thickness));
-  else
-    size.SetToMax(gfx::Size(min_with_arrow_thickness, min_with_arrow_width));
   return size;
 }
 
-gfx::ImageSkia* BubbleBorder::GetArrowImage() const {
-  if (!has_arrow(arrow_))
-    return NULL;
-  if (is_arrow_on_horizontal(arrow_)) {
-    return is_arrow_on_top(arrow_) ?
-        &images_->top_arrow : &images_->bottom_arrow;
-  }
-  return is_arrow_on_left(arrow_) ?
-      &images_->left_arrow : &images_->right_arrow;
-}
-
-gfx::Rect BubbleBorder::GetArrowRect(const gfx::Rect& bounds) const {
-  if (!has_arrow(arrow_) || arrow_paint_type_ != PAINT_NORMAL)
-    return gfx::Rect();
-
-  gfx::Point origin;
-  int offset = GetArrowOffset(bounds.size());
-  const int half_length = images_->arrow_width / 2;
-  const gfx::Insets insets = GetInsets();
-
-  if (is_arrow_on_horizontal(arrow_)) {
-    origin.set_x(is_arrow_on_left(arrow_) || is_arrow_at_center(arrow_) ?
-        offset : bounds.width() - offset);
-    origin.Offset(-half_length, 0);
-    if (is_arrow_on_top(arrow_))
-      origin.set_y(insets.top() - images_->arrow_thickness);
-    else
-      origin.set_y(bounds.height() - insets.bottom());
-  } else {
-    origin.set_y(is_arrow_on_top(arrow_)  || is_arrow_at_center(arrow_) ?
-        offset : bounds.height() - offset);
-    origin.Offset(0, -half_length);
-    if (is_arrow_on_left(arrow_))
-      origin.set_x(insets.left() - images_->arrow_thickness);
-    else
-      origin.set_x(bounds.width() - insets.right());
-  }
-
-  if (shadow_ != NO_ASSETS)
-    return gfx::Rect(origin, GetArrowImage()->size());
-
-  // With no assets, return the size enclosing the path filled in DrawArrow().
-  DCHECK_EQ(2 * images_->arrow_interior_thickness, images_->arrow_width);
-  int width = images_->arrow_width;
-  int height = images_->arrow_interior_thickness;
-  if (!is_arrow_on_horizontal(arrow_))
-    std::swap(width, height);
-  return gfx::Rect(origin, gfx::Size(width, height));
-}
-
-void BubbleBorder::GetArrowPathFromArrowBounds(const gfx::Rect& arrow_bounds,
-                                               SkPath* path) const {
-  DCHECK(!UseMaterialDesign());
-  const bool horizontal = is_arrow_on_horizontal(arrow_);
-  const int thickness = images_->arrow_interior_thickness;
-  float tip_x = horizontal ? arrow_bounds.CenterPoint().x() :
-      is_arrow_on_left(arrow_) ? arrow_bounds.right() - thickness :
-                                 arrow_bounds.x() + thickness;
-  float tip_y = !horizontal ? arrow_bounds.CenterPoint().y() + 0.5f :
-      is_arrow_on_top(arrow_) ? arrow_bounds.bottom() - thickness :
-                                arrow_bounds.y() + thickness;
-  const bool positive_offset = horizontal ?
-      is_arrow_on_top(arrow_) : is_arrow_on_left(arrow_);
-  const int offset_to_next_vertex = positive_offset ?
-      images_->arrow_interior_thickness : -images_->arrow_interior_thickness;
-
-  path->incReserve(4);
-  path->moveTo(SkDoubleToScalar(tip_x), SkDoubleToScalar(tip_y));
-  path->lineTo(SkDoubleToScalar(tip_x + offset_to_next_vertex),
-               SkDoubleToScalar(tip_y + offset_to_next_vertex));
-  const int multiplier = horizontal ? 1 : -1;
-  path->lineTo(SkDoubleToScalar(tip_x - multiplier * offset_to_next_vertex),
-               SkDoubleToScalar(tip_y + multiplier * offset_to_next_vertex));
-  path->close();
-}
-
-void BubbleBorder::DrawArrow(gfx::Canvas* canvas,
-                             const gfx::Rect& arrow_bounds) const {
-  DCHECK(!UseMaterialDesign());
-  canvas->DrawImageInt(*GetArrowImage(), arrow_bounds.x(), arrow_bounds.y());
-  SkPath path;
-  GetArrowPathFromArrowBounds(arrow_bounds, &path);
-  cc::PaintFlags flags;
-  flags.setStyle(cc::PaintFlags::kFill_Style);
-  flags.setColor(background_color_);
-
-  canvas->DrawPath(path, flags);
-}
-
 SkRRect BubbleBorder::GetClientRect(const View& view) const {
   gfx::RectF bounds(view.GetLocalBounds());
   bounds.Inset(GetInsets());
@@ -590,20 +273,6 @@
                              GetBorderCornerRadius(), GetBorderCornerRadius());
 }
 
-void BubbleBorder::PaintMd(const View& view, gfx::Canvas* canvas) {
-  if (shadow_ == NO_ASSETS)
-    return PaintNoAssets(view, canvas);
-
-  gfx::ScopedCanvas scoped(canvas);
-
-  SkRRect r_rect = GetClientRect(view);
-  canvas->sk_canvas()->clipRRect(r_rect, SkClipOp::kDifference,
-                                 true /*doAntiAlias*/);
-
-  DrawBorderAndShadow(std::move(r_rect), &cc::PaintCanvas::drawRRect, canvas,
-                      md_shadow_elevation_);
-}
-
 void BubbleBorder::PaintNoAssets(const View& view, gfx::Canvas* canvas) {
   gfx::ScopedCanvas scoped(canvas);
   canvas->sk_canvas()->clipRRect(GetClientRect(view), SkClipOp::kDifference,
@@ -611,15 +280,6 @@
   canvas->sk_canvas()->drawColor(SK_ColorTRANSPARENT, SkBlendMode::kSrc);
 }
 
-internal::BorderImages* BubbleBorder::GetImagesForTest() const {
-  return images_;
-}
-
-bool BubbleBorder::UseMaterialDesign() const {
-  return ui::MaterialDesignController::IsSecondaryUiMaterial() ||
-         corner_radius_.has_value();
-}
-
 void BubbleBackground::Paint(gfx::Canvas* canvas, views::View* view) const {
   if (border_->shadow() == BubbleBorder::NO_SHADOW_OPAQUE_BORDER)
     canvas->DrawColor(border_->background_color());
diff --git a/ui/views/bubble/bubble_border.h b/ui/views/bubble/bubble_border.h
index 778d930..d4a6e2a 100644
--- a/ui/views/bubble/bubble_border.h
+++ b/ui/views/bubble/bubble_border.h
@@ -12,58 +12,19 @@
 #include "base/macros.h"
 #include "build/build_config.h"
 #include "ui/gfx/canvas.h"
+#include "ui/gfx/color_palette.h"
 #include "ui/gfx/image/image_skia.h"
 #include "ui/gfx/shadow_value.h"
 #include "ui/views/background.h"
 #include "ui/views/border.h"
 
-class SkPath;
 class SkRRect;
 
 namespace gfx {
-class Path;
 class Rect;
 }
 
 namespace views {
-class Painter;
-
-namespace internal {
-
-// A helper that combines each border image-set painter with arrows and metrics.
-struct BorderImages {
-  BorderImages(const int border_image_ids[],
-               const int arrow_image_ids[],
-               int border_interior_thickness,
-               int arrow_interior_thickness,
-               int corner_radius);
-  virtual ~BorderImages();
-
-  std::unique_ptr<Painter> border_painter;
-  gfx::ImageSkia left_arrow;
-  gfx::ImageSkia top_arrow;
-  gfx::ImageSkia right_arrow;
-  gfx::ImageSkia bottom_arrow;
-
-  // The thickness of border and arrow images and their interior areas.
-  // Thickness is the width of left/right and the height of top/bottom images.
-  // The interior is measured without including stroke or shadow pixels. The tip
-  // of the arrow is |arrow_interior_thickness| from the border and the base is
-  // always twice that; drawn in the background color.
-  int border_thickness;
-  int border_interior_thickness;
-  int arrow_thickness;
-  int arrow_interior_thickness;
-
-  // Width of an arrow (on the horizontal), including any shadows. Defaults to
-  // the width of the |top_arrow| asset.
-  int arrow_width;
-
-  // The corner radius of the bubble's rounded-rect interior area.
-  int corner_radius;
-};
-
-}  // namespace internal
 
 // Renders a border, with optional arrow, and a custom dropshadow.
 // This can be used to produce floating "bubble" objects with rounded corners.
@@ -115,26 +76,6 @@
 #else
     DIALOG_SHADOW = SMALL_SHADOW,
 #endif
-
-  };
-
-  // The position of the bubble in relation to the anchor.
-  enum BubbleAlignment {
-    // The tip of the arrow points to the middle of the anchor.
-    ALIGN_ARROW_TO_MID_ANCHOR,
-    // The edge nearest to the arrow is lined up with the edge of the anchor.
-    ALIGN_EDGE_TO_ANCHOR_EDGE,
-  };
-
-  // The way the arrow should be painted.
-  // TODO(estade): Harmony doesn't use this enum; remove it.
-  enum ArrowPaintType {
-    // Fully render the arrow.
-    PAINT_NORMAL,
-    // Leave space for the arrow, but do not paint it.
-    PAINT_TRANSPARENT,
-    // Neither paint nor leave space for the arrow.
-    PAINT_NONE,
   };
 
   // Specific to MD bubbles: size of shadow blur (outside the bubble) and
@@ -187,7 +128,8 @@
       T rect,
       void (cc::PaintCanvas::*draw)(const T&, const cc::PaintFlags&),
       gfx::Canvas* canvas,
-      base::Optional<int> shadow_elevation = base::nullopt) {
+      base::Optional<int> shadow_elevation = base::nullopt,
+      SkColor shadow_base_color = SK_ColorBLACK) {
     // Borders with custom shadow elevations do not draw the 1px border.
     if (!shadow_elevation.has_value()) {
       // Provide a 1 px border outside the bounds.
@@ -197,8 +139,8 @@
       rect.outset(one_pixel, one_pixel);
     }
 
-    (canvas->sk_canvas()->*draw)(rect,
-                                 GetBorderAndShadowFlags(shadow_elevation));
+    (canvas->sk_canvas()->*draw)(
+        rect, GetBorderAndShadowFlags(shadow_elevation, shadow_base_color));
   }
 
   // Set the corner radius, enables Material Design.
@@ -208,10 +150,6 @@
   void set_arrow(Arrow arrow) { arrow_ = arrow; }
   Arrow arrow() const { return arrow_; }
 
-  // Get or set the bubble alignment.
-  void set_alignment(BubbleAlignment alignment) { alignment_ = alignment; }
-  BubbleAlignment alignment() const { return alignment_; }
-
   // Get the shadow type.
   Shadow shadow() const { return shadow_; }
 
@@ -233,42 +171,25 @@
   // location to place the arrow |offset| pixels from the perpendicular edge.
   void set_arrow_offset(int offset) { arrow_offset_ = offset; }
 
-  // Sets the way the arrow is actually painted. Default is PAINT_NORMAL.
-  void set_paint_arrow(ArrowPaintType value);
-
   // Sets the shadow elevation for MD shadows. A null |shadow_elevation| will
   // yield the default BubbleBorder MD shadow.
   void set_md_shadow_elevation(int shadow_elevation) {
-    DCHECK(UseMaterialDesign()) << "Setting a non-default MD shadow elevation "
-                                   "requires that the BubbleBorder is using MD";
     md_shadow_elevation_ = shadow_elevation;
   }
 
+  // Sets the shadow color for MD shadows. Defaults to SK_ColorBLACK.
+  void set_md_shadow_color(SkColor shadow_color) {
+    md_shadow_color_ = shadow_color;
+  }
+
   // Get the desired widget bounds (in screen coordinates) given the anchor rect
   // and bubble content size; calculated from shadow and arrow image dimensions.
   virtual gfx::Rect GetBounds(const gfx::Rect& anchor_rect,
                               const gfx::Size& contents_size) const;
 
-  // Get the border exterior thickness, including stroke and shadow, in pixels.
-  int GetBorderThickness() const;
-
   // Returns the corner radius of the current image set.
   int GetBorderCornerRadius() const;
 
-  // Gets the arrow offset to use.
-  int GetArrowOffset(const gfx::Size& border_size) const;
-
-  // Retreives the arrow path given |view_bounds|. |view_bounds| should be local
-  // bounds of the view.
-  // Returns false if |path| is unchanged, which is the case when there is no
-  // painted arrow.
-  // The returned path does not account for arrow stroke and shadow.
-  bool GetArrowPath(const gfx::Rect& view_bounds, gfx::Path* path) const;
-
-  // Sets border thickness overriding the thickness set on |images_| creation.
-  // May only be invoked after |arrow_paint_type_| has been set.
-  void SetBorderInteriorThickness(int border_interior_thickness);
-
   // Overridden from Border:
   void Paint(const View& view, gfx::Canvas* canvas) override;
   gfx::Insets GetInsets() const override;
@@ -284,55 +205,41 @@
   // bubbles. A null |shadow_elevation| will yield the default BubbleBorder MD
   // ShadowValues.
   static const gfx::ShadowValues& GetShadowValues(
-      base::Optional<int> shadow_elevation = base::nullopt);
+      base::Optional<int> shadow_elevation = base::nullopt,
+      SkColor shadow_base_color = SK_ColorBLACK);
 
   // Returns the paint flags to use for painting the border and shadow based on
   // |shadow_elevation|. This is only used for MD bubbles. A null
   // |shadow_elevation| will yield the default BubbleBorder MD PaintFlags.
   static const cc::PaintFlags& GetBorderAndShadowFlags(
-      base::Optional<int> shadow_elevation = base::nullopt);
+      base::Optional<int> shadow_elevation = base::nullopt,
+      SkColor shadow_base_color = SK_ColorBLACK);
 
   // The border and arrow stroke size used in image assets, in pixels.
   static const int kStroke;
 
-  // Initializes the MD or non-MD BubbleBorder.
-  void Init();
-
   gfx::Size GetSizeForContentsSize(const gfx::Size& contents_size) const;
-  gfx::ImageSkia* GetArrowImage() const;
-  gfx::Rect GetArrowRect(const gfx::Rect& bounds) const;
-  void GetArrowPathFromArrowBounds(const gfx::Rect& arrow_bounds,
-                                   SkPath* path) const;
-  void DrawArrow(gfx::Canvas* canvas, const gfx::Rect& arrow_bounds) const;
 
   // Returns the region within |view| representing the client area. This can be
   // set as a canvas clip to ensure any fill or shadow from the border does not
   // draw over the contents of the bubble.
   SkRRect GetClientRect(const View& view) const;
 
-  // Paints an MD border. Ignores |shadow_|.
-  void PaintMd(const View& view, gfx::Canvas* canvas);
-
   // Paint for the NO_ASSETS shadow type. This just paints transparent pixels
   // to make the window shape based on insets and GetBorderCornerRadius().
   void PaintNoAssets(const View& view, gfx::Canvas* canvas);
 
-  internal::BorderImages* GetImagesForTest() const;
-
-  // Whether to use material design.
-  bool UseMaterialDesign() const;
-
   Arrow arrow_;
   int arrow_offset_;
   // Corner radius for the bubble border. If supplied the border will use
   // material design.
   base::Optional<int> corner_radius_;
-  // Elevation for the MD shadow. Requires material design.
-  base::Optional<SkColor> md_shadow_elevation_;
-  ArrowPaintType arrow_paint_type_;
-  BubbleAlignment alignment_;
+
   Shadow shadow_;
-  internal::BorderImages* images_;
+  // Elevation for the MD shadow.
+  base::Optional<int> md_shadow_elevation_;
+  // Color for the MD shadow.
+  SkColor md_shadow_color_ = SK_ColorBLACK;
   SkColor background_color_;
   bool use_theme_background_color_;
 
diff --git a/ui/views/bubble/bubble_border_unittest.cc b/ui/views/bubble/bubble_border_unittest.cc
index 87ca9bc7..5e5a199 100644
--- a/ui/views/bubble/bubble_border_unittest.cc
+++ b/ui/views/bubble/bubble_border_unittest.cc
@@ -16,13 +16,6 @@
 #include "ui/views/test/views_test_base.h"
 
 namespace views {
-namespace {
-
-bool UseMd() {
-  return ui::MaterialDesignController::IsSecondaryUiMaterial();
-}
-
-}  // namespace
 
 typedef views::ViewsTestBase BubbleBorderTest;
 
@@ -223,7 +216,6 @@
                              BubbleBorder::NO_SHADOW,
                              SK_ColorWHITE);
 
-  const views::internal::BorderImages* kImages = border.GetImagesForTest();
   const gfx::Insets kInsets = border.GetInsets();
 
   // kSmallSize is smaller than the minimum allowable size and does not
@@ -233,106 +225,68 @@
   // the resulting size.
   const gfx::Size kMediumSize = gfx::Size(50, 60);
 
-  const gfx::Size kSmallHorizArrow(
-      UseMd() ? kSmallSize.width() + kInsets.width()
-              : 2 * kImages->border_thickness + kImages->arrow_width,
-      UseMd() ? kSmallSize.height() + kInsets.height()
-              : kImages->border_thickness + kImages->arrow_thickness +
-                    kImages->border_interior_thickness);
+  const gfx::Size kSmallHorizArrow(kSmallSize.width() + kInsets.width(),
+                                   kSmallSize.height() + kInsets.height());
 
-  const gfx::Size kSmallVertArrow(
-      UseMd() ? kSmallHorizArrow.width() : kSmallHorizArrow.height(),
-      UseMd() ? kSmallHorizArrow.height() : kSmallHorizArrow.width());
+  const gfx::Size kSmallVertArrow(kSmallHorizArrow.width(),
+                                  kSmallHorizArrow.height());
 
-  const gfx::Size kSmallNoArrow(
-      UseMd() ? kSmallHorizArrow.width() : 2 * kImages->border_thickness,
-      UseMd() ? kSmallHorizArrow.height() : 2 * kImages->border_thickness);
+  const gfx::Size kSmallNoArrow(kSmallHorizArrow.width(),
+                                kSmallHorizArrow.height());
 
-  const gfx::Size kMediumHorizArrow(
-      UseMd() ? kMediumSize.width() + kInsets.width()
-              : kMediumSize.width() + 2 * border.GetBorderThickness(),
-      UseMd() ? kMediumSize.height() + kInsets.height()
-              : kMediumSize.height() + border.GetBorderThickness() +
-                    kImages->arrow_thickness);
+  const gfx::Size kMediumHorizArrow(kMediumSize.width() + kInsets.width(),
+                                    kMediumSize.height() + kInsets.height());
 
-  const gfx::Size kMediumVertArrow(
-      UseMd() ? kMediumHorizArrow.width()
-              : kMediumSize.width() + border.GetBorderThickness() +
-                    kImages->arrow_thickness,
-      UseMd() ? kMediumHorizArrow.height()
-              : kMediumSize.height() + 2 * border.GetBorderThickness());
+  const gfx::Size kMediumVertArrow(kMediumHorizArrow.width(),
+                                   kMediumHorizArrow.height());
 
-  const gfx::Size kMediumNoArrow(
-      UseMd() ? kMediumHorizArrow.width()
-              : kMediumSize.width() + 2 * border.GetBorderThickness(),
-      UseMd() ? kMediumHorizArrow.height()
-              : kMediumSize.height() + 2 * border.GetBorderThickness());
+  const gfx::Size kMediumNoArrow(kMediumHorizArrow.width(),
+                                 kMediumHorizArrow.height());
 
   struct TestCase {
     BubbleBorder::Arrow arrow;
     gfx::Size content;
-    gfx::Size expected_with_arrow;
     gfx::Size expected_without_arrow;
   };
 
   TestCase cases[] = {
-    // Content size: kSmallSize
-    { BubbleBorder::TOP_LEFT, kSmallSize, kSmallHorizArrow, kSmallNoArrow },
-    { BubbleBorder::TOP_CENTER, kSmallSize, kSmallHorizArrow, kSmallNoArrow },
-    { BubbleBorder::TOP_RIGHT, kSmallSize, kSmallHorizArrow, kSmallNoArrow },
-    { BubbleBorder::BOTTOM_LEFT, kSmallSize, kSmallHorizArrow, kSmallNoArrow },
-    { BubbleBorder::BOTTOM_CENTER, kSmallSize, kSmallHorizArrow,
-      kSmallNoArrow },
-    { BubbleBorder::BOTTOM_RIGHT, kSmallSize, kSmallHorizArrow, kSmallNoArrow },
-    { BubbleBorder::LEFT_TOP, kSmallSize, kSmallVertArrow, kSmallNoArrow },
-    { BubbleBorder::LEFT_CENTER, kSmallSize, kSmallVertArrow, kSmallNoArrow },
-    { BubbleBorder::LEFT_BOTTOM, kSmallSize, kSmallVertArrow, kSmallNoArrow },
-    { BubbleBorder::RIGHT_TOP, kSmallSize, kSmallVertArrow, kSmallNoArrow },
-    { BubbleBorder::RIGHT_CENTER, kSmallSize, kSmallVertArrow, kSmallNoArrow },
-    { BubbleBorder::RIGHT_BOTTOM, kSmallSize, kSmallVertArrow, kSmallNoArrow },
-    { BubbleBorder::NONE, kSmallSize, kSmallNoArrow, kSmallNoArrow },
-    { BubbleBorder::FLOAT, kSmallSize, kSmallNoArrow, kSmallNoArrow },
+      // Content size: kSmallSize
+      {BubbleBorder::TOP_LEFT, kSmallSize, kSmallNoArrow},
+      {BubbleBorder::TOP_CENTER, kSmallSize, kSmallNoArrow},
+      {BubbleBorder::TOP_RIGHT, kSmallSize, kSmallNoArrow},
+      {BubbleBorder::BOTTOM_LEFT, kSmallSize, kSmallNoArrow},
+      {BubbleBorder::BOTTOM_CENTER, kSmallSize, kSmallNoArrow},
+      {BubbleBorder::BOTTOM_RIGHT, kSmallSize, kSmallNoArrow},
+      {BubbleBorder::LEFT_TOP, kSmallSize, kSmallNoArrow},
+      {BubbleBorder::LEFT_CENTER, kSmallSize, kSmallNoArrow},
+      {BubbleBorder::LEFT_BOTTOM, kSmallSize, kSmallNoArrow},
+      {BubbleBorder::RIGHT_TOP, kSmallSize, kSmallNoArrow},
+      {BubbleBorder::RIGHT_CENTER, kSmallSize, kSmallNoArrow},
+      {BubbleBorder::RIGHT_BOTTOM, kSmallSize, kSmallNoArrow},
+      {BubbleBorder::NONE, kSmallSize, kSmallNoArrow},
+      {BubbleBorder::FLOAT, kSmallSize, kSmallNoArrow},
 
-    // Content size: kMediumSize
-    { BubbleBorder::TOP_LEFT, kMediumSize, kMediumHorizArrow, kMediumNoArrow },
-    { BubbleBorder::TOP_CENTER, kMediumSize, kMediumHorizArrow,
-      kMediumNoArrow },
-    { BubbleBorder::TOP_RIGHT, kMediumSize, kMediumHorizArrow, kMediumNoArrow },
-    { BubbleBorder::BOTTOM_LEFT, kMediumSize, kMediumHorizArrow,
-      kMediumNoArrow },
-    { BubbleBorder::BOTTOM_CENTER, kMediumSize, kMediumHorizArrow,
-      kMediumNoArrow },
-    { BubbleBorder::BOTTOM_RIGHT, kMediumSize, kMediumHorizArrow,
-      kMediumNoArrow },
-    { BubbleBorder::LEFT_TOP, kMediumSize, kMediumVertArrow, kMediumNoArrow },
-    { BubbleBorder::LEFT_CENTER, kMediumSize, kMediumVertArrow,
-      kMediumNoArrow },
-    { BubbleBorder::LEFT_BOTTOM, kMediumSize, kMediumVertArrow,
-      kMediumNoArrow },
-    { BubbleBorder::RIGHT_TOP, kMediumSize, kMediumVertArrow, kMediumNoArrow },
-    { BubbleBorder::RIGHT_CENTER, kMediumSize, kMediumVertArrow,
-      kMediumNoArrow },
-    { BubbleBorder::RIGHT_BOTTOM, kMediumSize, kMediumVertArrow,
-      kMediumNoArrow },
-    { BubbleBorder::NONE, kMediumSize, kMediumNoArrow, kMediumNoArrow },
-    { BubbleBorder::FLOAT, kMediumSize, kMediumNoArrow, kMediumNoArrow }
-  };
+      // Content size: kMediumSize
+      {BubbleBorder::TOP_LEFT, kMediumSize, kMediumNoArrow},
+      {BubbleBorder::TOP_CENTER, kMediumSize, kMediumNoArrow},
+      {BubbleBorder::TOP_RIGHT, kMediumSize, kMediumNoArrow},
+      {BubbleBorder::BOTTOM_LEFT, kMediumSize, kMediumNoArrow},
+      {BubbleBorder::BOTTOM_CENTER, kMediumSize, kMediumNoArrow},
+      {BubbleBorder::BOTTOM_RIGHT, kMediumSize, kMediumNoArrow},
+      {BubbleBorder::LEFT_TOP, kMediumSize, kMediumNoArrow},
+      {BubbleBorder::LEFT_CENTER, kMediumSize, kMediumNoArrow},
+      {BubbleBorder::LEFT_BOTTOM, kMediumSize, kMediumNoArrow},
+      {BubbleBorder::RIGHT_TOP, kMediumSize, kMediumNoArrow},
+      {BubbleBorder::RIGHT_CENTER, kMediumSize, kMediumNoArrow},
+      {BubbleBorder::RIGHT_BOTTOM, kMediumSize, kMediumNoArrow},
+      {BubbleBorder::NONE, kMediumSize, kMediumNoArrow},
+      {BubbleBorder::FLOAT, kMediumSize, kMediumNoArrow}};
 
   for (size_t i = 0; i < arraysize(cases); ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%d arrow=%d",
         static_cast<int>(i), cases[i].arrow));
 
     border.set_arrow(cases[i].arrow);
-
-    border.set_paint_arrow(BubbleBorder::PAINT_NORMAL);
-    EXPECT_EQ(cases[i].expected_with_arrow,
-              border.GetSizeForContentsSize(cases[i].content));
-
-    border.set_paint_arrow(BubbleBorder::PAINT_TRANSPARENT);
-    EXPECT_EQ(cases[i].expected_without_arrow,
-              border.GetSizeForContentsSize(cases[i].content));
-
-    border.set_paint_arrow(BubbleBorder::PAINT_NONE);
     EXPECT_EQ(cases[i].expected_without_arrow,
               border.GetSizeForContentsSize(cases[i].content));
   }
@@ -348,8 +302,6 @@
     const gfx::Size kContentSize(500, 600);
     const gfx::Insets kInsets = border.GetInsets();
 
-    const views::internal::BorderImages* kImages = border.GetImagesForTest();
-
     border.set_arrow(BubbleBorder::TOP_LEFT);
     const gfx::Size kTotalSizeWithHorizArrow =
         border.GetSizeForContentsSize(kContentSize);
@@ -362,19 +314,13 @@
     const gfx::Size kTotalSizeWithNoArrow =
         border.GetSizeForContentsSize(kContentSize);
 
-    const int kBorderThickness = border.GetBorderThickness();
-
     const int kArrowOffsetForHorizCenter = kTotalSizeWithHorizArrow.width() / 2;
     const int kArrowOffsetForVertCenter = kTotalSizeWithVertArrow.height() / 2;
-    const int kArrowOffsetForNotCenter =
-        UseMd() ? 0 : kImages->border_thickness + (kImages->arrow_width / 2);
 
     const int kStrokeWidth =
         shadow == BubbleBorder::NO_ASSETS ? 0 : BubbleBorder::kStroke;
 
-    const int kArrowThickness = UseMd() ? 0 : kImages->arrow_interior_thickness;
-    const int kArrowShift =
-        UseMd() ? 0 : kArrowThickness + kStrokeWidth - kImages->arrow_thickness;
+    const int kArrowShift = 0;
     const int kHeightDifference =
         kTotalSizeWithHorizArrow.height() - kTotalSizeWithNoArrow.height();
     const int kWidthDifference =
@@ -383,118 +329,62 @@
 
     // The arrow only makes a difference in height if it is longer than the
     // shadow.
-    const int kExpectedHeightDifference =
-        UseMd() ? 0
-                : std::max(kImages->arrow_thickness +
-                               kImages->border_interior_thickness,
-                           kImages->border_thickness) -
-                      std::max(kImages->border_interior_thickness,
-                               kImages->border_thickness);
+    const int kExpectedHeightDifference = 0;
     EXPECT_EQ(kExpectedHeightDifference, kHeightDifference)
         << "Size with arrow: " << kTotalSizeWithHorizArrow.ToString()
         << " vs. size without arrow: " << kTotalSizeWithNoArrow.ToString();
 
-    const int kTopHorizArrowY =
-        UseMd() ? kAnchor.bottom() + kStrokeWidth - kInsets.top()
-                : kAnchor.bottom() + kArrowShift;
+    const int kTopHorizArrowY = kAnchor.bottom() + kStrokeWidth - kInsets.top();
     const int kBottomHorizArrowY =
-        UseMd() ? kAnchor.y() - kTotalSizeWithHorizArrow.height()
-                : kAnchor.y() - kArrowShift - kTotalSizeWithHorizArrow.height();
+        kAnchor.y() - kTotalSizeWithHorizArrow.height();
     const int kLeftVertArrowX = kAnchor.x() + kAnchor.width() + kArrowShift;
-    const int kRightVertArrowX =
-        UseMd() ? kAnchor.x() - kTotalSizeWithHorizArrow.width()
-                : kAnchor.x() - kArrowShift - kTotalSizeWithVertArrow.width();
+    const int kRightVertArrowX = kAnchor.x() - kTotalSizeWithHorizArrow.width();
 
     struct TestCase {
       BubbleBorder::Arrow arrow;
-      BubbleBorder::BubbleAlignment alignment;
       int expected_x;
       int expected_y;
     };
 
     TestCase cases[] = {
         // Horizontal arrow tests.
-        {BubbleBorder::TOP_LEFT, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR,
-         UseMd() ? kAnchor.x() + kStrokeWidth - kInsets.left()
-                 : kAnchor.CenterPoint().x() - kArrowOffsetForNotCenter,
+        {BubbleBorder::TOP_LEFT, kAnchor.x() + kStrokeWidth - kInsets.left(),
          kTopHorizArrowY},
-        {BubbleBorder::TOP_LEFT, BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE,
-         UseMd() ? kAnchor.x() + kStrokeWidth - kInsets.left()
-                 : kAnchor.x() + kStrokeWidth - kBorderThickness,
-         kTopHorizArrowY},
-        {BubbleBorder::TOP_CENTER, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR,
+        {BubbleBorder::TOP_CENTER,
          kAnchor.CenterPoint().x() - kArrowOffsetForHorizCenter,
          kTopHorizArrowY},
-        {BubbleBorder::BOTTOM_RIGHT, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR,
-         UseMd() ? kAnchor.CenterPoint().x() - kTotalSizeWithHorizArrow.width()
-                 : kAnchor.CenterPoint().x() + kArrowOffsetForNotCenter -
-                       kTotalSizeWithHorizArrow.width(),
-         kBottomHorizArrowY},
-        {BubbleBorder::BOTTOM_RIGHT, BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE,
-         kAnchor.x() + kAnchor.width() - kTotalSizeWithHorizArrow.width() +
-             kBorderThickness - kStrokeWidth,
+        {BubbleBorder::BOTTOM_RIGHT,
+         kAnchor.x() + kAnchor.width() - kTotalSizeWithHorizArrow.width() -
+             kStrokeWidth,
          kBottomHorizArrowY},
 
         // Vertical arrow tests.
-        {BubbleBorder::LEFT_TOP, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR,
-         kLeftVertArrowX, kAnchor.CenterPoint().y() - kArrowOffsetForNotCenter},
-        {BubbleBorder::LEFT_TOP, BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE,
-         kLeftVertArrowX, kAnchor.y() + kStrokeWidth - kBorderThickness},
-        {BubbleBorder::LEFT_CENTER, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR,
-         kLeftVertArrowX - (UseMd() ? kInsets.right() - kStrokeWidth : 0),
+        {BubbleBorder::LEFT_TOP, kLeftVertArrowX, kAnchor.y() + kStrokeWidth},
+        {BubbleBorder::LEFT_CENTER,
+         kLeftVertArrowX - (kInsets.right() - kStrokeWidth),
          kAnchor.CenterPoint().y() - kArrowOffsetForVertCenter +
-             (UseMd() ? 2 * kStrokeWidth : 0)},
-        {BubbleBorder::RIGHT_BOTTOM, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR,
-         kRightVertArrowX,
-         kAnchor.CenterPoint().y() + kArrowOffsetForNotCenter -
-             kTotalSizeWithVertArrow.height()},
-        {BubbleBorder::RIGHT_BOTTOM, BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE,
-         kRightVertArrowX,
-         kAnchor.y() + kAnchor.height() - kTotalSizeWithVertArrow.height() +
-             kBorderThickness - kStrokeWidth},
+             (2 * kStrokeWidth)},
+        {BubbleBorder::RIGHT_BOTTOM, kRightVertArrowX,
+         kAnchor.y() + kAnchor.height() - kTotalSizeWithVertArrow.height() -
+             kStrokeWidth},
 
         // No arrow tests.
-        {BubbleBorder::NONE, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR,
+        {BubbleBorder::NONE,
          kAnchor.x() + (kAnchor.width() - kTotalSizeWithNoArrow.width()) / 2,
          kAnchor.y() + kAnchor.height()},
-        {BubbleBorder::FLOAT, BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR,
+        {BubbleBorder::FLOAT,
          kAnchor.x() + (kAnchor.width() - kTotalSizeWithNoArrow.width()) / 2,
          kAnchor.y() + (kAnchor.height() - kTotalSizeWithNoArrow.height()) / 2},
     };
 
     for (size_t i = 0; i < arraysize(cases); ++i) {
-      SCOPED_TRACE(base::StringPrintf("i=%d arrow=%d alignment=%d",
-                                      static_cast<int>(i), cases[i].arrow,
-                                      cases[i].alignment));
+      SCOPED_TRACE(base::StringPrintf("i=%d arrow=%d", static_cast<int>(i),
+                                      cases[i].arrow));
       const BubbleBorder::Arrow arrow = cases[i].arrow;
       border.set_arrow(arrow);
-      border.set_alignment(cases[i].alignment);
-
-      border.set_paint_arrow(BubbleBorder::PAINT_NORMAL);
       gfx::Point origin = border.GetBounds(kAnchor, kContentSize).origin();
       int expected_x = cases[i].expected_x;
       int expected_y = cases[i].expected_y;
-      EXPECT_EQ(expected_x, origin.x());
-      EXPECT_EQ(expected_y, origin.y());
-
-      border.set_paint_arrow(BubbleBorder::PAINT_TRANSPARENT);
-      origin = border.GetBounds(kAnchor, kContentSize).origin();
-      if (border.is_arrow_on_horizontal(arrow)) {
-        expected_y += BubbleBorder::is_arrow_on_top(arrow)
-                          ? kArrowThickness
-                          : (-kArrowThickness + kHeightDifference);
-      } else if (BubbleBorder::has_arrow(arrow)) {
-        expected_x += BubbleBorder::is_arrow_on_left(arrow)
-                          ? kArrowThickness
-                          : (-kArrowThickness + kWidthDifference);
-      }
-      EXPECT_EQ(expected_x, origin.x());
-      EXPECT_EQ(expected_y, origin.y());
-
-      border.set_paint_arrow(BubbleBorder::PAINT_NONE);
-      origin = border.GetBounds(kAnchor, kContentSize).origin();
-      expected_x = cases[i].expected_x;
-      expected_y = cases[i].expected_y;
       if (border.is_arrow_on_horizontal(arrow) &&
           !BubbleBorder::is_arrow_on_top(arrow)) {
         expected_y += kHeightDifference;
@@ -506,37 +396,6 @@
       EXPECT_EQ(expected_x, origin.x());
       EXPECT_EQ(expected_y, origin.y());
     }
-}
-}
-
-// Ensure all the shadow types pass some size validation and paint sanely.
-TEST_F(BubbleBorderTest, ShadowTypes) {
-  if (UseMd())
-    return;  // This test doesn't mean anything in MD mode.
-  const gfx::Rect rect(0, 0, 320, 200);
-  View paint_view;
-  paint_view.SetBoundsRect(rect);
-
-  for (int i = 0; i < BubbleBorder::SHADOW_COUNT; ++i) {
-    BubbleBorder::Shadow shadow = static_cast<BubbleBorder::Shadow>(i);
-    SCOPED_TRACE(testing::Message() << "BubbleBorder::Shadow: " << shadow);
-    gfx::Canvas canvas(gfx::Size(640, 480), 1.0f, false);
-    BubbleBorder border(BubbleBorder::TOP_LEFT, shadow, SK_ColorWHITE);
-    internal::BorderImages* border_images = border.GetImagesForTest();
-
-    // Arrow assets should always be at least as big as the drawn arrow.
-    EXPECT_GE(border_images->arrow_thickness,
-              border_images->arrow_interior_thickness);
-    EXPECT_GE(border_images->arrow_width,
-              2 * border_images->arrow_interior_thickness);
-
-    // Border assets should always be at least as thick as the hittable border.
-    EXPECT_GE(border_images->border_thickness,
-              border_images->border_interior_thickness);
-
-    // For a TOP_LEFT arrow, the x-offset always matches the border thickness.
-    EXPECT_EQ(border.GetArrowRect(rect).x(), border_images->border_thickness);
-    border.Paint(paint_view, &canvas);
   }
 }
 
diff --git a/ui/views/bubble/bubble_dialog_delegate.cc b/ui/views/bubble/bubble_dialog_delegate.cc
index 7a20dcd..80884e20 100644
--- a/ui/views/bubble/bubble_dialog_delegate.cc
+++ b/ui/views/bubble/bubble_dialog_delegate.cc
@@ -220,23 +220,6 @@
   set_margins(gfx::Insets(kCompactMargin));
 }
 
-void BubbleDialogDelegateView::SetAlignment(
-    BubbleBorder::BubbleAlignment alignment) {
-  GetBubbleFrameView()->bubble_border()->set_alignment(alignment);
-  SizeToContents();
-}
-
-void BubbleDialogDelegateView::SetArrowPaintType(
-    BubbleBorder::ArrowPaintType paint_type) {
-  GetBubbleFrameView()->bubble_border()->set_paint_arrow(paint_type);
-  SizeToContents();
-}
-
-void BubbleDialogDelegateView::SetBorderInteriorThickness(int thickness) {
-  GetBubbleFrameView()->bubble_border()->SetBorderInteriorThickness(thickness);
-  SizeToContents();
-}
-
 void BubbleDialogDelegateView::OnAnchorBoundsChanged() {
   SizeToContents();
 }
diff --git a/ui/views/bubble/bubble_dialog_delegate.h b/ui/views/bubble/bubble_dialog_delegate.h
index 9a1cd1b..d039304 100644
--- a/ui/views/bubble/bubble_dialog_delegate.h
+++ b/ui/views/bubble/bubble_dialog_delegate.h
@@ -113,16 +113,6 @@
   // Sets the content margins to a default picked for smaller bubbles.
   void UseCompactMargins();
 
-  // Sets the bubble alignment relative to the anchor. This may only be called
-  // after calling CreateBubble.
-  void SetAlignment(BubbleBorder::BubbleAlignment alignment);
-
-  // Sets the bubble arrow paint type.
-  void SetArrowPaintType(BubbleBorder::ArrowPaintType paint_type);
-
-  // Sets the bubble border interior thickness.
-  void SetBorderInteriorThickness(int thickness);
-
   // Call this method when the anchor bounds have changed to reposition the
   // bubble. The bubble is automatically repositioned when the anchor view
   // bounds change as a result of the widget's bounds changing.
diff --git a/ui/views/bubble/bubble_dialog_delegate_unittest.cc b/ui/views/bubble/bubble_dialog_delegate_unittest.cc
index 6b0e5d89..7c2ff06 100644
--- a/ui/views/bubble/bubble_dialog_delegate_unittest.cc
+++ b/ui/views/bubble/bubble_dialog_delegate_unittest.cc
@@ -285,19 +285,18 @@
       new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
   BubbleDialogDelegateView::CreateBubble(bubble_delegate);
   BubbleFrameView* frame = bubble_delegate->GetBubbleFrameView();
-  const int border = frame->bubble_border()->GetBorderThickness();
 
   struct {
     const int point;
     const int hit;
   } cases[] = {
-      {border, HTNOWHERE}, {border + 60, HTCLIENT}, {1000, HTNOWHERE},
+      {0, HTNOWHERE}, {60, HTCLIENT}, {1000, HTNOWHERE},
   };
 
   for (size_t i = 0; i < arraysize(cases); ++i) {
     gfx::Point point(cases[i].point, cases[i].point);
     EXPECT_EQ(cases[i].hit, frame->NonClientHitTest(point))
-        << " with border: " << border << ", at point " << cases[i].point;
+        << " at point " << cases[i].point;
   }
 }
 
diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc
index 530e809..47028fc 100644
--- a/ui/views/bubble/bubble_frame_view.cc
+++ b/ui/views/bubble/bubble_frame_view.cc
@@ -12,7 +12,6 @@
 #include "ui/base/default_style.h"
 #include "ui/base/hit_test.h"
 #include "ui/base/l10n/l10n_util.h"
-#include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/compositor/paint_recorder.h"
 #include "ui/display/display.h"
@@ -127,21 +126,8 @@
 // static
 Button* BubbleFrameView::CreateCloseButton(ButtonListener* listener) {
   ImageButton* close_button = nullptr;
-  if (ui::MaterialDesignController::IsSecondaryUiMaterial()) {
-    close_button = CreateVectorImageButton(listener);
-    SetImageFromVectorIcon(close_button, vector_icons::kCloseRoundedIcon);
-  } else {
-    ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
-    close_button = new ImageButton(listener);
-    close_button->SetImage(Button::STATE_NORMAL,
-                           *rb->GetImageNamed(IDR_CLOSE_DIALOG).ToImageSkia());
-    close_button->SetImage(
-        Button::STATE_HOVERED,
-        *rb->GetImageNamed(IDR_CLOSE_DIALOG_H).ToImageSkia());
-    close_button->SetImage(
-        Button::STATE_PRESSED,
-        *rb->GetImageNamed(IDR_CLOSE_DIALOG_P).ToImageSkia());
-  }
+  close_button = CreateVectorImageButton(listener);
+  SetImageFromVectorIcon(close_button, vector_icons::kCloseRoundedIcon);
   close_button->SetTooltipText(l10n_util::GetStringUTF16(IDS_APP_CLOSE));
   close_button->SizeToPreferredSize();
 
@@ -249,9 +235,6 @@
     rect.fBottom += SkIntToScalar(kBottomBorderShadowSize);
     window_mask->addRect(rect);
   }
-  gfx::Path arrow_path;
-  if (bubble_border_->GetArrowPath(gfx::Rect(size), &arrow_path))
-    window_mask->addPath(arrow_path, 0, 0);
 }
 
 void BubbleFrameView::ResetWindowControls() {
@@ -575,8 +558,7 @@
   // |offscreen_adjust|, e.g. positive |offscreen_adjust| means bubble
   // window needs to be moved to the right and that means we need to move arrow
   // to the left, and that means negative offset.
-  bubble_border_->set_arrow_offset(
-      bubble_border_->GetArrowOffset(window_bounds.size()) - offscreen_adjust);
+  bubble_border_->set_arrow_offset(-offscreen_adjust);
   if (offscreen_adjust)
     SchedulePaint();
 }
diff --git a/ui/views/bubble/bubble_frame_view_unittest.cc b/ui/views/bubble/bubble_frame_view_unittest.cc
index 0366f1f..36c307e6 100644
--- a/ui/views/bubble/bubble_frame_view_unittest.cc
+++ b/ui/views/bubble/bubble_frame_view_unittest.cc
@@ -9,7 +9,6 @@
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "ui/base/material_design/material_design_controller.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
@@ -29,10 +28,6 @@
 
 namespace {
 
-bool UseMd() {
-  return ui::MaterialDesignController::IsSecondaryUiMaterial();
-}
-
 const BubbleBorder::Arrow kArrow = BubbleBorder::TOP_LEFT;
 const SkColor kColor = SK_ColorRED;
 const int kMargin = 6;
@@ -359,7 +354,7 @@
   gfx::Rect window_bounds;
   // Bubbles have a thicker shadow on the bottom in MD.
   // Match definition of kLargeShadowVerticalOffset in bubble_border.cc.
-  const int kLargeShadowVerticalOffset = UseMd() ? 2 : 0;
+  constexpr int kLargeShadowVerticalOffset = 2;
 
   // Some of these tests may go away once --secondary-ui-md becomes the
   // default. Under Material Design mode, the BubbleBorder doesn't support all
@@ -367,16 +362,6 @@
   // added for MD mode.
 
   // Test that the bubble displays normally when it fits.
-  if (!UseMd()) {  // TOP_CENTER isn't supported by the bubble_border() in MD.
-    frame.bubble_border()->set_arrow(BubbleBorder::TOP_CENTER);
-    window_bounds = frame.GetUpdatedWindowBounds(
-        gfx::Rect(500, 100, 50, 50),  // |anchor_rect|
-        gfx::Size(500, 500),          // |client_size|
-        true);                        // |adjust_if_offscreen|
-    EXPECT_EQ(BubbleBorder::TOP_CENTER, frame.bubble_border()->arrow());
-    EXPECT_EQ(window_bounds.x() + window_bounds.width() / 2, 525);
-  }
-
   frame.bubble_border()->set_arrow(BubbleBorder::BOTTOM_CENTER);
   window_bounds = frame.GetUpdatedWindowBounds(
       gfx::Rect(500, 900, 50, 50),  // |anchor_rect|
@@ -404,19 +389,6 @@
             425 + kLargeShadowVerticalOffset);
 
   // Test bubble not fitting left screen edge.
-  if (!UseMd()) {  // TOP_CENTER isn't supported by the bubble_border() in MD.
-    frame.bubble_border()->set_arrow(BubbleBorder::TOP_CENTER);
-    window_bounds = frame.GetUpdatedWindowBounds(
-        gfx::Rect(100, 100, 50, 50),  // |anchor_rect|
-        gfx::Size(500, 500),          // |client_size|
-        true);                        // |adjust_if_offscreen|
-    EXPECT_EQ(BubbleBorder::TOP_CENTER, frame.bubble_border()->arrow());
-    EXPECT_EQ(window_bounds.x(), 0);
-    EXPECT_EQ(window_bounds.x() +
-                  frame.bubble_border()->GetArrowOffset(window_bounds.size()),
-              125);
-  }
-
   frame.bubble_border()->set_arrow(BubbleBorder::BOTTOM_CENTER);
   window_bounds = frame.GetUpdatedWindowBounds(
       gfx::Rect(100, 900, 50, 50),  // |anchor_rect|
@@ -424,26 +396,8 @@
       true);                        // |adjust_if_offscreen|
   EXPECT_EQ(BubbleBorder::BOTTOM_CENTER, frame.bubble_border()->arrow());
   EXPECT_EQ(window_bounds.x(), 0);
-  if (!UseMd()) {  // There is no arrow offset in MD mode.
-    EXPECT_EQ(window_bounds.x() +
-                  frame.bubble_border()->GetArrowOffset(window_bounds.size()),
-              125);
-  }
 
   // Test bubble not fitting right screen edge.
-  if (!UseMd()) {  // TOP_CENTER isn't supported by the bubble_border() in MD.
-    frame.bubble_border()->set_arrow(BubbleBorder::TOP_CENTER);
-    window_bounds = frame.GetUpdatedWindowBounds(
-        gfx::Rect(900, 100, 50, 50),  // |anchor_rect|
-        gfx::Size(500, 500),          // |client_size|
-        true);                        // |adjust_if_offscreen|
-    EXPECT_EQ(BubbleBorder::TOP_CENTER, frame.bubble_border()->arrow());
-    EXPECT_EQ(window_bounds.right(), 1000);
-    EXPECT_EQ(window_bounds.x() +
-                  frame.bubble_border()->GetArrowOffset(window_bounds.size()),
-              925);
-  }
-
   frame.bubble_border()->set_arrow(BubbleBorder::BOTTOM_CENTER);
   window_bounds = frame.GetUpdatedWindowBounds(
       gfx::Rect(900, 900, 50, 50),  // |anchor_rect|
@@ -451,60 +405,6 @@
       true);                        // |adjust_if_offscreen|
   EXPECT_EQ(BubbleBorder::BOTTOM_CENTER, frame.bubble_border()->arrow());
   EXPECT_EQ(window_bounds.right(), 1000);
-  if (!UseMd()) {  // There is no arrow offset in MD mode.
-    EXPECT_EQ(window_bounds.x() +
-                  frame.bubble_border()->GetArrowOffset(window_bounds.size()),
-              925);
-  }
-
-  // Test bubble not fitting top screen edge.
-  if (!UseMd()) {  // Moving the bubble by setting the arrow offset doesn't work
-                   // in MD mode since there is no arrow displayed.
-    frame.bubble_border()->set_arrow(BubbleBorder::LEFT_CENTER);
-    window_bounds = frame.GetUpdatedWindowBounds(
-        gfx::Rect(100, 100, 50, 50),  // |anchor_rect|
-        gfx::Size(500, 500),          // |client_size|
-        true);                        // |adjust_if_offscreen|
-    EXPECT_EQ(BubbleBorder::LEFT_CENTER, frame.bubble_border()->arrow());
-    EXPECT_EQ(window_bounds.y(), 0);
-    EXPECT_EQ(window_bounds.y() +
-                  frame.bubble_border()->GetArrowOffset(window_bounds.size()),
-              125);
-
-    frame.bubble_border()->set_arrow(BubbleBorder::RIGHT_CENTER);
-    window_bounds = frame.GetUpdatedWindowBounds(
-        gfx::Rect(900, 100, 50, 50),  // |anchor_rect|
-        gfx::Size(500, 500),          // |client_size|
-        true);                        // |adjust_if_offscreen|
-    EXPECT_EQ(BubbleBorder::RIGHT_CENTER, frame.bubble_border()->arrow());
-    EXPECT_EQ(window_bounds.y(), 0);
-    EXPECT_EQ(window_bounds.y() +
-                  frame.bubble_border()->GetArrowOffset(window_bounds.size()),
-              125);
-
-    // Test bubble not fitting bottom screen edge.
-    frame.bubble_border()->set_arrow(BubbleBorder::LEFT_CENTER);
-    window_bounds = frame.GetUpdatedWindowBounds(
-        gfx::Rect(100, 900, 50, 50),  // |anchor_rect|
-        gfx::Size(500, 500),          // |client_size|
-        true);                        // |adjust_if_offscreen|
-    EXPECT_EQ(BubbleBorder::LEFT_CENTER, frame.bubble_border()->arrow());
-    EXPECT_EQ(window_bounds.bottom(), 1000);
-    EXPECT_EQ(window_bounds.y() +
-                  frame.bubble_border()->GetArrowOffset(window_bounds.size()),
-              925);
-
-    frame.bubble_border()->set_arrow(BubbleBorder::RIGHT_CENTER);
-    window_bounds = frame.GetUpdatedWindowBounds(
-        gfx::Rect(900, 900, 50, 50),  // |anchor_rect|
-        gfx::Size(500, 500),          // |client_size|
-        true);                        // |adjust_if_offscreen|
-    EXPECT_EQ(BubbleBorder::RIGHT_CENTER, frame.bubble_border()->arrow());
-    EXPECT_EQ(window_bounds.bottom(), 1000);
-    EXPECT_EQ(window_bounds.y() +
-                  frame.bubble_border()->GetArrowOffset(window_bounds.size()),
-              925);
-  }
 }
 
 TEST_F(BubbleFrameViewTest, GetPreferredSize) {
diff --git a/ui/views/bubble/tray_bubble_view.cc b/ui/views/bubble/tray_bubble_view.cc
index 397b49e9b..1d769dc 100644
--- a/ui/views/bubble/tray_bubble_view.cc
+++ b/ui/views/bubble/tray_bubble_view.cc
@@ -221,8 +221,6 @@
   DCHECK(params_.parent_window);
   DCHECK(anchor_widget());  // Computed by BubbleDialogDelegateView().
   bubble_border_->set_use_theme_background_color(!init_params.bg_color);
-  bubble_border_->set_alignment(BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE);
-  bubble_border_->set_paint_arrow(BubbleBorder::PAINT_NONE);
   if (init_params.corner_radius)
     bubble_border_->SetCornerRadius(init_params.corner_radius.value());
   set_parent_window(params_.parent_window);
diff --git a/ui/views/cocoa/bridged_content_view.h b/ui/views/cocoa/bridged_content_view.h
index a5a9b690..b3fb167 100644
--- a/ui/views/cocoa/bridged_content_view.h
+++ b/ui/views/cocoa/bridged_content_view.h
@@ -16,6 +16,7 @@
 }
 
 namespace views {
+class BridgedNativeWidgetHost;
 class View;
 }
 
@@ -26,16 +27,22 @@
                                                 NSUserInterfaceValidations,
                                                 NSDraggingSource> {
  @private
+  // Weak, reset by clearView.
+  views::BridgedNativeWidgetHost* host_;
+
   // Weak. The hosted RootView, owned by hostedView_->GetWidget().
+  // TODO(ccameron): Remove this member.
   views::View* hostedView_;
 
   // Weak. If non-null the TextInputClient of the currently focused View in the
   // hierarchy rooted at |hostedView_|. Owned by the focused View.
+  // TODO(ccameron): Remove this member.
   ui::TextInputClient* textInputClient_;
 
   // The TextInputClient about to be set. Requests for a new -inputContext will
   // use this, but while the input is changing, |self| still needs to service
   // IME requests using the old |textInputClient_|.
+  // TODO(ccameron): Remove this member.
   ui::TextInputClient* pendingTextInputClient_;
 
   // A tracking area installed to enable mouseMoved events.
@@ -56,7 +63,8 @@
 @property(assign, nonatomic) BOOL drawMenuBackgroundForBlur;
 
 // Initialize the NSView -> views::View bridge. |viewToHost| must be non-NULL.
-- (id)initWithView:(views::View*)viewToHost;
+- (id)initWithHost:(views::BridgedNativeWidgetHost*)host
+              view:(views::View*)viewToHost;
 
 // Clear the hosted view. For example, if it is about to be destroyed.
 - (void)clearView;
diff --git a/ui/views/cocoa/bridged_content_view.mm b/ui/views/cocoa/bridged_content_view.mm
index d6c0b74..019a538 100644
--- a/ui/views/cocoa/bridged_content_view.mm
+++ b/ui/views/cocoa/bridged_content_view.mm
@@ -14,7 +14,6 @@
 #include "ui/base/cocoa/cocoa_base_utils.h"
 #include "ui/base/dragdrop/drag_drop_types.h"
 #include "ui/base/dragdrop/os_exchange_data_provider_mac.h"
-#include "ui/base/hit_test.h"
 #include "ui/base/ime/input_method.h"
 #include "ui/base/ime/text_edit_commands.h"
 #include "ui/base/ime/text_input_client.h"
@@ -32,6 +31,7 @@
 #import "ui/gfx/path_mac.h"
 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h"
 #import "ui/views/cocoa/bridged_native_widget.h"
+#import "ui/views/cocoa/bridged_native_widget_host.h"
 #import "ui/views/cocoa/drag_drop_client_mac.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/controls/menu/menu_config.h"
@@ -39,7 +39,6 @@
 #include "ui/views/view.h"
 #include "ui/views/widget/native_widget_mac.h"
 #include "ui/views/widget/widget.h"
-#include "ui/views/word_lookup_client.h"
 
 using views::MenuController;
 
@@ -277,7 +276,8 @@
 @synthesize textInputClient = textInputClient_;
 @synthesize drawMenuBackgroundForBlur = drawMenuBackgroundForBlur_;
 
-- (id)initWithView:(views::View*)viewToHost {
+- (id)initWithHost:(views::BridgedNativeWidgetHost*)host
+              view:(views::View*)viewToHost {
   DCHECK(viewToHost);
   gfx::Rect bounds = viewToHost->bounds();
   // To keep things simple, assume the origin is (0, 0) until there exists a use
@@ -285,6 +285,7 @@
   DCHECK(bounds.origin().IsOrigin());
   NSRect initialFrame = NSMakeRect(0, 0, bounds.width(), bounds.height());
   if ((self = [super initWithFrame:initialFrame])) {
+    host_ = host;
     hostedView_ = viewToHost;
 
     // Apple's documentation says that NSTrackingActiveAlways is incompatible
@@ -326,6 +327,7 @@
 
 - (void)clearView {
   [self setTextInputClient:nullptr];
+  host_ = nullptr;
   hostedView_ = nullptr;
   [[NSDistributedNotificationCenter defaultCenter] removeObserver:self];
   [cursorTrackingArea_.get() clearOwner];
@@ -391,20 +393,21 @@
   }
 }
 
-// If |point| is classified as HTCAPTION (draggable background), return nil so
+// If |point| is classified as a draggable background (HTCAPTION), return nil so
 // that it can lead to a window drag or double-click in the title bar. Dragging
 // could be optimized by telling the window server which regions should be
 // instantly draggable without asking (tracked at https://crbug.com/830962).
 - (NSView*)hitTest:(NSPoint)point {
   gfx::Point flippedPoint(point.x, NSHeight(self.superview.bounds) - point.y);
-  int component = hostedView_->GetWidget()->GetNonClientComponent(flippedPoint);
-  if (component == HTCAPTION)
+  bool isDraggableBackground = false;
+  host_->GetIsDraggableBackgroundAt(flippedPoint, &isDraggableBackground);
+  if (isDraggableBackground)
     return nil;
   return [super hitTest:point];
 }
 
 - (void)processCapturedMouseEvent:(NSEvent*)theEvent {
-  if (!hostedView_)
+  if (!host_)
     return;
 
   NSWindow* source = [theEvent window];
@@ -430,26 +433,19 @@
   if (isScrollEvent) {
     ui::ScrollEvent event(theEvent);
     event.set_location(event_location);
-    hostedView_->GetWidget()->OnScrollEvent(&event);
+    host_->OnScrollEvent(event);
   } else {
     ui::MouseEvent event(theEvent);
     event.set_location(event_location);
-    hostedView_->GetWidget()->OnMouseEvent(&event);
+    host_->OnMouseEvent(event);
   }
 }
 
 - (void)updateTooltipIfRequiredAt:(const gfx::Point&)locationInContent {
-  DCHECK(hostedView_);
+  DCHECK(host_);
   base::string16 newTooltipText;
 
-  views::View* view = hostedView_->GetTooltipHandlerForPoint(locationInContent);
-  if (view) {
-    gfx::Point viewPoint = locationInContent;
-    views::View::ConvertPointToScreen(hostedView_, &viewPoint);
-    views::View::ConvertPointFromScreen(view, &viewPoint);
-    if (!view->GetTooltipText(viewPoint, &newTooltipText))
-      DCHECK(newTooltipText.empty());
-  }
+  host_->GetTooltipTextAt(locationInContent, &newTooltipText);
   if (newTooltipText != lastTooltipText_) {
     std::swap(newTooltipText, lastTooltipText_);
     [self setToolTipAtMousePoint:base::SysUTF16ToNSString(lastTooltipText_)];
@@ -457,13 +453,9 @@
 }
 
 - (void)updateFullKeyboardAccess {
-  if (!hostedView_)
+  if (!host_)
     return;
-
-  views::FocusManager* focusManager =
-      hostedView_->GetWidget()->GetFocusManager();
-  if (focusManager)
-    focusManager->SetKeyboardAccessible([NSApp isFullKeyboardAccessEnabled]);
+  host_->SetKeyboardAccessible([NSApp isFullKeyboardAccessEnabled]);
 }
 
 // BridgedContentView private implementation.
@@ -689,7 +681,7 @@
 // Translates the location of |theEvent| to toolkit-views coordinates and passes
 // the event to NativeWidgetMac for handling.
 - (void)mouseEvent:(NSEvent*)theEvent {
-  if (!hostedView_)
+  if (!host_)
     return;
 
   DCHECK([theEvent type] != NSScrollWheel);
@@ -699,8 +691,7 @@
   // Aura updates tooltips with the help of aura::Window::AddPreTargetHandler().
   // Mac hooks in here.
   [self updateTooltipIfRequiredAt:event.location()];
-
-  hostedView_->GetWidget()->OnMouseEvent(&event);
+  host_->OnMouseEvent(event);
 }
 
 - (void)forceTouchEvent:(NSEvent*)theEvent {
@@ -720,15 +711,15 @@
   if ([[self window] firstResponder] != self)
     return NO;
   BOOL result = [super becomeFirstResponder];
-  if (result && hostedView_)
-    hostedView_->GetWidget()->GetFocusManager()->RestoreFocusedView();
+  if (result && host_)
+    host_->SetIsFirstResponder(true);
   return result;
 }
 
 - (BOOL)resignFirstResponder {
   BOOL result = [super resignFirstResponder];
-  if (result && hostedView_)
-    hostedView_->GetWidget()->GetFocusManager()->StoreFocusedView(true);
+  if (result && host_)
+    host_->SetIsFirstResponder(false);
   return result;
 }
 
@@ -751,16 +742,16 @@
     newSize = [window contentRectForFrameRect:[window frame]].size;
 
   [super setFrameSize:newSize];
-  if (!hostedView_)
+  if (!host_)
     return;
-
-  hostedView_->SetSize(gfx::Size(newSize.width, newSize.height));
+  host_->SetSize(gfx::Size(newSize.width, newSize.height));
 }
 
 - (BOOL)isOpaque {
   if (!hostedView_)
     return NO;
 
+  // TODO(ccameron): Plumb this from BridgedNativeWidget to here.
   ui::Layer* layer = hostedView_->GetWidget()->GetLayer();
   return layer && layer->fills_bounds_opaquely();
 }
@@ -857,7 +848,7 @@
 }
 
 - (void)scrollWheel:(NSEvent*)theEvent {
-  if (!hostedView_)
+  if (!host_)
     return;
 
   ui::ScrollEvent event(theEvent);
@@ -866,14 +857,13 @@
   // Aura updates tooltips with the help of aura::Window::AddPreTargetHandler().
   // Mac hooks in here.
   [self updateTooltipIfRequiredAt:event.location()];
-
-  hostedView_->GetWidget()->OnScrollEvent(&event);
+  host_->OnScrollEvent(event);
 }
 
 // Called when we get a three-finger swipe, and they're enabled in System
 // Preferences.
 - (void)swipeWithEvent:(NSEvent*)event {
-  if (!hostedView_)
+  if (!host_)
     return;
 
   // themblsha: In my testing all three-finger swipes send only a single event
@@ -894,35 +884,24 @@
   ui::GestureEvent gestureEvent(location.x(), location.y(),
                                 ui::EventFlagsFromNative(event),
                                 ui::EventTimeFromNative(event), swipeDetails);
-
-  hostedView_->GetWidget()->OnGestureEvent(&gestureEvent);
+  host_->OnGestureEvent(gestureEvent);
 }
 
 - (void)quickLookWithEvent:(NSEvent*)theEvent {
-  if (!hostedView_)
+  if (!host_)
     return;
 
   const gfx::Point locationInContent =
       gfx::ToFlooredPoint(ui::EventLocationFromNative(theEvent));
-  views::View* target = hostedView_->GetEventHandlerForPoint(locationInContent);
-  if (!target)
-    return;
 
-  views::WordLookupClient* wordLookupClient = target->GetWordLookupClient();
-  if (!wordLookupClient)
-    return;
-
-  gfx::Point locationInTarget = locationInContent;
-  views::View::ConvertPointToTarget(hostedView_, target, &locationInTarget);
+  bool foundWord = false;
   gfx::DecoratedText decoratedWord;
   gfx::Point baselinePoint;
-  if (!wordLookupClient->GetWordLookupDataAtPoint(
-          locationInTarget, &decoratedWord, &baselinePoint)) {
+  host_->GetWordAt(locationInContent, &foundWord, &decoratedWord,
+                   &baselinePoint);
+  if (!foundWord)
     return;
-  }
 
-  // Convert |baselinePoint| to the coordinate system of |hostedView_|.
-  views::View::ConvertPointToTarget(target, hostedView_, &baselinePoint);
   NSPoint baselinePointAppKit = NSMakePoint(
       baselinePoint.x(), NSHeight([self frame]) - baselinePoint.y());
   [self showDefinitionForAttributedString:
diff --git a/ui/views/cocoa/bridged_native_widget.mm b/ui/views/cocoa/bridged_native_widget.mm
index fcda74e..837d8c5 100644
--- a/ui/views/cocoa/bridged_native_widget.mm
+++ b/ui/views/cocoa/bridged_native_widget.mm
@@ -444,7 +444,8 @@
   // the old views::View will be gone, so any method calls will become no-ops.
 
   if (view) {
-    bridged_view_.reset([[BridgedContentView alloc] initWithView:view]);
+    bridged_view_.reset(
+        [[BridgedContentView alloc] initWithHost:host_ view:view]);
     drag_drop_client_.reset(new DragDropClientMac(this, view));
 
     // Objective C initializers can return nil. However, if |view| is non-NULL
diff --git a/ui/views/cocoa/bridged_native_widget_host.h b/ui/views/cocoa/bridged_native_widget_host.h
index a489871b..afcf0cff 100644
--- a/ui/views/cocoa/bridged_native_widget_host.h
+++ b/ui/views/cocoa/bridged_native_widget_host.h
@@ -5,6 +5,10 @@
 #ifndef UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_HOST_H_
 #define UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_HOST_H_
 
+#include "ui/events/event_utils.h"
+#include "ui/gfx/decorated_text.h"
+#include "ui/gfx/geometry/point.h"
+#include "ui/gfx/geometry/size.h"
 #include "ui/views/views_export.h"
 
 namespace views {
@@ -21,6 +25,37 @@
 
   // Update the ui::Compositor and ui::Layer's visibility.
   virtual void SetCompositorVisibility(bool visible) = 0;
+
+  // Resize the underlying views::View to |new_size|.
+  virtual void SetSize(const gfx::Size& new_size) = 0;
+
+  // Indicate if full keyboard accessibility is needed and updates focus if
+  // needed.
+  virtual void SetKeyboardAccessible(bool enabled) = 0;
+
+  // Indicate if the NSView is the first responder.
+  virtual void SetIsFirstResponder(bool is_first_responder) = 0;
+
+  // Handle events. Note that whether or not the event is actually handled is
+  // not returned.
+  virtual void OnScrollEvent(const ui::ScrollEvent& const_event) = 0;
+  virtual void OnMouseEvent(const ui::MouseEvent& const_event) = 0;
+  virtual void OnGestureEvent(const ui::GestureEvent& const_event) = 0;
+
+  // Synchronously query if |location_in_content| is a draggable background.
+  virtual void GetIsDraggableBackgroundAt(const gfx::Point& location_in_content,
+                                          bool* is_draggable_background) = 0;
+
+  // Synchronously query the tooltip text for |location_in_content|.
+  virtual void GetTooltipTextAt(const gfx::Point& location_in_content,
+                                base::string16* new_tooltip_text) = 0;
+
+  // Synchronously query the quicklook text at |location_in_content|. Return in
+  // |found_word| whether or not a word was found.
+  virtual void GetWordAt(const gfx::Point& location_in_content,
+                         bool* found_word,
+                         gfx::DecoratedText* decorated_word,
+                         gfx::Point* baseline_point) = 0;
 };
 
 }  // namespace views
diff --git a/ui/views/cocoa/bridged_native_widget_host_impl.h b/ui/views/cocoa/bridged_native_widget_host_impl.h
index 72c1176..1b15c1a 100644
--- a/ui/views/cocoa/bridged_native_widget_host_impl.h
+++ b/ui/views/cocoa/bridged_native_widget_host_impl.h
@@ -41,27 +41,46 @@
   // with methods that may be sent across processes.
   BridgedNativeWidget* bridge() const { return bridge_.get(); }
 
+  // Set the root view (set during initialization and un-set during teardown).
+  void SetRootView(views::View* root_view);
+
   // Initialize the ui::Compositor and ui::Layer.
   void CreateCompositor(const Widget::InitParams& params);
 
  private:
   void DestroyCompositor();
 
-  // Overridden from views::BridgedNativeWidgetHost:
+  // views::BridgedNativeWidgetHost:
   void SetCompositorSize(const gfx::Size& size_in_dip,
                          float scale_factor) override;
   void SetCompositorVisibility(bool visible) override;
+  void SetSize(const gfx::Size& new_size) override;
+  void SetKeyboardAccessible(bool enabled) override;
+  void SetIsFirstResponder(bool is_first_responder) override;
+  void OnScrollEvent(const ui::ScrollEvent& const_event) override;
+  void OnMouseEvent(const ui::MouseEvent& const_event) override;
+  void OnGestureEvent(const ui::GestureEvent& const_event) override;
+  void GetIsDraggableBackgroundAt(const gfx::Point& location_in_content,
+                                  bool* is_draggable_background) override;
+  void GetTooltipTextAt(const gfx::Point& location_in_content,
+                        base::string16* new_tooltip_text) override;
+  void GetWordAt(const gfx::Point& location_in_content,
+                 bool* found_word,
+                 gfx::DecoratedText* decorated_word,
+                 gfx::Point* baseline_point) override;
 
-  // Overridden from ui::LayerDelegate:
+  // ui::LayerDelegate:
   void OnPaintLayer(const ui::PaintContext& context) override;
   void OnDeviceScaleFactorChanged(float old_device_scale_factor,
                                   float new_device_scale_factor) override;
 
-  // Overridden from ui::AcceleratedWidgetMacNSView:
+  // ui::AcceleratedWidgetMacNSView:
   void AcceleratedWidgetCALayerParamsUpdated() override;
 
   views::NativeWidgetMac* const native_widget_mac_;  // Weak. Owns |this_|.
 
+  views::View* root_view_ = nullptr;  // Weak. Owned by |native_widget_mac_|.
+
   // TODO(ccameron): Rather than instantiate a BridgedNativeWidget here,
   // we will instantiate a mojo BridgedNativeWidget interface to a Cocoa
   // instance that may be in another process.
diff --git a/ui/views/cocoa/bridged_native_widget_host_impl.mm b/ui/views/cocoa/bridged_native_widget_host_impl.mm
index ba1677d..28dfa18 100644
--- a/ui/views/cocoa/bridged_native_widget_host_impl.mm
+++ b/ui/views/cocoa/bridged_native_widget_host_impl.mm
@@ -4,11 +4,13 @@
 
 #include "ui/views/cocoa/bridged_native_widget_host_impl.h"
 
+#include "ui/base/hit_test.h"
 #include "ui/compositor/recyclable_compositor_mac.h"
 #include "ui/gfx/geometry/dip_util.h"
 #include "ui/views/cocoa/bridged_native_widget.h"
 #include "ui/views/views_delegate.h"
 #include "ui/views/widget/native_widget_mac.h"
+#include "ui/views/word_lookup_client.h"
 
 namespace views {
 
@@ -26,6 +28,13 @@
   DestroyCompositor();
 }
 
+void BridgedNativeWidgetHostImpl::SetRootView(views::View* root_view) {
+  root_view_ = root_view;
+  // TODO(ccameron): The BridgedNativeWidget should not need to know its root
+  // view.
+  bridge_->SetRootView(root_view);
+}
+
 void BridgedNativeWidgetHostImpl::CreateCompositor(
     const Widget::InitParams& params) {
   DCHECK(!compositor_);
@@ -100,6 +109,92 @@
   }
 }
 
+void BridgedNativeWidgetHostImpl::OnScrollEvent(
+    const ui::ScrollEvent& const_event) {
+  ui::ScrollEvent event = const_event;
+  root_view_->GetWidget()->OnScrollEvent(&event);
+}
+
+void BridgedNativeWidgetHostImpl::OnMouseEvent(
+    const ui::MouseEvent& const_event) {
+  ui::MouseEvent event = const_event;
+  root_view_->GetWidget()->OnMouseEvent(&event);
+}
+
+void BridgedNativeWidgetHostImpl::OnGestureEvent(
+    const ui::GestureEvent& const_event) {
+  ui::GestureEvent event = const_event;
+  root_view_->GetWidget()->OnGestureEvent(&event);
+}
+
+void BridgedNativeWidgetHostImpl::SetSize(const gfx::Size& new_size) {
+  root_view_->SetSize(new_size);
+}
+
+void BridgedNativeWidgetHostImpl::SetKeyboardAccessible(bool enabled) {
+  views::FocusManager* focus_manager =
+      root_view_->GetWidget()->GetFocusManager();
+  if (focus_manager)
+    focus_manager->SetKeyboardAccessible(enabled);
+}
+
+void BridgedNativeWidgetHostImpl::SetIsFirstResponder(bool is_first_responder) {
+  if (is_first_responder)
+    root_view_->GetWidget()->GetFocusManager()->RestoreFocusedView();
+  else
+    root_view_->GetWidget()->GetFocusManager()->StoreFocusedView(true);
+}
+
+void BridgedNativeWidgetHostImpl::GetIsDraggableBackgroundAt(
+    const gfx::Point& location_in_content,
+    bool* is_draggable_background) {
+  int component =
+      root_view_->GetWidget()->GetNonClientComponent(location_in_content);
+  *is_draggable_background = component == HTCAPTION;
+}
+
+void BridgedNativeWidgetHostImpl::GetTooltipTextAt(
+    const gfx::Point& location_in_content,
+    base::string16* new_tooltip_text) {
+  views::View* view =
+      root_view_->GetTooltipHandlerForPoint(location_in_content);
+  if (view) {
+    gfx::Point view_point = location_in_content;
+    views::View::ConvertPointToScreen(root_view_, &view_point);
+    views::View::ConvertPointFromScreen(view, &view_point);
+    if (!view->GetTooltipText(view_point, new_tooltip_text))
+      DCHECK(new_tooltip_text->empty());
+  }
+}
+
+void BridgedNativeWidgetHostImpl::GetWordAt(
+    const gfx::Point& location_in_content,
+    bool* found_word,
+    gfx::DecoratedText* decorated_word,
+    gfx::Point* baseline_point) {
+  *found_word = false;
+
+  views::View* target =
+      root_view_->GetEventHandlerForPoint(location_in_content);
+  if (!target)
+    return;
+
+  views::WordLookupClient* word_lookup_client = target->GetWordLookupClient();
+  if (!word_lookup_client)
+    return;
+
+  gfx::Point location_in_target = location_in_content;
+  views::View::ConvertPointToTarget(root_view_, target, &location_in_target);
+  if (!word_lookup_client->GetWordLookupDataAtPoint(
+          location_in_target, decorated_word, baseline_point)) {
+    return;
+  }
+
+  // Convert |baselinePoint| to the coordinate system of |root_view_|.
+  views::View::ConvertPointToTarget(target, root_view_, baseline_point);
+  *found_word = true;
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // BridgedNativeWidgetHostImpl, LayerDelegate:
 
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm
index 5eaa3e8..b131177 100644
--- a/ui/views/cocoa/bridged_native_widget_unittest.mm
+++ b/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -26,6 +26,7 @@
 #include "ui/events/test/cocoa_test_event_utils.h"
 #import "ui/gfx/mac/coordinate_conversion.h"
 #import "ui/views/cocoa/bridged_content_view.h"
+#import "ui/views/cocoa/bridged_native_widget_host_impl.h"
 #import "ui/views/cocoa/native_widget_mac_nswindow.h"
 #import "ui/views/cocoa/views_nswindow_delegate.h"
 #include "ui/views/controls/textfield/textfield.h"
@@ -289,6 +290,7 @@
   explicit MockNativeWidgetMac(internal::NativeWidgetDelegate* delegate)
       : NativeWidgetMac(delegate) {}
   using NativeWidgetMac::bridge;
+  using NativeWidgetMac::bridge_host_for_testing;
 
   // internal::NativeWidgetPrivate:
   void InitNativeWidget(const Widget::InitParams& params) override {
@@ -323,6 +325,9 @@
       : native_widget_mac_(nullptr) {}
 
   BridgedNativeWidget* bridge() { return native_widget_mac_->bridge(); }
+  BridgedNativeWidgetHostImpl* bridge_host() {
+    return native_widget_mac_->bridge_host_for_testing();
+  }
 
   // Overridden from testing::Test:
   void SetUp() override {
@@ -571,7 +576,7 @@
 
   // The delegate should exist before setting the root view.
   EXPECT_TRUE([window delegate]);
-  bridge()->SetRootView(view_.get());
+  bridge_host()->SetRootView(view_.get());
   ns_view_ = bridge()->ns_view();
 
   // Pretend it has been shown via NativeWidgetMac::Show().
@@ -583,8 +588,8 @@
   // Clear kill buffer so that no state persists between tests.
   TextfieldModel::ClearKillBuffer();
 
-  if (bridge())
-    bridge()->SetRootView(nullptr);
+  if (bridge_host())
+    bridge_host()->SetRootView(nullptr);
   view_.reset();
   BridgedNativeWidgetTestBase::TearDown();
 }
diff --git a/ui/views/controls/button/checkbox.cc b/ui/views/controls/button/checkbox.cc
index 5dc51b4..b0387e69 100644
--- a/ui/views/controls/button/checkbox.cc
+++ b/ui/views/controls/button/checkbox.cc
@@ -9,7 +9,6 @@
 #include <utility>
 
 #include "ui/accessibility/ax_node_data.h"
-#include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_palette.h"
@@ -33,68 +32,16 @@
 // static
 const char Checkbox::kViewClassName[] = "Checkbox";
 
-Checkbox::Checkbox(const base::string16& label,
-                   ButtonListener* listener,
-                   bool force_md)
-    : LabelButton(listener, label),
-      checked_(false),
-      label_ax_id_(0),
-      use_md_(force_md ||
-              ui::MaterialDesignController::IsSecondaryUiMaterial()) {
+Checkbox::Checkbox(const base::string16& label, ButtonListener* listener)
+    : LabelButton(listener, label), checked_(false), label_ax_id_(0) {
   SetHorizontalAlignment(gfx::ALIGN_LEFT);
   SetFocusForPlatform();
   SetFocusPainter(nullptr);
 
-  if (UseMd()) {
-    set_request_focus_on_press(false);
-    SetInkDropMode(InkDropMode::ON);
-    set_has_ink_drop_action_on_click(true);
-    focus_ring_ = FocusRing::Install(this);
-  } else {
-    std::unique_ptr<LabelButtonBorder> button_border(new LabelButtonBorder());
-    // Inset the trailing side by a couple pixels for the focus border.
-    button_border->set_insets(gfx::Insets(0, 0, 0, 2));
-    SetBorder(std::move(button_border));
-    set_request_focus_on_press(true);
-
-    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
-
-    // Unchecked/Unfocused images.
-    SetCustomImage(false, false, STATE_NORMAL,
-                   *rb.GetImageSkiaNamed(IDR_CHECKBOX));
-    SetCustomImage(false, false, STATE_HOVERED,
-                   *rb.GetImageSkiaNamed(IDR_CHECKBOX_HOVER));
-    SetCustomImage(false, false, STATE_PRESSED,
-                   *rb.GetImageSkiaNamed(IDR_CHECKBOX_PRESSED));
-    SetCustomImage(false, false, STATE_DISABLED,
-                   *rb.GetImageSkiaNamed(IDR_CHECKBOX_DISABLED));
-
-    // Checked/Unfocused images.
-    SetCustomImage(true, false, STATE_NORMAL,
-                   *rb.GetImageSkiaNamed(IDR_CHECKBOX_CHECKED));
-    SetCustomImage(true, false, STATE_HOVERED,
-                   *rb.GetImageSkiaNamed(IDR_CHECKBOX_CHECKED_HOVER));
-    SetCustomImage(true, false, STATE_PRESSED,
-                   *rb.GetImageSkiaNamed(IDR_CHECKBOX_CHECKED_PRESSED));
-    SetCustomImage(true, false, STATE_DISABLED,
-                   *rb.GetImageSkiaNamed(IDR_CHECKBOX_CHECKED_DISABLED));
-
-    // Unchecked/Focused images.
-    SetCustomImage(false, true, STATE_NORMAL,
-                   *rb.GetImageSkiaNamed(IDR_CHECKBOX_FOCUSED));
-    SetCustomImage(false, true, STATE_HOVERED,
-                   *rb.GetImageSkiaNamed(IDR_CHECKBOX_FOCUSED_HOVER));
-    SetCustomImage(false, true, STATE_PRESSED,
-                   *rb.GetImageSkiaNamed(IDR_CHECKBOX_FOCUSED_PRESSED));
-
-    // Checked/Focused images.
-    SetCustomImage(true, true, STATE_NORMAL,
-                   *rb.GetImageSkiaNamed(IDR_CHECKBOX_FOCUSED_CHECKED));
-    SetCustomImage(true, true, STATE_HOVERED,
-                   *rb.GetImageSkiaNamed(IDR_CHECKBOX_FOCUSED_CHECKED_HOVER));
-    SetCustomImage(true, true, STATE_PRESSED,
-                   *rb.GetImageSkiaNamed(IDR_CHECKBOX_FOCUSED_CHECKED_PRESSED));
-  }
+  set_request_focus_on_press(false);
+  SetInkDropMode(InkDropMode::ON);
+  set_has_ink_drop_action_on_click(true);
+  focus_ring_ = FocusRing::Install(this);
 
   // Limit the checkbox height to match the legacy appearance.
   const gfx::Size preferred_size(LabelButton::CalculatePreferredSize());
@@ -125,12 +72,6 @@
       node_data.GetString16Attribute(ax::mojom::StringAttribute::kName));
 }
 
-// TODO(tetsui): Remove this method and |use_md_| when MD for secondary UI
-// becomes default and IsSecondaryUiMaterial() is tautology.
-bool Checkbox::UseMd() const {
-  return use_md_;
-}
-
 const char* Checkbox::GetClassName() const {
   return kViewClassName;
 }
@@ -155,22 +96,9 @@
   }
 }
 
-void Checkbox::OnFocus() {
-  LabelButton::OnFocus();
-  if (!UseMd())
-    UpdateImage();
-}
-
-void Checkbox::OnBlur() {
-  LabelButton::OnBlur();
-  if (!UseMd())
-    UpdateImage();
-}
-
 void Checkbox::OnNativeThemeChanged(const ui::NativeTheme* theme) {
   LabelButton::OnNativeThemeChanged(theme);
-  if (UseMd())
-    UpdateImage();
+  UpdateImage();
 }
 
 std::unique_ptr<InkDrop> Checkbox::CreateInkDrop() {
@@ -194,19 +122,10 @@
 }
 
 gfx::ImageSkia Checkbox::GetImage(ButtonState for_state) const {
-  if (UseMd()) {
-    const int checked = checked_ ? IconState::CHECKED : 0;
-    const int enabled = for_state != STATE_DISABLED ? IconState::ENABLED : 0;
-    return gfx::CreateVectorIcon(GetVectorIcon(), 16,
-                                 GetIconImageColor(checked | enabled));
-  }
-
-  const size_t checked_index = checked_ ? 1 : 0;
-  const size_t focused_index = HasFocus() ? 1 : 0;
-  if (for_state != STATE_NORMAL &&
-      images_[checked_index][focused_index][for_state].isNull())
-    return images_[checked_index][focused_index][STATE_NORMAL];
-  return images_[checked_index][focused_index][for_state];
+  const int checked = checked_ ? IconState::CHECKED : 0;
+  const int enabled = for_state != STATE_DISABLED ? IconState::ENABLED : 0;
+  return gfx::CreateVectorIcon(GetVectorIcon(), 16,
+                               GetIconImageColor(checked | enabled));
 }
 
 std::unique_ptr<LabelButtonBorder> Checkbox::CreateDefaultBorder() const {
@@ -231,22 +150,11 @@
   return path;
 }
 
-void Checkbox::SetCustomImage(bool checked,
-                              bool focused,
-                              ButtonState for_state,
-                              const gfx::ImageSkia& image) {
-  const size_t checked_index = checked ? 1 : 0;
-  const size_t focused_index = focused ? 1 : 0;
-  images_[checked_index][focused_index][for_state] = image;
-  UpdateImage();
-}
-
 const gfx::VectorIcon& Checkbox::GetVectorIcon() const {
   return checked() ? kCheckboxActiveIcon : kCheckboxNormalIcon;
 }
 
 SkColor Checkbox::GetIconImageColor(int icon_state) const {
-  DCHECK(UseMd());
   const SkColor active_color =
       (icon_state & IconState::CHECKED)
           ? GetNativeTheme()->GetSystemColor(
diff --git a/ui/views/controls/button/checkbox.h b/ui/views/controls/button/checkbox.h
index 6fb4c93b..db6e630 100644
--- a/ui/views/controls/button/checkbox.h
+++ b/ui/views/controls/button/checkbox.h
@@ -28,8 +28,7 @@
 
   // |force_md| forces MD even when --secondary-ui-md flag is not set.
   explicit Checkbox(const base::string16& label,
-                    ButtonListener* listener = nullptr,
-                    bool force_md = false);
+                    ButtonListener* listener = nullptr);
   ~Checkbox() override;
 
   // Sets/Gets whether or not the checkbox is checked.
@@ -48,14 +47,8 @@
   void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
 
  protected:
-  // Returns whether MD is enabled. Returns true if |force_md| in the
-  // constructor or --secondary-ui-md flag is set.
-  bool UseMd() const;
-
   // LabelButton:
   const char* GetClassName() const override;
-  void OnFocus() override;
-  void OnBlur() override;
   void OnNativeThemeChanged(const ui::NativeTheme* theme) override;
   std::unique_ptr<InkDrop> CreateInkDrop() override;
   std::unique_ptr<InkDropRipple> CreateInkDropRipple() const override;
@@ -64,13 +57,6 @@
   std::unique_ptr<LabelButtonBorder> CreateDefaultBorder() const override;
   void Layout() override;
 
-  // Set the image shown for each button state depending on whether it is
-  // [checked] or [focused].
-  void SetCustomImage(bool checked,
-                      bool focused,
-                      ButtonState for_state,
-                      const gfx::ImageSkia& image);
-
   // Gets the vector icon to use based on the current state of |checked_|.
   virtual const gfx::VectorIcon& GetVectorIcon() const;
 
@@ -95,17 +81,12 @@
   // True if the checkbox is checked.
   bool checked_;
 
-  // The images for each button node_data.
-  gfx::ImageSkia images_[2][2][STATE_COUNT];
-
   // The unique id for the associated label's accessible object.
   int32_t label_ax_id_;
 
   // The focus ring to use for this Checkbox.
   std::unique_ptr<FocusRing> focus_ring_;
 
-  bool use_md_;
-
   DISALLOW_COPY_AND_ASSIGN(Checkbox);
 };
 
diff --git a/ui/views/controls/button/md_text_button.cc b/ui/views/controls/button/md_text_button.cc
index 6ca62c1e..4e6011dc 100644
--- a/ui/views/controls/button/md_text_button.cc
+++ b/ui/views/controls/button/md_text_button.cc
@@ -27,47 +27,20 @@
 
 namespace views {
 
-namespace {
-
-bool UseMaterialSecondaryButtons() {
-#if defined(OS_MACOSX)
-  return true;
-#else
-  return ui::MaterialDesignController::IsSecondaryUiMaterial();
-#endif  // defined(OS_MACOSX)
-}
-
-LabelButton* CreateButton(ButtonListener* listener,
-                          const base::string16& text,
-                          bool md) {
-  if (md)
-    return MdTextButton::Create(listener, text, style::CONTEXT_BUTTON_MD);
-
-  LabelButton* button = new LabelButton(listener, text, style::CONTEXT_BUTTON);
-  button->SetStyleDeprecated(Button::STYLE_BUTTON);
-  return button;
-}
-
-}  // namespace
-
 // static
 LabelButton* MdTextButton::CreateSecondaryUiButton(ButtonListener* listener,
                                                    const base::string16& text) {
-  return CreateButton(listener, text, UseMaterialSecondaryButtons());
+  return MdTextButton::Create(listener, text, style::CONTEXT_BUTTON_MD);
 }
 
 // static
 LabelButton* MdTextButton::CreateSecondaryUiBlueButton(
     ButtonListener* listener,
     const base::string16& text) {
-  if (UseMaterialSecondaryButtons()) {
-    MdTextButton* md_button =
-        MdTextButton::Create(listener, text, style::CONTEXT_BUTTON_MD);
-    md_button->SetProminent(true);
-    return md_button;
-  }
-
-  return new BlueButton(listener, text);
+  MdTextButton* md_button =
+      MdTextButton::Create(listener, text, style::CONTEXT_BUTTON_MD);
+  md_button->SetProminent(true);
+  return md_button;
 }
 
 // static
@@ -307,25 +280,10 @@
       // Harmony and non-Harmony colors.
       stroke_alpha = 0x43;
     } else {
-      // These alpha values will take the enabled button colors, 5a5a5a @ 1.0
-      // alpha for non-Harmony, 757575 @ 1.0 alpha for Harmony and turn it into
-      // an effective b2b2b2 @ 1.0 alpha or 000000 @ 0.3 for the stroke_color.
-      stroke_alpha = UseMaterialSecondaryButtons() ? 0x8f : 0x77;
-#if defined(OS_MACOSX)
-      // Without full secondary UI MD support, the text color is solid black,
-      // and so the border is too dark on Mac. On Retina it looks OK, so
-      // heuristically determine the scale factor as well.
-      if (!ui::MaterialDesignController::IsSecondaryUiMaterial()) {
-        // The Compositor may only be set when attached to a Widget. But, since
-        // that also determines the theme, UpdateColors() will always be called
-        // after attaching to a Widget.
-        // TODO(tapted): Move this into SolidRoundRectPainter if we like this
-        // logic for Harmony.
-        auto* compositor = layer()->GetCompositor();
-        if (compositor && compositor->device_scale_factor() == 1)
-          stroke_alpha = 0x4d;  // Chosen to match full secondary UI MD (0.3).
-      }
-#endif
+      // These alpha values will take the enabled button colors, 757575 @ 1.0
+      // alpha turn it into an effective b2b2b2 @ 1.0 alpha or 000000 @ 0.3 for
+      // the stroke_color.
+      stroke_alpha = 0x8f;
     }
     stroke_color = SkColorSetA(text_color, stroke_alpha);
   }
diff --git a/ui/views/controls/button/radio_button.cc b/ui/views/controls/button/radio_button.cc
index b9dbdbe..9adf494 100644
--- a/ui/views/controls/button/radio_button.cc
+++ b/ui/views/controls/button/radio_button.cc
@@ -19,51 +19,9 @@
 // static
 const char RadioButton::kViewClassName[] = "RadioButton";
 
-RadioButton::RadioButton(const base::string16& label,
-                         int group_id,
-                         bool force_md)
-    : Checkbox(label, nullptr, force_md) {
+RadioButton::RadioButton(const base::string16& label, int group_id)
+    : Checkbox(label, nullptr) {
   SetGroup(group_id);
-
-  if (!UseMd()) {
-    set_request_focus_on_press(true);
-    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
-    // Unchecked/Unfocused images.
-    SetCustomImage(false, false, STATE_NORMAL,
-                   *rb.GetImageSkiaNamed(IDR_RADIO));
-    SetCustomImage(false, false, STATE_HOVERED,
-                   *rb.GetImageSkiaNamed(IDR_RADIO_HOVER));
-    SetCustomImage(false, false, STATE_PRESSED,
-                   *rb.GetImageSkiaNamed(IDR_RADIO_PRESSED));
-    SetCustomImage(false, false, STATE_DISABLED,
-                   *rb.GetImageSkiaNamed(IDR_RADIO_DISABLED));
-
-    // Checked/Unfocused images.
-    SetCustomImage(true, false, STATE_NORMAL,
-                   *rb.GetImageSkiaNamed(IDR_RADIO_CHECKED));
-    SetCustomImage(true, false, STATE_HOVERED,
-                   *rb.GetImageSkiaNamed(IDR_RADIO_CHECKED_HOVER));
-    SetCustomImage(true, false, STATE_PRESSED,
-                   *rb.GetImageSkiaNamed(IDR_RADIO_CHECKED_PRESSED));
-    SetCustomImage(true, false, STATE_DISABLED,
-                   *rb.GetImageSkiaNamed(IDR_RADIO_CHECKED_DISABLED));
-
-    // Unchecked/Focused images.
-    SetCustomImage(false, true, STATE_NORMAL,
-                   *rb.GetImageSkiaNamed(IDR_RADIO_FOCUSED));
-    SetCustomImage(false, true, STATE_HOVERED,
-                   *rb.GetImageSkiaNamed(IDR_RADIO_FOCUSED_HOVER));
-    SetCustomImage(false, true, STATE_PRESSED,
-                   *rb.GetImageSkiaNamed(IDR_RADIO_FOCUSED_PRESSED));
-
-    // Checked/Focused images.
-    SetCustomImage(true, true, STATE_NORMAL,
-                   *rb.GetImageSkiaNamed(IDR_RADIO_FOCUSED_CHECKED));
-    SetCustomImage(true, true, STATE_HOVERED,
-                   *rb.GetImageSkiaNamed(IDR_RADIO_FOCUSED_CHECKED_HOVER));
-    SetCustomImage(true, true, STATE_PRESSED,
-                   *rb.GetImageSkiaNamed(IDR_RADIO_FOCUSED_CHECKED_PRESSED));
-  }
 }
 
 RadioButton::~RadioButton() {
diff --git a/ui/views/controls/button/radio_button.h b/ui/views/controls/button/radio_button.h
index 02cf91d..2810468 100644
--- a/ui/views/controls/button/radio_button.h
+++ b/ui/views/controls/button/radio_button.h
@@ -19,8 +19,7 @@
   // The button's class name.
   static const char kViewClassName[];
 
-  // |force_md| forces MD even when --secondary-ui-md flag is not set.
-  RadioButton(const base::string16& label, int group_id, bool force_md = false);
+  RadioButton(const base::string16& label, int group_id);
   ~RadioButton() override;
 
   // Overridden from View:
diff --git a/ui/views/controls/button/radio_button_unittest.cc b/ui/views/controls/button/radio_button_unittest.cc
index 19485e6..390809e 100644
--- a/ui/views/controls/button/radio_button_unittest.cc
+++ b/ui/views/controls/button/radio_button_unittest.cc
@@ -6,7 +6,6 @@
 
 #include "base/strings/utf_string_conversions.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/material_design/material_design_controller.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/views/test/views_test_base.h"
 
@@ -113,26 +112,18 @@
 
   EXPECT_TRUE(button2->checked());
   auto* focus_manager = button_container().GetFocusManager();
-  // Focus behavior is different pre/post-Harmony.
-  if (ui::MaterialDesignController::IsSecondaryUiMaterial()) {
-    // No focus on click.
-    EXPECT_EQ(nullptr, focus_manager->GetFocusedView());
+  // No focus on click.
+  EXPECT_EQ(nullptr, focus_manager->GetFocusedView());
 
-    ui::KeyEvent pressed_tab(ui::ET_KEY_PRESSED, ui::VKEY_TAB, ui::EF_NONE);
-    focus_manager->OnKeyEvent(pressed_tab);
-    EXPECT_EQ(button2, focus_manager->GetFocusedView());
+  ui::KeyEvent pressed_tab(ui::ET_KEY_PRESSED, ui::VKEY_TAB, ui::EF_NONE);
+  focus_manager->OnKeyEvent(pressed_tab);
+  EXPECT_EQ(button2, focus_manager->GetFocusedView());
 
-    button1->OnMousePressed(event);
-    button1->OnMouseReleased(event);
-    // Button 1 gets focus on click because button 2 already had it.
-    EXPECT_TRUE(button1->checked());
-    EXPECT_EQ(button1, focus_manager->GetFocusedView());
-  } else if (button2->request_focus_on_press()) {
-    EXPECT_EQ(button2, focus_manager->GetFocusedView());
-  } else {
-    // On Mac, buttons never (and can not be made to) request focus on clicks.
-    EXPECT_EQ(nullptr, focus_manager->GetFocusedView());
-  }
+  button1->OnMousePressed(event);
+  button1->OnMouseReleased(event);
+  // Button 1 gets focus on click because button 2 already had it.
+  EXPECT_TRUE(button1->checked());
+  EXPECT_EQ(button1, focus_manager->GetFocusedView());
 }
 
 }  // namespace views
diff --git a/ui/views/controls/combobox/combobox.cc b/ui/views/controls/combobox/combobox.cc
index 2cb22fe..f900b99 100644
--- a/ui/views/controls/combobox/combobox.cc
+++ b/ui/views/controls/combobox/combobox.cc
@@ -15,7 +15,6 @@
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/default_style.h"
 #include "ui/base/ime/input_method.h"
-#include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/models/combobox_model_observer.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/events/event.h"
@@ -93,10 +92,6 @@
 
 #undef MENU_IMAGE_GRID
 
-bool UseMd() {
-  return ui::MaterialDesignController::IsSecondaryUiMaterial();
-}
-
 SkColor GetTextColorForEnableState(const Combobox& combobox, bool enabled) {
   return style::GetColor(
       combobox, style::CONTEXT_TEXTFIELD,
@@ -130,10 +125,8 @@
     SetFocusBehavior(FocusBehavior::NEVER);
     set_notify_action(PlatformStyle::kMenuNotifyActivationAction);
 
-    if (UseMd()) {
-      SetInkDropMode(InkDropMode::ON);
-      set_has_ink_drop_action_on_click(true);
-    }
+    SetInkDropMode(InkDropMode::ON);
+    set_has_ink_drop_action_on_click(true);
   }
   ~TransparentButton() override {}
 
@@ -455,16 +448,10 @@
 
   // A layer is applied to make sure that canvas bounds are snapped to pixel
   // boundaries (for the sake of drawing the arrow).
-  if (UseMd()) {
-    SetPaintToLayer();
-    layer()->SetFillsBoundsOpaquely(false);
-  } else {
-    arrow_image_ = *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
-        IDR_MENU_DROPARROW);
-  }
+  SetPaintToLayer();
+  layer()->SetFillsBoundsOpaquely(false);
 
-  if (UseMd())
-    focus_ring_ = FocusRing::Install(this);
+  focus_ring_ = FocusRing::Install(this);
 }
 
 Combobox::~Combobox() {
@@ -567,9 +554,6 @@
 }
 
 void Combobox::OnNativeThemeChanged(const ui::NativeTheme* theme) {
-  if (!UseMd())
-    return;
-
   SetBackground(
       CreateBackgroundFromPainter(Painter::CreateSolidRoundRectPainter(
           theme->GetSystemColor(
@@ -795,9 +779,6 @@
   if (!enabled())
     return;
 
-  if (!UseMd())
-    RequestFocus();
-
   if (sender == text_button_) {
     OnPerformAction();
   } else {
@@ -865,7 +846,7 @@
       PositionArrowWithinContainer(arrow_bounds, ArrowSize(), style_);
   AdjustBoundsForRTLUI(&arrow_bounds);
 
-  if (UseMd()) {
+  {
     // Since this is a core piece of UI and vector icons don't handle fractional
     // scale factors particularly well, manually draw an arrow and make sure it
     // looks good at all scale factors.
@@ -890,8 +871,6 @@
     flags.setColor(arrow_color);
     flags.setAntiAlias(true);
     canvas->DrawPath(path, flags);
-  } else {
-    canvas->DrawImageInt(arrow_image_, arrow_bounds.x(), arrow_bounds.y());
   }
 }
 
@@ -1005,7 +984,7 @@
 }
 
 gfx::Size Combobox::ArrowSize() const {
-  return UseMd() ? gfx::Size(8, 4) : arrow_image_.size();
+  return gfx::Size(8, 4);
 }
 
 gfx::Size Combobox::GetContentSize() const {
@@ -1031,11 +1010,9 @@
 }
 
 int Combobox::GetArrowContainerWidth() const {
-  constexpr int kMdPaddingWidth = 8;
-  constexpr int kNormalPaddingWidth = 7;
-  int arrow_pad = UseMd() ? kMdPaddingWidth : kNormalPaddingWidth;
+  constexpr int kPaddingWidth = 8;
   int padding = style_ == STYLE_NORMAL
-                    ? arrow_pad * 2
+                    ? kPaddingWidth * 2
                     : kActionLeftPadding + kActionRightPadding;
   return ArrowSize().width() + padding;
 }
diff --git a/ui/views/controls/focusable_border.cc b/ui/views/controls/focusable_border.cc
index 3b60677..800736a 100644
--- a/ui/views/controls/focusable_border.cc
+++ b/ui/views/controls/focusable_border.cc
@@ -6,7 +6,6 @@
 
 #include "cc/paint/paint_flags.h"
 #include "third_party/skia/include/core/SkPath.h"
-#include "ui/base/material_design/material_design_controller.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/color_utils.h"
@@ -43,10 +42,7 @@
   gfx::ScopedCanvas scoped(canvas);
   float dsf = canvas->UndoDeviceScaleFactor();
 
-  const int stroke_width_px =
-      ui::MaterialDesignController::IsSecondaryUiMaterial()
-          ? 1
-          : gfx::ToFlooredInt(dsf);
+  const int stroke_width_px = 1;
   flags.setStrokeWidth(SkIntToScalar(stroke_width_px));
 
   // Scale the rect and snap to pixel boundaries.
@@ -54,14 +50,10 @@
   rect.Inset(gfx::InsetsF(stroke_width_px / 2.0f));
 
   SkPath path;
-  if (ui::MaterialDesignController::IsSecondaryUiMaterial()) {
     flags.setAntiAlias(true);
     float corner_radius_px = kCornerRadiusDp * dsf;
     path.addRoundRect(gfx::RectFToSkRect(rect), corner_radius_px,
                       corner_radius_px);
-  } else {
-    path.addRect(gfx::RectFToSkRect(rect), SkPath::kCW_Direction);
-  }
 
   canvas->DrawPath(path, flags);
 }
@@ -85,18 +77,11 @@
 SkColor FocusableBorder::GetCurrentColor(const View& view) const {
   ui::NativeTheme::ColorId color_id =
       ui::NativeTheme::kColorId_UnfocusedBorderColor;
-  if (override_color_id_) {
+  if (override_color_id_)
     color_id = *override_color_id_;
-  } else if (view.HasFocus() &&
-             !ui::MaterialDesignController::IsSecondaryUiMaterial()) {
-    // Note with --secondary-ui-md there is a FocusRing indicator, so the border
-    // retains its unfocused color.
-    color_id = ui::NativeTheme::kColorId_FocusedBorderColor;
-  }
 
   SkColor color = view.GetNativeTheme()->GetSystemColor(color_id);
-  if (ui::MaterialDesignController::IsSecondaryUiMaterial() &&
-      !view.enabled()) {
+  if (!view.enabled()) {
     return color_utils::BlendTowardOppositeLuma(color,
                                                 gfx::kDisabledControlAlpha);
   }
diff --git a/ui/views/controls/menu/menu_config_mac.mm b/ui/views/controls/menu/menu_config_mac.mm
index 9093926..75768342 100644
--- a/ui/views/controls/menu/menu_config_mac.mm
+++ b/ui/views/controls/menu/menu_config_mac.mm
@@ -7,7 +7,6 @@
 #import <AppKit/AppKit.h>
 
 #include "base/mac/mac_util.h"
-#include "ui/base/material_design/material_design_controller.h"
 
 namespace {
 
@@ -46,8 +45,7 @@
   arrow_key_selection_wraps = false;
   use_mnemonics = false;
   show_context_menu_accelerators = false;
-  if (ui::MaterialDesignController::IsSecondaryUiMaterial())
-    InitMaterialMenuConfig(this);
+  InitMaterialMenuConfig(this);
 }
 
 }  // namespace views
diff --git a/ui/views/controls/scroll_view.cc b/ui/views/controls/scroll_view.cc
index e58ef7d..9f7028a 100644
--- a/ui/views/controls/scroll_view.cc
+++ b/ui/views/controls/scroll_view.cc
@@ -7,7 +7,6 @@
 #include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/compositor/overscroll/scroll_input_handler.h"
 #include "ui/events/event.h"
@@ -215,13 +214,11 @@
   }
   UpdateBackground();
 
-  if (ui::MaterialDesignController::IsSecondaryUiMaterial()) {
-    focus_ring_ = FocusRing::Install(this);
-    focus_ring_->SetHasFocusPredicate([](View* view) -> bool {
-      auto* v = static_cast<ScrollView*>(view);
-      return v->draw_focus_indicator_;
-    });
-  }
+  focus_ring_ = FocusRing::Install(this);
+  focus_ring_->SetHasFocusPredicate([](View* view) -> bool {
+    auto* v = static_cast<ScrollView*>(view);
+    return v->draw_focus_indicator_;
+  });
 }
 
 ScrollView::~ScrollView() {
@@ -335,10 +332,7 @@
     return;
   draw_focus_indicator_ = has_focus_indicator;
 
-  if (ui::MaterialDesignController::IsSecondaryUiMaterial())
     focus_ring_->SchedulePaint();
-  else
-    UpdateBorder();
   SchedulePaint();
 }
 
diff --git a/ui/views/controls/tabbed_pane/tabbed_pane.cc b/ui/views/controls/tabbed_pane/tabbed_pane.cc
index 4cd621b..04e572c2 100644
--- a/ui/views/controls/tabbed_pane/tabbed_pane.cc
+++ b/ui/views/controls/tabbed_pane/tabbed_pane.cc
@@ -12,7 +12,6 @@
 #include "ui/accessibility/ax_action_data.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/default_style.h"
-#include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/events/keycodes/keyboard_codes.h"
 #include "ui/gfx/animation/animation_delegate.h"
@@ -667,9 +666,7 @@
     : listener_(NULL), contents_(new View()) {
   DCHECK(orientation != TabbedPane::Orientation::kHorizontal ||
          style != TabbedPane::TabStripStyle::kHighlight);
-  tab_strip_ = ui::MaterialDesignController::IsSecondaryUiMaterial()
-                   ? new MdTabStrip(orientation, style)
-                   : new TabStrip(orientation, style);
+  tab_strip_ = new MdTabStrip(orientation, style);
   AddChildView(tab_strip_);
   AddChildView(contents_);
 }
@@ -695,11 +692,7 @@
   DCHECK(index >= 0 && index <= GetTabCount());
   contents->SetVisible(false);
 
-  tab_strip_->AddChildViewAt(
-      ui::MaterialDesignController::IsSecondaryUiMaterial()
-          ? new MdTab(this, title, contents)
-          : new Tab(this, title, contents),
-      index);
+  tab_strip_->AddChildViewAt(new MdTab(this, title, contents), index);
   contents_->AddChildViewAt(contents, index);
   if (!GetSelectedTab())
     SelectTabAt(index);
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc
index c9a96b4..35359d1b 100644
--- a/ui/views/controls/textfield/textfield.cc
+++ b/ui/views/controls/textfield/textfield.cc
@@ -21,7 +21,6 @@
 #include "ui/base/dragdrop/drag_drop_types.h"
 #include "ui/base/ime/input_method.h"
 #include "ui/base/ime/text_edit_commands.h"
-#include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/base/ui_base_switches_util.h"
@@ -93,9 +92,6 @@
     gfx::SELECTION_RETAIN;
 #endif
 
-// Default placeholder text color.
-const SkColor kDefaultPlaceholderTextColor = SK_ColorLTGRAY;
-
 // Get the default command for a given key |event|.
 ui::TextEditCommand GetCommandForKeyEvent(const ui::KeyEvent& event) {
   if (event.type() != ui::ET_KEY_PRESSED || event.IsUnicodeKeyCode())
@@ -279,7 +275,7 @@
       selection_controller_(this),
       drag_start_display_offset_(0),
       touch_handles_hidden_due_to_scroll_(false),
-      use_focus_ring_(ui::MaterialDesignController::IsSecondaryUiMaterial()),
+      use_focus_ring_(true),
       weak_ptr_factory_(this) {
   set_context_menu_controller(this);
   set_drag_controller(this);
@@ -2083,13 +2079,9 @@
 
 void Textfield::UpdateBackgroundColor() {
   const SkColor color = GetBackgroundColor();
-  if (ui::MaterialDesignController::IsSecondaryUiMaterial()) {
     SetBackground(
         CreateBackgroundFromPainter(Painter::CreateSolidRoundRectPainter(
             color, FocusableBorder::kCornerRadiusDp)));
-  } else {
-    SetBackground(CreateSolidBackground(color));
-  }
   // Disable subpixel rendering when the background color is not opaque because
   // it draws incorrect colors around the glyphs in that case.
   // See crbug.com/115198
@@ -2165,10 +2157,7 @@
         GetPlaceholderText(),
         placeholder_font_list_.has_value() ? placeholder_font_list_.value()
                                            : GetFontList(),
-        placeholder_text_color_.value_or(
-            ui::MaterialDesignController::IsSecondaryUiMaterial()
-                ? SkColorSetA(GetTextColor(), 0x83)
-                : kDefaultPlaceholderTextColor),
+        placeholder_text_color_.value_or(SkColorSetA(GetTextColor(), 0x83)),
         render_text->display_rect(), placeholder_text_draw_flags);
   }
 
diff --git a/ui/views/examples/bubble_example.cc b/ui/views/examples/bubble_example.cc
index 026a1032..3437ab2 100644
--- a/ui/views/examples/bubble_example.cc
+++ b/ui/views/examples/bubble_example.cc
@@ -89,8 +89,6 @@
   container->AddChildView(small_shadow_);
   no_assets_ = new LabelButton(this, ASCIIToUTF16("No Assets"));
   container->AddChildView(no_assets_);
-  align_to_edge_ = new LabelButton(this, ASCIIToUTF16("Align To Edge"));
-  container->AddChildView(align_to_edge_);
   persistent_ = new LabelButton(this, ASCIIToUTF16("Persistent"));
   container->AddChildView(persistent_);
 }
@@ -123,8 +121,6 @@
     bubble->set_close_on_deactivate(false);
 
   BubbleDialogDelegateView::CreateBubble(bubble);
-  if (sender == align_to_edge_)
-    bubble->SetAlignment(BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE);
 
   bubble->GetWidget()->Show();
 }
diff --git a/ui/views/examples/bubble_example.h b/ui/views/examples/bubble_example.h
index 91e514d..6d5717f 100644
--- a/ui/views/examples/bubble_example.h
+++ b/ui/views/examples/bubble_example.h
@@ -31,7 +31,6 @@
   Button* big_shadow_;
   Button* small_shadow_;
   Button* no_assets_;
-  Button* align_to_edge_;
   Button* persistent_;
 
   DISALLOW_COPY_AND_ASSIGN(BubbleExample);
diff --git a/ui/views/examples/button_sticker_sheet.cc b/ui/views/examples/button_sticker_sheet.cc
index f1d0099e..1de3940d1 100644
--- a/ui/views/examples/button_sticker_sheet.cc
+++ b/ui/views/examples/button_sticker_sheet.cc
@@ -5,7 +5,6 @@
 #include "ui/views/examples/button_sticker_sheet.h"
 
 #include "base/strings/utf_string_conversions.h"
-#include "ui/base/material_design/material_design_controller.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/controls/button/md_text_button.h"
 #include "ui/views/layout/grid_layout.h"
@@ -91,13 +90,6 @@
 void ButtonStickerSheet::CreateExampleView(View* container) {
   GridLayout* layout = MakeStretchyGridLayout(container, 3);
 
-  if (!ui::MaterialDesignController::IsSecondaryUiMaterial()) {
-    const char* kNeedsMdWarning =
-        "This will look wrong without --secondary-ui-md.";
-    layout->StartRow(0, 0);
-    layout->AddView(MakePlainLabel(kNeedsMdWarning), 3, 1);
-  }
-
   // The title row has an empty row label.
   AddLabelledRowToGridLayout(
       layout, std::string(),
diff --git a/ui/views/focus/focus_manager_unittest.cc b/ui/views/focus/focus_manager_unittest.cc
index f87b8c4f..5e7c7a6 100644
--- a/ui/views/focus/focus_manager_unittest.cc
+++ b/ui/views/focus/focus_manager_unittest.cc
@@ -69,7 +69,7 @@
 
 // Tests that the appropriate Focus related methods are called when a View
 // gets/loses focus.
-TEST_F(FocusManagerTest, DISABLED_ViewFocusCallbacks) {
+TEST_F(FocusManagerTest, ViewFocusCallbacks) {
   std::vector<FocusTestEvent> event_list;
   const int kView1ID = 1;
   const int kView2ID = 2;
diff --git a/ui/views/layout/layout_provider.cc b/ui/views/layout/layout_provider.cc
index caba8a52..310d695 100644
--- a/ui/views/layout/layout_provider.cc
+++ b/ui/views/layout/layout_provider.cc
@@ -166,8 +166,9 @@
   return 3;
 }
 
-gfx::ShadowValues LayoutProvider::MakeShadowValues(int elevation) const {
-  return gfx::ShadowValue::MakeMdShadowValues(elevation);
+gfx::ShadowValues LayoutProvider::MakeShadowValues(int elevation,
+                                                   SkColor color) const {
+  return gfx::ShadowValue::MakeMdShadowValues(elevation, color);
 }
 
 }  // namespace views
diff --git a/ui/views/layout/layout_provider.h b/ui/views/layout/layout_provider.h
index cf92ab71..c7f1946 100644
--- a/ui/views/layout/layout_provider.h
+++ b/ui/views/layout/layout_provider.h
@@ -175,7 +175,8 @@
 
   // Creates shadows for the given elevation. Use GetShadowElevationMetric for
   // the appropriate elevation.
-  virtual gfx::ShadowValues MakeShadowValues(int elevation) const;
+  virtual gfx::ShadowValues MakeShadowValues(int elevation,
+                                             SkColor color) const;
 
  private:
   DefaultTypographyProvider typography_provider_;
diff --git a/ui/views/resources/default_100_percent/bubble_bottom.png b/ui/views/resources/default_100_percent/bubble_bottom.png
deleted file mode 100644
index 03dde937..0000000
--- a/ui/views/resources/default_100_percent/bubble_bottom.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/bubble_bottom_left.png b/ui/views/resources/default_100_percent/bubble_bottom_left.png
deleted file mode 100644
index 2e6b248..0000000
--- a/ui/views/resources/default_100_percent/bubble_bottom_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/bubble_bottom_right.png b/ui/views/resources/default_100_percent/bubble_bottom_right.png
deleted file mode 100644
index 286449e..0000000
--- a/ui/views/resources/default_100_percent/bubble_bottom_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/bubble_left.png b/ui/views/resources/default_100_percent/bubble_left.png
deleted file mode 100644
index 341df39..0000000
--- a/ui/views/resources/default_100_percent/bubble_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/bubble_pointer_bottom.png b/ui/views/resources/default_100_percent/bubble_pointer_bottom.png
deleted file mode 100644
index 4744fed..0000000
--- a/ui/views/resources/default_100_percent/bubble_pointer_bottom.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/bubble_pointer_left.png b/ui/views/resources/default_100_percent/bubble_pointer_left.png
deleted file mode 100644
index 60695bd5..0000000
--- a/ui/views/resources/default_100_percent/bubble_pointer_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/bubble_pointer_right.png b/ui/views/resources/default_100_percent/bubble_pointer_right.png
deleted file mode 100644
index fd636c5c..0000000
--- a/ui/views/resources/default_100_percent/bubble_pointer_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/bubble_pointer_top.png b/ui/views/resources/default_100_percent/bubble_pointer_top.png
deleted file mode 100644
index 1f66b21..0000000
--- a/ui/views/resources/default_100_percent/bubble_pointer_top.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/bubble_right.png b/ui/views/resources/default_100_percent/bubble_right.png
deleted file mode 100644
index 1323a1cd..0000000
--- a/ui/views/resources/default_100_percent/bubble_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/bubble_top.png b/ui/views/resources/default_100_percent/bubble_top.png
deleted file mode 100644
index 50b6817..0000000
--- a/ui/views/resources/default_100_percent/bubble_top.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/bubble_top_left.png b/ui/views/resources/default_100_percent/bubble_top_left.png
deleted file mode 100644
index 60a2c98..0000000
--- a/ui/views/resources/default_100_percent/bubble_top_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/bubble_top_right.png b/ui/views/resources/default_100_percent/bubble_top_right.png
deleted file mode 100644
index 3821309..0000000
--- a/ui/views/resources/default_100_percent/bubble_top_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_bottom.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_bottom.png
deleted file mode 100644
index e57800c9..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_bottom.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_bottom_left.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_bottom_left.png
deleted file mode 100644
index 0a51f9a..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_bottom_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_bottom_right.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_bottom_right.png
deleted file mode 100644
index 428b379..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_bottom_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_left.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_left.png
deleted file mode 100644
index 4c3d9b4a..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_right.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_right.png
deleted file mode 100644
index 670b818..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_top.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_top.png
deleted file mode 100644
index 059af22c..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_top.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_top_left.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_top_left.png
deleted file mode 100644
index 43ac459..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_top_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_top_right.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_top_right.png
deleted file mode 100644
index 8198a7d..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_big_top_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_bottom.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_bottom.png
deleted file mode 100644
index 6f5735ed..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_bottom.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_bottom_left.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_bottom_left.png
deleted file mode 100644
index fbef5a8..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_bottom_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_bottom_right.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_bottom_right.png
deleted file mode 100644
index 1949fa4a..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_bottom_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_left.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_left.png
deleted file mode 100644
index 7a77ed6..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_right.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_right.png
deleted file mode 100644
index 4f5a851..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_top.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_top.png
deleted file mode 100644
index 4ae2fb0..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_top.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_top_left.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_top_left.png
deleted file mode 100644
index 27933e9d..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_top_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_top_right.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_top_right.png
deleted file mode 100644
index 99d417c..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_small_top_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_big_bottom.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_big_bottom.png
deleted file mode 100644
index 3fff849..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_big_bottom.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_big_left.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_big_left.png
deleted file mode 100644
index 3fdd27ee..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_big_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_big_right.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_big_right.png
deleted file mode 100644
index 454ec34..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_big_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_big_top.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_big_top.png
deleted file mode 100644
index 4c3e68b..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_big_top.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_small_bottom.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_small_bottom.png
deleted file mode 100644
index 6a67514..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_small_bottom.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_small_left.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_small_left.png
deleted file mode 100644
index 0ba6a51..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_small_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_small_right.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_small_right.png
deleted file mode 100644
index d5cf151..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_small_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_small_top.png b/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_small_top.png
deleted file mode 100644
index 2c1a022..0000000
--- a/ui/views/resources/default_100_percent/common/window_bubble_shadow_spike_small_top.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/bubble_bottom.png b/ui/views/resources/default_200_percent/bubble_bottom.png
deleted file mode 100644
index e89a681..0000000
--- a/ui/views/resources/default_200_percent/bubble_bottom.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/bubble_bottom_left.png b/ui/views/resources/default_200_percent/bubble_bottom_left.png
deleted file mode 100644
index 207f7af3..0000000
--- a/ui/views/resources/default_200_percent/bubble_bottom_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/bubble_bottom_right.png b/ui/views/resources/default_200_percent/bubble_bottom_right.png
deleted file mode 100644
index d955a43..0000000
--- a/ui/views/resources/default_200_percent/bubble_bottom_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/bubble_left.png b/ui/views/resources/default_200_percent/bubble_left.png
deleted file mode 100644
index 69844562..0000000
--- a/ui/views/resources/default_200_percent/bubble_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/bubble_pointer_bottom.png b/ui/views/resources/default_200_percent/bubble_pointer_bottom.png
deleted file mode 100644
index e2ef165..0000000
--- a/ui/views/resources/default_200_percent/bubble_pointer_bottom.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/bubble_pointer_left.png b/ui/views/resources/default_200_percent/bubble_pointer_left.png
deleted file mode 100644
index 94f49fb..0000000
--- a/ui/views/resources/default_200_percent/bubble_pointer_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/bubble_pointer_right.png b/ui/views/resources/default_200_percent/bubble_pointer_right.png
deleted file mode 100644
index b72e34c3..0000000
--- a/ui/views/resources/default_200_percent/bubble_pointer_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/bubble_pointer_top.png b/ui/views/resources/default_200_percent/bubble_pointer_top.png
deleted file mode 100644
index 59714dab..0000000
--- a/ui/views/resources/default_200_percent/bubble_pointer_top.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/bubble_right.png b/ui/views/resources/default_200_percent/bubble_right.png
deleted file mode 100644
index d82631a..0000000
--- a/ui/views/resources/default_200_percent/bubble_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/bubble_top.png b/ui/views/resources/default_200_percent/bubble_top.png
deleted file mode 100644
index 004f5655..0000000
--- a/ui/views/resources/default_200_percent/bubble_top.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/bubble_top_left.png b/ui/views/resources/default_200_percent/bubble_top_left.png
deleted file mode 100644
index bd25b50e..0000000
--- a/ui/views/resources/default_200_percent/bubble_top_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/bubble_top_right.png b/ui/views/resources/default_200_percent/bubble_top_right.png
deleted file mode 100644
index f5feea6a..0000000
--- a/ui/views/resources/default_200_percent/bubble_top_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_bottom.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_bottom.png
deleted file mode 100644
index bc8b195..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_bottom.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_bottom_left.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_bottom_left.png
deleted file mode 100644
index f7bef138..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_bottom_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_bottom_right.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_bottom_right.png
deleted file mode 100644
index c5b1fc2e..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_bottom_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_left.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_left.png
deleted file mode 100644
index 4a4ce5f..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_right.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_right.png
deleted file mode 100644
index 8a502c8..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_top.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_top.png
deleted file mode 100644
index 9a85702f..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_top.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_top_left.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_top_left.png
deleted file mode 100644
index 9046e454..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_top_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_top_right.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_top_right.png
deleted file mode 100644
index 82e788dd..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_big_top_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_bottom.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_bottom.png
deleted file mode 100644
index 5239c46..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_bottom.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_bottom_left.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_bottom_left.png
deleted file mode 100644
index e958b6ff..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_bottom_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_bottom_right.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_bottom_right.png
deleted file mode 100644
index 2150446..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_bottom_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_left.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_left.png
deleted file mode 100644
index 30d93bd..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_right.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_right.png
deleted file mode 100644
index 35999b1..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_top.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_top.png
deleted file mode 100644
index 022e48f..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_top.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_top_left.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_top_left.png
deleted file mode 100644
index 9a8823f..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_top_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_top_right.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_top_right.png
deleted file mode 100644
index fb1d21b..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_small_top_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_big_bottom.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_big_bottom.png
deleted file mode 100644
index 93461aa..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_big_bottom.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_big_left.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_big_left.png
deleted file mode 100644
index 286bcb9..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_big_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_big_right.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_big_right.png
deleted file mode 100644
index ed64369..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_big_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_big_top.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_big_top.png
deleted file mode 100644
index 7048347..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_big_top.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_small_bottom.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_small_bottom.png
deleted file mode 100644
index e100884..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_small_bottom.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_small_left.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_small_left.png
deleted file mode 100644
index f187da4..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_small_left.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_small_right.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_small_right.png
deleted file mode 100644
index 4bda3e6..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_small_right.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_small_top.png b/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_small_top.png
deleted file mode 100644
index ad5fa49..0000000
--- a/ui/views/resources/default_200_percent/common/window_bubble_shadow_spike_small_top.png
+++ /dev/null
Binary files differ
diff --git a/ui/views/resources/views_resources.grd b/ui/views/resources/views_resources.grd
index 112662e..9b6b9964 100644
--- a/ui/views/resources/views_resources.grd
+++ b/ui/views/resources/views_resources.grd
@@ -15,18 +15,6 @@
       <structure type="chrome_scaled_image" name="IDR_APP_TOP_CENTER" file="app_top_center.png" />
       <structure type="chrome_scaled_image" name="IDR_APP_TOP_LEFT" file="app_top_left.png" />
       <structure type="chrome_scaled_image" name="IDR_APP_TOP_RIGHT" file="app_top_right.png" />
-      <structure type="chrome_scaled_image" name="IDR_BUBBLE_B" file="bubble_bottom.png" />
-      <structure type="chrome_scaled_image" name="IDR_BUBBLE_BL" file="bubble_bottom_left.png" />
-      <structure type="chrome_scaled_image" name="IDR_BUBBLE_BR" file="bubble_bottom_right.png" />
-      <structure type="chrome_scaled_image" name="IDR_BUBBLE_B_ARROW" file="bubble_pointer_bottom.png" />
-      <structure type="chrome_scaled_image" name="IDR_BUBBLE_L" file="bubble_left.png" />
-      <structure type="chrome_scaled_image" name="IDR_BUBBLE_L_ARROW" file="bubble_pointer_left.png" />
-      <structure type="chrome_scaled_image" name="IDR_BUBBLE_R" file="bubble_right.png" />
-      <structure type="chrome_scaled_image" name="IDR_BUBBLE_R_ARROW" file="bubble_pointer_right.png" />
-      <structure type="chrome_scaled_image" name="IDR_BUBBLE_T" file="bubble_top.png" />
-      <structure type="chrome_scaled_image" name="IDR_BUBBLE_TL" file="bubble_top_left.png" />
-      <structure type="chrome_scaled_image" name="IDR_BUBBLE_TR" file="bubble_top_right.png" />
-      <structure type="chrome_scaled_image" name="IDR_BUBBLE_T_ARROW" file="bubble_pointer_top.png" />
       <structure type="chrome_scaled_image" name="IDR_BUTTON_DISABLED" file="common/button_inactive.png" />
       <structure type="chrome_scaled_image" name="IDR_BUTTON_FOCUSED_HOVER" file="common/button_focused_hover.png" />
       <structure type="chrome_scaled_image" name="IDR_BUTTON_FOCUSED_NORMAL" file="common/button_focused.png" />
@@ -216,30 +204,6 @@
       <structure type="chrome_scaled_image" name="IDR_WINDOW_TOP_CENTER" file="common/window_top_center.png" />
       <structure type="chrome_scaled_image" name="IDR_WINDOW_TOP_LEFT_CORNER" file="common/window_top_left_corner.png" />
       <structure type="chrome_scaled_image" name="IDR_WINDOW_TOP_RIGHT_CORNER" file="common/window_top_right_corner.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_BIG_BOTTOM" file="common/window_bubble_shadow_big_bottom.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_BIG_BOTTOM_LEFT" file="common/window_bubble_shadow_big_bottom_left.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_BIG_BOTTOM_RIGHT" file="common/window_bubble_shadow_big_bottom_right.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_BIG_LEFT" file="common/window_bubble_shadow_big_left.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_BIG_RIGHT" file="common/window_bubble_shadow_big_right.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_BIG_TOP" file="common/window_bubble_shadow_big_top.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_BIG_TOP_LEFT" file="common/window_bubble_shadow_big_top_left.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_BIG_TOP_RIGHT" file="common/window_bubble_shadow_big_top_right.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SPIKE_BIG_BOTTOM" file="common/window_bubble_shadow_spike_big_bottom.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SPIKE_BIG_LEFT" file="common/window_bubble_shadow_spike_big_left.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SPIKE_BIG_RIGHT" file="common/window_bubble_shadow_spike_big_right.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SPIKE_BIG_TOP" file="common/window_bubble_shadow_spike_big_top.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SMALL_BOTTOM" file="common/window_bubble_shadow_small_bottom.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SMALL_BOTTOM_LEFT" file="common/window_bubble_shadow_small_bottom_left.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SMALL_BOTTOM_RIGHT" file="common/window_bubble_shadow_small_bottom_right.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SMALL_LEFT" file="common/window_bubble_shadow_small_left.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SMALL_RIGHT" file="common/window_bubble_shadow_small_right.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SMALL_TOP" file="common/window_bubble_shadow_small_top.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SMALL_TOP_LEFT" file="common/window_bubble_shadow_small_top_left.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SMALL_TOP_RIGHT" file="common/window_bubble_shadow_small_top_right.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SPIKE_SMALL_BOTTOM" file="common/window_bubble_shadow_spike_small_bottom.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SPIKE_SMALL_LEFT" file="common/window_bubble_shadow_spike_small_left.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SPIKE_SMALL_RIGHT" file="common/window_bubble_shadow_spike_small_right.png" />
-      <structure type="chrome_scaled_image" name="IDR_WINDOW_BUBBLE_SHADOW_SPIKE_SMALL_TOP" file="common/window_bubble_shadow_spike_small_top.png" />
     </structures>
   </release>
 </grit>
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
index 1b3e081..8879221 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
@@ -186,7 +186,7 @@
 
 void DesktopWindowTreeHostPlatform::ShowMaximizedWithBounds(
     const gfx::Rect& restored_bounds) {
-  // TODO: support |restored_bounds|.
+  platform_window()->SetRestoredBoundsInPixels(ToPixelRect(restored_bounds));
   ShowWindowWithState(ui::SHOW_STATE_MAXIMIZED);
 }
 
@@ -255,8 +255,12 @@
 }
 
 gfx::Rect DesktopWindowTreeHostPlatform::GetRestoredBounds() const {
-  NOTIMPLEMENTED_LOG_ONCE();
-  return gfx::Rect(0, 0, 640, 840);
+  gfx::Rect restored_bounds = platform_window()->GetRestoredBoundsInPixels();
+  // When window is resized, |restored bounds| is not set and empty.
+  // If |restored bounds| is empty, it returns the current window size.
+  gfx::Rect bounds =
+      !restored_bounds.IsEmpty() ? restored_bounds : GetBoundsInPixels();
+  return ToDIPRect(bounds);
 }
 
 std::string DesktopWindowTreeHostPlatform::GetWorkspace() const {
@@ -493,6 +497,20 @@
   return native_widget_delegate_->AsWidget();
 }
 
+gfx::Rect DesktopWindowTreeHostPlatform::ToDIPRect(
+    const gfx::Rect& rect_in_pixels) const {
+  gfx::RectF rect_in_dip = gfx::RectF(rect_in_pixels);
+  GetRootTransform().TransformRectReverse(&rect_in_dip);
+  return gfx::ToEnclosingRect(rect_in_dip);
+}
+
+gfx::Rect DesktopWindowTreeHostPlatform::ToPixelRect(
+    const gfx::Rect& rect_in_dip) const {
+  gfx::RectF rect_in_pixels = gfx::RectF(rect_in_dip);
+  GetRootTransform().TransformRect(&rect_in_pixels);
+  return gfx::ToEnclosingRect(rect_in_pixels);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // DesktopWindowTreeHost:
 
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h
index 44f8c0c1..7e28ac1 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h
@@ -100,6 +100,9 @@
 
   Widget* GetWidget();
 
+  gfx::Rect ToDIPRect(const gfx::Rect& rect_in_pixels) const;
+  gfx::Rect ToPixelRect(const gfx::Rect& rect_in_dip) const;
+
   internal::NativeWidgetDelegate* const native_widget_delegate_;
   DesktopNativeWidgetAura* const desktop_native_widget_aura_;
 
diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc
index 5f763f7..0decc40 100644
--- a/ui/views/widget/native_widget_aura.cc
+++ b/ui/views/widget/native_widget_aura.cc
@@ -673,6 +673,16 @@
     window_->layer()->SetOpacity(opacity);
 }
 
+void NativeWidgetAura::SetAspectRatio(const gfx::SizeF& aspect_ratio) {
+  DCHECK(!aspect_ratio.IsEmpty());
+  if (window_) {
+    // aura::client::kAspectRatio is owned, which allows for passing in this
+    // raw pointer.
+    window_->SetProperty(aura::client::kAspectRatio,
+                         new gfx::SizeF(aspect_ratio));
+  }
+}
+
 void NativeWidgetAura::FlashFrame(bool flash) {
   if (window_)
     window_->SetProperty(aura::client::kDrawAttentionKey, flash);
diff --git a/ui/views/widget/native_widget_aura.h b/ui/views/widget/native_widget_aura.h
index 50ad2cac4..64617ed 100644
--- a/ui/views/widget/native_widget_aura.h
+++ b/ui/views/widget/native_widget_aura.h
@@ -125,7 +125,7 @@
   void SetFullscreen(bool fullscreen) override;
   bool IsFullscreen() const override;
   void SetOpacity(float opacity) override;
-  void SetAspectRatio(const gfx::SizeF& aspect_ratio) override {}
+  void SetAspectRatio(const gfx::SizeF& aspect_ratio) override;
   void FlashFrame(bool flash_frame) override;
   void RunShellDrag(View* view,
                     const ui::OSExchangeData& data,
diff --git a/ui/views/widget/native_widget_mac.h b/ui/views/widget/native_widget_mac.h
index 6b2fed7..60d8364 100644
--- a/ui/views/widget/native_widget_mac.h
+++ b/ui/views/widget/native_widget_mac.h
@@ -155,6 +155,9 @@
 
   internal::NativeWidgetDelegate* delegate() { return delegate_; }
   BridgedNativeWidget* bridge() const;
+  BridgedNativeWidgetHostImpl* bridge_host_for_testing() const {
+    return bridge_host_.get();
+  }
 
  private:
   friend class test::MockNativeWidgetMac;
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm
index a8bd55b..3def277 100644
--- a/ui/views/widget/native_widget_mac.mm
+++ b/ui/views/widget/native_widget_mac.mm
@@ -141,7 +141,7 @@
   delegate_->OnNativeWidgetCreated(true);
 
   DCHECK(GetWidget()->GetRootView());
-  bridge()->SetRootView(GetWidget()->GetRootView());
+  bridge_host_->SetRootView(GetWidget()->GetRootView());
   if (auto* focus_manager = GetWidget()->GetFocusManager()) {
     [window makeFirstResponder:bridge()->ns_view()];
     bridge()->SetFocusManager(focus_manager);
@@ -399,7 +399,7 @@
   }
 
   // Clear the view early to suppress repaints.
-  bridge()->SetRootView(nullptr);
+  bridge_host_->SetRootView(nullptr);
 
   // Widget::Close() ensures [Non]ClientView::CanClose() returns true, so there
   // is no need to call the NSWindow or its delegate's -windowShouldClose:
diff --git a/ui/views/window/dialog_delegate_unittest.cc b/ui/views/window/dialog_delegate_unittest.cc
index bb2b8d5..5fd4c862 100644
--- a/ui/views/window/dialog_delegate_unittest.cc
+++ b/ui/views/window/dialog_delegate_unittest.cc
@@ -214,25 +214,23 @@
   // Ensure that BubbleFrameView hit-tests as expected when the title is hidden.
   const NonClientView* view = dialog()->GetWidget()->non_client_view();
   BubbleFrameView* frame = static_cast<BubbleFrameView*>(view->frame_view());
-  const int border = frame->bubble_border()->GetBorderThickness();
 
   struct {
     const int point;
     const int hit;
   } cases[] = {
-      {border, HTSYSMENU},
-      {border + 10, HTSYSMENU},
-      {border + 20, HTNOWHERE},
-      {border + 50, HTCLIENT /* Space is reserved for the close button. */},
-      {border + 60, HTCLIENT},
+      {0, HTSYSMENU},
+      {10, HTSYSMENU},
+      {20, HTNOWHERE},
+      {50, HTCLIENT /* Space is reserved for the close button. */},
+      {60, HTCLIENT},
       {1000, HTNOWHERE},
   };
 
   for (size_t i = 0; i < arraysize(cases); ++i) {
     gfx::Point point(cases[i].point, cases[i].point);
     EXPECT_EQ(cases[i].hit, frame->NonClientHitTest(point))
-        << " case " << i << " with border: " << border << ", at point "
-        << cases[i].point;
+        << " case " << i << " at point " << cases[i].point;
   }
 }
 
@@ -243,22 +241,19 @@
 
   const NonClientView* view = dialog()->GetWidget()->non_client_view();
   BubbleFrameView* frame = static_cast<BubbleFrameView*>(view->frame_view());
-  const int border = frame->bubble_border()->GetBorderThickness();
 
   struct {
     const int point;
     const int hit;
   } cases[] = {
-      {border, HTSYSMENU},     {border + 10, HTSYSMENU},
-      {border + 20, HTCLIENT}, {border + 50, HTCLIENT},
-      {border + 60, HTCLIENT}, {1000, HTNOWHERE},
+      {0, HTSYSMENU}, {10, HTSYSMENU}, {20, HTCLIENT},
+      {50, HTCLIENT}, {60, HTCLIENT},  {1000, HTNOWHERE},
   };
 
   for (size_t i = 0; i < arraysize(cases); ++i) {
     gfx::Point point(cases[i].point, cases[i].point);
     EXPECT_EQ(cases[i].hit, frame->NonClientHitTest(point))
-        << " case " << i << " with border: " << border << ", at point "
-        << cases[i].point;
+        << " case " << i << " at point " << cases[i].point;
   }
 }
 
@@ -268,24 +263,19 @@
   dialog()->set_title(base::ASCIIToUTF16("Title"));
   dialog()->GetWidget()->UpdateWindowTitle();
   BubbleFrameView* frame = static_cast<BubbleFrameView*>(view->frame_view());
-  const int border = frame->bubble_border()->GetBorderThickness();
 
   struct {
     const int point;
     const int hit;
   } cases[] = {
-    { border,      HTSYSMENU },
-    { border + 10, HTSYSMENU },
-    { border + 20, HTCAPTION },
-    { border + 50, HTCLIENT  },
-    { border + 60, HTCLIENT  },
-    { 1000,        HTNOWHERE },
+      {0, HTSYSMENU}, {10, HTSYSMENU}, {20, HTCAPTION},
+      {50, HTCLIENT}, {60, HTCLIENT},  {1000, HTNOWHERE},
   };
 
   for (size_t i = 0; i < arraysize(cases); ++i) {
     gfx::Point point(cases[i].point, cases[i].point);
     EXPECT_EQ(cases[i].hit, frame->NonClientHitTest(point))
-        << " with border: " << border << ", at point " << cases[i].point;
+        << " at point " << cases[i].point;
   }
 }
 
diff --git a/ui/webui/resources/cr_elements/chromeos/network/BUILD.gn b/ui/webui/resources/cr_elements/chromeos/network/BUILD.gn
index 5804c77..c70cdd8e 100644
--- a/ui/webui/resources/cr_elements/chromeos/network/BUILD.gn
+++ b/ui/webui/resources/cr_elements/chromeos/network/BUILD.gn
@@ -10,6 +10,7 @@
     ":cr_network_list",
     ":cr_network_list_item",
     ":cr_network_list_types",
+    ":cr_network_listener_behavior",
     ":cr_network_select",
     ":cr_onc_types",
   ]
@@ -45,6 +46,14 @@
   ]
 }
 
+js_library("cr_network_listener_behavior") {
+  deps = [
+    "//ui/webui/resources/js:assert",
+  ]
+  externs_list = [ "$externs_path/networking_private.js" ]
+  extra_sources = [ "$interfaces_path/networking_private_interface.js" ]
+}
+
 js_library("cr_network_select") {
   deps = [
     ":cr_network_list_types",
diff --git a/ui/webui/resources/cr_elements/chromeos/network/cr_network_listener_behavior.html b/ui/webui/resources/cr_elements/chromeos/network/cr_network_listener_behavior.html
new file mode 100644
index 0000000..6f8d242
--- /dev/null
+++ b/ui/webui/resources/cr_elements/chromeos/network/cr_network_listener_behavior.html
@@ -0,0 +1 @@
+<script src="cr_network_listener_behavior.js"></script>
diff --git a/chrome/browser/resources/settings/internet_page/network_listener_behavior.js b/ui/webui/resources/cr_elements/chromeos/network/cr_network_listener_behavior.js
similarity index 80%
rename from chrome/browser/resources/settings/internet_page/network_listener_behavior.js
rename to ui/webui/resources/cr_elements/chromeos/network/cr_network_listener_behavior.js
index 665cc540..026500d9 100644
--- a/chrome/browser/resources/settings/internet_page/network_listener_behavior.js
+++ b/ui/webui/resources/cr_elements/chromeos/network/cr_network_listener_behavior.js
@@ -8,7 +8,7 @@
  */
 
 /** @polymerBehavior */
-const NetworkListenerBehavior = {
+var CrNetworkListenerBehavior = {
   properties: {
     /**
      * Array of selectors specifying all children to alert of changes to the
@@ -63,9 +63,12 @@
    * @private
    */
   onNetworkListChanged_: function(networkIds) {
-    const event = new CustomEvent('network-list-changed', {detail: networkIds});
-    this.networkListChangeSubscriberSelectors_.forEach(
-        selector => this.maybeDispatchEvent_(selector, event));
+    var event = new CustomEvent('network-list-changed', {detail: networkIds});
+    for (var i = 0; i < this.networkListChangeSubscriberSelectors_.length;
+         i++) {
+      this.maybeDispatchEvent_(
+          this.networkListChangeSubscriberSelectors_[i], event);
+    }
   },
 
   /**
@@ -76,9 +79,11 @@
    * @private
    */
   onNetworksChanged_: function(networkIds) {
-    const event = new CustomEvent('networks-changed', {detail: networkIds});
-    this.networksChangeSubscriberSelectors_.forEach(
-        selector => this.maybeDispatchEvent_(selector, event));
+    var event = new CustomEvent('networks-changed', {detail: networkIds});
+    for (var i = 0; i < this.networksChangeSubscriberSelectors_.length; i++) {
+      this.maybeDispatchEvent_(
+          this.networksChangeSubscriberSelectors_[i], event);
+    }
   },
 
   /**
@@ -86,7 +91,7 @@
    * @private
    */
   maybeDispatchEvent_: function(selectors, event) {
-    const element = this.$$(selectors);
+    var element = this.$$(selectors);
     if (!element)
       return;
     element.dispatchEvent(event);
diff --git a/ui/webui/resources/cr_elements_resources.grdp b/ui/webui/resources/cr_elements_resources.grdp
index fd8e442..b4aea93 100644
--- a/ui/webui/resources/cr_elements_resources.grdp
+++ b/ui/webui/resources/cr_elements_resources.grdp
@@ -199,6 +199,14 @@
                file="cr_elements/chromeos/network/cr_network_list_types.js"
                type="chrome_html"
                compress="gzip" />
+    <structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_NETWORK_LISTENER_BEHAVIOR_HTML"
+               file="cr_elements/chromeos/network/cr_network_listener_behavior.html"
+               type="chrome_html"
+               compress="gzip" />
+    <structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_NETWORK_LISTENER_BEHAVIOR_JS"
+               file="cr_elements/chromeos/network/cr_network_listener_behavior.js"
+               type="chrome_html"
+               compress="gzip" />
     <structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_NETWORK_SELECT_HTML"
                file="cr_elements/chromeos/network/cr_network_select.html"
                type="chrome_html"