diff --git a/DEPS b/DEPS
index 69cfddf1..9b44a4e1 100644
--- a/DEPS
+++ b/DEPS
@@ -133,11 +133,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '93b94512391327fb74b07d162aac8f1f677375f4',
+  'skia_revision': '36f660818365bef3b62122b4469f2f2658b6a4b0',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': 'e51a5299c81b118cfb084568b1f5241af4d96c54',
+  'v8_revision': 'e1451a8b9471ee544df39b0d1621ee1d64c4113e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -145,11 +145,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '494afea985e678cbefb3de80a816f3f54762bea6',
+  'angle_revision': '37b996425a0e72b07a79fd8e86c288ba8021aa4a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '6480d4e10cb57f36baa2b03f8eb40b8d04f0e39f',
+  'swiftshader_revision': '4ef71eb81f5d2f313ee83b78ff5e6fc7d7c5a291',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -272,23 +272,23 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling clang format
   # and whatever else without interference from each other.
-  "clang_format_revision": "96636aa0e9f047f17447f2d45a094d0b59ed7917",
+  'clang_format_revision': '96636aa0e9f047f17447f2d45a094d0b59ed7917',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libc++
   # and whatever else without interference from each other.
-  "libcxx_revision": "a50f5035629b7621e92acef968403f71b7d48553",
+  'libcxx_revision': 'a50f5035629b7621e92acef968403f71b7d48553',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libc++abi
   # and whatever else without interference from each other.
-  "libcxxabi_revision": "0d529660e32d77d9111912d73f2c74fc5fa2a858",
+  'libcxxabi_revision': '0d529660e32d77d9111912d73f2c74fc5fa2a858',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libunwind
   # and whatever else without interference from each other.
-  "libunwind_revision": "69d9b84cca8354117b9fe9705a4430d789ee599b",
+  'libunwind_revision': '69d9b84cca8354117b9fe9705a4430d789ee599b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
-  "ios_webkit_revision": "59e9de61b7b36507836fa8b098e8839d7d995b13",
+  'ios_webkit_revision': '59e9de61b7b36507836fa8b098e8839d7d995b13',
 }
 
 # Only these hosts are allowed for dependencies in this DEPS file.
@@ -309,18 +309,18 @@
 ]
 
 deps = {
-  "src/buildtools/clang_format/script":
-    Var("chromium_git") + "/chromium/llvm-project/cfe/tools/clang-format.git@" +
-    Var("clang_format_revision"),
-  "src/buildtools/third_party/libc++/trunk":
-    Var("chromium_git") + "/chromium/llvm-project/libcxx.git" + "@" +
-    Var("libcxx_revision"),
-  "src/buildtools/third_party/libc++abi/trunk":
-    Var("chromium_git") + "/chromium/llvm-project/libcxxabi.git" + "@" +
-    Var("libcxxabi_revision"),
-  "src/buildtools/third_party/libunwind/trunk":
-    Var("chromium_git") + "/external/llvm.org/libunwind.git" + "@" +
-    Var("libunwind_revision"),
+  'src/buildtools/clang_format/script':
+    Var('chromium_git') + '/chromium/llvm-project/cfe/tools/clang-format.git@' +
+    Var('clang_format_revision'),
+  'src/buildtools/third_party/libc++/trunk':
+    Var('chromium_git') + '/chromium/llvm-project/libcxx.git' + '@' +
+    Var('libcxx_revision'),
+  'src/buildtools/third_party/libc++abi/trunk':
+    Var('chromium_git') + '/chromium/llvm-project/libcxxabi.git' + '@' +
+    Var('libcxxabi_revision'),
+  'src/buildtools/third_party/libunwind/trunk':
+    Var('chromium_git') + '/external/llvm.org/libunwind.git' + '@' +
+    Var('libunwind_revision'),
 
   'src/chrome/browser/resources/media_router/extension/src':
     Var('chromium_git') + '/media_router.git' + '@' + '29324b698ccd8920bc81c71d42dadc6310f0ad0f',
@@ -760,7 +760,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'ede69d84cfc7290b7f44a4bccb566c70f6839808',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '382116b42cac12e85fc79174a865eb39d71610c4',
       'condition': 'checkout_linux',
   },
 
@@ -785,7 +785,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'deb384f985d00de73ee29a65760b826f08a60983',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '40c19421b4ba13579d1d8cbfecc7cb610eca3269',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -1127,7 +1127,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  'c39f77fd46c268605e270228b24d2753d2c95f21',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '0e83ee6b9e88ea3282134c05fdcd56aa4e85d153',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78',
@@ -1339,7 +1339,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@a94bdfdb451cfc9d285f7c89c1e96c4fdb554338',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@611b8351677e0d62e2c625bda639006192b3b4ab',
     'condition': 'checkout_src_internal',
   },
 
@@ -2483,10 +2483,10 @@
     'condition': 'checkout_instrumented_libraries',
     'action': [ 'python',
                 'src/third_party/depot_tools/download_from_google_storage.py',
-                "--no_resume",
-                "--no_auth",
-                "--bucket", "chromium-instrumented-libraries",
-                "-s", "src/third_party/instrumented_libraries/binaries/msan-chained-origins-trusty.tgz.sha1",
+                '--no_resume',
+                '--no_auth',
+                '--bucket', 'chromium-instrumented-libraries',
+                '-s', 'src/third_party/instrumented_libraries/binaries/msan-chained-origins-trusty.tgz.sha1',
               ],
   },
   {
@@ -2495,22 +2495,22 @@
     'condition': 'checkout_instrumented_libraries',
     'action': [ 'python',
                 'src/third_party/depot_tools/download_from_google_storage.py',
-                "--no_resume",
-                "--no_auth",
-                "--bucket", "chromium-instrumented-libraries",
-                "-s", "src/third_party/instrumented_libraries/binaries/msan-no-origins-trusty.tgz.sha1",
+                '--no_resume',
+                '--no_auth',
+                '--bucket', 'chromium-instrumented-libraries',
+                '-s', 'src/third_party/instrumented_libraries/binaries/msan-no-origins-trusty.tgz.sha1',
               ],
   },
   {
-    "name": "wasm_fuzzer",
-    "pattern": ".",
+    'name': 'wasm_fuzzer',
+    'pattern': '.',
     'action': [ 'python',
                 'src/third_party/depot_tools/download_from_google_storage.py',
-                "--no_resume",
-                "--no_auth",
-                "-u",
-                "--bucket", "v8-wasm-fuzzer",
-                "-s", "src/v8/test/fuzzer/wasm_corpus.tar.gz.sha1",
+                '--no_resume',
+                '--no_auth',
+                '-u',
+                '--bucket', 'v8-wasm-fuzzer',
+                '-s', 'src/v8/test/fuzzer/wasm_corpus.tar.gz.sha1',
     ],
   },
 
@@ -2875,7 +2875,7 @@
 
 recursedeps = [
   # ANGLE manages DEPS that it also owns the build files for, such as dEQP.
-  "src/third_party/angle",
+  'src/third_party/angle',
   'src/third_party/openscreen/src',
   # src-internal has its own DEPS file to pull additional internal repos
   'src-internal',
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
index fbc58f4..964c20a 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
@@ -576,21 +576,17 @@
         }
     }
 
-    private String thirdPartyCookieForWebSocket(boolean acceptCookie) throws Throwable {
+    private String webSocketCookieHelper(
+            boolean shouldUseThirdPartyUrl, String cookieKey, String cookieValue) throws Throwable {
         TestWebServer webServer = TestWebServer.start();
         try {
-            // Turn global allow on.
-            mCookieManager.setAcceptCookie(true);
-            Assert.assertTrue(mCookieManager.acceptCookie());
-
-            // Sets the per-WebView value.
-            mAwContents.getSettings().setAcceptThirdPartyCookies(acceptCookie);
-            Assert.assertEquals(
-                    acceptCookie, mAwContents.getSettings().getAcceptThirdPartyCookies());
-
-            // |cookieUrl| is a third-party url that sets a cookie on response.
-            String cookieUrl = toThirdPartyUrl(
-                    makeCookieWebSocketUrl(webServer, "/cookie_1", "test1", "value1"));
+            // |cookieUrl| sets a cookie on response.
+            String cookieUrl =
+                    makeCookieWebSocketUrl(webServer, "/cookie_1", cookieKey, cookieValue);
+            if (shouldUseThirdPartyUrl) {
+                // Let |cookieUrl| be a third-party url to test third-party cookies.
+                cookieUrl = toThirdPartyUrl(cookieUrl);
+            }
             // This html file includes a script establishing a WebSocket connection to |cookieUrl|.
             String url = makeWebSocketScriptUrl(webServer, "/content_1.html", cookieUrl);
             mActivityTestRule.loadUrlSync(
@@ -614,15 +610,57 @@
     @Test
     @MediumTest
     @Feature({"AndroidWebView", "Privacy"})
-    public void testThirdPartyCookieForWebSocketDisabledCase() throws Throwable {
-        Assert.assertNull(thirdPartyCookieForWebSocket(false));
+    public void testCookieForWebSocketHandshake_thirdParty_enabled() throws Throwable {
+        // Allow all cookies
+        mCookieManager.setAcceptCookie(true);
+        Assert.assertTrue(mCookieManager.acceptCookie());
+        mAwContents.getSettings().setAcceptThirdPartyCookies(true);
+        Assert.assertTrue(mAwContents.getSettings().getAcceptThirdPartyCookies());
+        String cookieKey = "test1";
+        String cookieValue = "value1";
+        Assert.assertEquals(cookieKey + "=" + cookieValue,
+                webSocketCookieHelper(true /* shouldUseThirdPartyUrl */, cookieKey, cookieValue));
     }
 
     @Test
     @MediumTest
     @Feature({"AndroidWebView", "Privacy"})
-    public void testThirdPartyCookieForWebSocketEnabledCase() throws Throwable {
-        Assert.assertEquals("test1=value1", thirdPartyCookieForWebSocket(true));
+    public void testCookieForWebSocketHandshake_thirdParty_disabled() throws Throwable {
+        // Allow cookies but disable 3P cookies
+        mCookieManager.setAcceptCookie(true);
+        Assert.assertTrue(mCookieManager.acceptCookie());
+        mAwContents.getSettings().setAcceptThirdPartyCookies(false);
+        Assert.assertFalse(mAwContents.getSettings().getAcceptThirdPartyCookies());
+        String cookieKey = "test1";
+        String cookieValue = "value1";
+        Assert.assertNull("Should not set 3P cookie when 3P cookie settings are disabled",
+                webSocketCookieHelper(true /* shouldUseThirdPartyUrl */, cookieKey, cookieValue));
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"AndroidWebView", "Privacy"})
+    public void testCookieForWebSocketHandshake_firstParty_enabled() throws Throwable {
+        // Allow all cookies
+        mCookieManager.setAcceptCookie(true);
+        Assert.assertTrue(mCookieManager.acceptCookie());
+        String cookieKey = "test1";
+        String cookieValue = "value1";
+        Assert.assertEquals(cookieKey + "=" + cookieValue,
+                webSocketCookieHelper(false /* shouldUseThirdPartyUrl */, cookieKey, cookieValue));
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"AndroidWebView", "Privacy"})
+    public void testCookieForWebSocketHandshake_firstParty_disabled() throws Throwable {
+        // Disallow all cookies
+        mCookieManager.setAcceptCookie(false);
+        Assert.assertFalse(mCookieManager.acceptCookie());
+        String cookieKey = "test1";
+        String cookieValue = "value1";
+        Assert.assertNull("Should not set 1P cookie when 1P cookie settings are disabled",
+                webSocketCookieHelper(false /* shouldUseThirdPartyUrl */, cookieKey, cookieValue));
     }
 
     /**
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 09e42768..276d370 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -442,6 +442,8 @@
     "magnifier/partial_magnification_controller.h",
     "media/media_controller.cc",
     "media/media_controller.h",
+    "media/media_notification_background.cc",
+    "media/media_notification_background.h",
     "media/media_notification_constants.cc",
     "media/media_notification_constants.h",
     "media/media_notification_controller.cc",
@@ -1577,6 +1579,7 @@
     "autoclick/autoclick_drag_event_rewriter_unittest.cc",
     "autoclick/autoclick_unittest.cc",
     "cursor_unittest.cc",
+    "dbus/url_handler_service_provider_unittest.cc",
     "detachable_base/detachable_base_handler_unittest.cc",
     "detachable_base/detachable_base_notification_controller_unittest.cc",
     "dip_unittest.cc",
@@ -1664,6 +1667,7 @@
     "magnifier/magnifier_test_utils.h",
     "magnifier/magnifier_utils_unittest.cc",
     "magnifier/partial_magnification_controller_unittest.cc",
+    "media/media_notification_background_unittest.cc",
     "media/media_notification_controller_unittest.cc",
     "media/media_notification_view_unittest.cc",
     "metrics/demo_session_metrics_recorder_unittest.cc",
diff --git a/ash/dbus/url_handler_service_provider.cc b/ash/dbus/url_handler_service_provider.cc
index 1bb6125..bcfd57aa 100644
--- a/ash/dbus/url_handler_service_provider.cc
+++ b/ash/dbus/url_handler_service_provider.cc
@@ -50,6 +50,11 @@
       base::BindRepeating(&OnExported));
 }
 
+bool UrlHandlerServiceProvider::UrlAllowed(const GURL& gurl) const {
+  return gurl.is_valid() &&
+         allowed_url_schemes_.find(gurl.scheme()) != allowed_url_schemes_.end();
+}
+
 void UrlHandlerServiceProvider::OpenUrl(
     dbus::MethodCall* method_call,
     dbus::ExportedObject::ResponseSender response_sender) {
@@ -63,8 +68,7 @@
   }
 
   const GURL gurl(url);
-  if (!gurl.is_valid() ||
-      allowed_url_schemes_.find(gurl.scheme()) == allowed_url_schemes_.end()) {
+  if (!UrlAllowed(gurl)) {
     response_sender.Run(dbus::ErrorResponse::FromMethodCall(
         method_call, DBUS_ERROR_FAILED, "Invalid URL"));
     return;
diff --git a/ash/dbus/url_handler_service_provider.h b/ash/dbus/url_handler_service_provider.h
index cc81737..5897f444d 100644
--- a/ash/dbus/url_handler_service_provider.h
+++ b/ash/dbus/url_handler_service_provider.h
@@ -16,6 +16,7 @@
 #include "base/memory/weak_ptr.h"
 #include "chromeos/dbus/services/cros_dbus_service.h"
 #include "dbus/exported_object.h"
+#include "url/gurl.h"
 
 namespace dbus {
 class MethodCall;
@@ -42,6 +43,10 @@
   // CrosDBusService::ServiceProviderInterface overrides:
   void Start(scoped_refptr<dbus::ExportedObject> exported_object) override;
 
+  // Returns true if |gurl| is allowed to be opened in a new tab.
+  // Visible for testing.
+  bool UrlAllowed(const GURL& gurl) const;
+
  private:
   // Called on UI thread in response to a D-Bus request.
   void OpenUrl(dbus::MethodCall* method_call,
diff --git a/ash/dbus/url_handler_service_provider_unittest.cc b/ash/dbus/url_handler_service_provider_unittest.cc
new file mode 100644
index 0000000..042dedc
--- /dev/null
+++ b/ash/dbus/url_handler_service_provider_unittest.cc
@@ -0,0 +1,38 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/dbus/url_handler_service_provider.h"
+
+#include <memory>
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace ash {
+
+class UrlHandlerServiceProviderTest : public testing::Test {};
+
+TEST_F(UrlHandlerServiceProviderTest, UrlAllowed) {
+  std::unique_ptr<UrlHandlerServiceProvider> provider =
+      std::make_unique<UrlHandlerServiceProvider>();
+  EXPECT_TRUE(provider->UrlAllowed(GURL("data://test/data")));
+  EXPECT_TRUE(provider->UrlAllowed(GURL("file:///test/file")));
+  EXPECT_TRUE(provider->UrlAllowed(GURL("ftp://test/ftp")));
+  EXPECT_TRUE(provider->UrlAllowed(GURL("http://test/http")));
+  EXPECT_TRUE(provider->UrlAllowed(GURL("https://test/https")));
+  EXPECT_TRUE(provider->UrlAllowed(GURL("mailto://test/mailto")));
+
+  EXPECT_FALSE(provider->UrlAllowed(GURL("notvalid")));
+  EXPECT_FALSE(provider->UrlAllowed(GURL("about://test/about")));
+  EXPECT_FALSE(provider->UrlAllowed(GURL("blob://test/blob")));
+  EXPECT_FALSE(provider->UrlAllowed(GURL("content://test/content")));
+  EXPECT_FALSE(provider->UrlAllowed(GURL("cid://test/cid")));
+  EXPECT_FALSE(provider->UrlAllowed(GURL("filesystem://test/filesystem")));
+  EXPECT_FALSE(provider->UrlAllowed(GURL("gopher://test/gopher")));
+  EXPECT_FALSE(provider->UrlAllowed(GURL("javascript://test/javascript")));
+  EXPECT_FALSE(provider->UrlAllowed(GURL("ws://test/ws")));
+  EXPECT_FALSE(provider->UrlAllowed(GURL("wss://test/wss")));
+}
+
+}  // namespace ash
diff --git a/ash/kiosk_next/kiosk_next_shell_controller.cc b/ash/kiosk_next/kiosk_next_shell_controller.cc
index a2ddf5a..be7ae78 100644
--- a/ash/kiosk_next/kiosk_next_shell_controller.cc
+++ b/ash/kiosk_next/kiosk_next_shell_controller.cc
@@ -39,9 +39,11 @@
   PrefService* prefs =
       Shell::Get()->session_controller()->GetPrimaryUserPrefService();
 
-  DCHECK(prefs) << "PrefService should not be null when reading Kiosk Next "
-                   "Shell pref. This usually happens when calling "
-                   "KioskNextShellController::IsEnabled() before sign in.";
+  // If we don't have user prefs, this method is being called before the first
+  // sign-in happens. In these cases the shell is always disabled.
+  if (!prefs)
+    return false;
+
   return prefs->GetBoolean(prefs::kKioskNextShellEnabled);
 }
 
diff --git a/ash/kiosk_next/kiosk_next_shell_controller.h b/ash/kiosk_next/kiosk_next_shell_controller.h
index c120cdb..0ac33b1 100644
--- a/ash/kiosk_next/kiosk_next_shell_controller.h
+++ b/ash/kiosk_next/kiosk_next_shell_controller.h
@@ -29,15 +29,14 @@
   // Binds the mojom::KioskNextShellController interface to this object.
   void BindRequest(mojom::KioskNextShellControllerRequest request);
 
-  // Returns if the Kiosk Next Shell is enabled for the current user.
+  // Returns if the Kiosk Next Shell is enabled for the current user. If there's
+  // no signed-in user, this returns false.
   bool IsEnabled();
 
   // Tries to start the Kiosk Next shell by sending a
   // LaunchKioskNextShell command to the KioskNextShellClient. We will only
   // launch if |IsEnabled()| is true, so it's safe to call this every time a
   // successful sign in happens.
-  // Warning: This method should not be called before sign in since the prefs
-  // would not be initialized.
   void LaunchKioskNextShellIfEnabled();
 
   // mojom::KioskNextShellController:
diff --git a/ash/media/media_notification_background.cc b/ash/media/media_notification_background.cc
new file mode 100644
index 0000000..4aba362
--- /dev/null
+++ b/ash/media/media_notification_background.cc
@@ -0,0 +1,173 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/media/media_notification_background.h"
+
+#include <algorithm>
+
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/scoped_canvas.h"
+#include "ui/views/view.h"
+
+namespace ash {
+
+namespace {
+
+constexpr int kMediaImageGradientWidth = 40;
+
+constexpr SkColor kMediaNotificationBackgroundColor = SK_ColorWHITE;
+
+}  // namespace
+
+MediaNotificationBackground::MediaNotificationBackground(
+    views::View* owner,
+    int top_radius,
+    int bottom_radius,
+    double artwork_max_width_pct)
+    : owner_(owner),
+      top_radius_(top_radius),
+      bottom_radius_(bottom_radius),
+      artwork_max_width_pct_(artwork_max_width_pct) {
+  DCHECK(owner);
+}
+
+void MediaNotificationBackground::Paint(gfx::Canvas* canvas,
+                                        views::View* view) const {
+  DCHECK(view);
+
+  gfx::ScopedCanvas scoped_canvas(canvas);
+  gfx::Rect bounds = view->GetContentsBounds();
+
+  {
+    // Draw a rounded rectangle which the background will be clipped to. The
+    // radius is provided by the notification and can change based on where in
+    // the list the notification is.
+    const SkScalar top_radius = SkIntToScalar(top_radius_);
+    const SkScalar bottom_radius = SkIntToScalar(bottom_radius_);
+
+    const SkScalar radii[8] = {top_radius,    top_radius,    top_radius,
+                               top_radius,    bottom_radius, bottom_radius,
+                               bottom_radius, bottom_radius};
+
+    SkPath path;
+    path.addRoundRect(gfx::RectToSkRect(bounds), radii, SkPath::kCW_Direction);
+    canvas->ClipPath(path, true);
+  }
+
+  {
+    // Draw the artwork. The artwork is resized to the height of the view while
+    // maintaining the aspect ratio.
+    gfx::Rect source_bounds =
+        gfx::Rect(0, 0, artwork_.width(), artwork_.height());
+    gfx::Rect artwork_bounds = GetArtworkBounds(bounds);
+
+    canvas->DrawImageInt(
+        artwork_, source_bounds.x(), source_bounds.y(), source_bounds.width(),
+        source_bounds.height(), artwork_bounds.x(), artwork_bounds.y(),
+        artwork_bounds.width(), artwork_bounds.height(), false /* filter */);
+  }
+
+  // Draw a filled rectangle which will act as the main background of the
+  // notification. This may cover up some of the artwork.
+  canvas->FillRect(GetFilledBackgroundBounds(bounds),
+                   kMediaNotificationBackgroundColor);
+
+  {
+    // Draw a gradient to fade the color background and the image together.
+    gfx::Rect draw_bounds = GetGradientBounds(bounds);
+
+    const SkColor transparent =
+        SkColorSetA(kMediaNotificationBackgroundColor, 0);
+
+    const SkColor colors[2] = {kMediaNotificationBackgroundColor, transparent};
+
+    const SkPoint points[2] = {gfx::PointToSkPoint(draw_bounds.left_center()),
+                               gfx::PointToSkPoint(draw_bounds.right_center())};
+
+    cc::PaintFlags flags;
+    flags.setAntiAlias(true);
+    flags.setStyle(cc::PaintFlags::kFill_Style);
+    flags.setShader(cc::PaintShader::MakeLinearGradient(
+        points, colors, nullptr, 2, SkShader::kClamp_TileMode));
+
+    canvas->DrawRect(draw_bounds, flags);
+  }
+}
+
+void MediaNotificationBackground::UpdateArtwork(const gfx::ImageSkia& image) {
+  if (artwork_.BackedBySameObjectAs(image))
+    return;
+
+  artwork_ = image;
+  owner_->SchedulePaint();
+}
+
+void MediaNotificationBackground::UpdateCornerRadius(int top_radius,
+                                                     int bottom_radius) {
+  if (top_radius_ == top_radius && bottom_radius_ == bottom_radius)
+    return;
+
+  top_radius_ = top_radius;
+  bottom_radius_ = bottom_radius;
+
+  owner_->SchedulePaint();
+}
+
+void MediaNotificationBackground::UpdateArtworkMaxWidthPct(
+    double max_width_pct) {
+  if (artwork_max_width_pct_ == max_width_pct)
+    return;
+
+  artwork_max_width_pct_ = max_width_pct;
+  owner_->SchedulePaint();
+}
+
+int MediaNotificationBackground::GetArtworkWidth(
+    const gfx::Size& view_size) const {
+  if (artwork_.isNull())
+    return 0;
+
+  // Calculate the aspect ratio of the image and determine what the width of the
+  // image should be based on that ratio and the height of the notification.
+  float aspect_ratio = (float)artwork_.width() / artwork_.height();
+  return ceil(view_size.height() * aspect_ratio);
+}
+
+int MediaNotificationBackground::GetArtworkVisibleWidth(
+    const gfx::Size& view_size) const {
+  // The artwork should only take up a maximum percentage of the notification.
+  return std::min(GetArtworkWidth(view_size),
+                  (int)ceil(view_size.width() * artwork_max_width_pct_));
+}
+
+gfx::Rect MediaNotificationBackground::GetArtworkBounds(
+    const gfx::Rect& view_bounds) const {
+  int width = GetArtworkWidth(view_bounds.size());
+
+  // The artwork should be positioned on the far right hand side of the
+  // notification and be the same height.
+  return gfx::Rect(view_bounds.right() - width, 0, width, view_bounds.height());
+}
+
+gfx::Rect MediaNotificationBackground::GetFilledBackgroundBounds(
+    const gfx::Rect& view_bounds) const {
+  // The filled background should take up the full notification except the area
+  // taken up by the artwork.
+  gfx::Rect bounds = gfx::Rect(view_bounds);
+  bounds.Inset(0, 0, GetArtworkVisibleWidth(view_bounds.size()), 0);
+  return bounds;
+}
+
+gfx::Rect MediaNotificationBackground::GetGradientBounds(
+    const gfx::Rect& view_bounds) const {
+  if (artwork_.isNull())
+    return gfx::Rect(0, 0, 0, 0);
+
+  // The gradient should appear above the artwork on the left.
+  gfx::Rect filled_bounds = GetFilledBackgroundBounds(view_bounds);
+  return gfx::Rect(filled_bounds.right(), view_bounds.y(),
+                   kMediaImageGradientWidth, view_bounds.height());
+}
+
+}  // namespace ash
diff --git a/ash/media/media_notification_background.h b/ash/media/media_notification_background.h
new file mode 100644
index 0000000..c412964
--- /dev/null
+++ b/ash/media/media_notification_background.h
@@ -0,0 +1,64 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_MEDIA_MEDIA_NOTIFICATION_BACKGROUND_H_
+#define ASH_MEDIA_MEDIA_NOTIFICATION_BACKGROUND_H_
+
+#include "ash/ash_export.h"
+#include "ui/gfx/image/image_skia.h"
+#include "ui/views/background.h"
+
+namespace gfx {
+class Rect;
+class Size;
+}  // namespace gfx
+
+namespace views {
+class View;
+}  // namespace views
+
+namespace ash {
+
+// MediaNotificationBackground draws a custom background for the media
+// notification showing the artwork clipped to a rounded rectangle faded into a
+// background color.
+class ASH_EXPORT MediaNotificationBackground : public views::Background {
+ public:
+  MediaNotificationBackground(views::View* owner,
+                              int top_radius,
+                              int bottom_radius,
+                              double artwork_max_width_pct);
+
+  // views::Background
+  void Paint(gfx::Canvas* canvas, views::View* view) const override;
+
+  void UpdateCornerRadius(int top_radius, int bottom_radius);
+  void UpdateArtwork(const gfx::ImageSkia& image);
+  void UpdateArtworkMaxWidthPct(double max_width_pct);
+
+ private:
+  friend class MediaNotificationViewTest;
+  FRIEND_TEST_ALL_PREFIXES(MediaNotificationBackgroundTest, BoundsSanityCheck);
+
+  int GetArtworkWidth(const gfx::Size& view_size) const;
+  int GetArtworkVisibleWidth(const gfx::Size& view_size) const;
+  gfx::Rect GetArtworkBounds(const gfx::Rect& view_bounds) const;
+  gfx::Rect GetFilledBackgroundBounds(const gfx::Rect& view_bounds) const;
+  gfx::Rect GetGradientBounds(const gfx::Rect& view_bounds) const;
+
+  // Reference to the owning view that this is a background for.
+  views::View* owner_;
+
+  int top_radius_;
+  int bottom_radius_;
+
+  gfx::ImageSkia artwork_;
+  double artwork_max_width_pct_;
+
+  DISALLOW_COPY_AND_ASSIGN(MediaNotificationBackground);
+};
+
+}  // namespace ash
+
+#endif  // ASH_MEDIA_MEDIA_NOTIFICATION_BACKGROUND_H_
diff --git a/ash/media/media_notification_background_unittest.cc b/ash/media/media_notification_background_unittest.cc
new file mode 100644
index 0000000..f8ee418
--- /dev/null
+++ b/ash/media/media_notification_background_unittest.cc
@@ -0,0 +1,63 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/media/media_notification_background.h"
+
+#include <memory>
+
+#include "ash/test/ash_test_base.h"
+#include "ui/views/test/test_views.h"
+
+namespace ash {
+
+class MediaNotificationBackgroundTest : public AshTestBase {
+ public:
+  MediaNotificationBackgroundTest() = default;
+  ~MediaNotificationBackgroundTest() override = default;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MediaNotificationBackgroundTest);
+};
+
+TEST_F(MediaNotificationBackgroundTest, BoundsSanityCheck) {
+  views::StaticSizedView owner;
+  MediaNotificationBackground background(&owner, 10, 10, 0.1);
+
+  // The test notification will have a width of 200 and a height of 50.
+  gfx::Rect bounds(0, 0, 200, 50);
+
+  // Check the artwork is not visible by default.
+  EXPECT_EQ(0, background.GetArtworkWidth(bounds.size()));
+  EXPECT_EQ(0, background.GetArtworkVisibleWidth(bounds.size()));
+  EXPECT_EQ(gfx::Rect(200, 0, 0, 50), background.GetArtworkBounds(bounds));
+  EXPECT_EQ(gfx::Rect(0, 0, 200, 50),
+            background.GetFilledBackgroundBounds(bounds));
+  EXPECT_EQ(gfx::Rect(0, 0, 0, 0), background.GetGradientBounds(bounds));
+
+  // The background artwork image will have an aspect ratio of 2:1.
+  SkBitmap bitmap;
+  bitmap.allocN32Pixels(20, 10);
+  background.UpdateArtwork(gfx::ImageSkia::CreateFrom1xBitmap(bitmap));
+
+  // The artwork width will be 2x the height of the notification and the visible
+  // width will be limited to 10% the width of the notification.
+  EXPECT_EQ(100, background.GetArtworkWidth(bounds.size()));
+  EXPECT_EQ(20, background.GetArtworkVisibleWidth(bounds.size()));
+
+  // Update the visible width % to be greater than the width of the image.
+  background.UpdateArtworkMaxWidthPct(0.6);
+  EXPECT_EQ(100, background.GetArtworkVisibleWidth(bounds.size()));
+
+  // Check the artwork is positioned to the right.
+  EXPECT_EQ(gfx::Rect(100, 0, 100, 50), background.GetArtworkBounds(bounds));
+
+  // Check the filled background is to the left of the image.
+  EXPECT_EQ(gfx::Rect(0, 0, 100, 50),
+            background.GetFilledBackgroundBounds(bounds));
+
+  // Check the gradient is positioned above the artwork.
+  EXPECT_EQ(gfx::Rect(100, 0, 40, 50), background.GetGradientBounds(bounds));
+}
+
+}  // namespace ash
diff --git a/ash/media/media_notification_view.cc b/ash/media/media_notification_view.cc
index d93ceac15..a944df9 100644
--- a/ash/media/media_notification_view.cc
+++ b/ash/media/media_notification_view.cc
@@ -4,6 +4,7 @@
 
 #include "ash/media/media_notification_view.h"
 
+#include "ash/media/media_notification_background.h"
 #include "ash/media/media_notification_constants.h"
 #include "ash/media/media_notification_controller.h"
 #include "ash/shell.h"
@@ -17,9 +18,7 @@
 #include "ui/message_center/views/notification_control_buttons_view.h"
 #include "ui/message_center/views/notification_header_view.h"
 #include "ui/views/controls/button/image_button_factory.h"
-#include "ui/views/controls/image_view.h"
 #include "ui/views/layout/box_layout.h"
-#include "ui/views/layout/fill_layout.h"
 #include "ui/views/style/typography.h"
 
 namespace ash {
@@ -38,8 +37,8 @@
 // Dimensions.
 constexpr int kDefaultMarginSize = 16;
 constexpr int kMediaButtonIconSize = 24;
-constexpr gfx::Size kMediaArtworkSize = gfx::Size(104, 104);
-constexpr gfx::Size kMediaArtworkExpandedSize = gfx::Size(152, 152);
+constexpr double kMediaImageMaxWidthPct = 0.3;
+constexpr double kMediaImageMaxWidthExpandedPct = 0.4;
 
 SkColor GetMediaNotificationColor(const views::View& view) {
   return views::style::GetColor(view, views::style::CONTEXT_LABEL,
@@ -58,19 +57,8 @@
 MediaNotificationView::MediaNotificationView(
     const message_center::Notification& notification)
     : message_center::MessageView(notification) {
-  SetLayoutManager(std::make_unique<views::FillLayout>());
-
-  // |artwork_| displays the image showing the artwork for the media.
-  artwork_ = new views::ImageView();
-  artwork_->SetImageSize(kMediaArtworkSize);
-  artwork_->SetHorizontalAlignment(views::ImageView::TRAILING);
-  AddChildView(artwork_);
-
-  // |layout_row_| holds the main box layout for the notification.
-  layout_row_ = new views::View();
-  layout_row_->SetLayoutManager(std::make_unique<views::BoxLayout>(
+  SetLayoutManager(std::make_unique<views::BoxLayout>(
       views::BoxLayout::kVertical, gfx::Insets(), 0));
-  AddChildView(layout_row_);
 
   // |controls_button_view_| has the common notification control buttons.
   control_buttons_view_ =
@@ -83,11 +71,11 @@
   header_row_->SetExpandButtonEnabled(true);
   header_row_->SetAppName(
       message_center::MessageCenter::Get()->GetSystemNotificationAppName());
-  layout_row_->AddChildView(header_row_);
+  AddChildView(header_row_);
 
   // |main_row_| holds the main content of the notification.
   main_row_ = new views::View();
-  layout_row_->AddChildView(main_row_);
+  AddChildView(main_row_);
 
   // |title_artist_row_| contains the title and artist labels.
   title_artist_row_ = new views::View();
@@ -149,6 +137,10 @@
   CreateMediaButton(vector_icons::kMediaNextTrackIcon,
                     MediaSessionAction::kNextTrack);
 
+  SetBackground(std::make_unique<MediaNotificationBackground>(
+      this, message_center::kNotificationCornerRadius,
+      message_center::kNotificationCornerRadius, kMediaImageMaxWidthPct));
+
   UpdateControlButtonsVisibilityWithNotification(notification);
   UpdateCornerRadius(message_center::kNotificationCornerRadius,
                      message_center::kNotificationCornerRadius);
@@ -168,6 +160,8 @@
   MessageView::UpdateWithNotification(notification);
 
   UpdateControlButtonsVisibilityWithNotification(notification);
+
+  PreferredSizeChanged();
   Layout();
   SchedulePaint();
 }
@@ -184,16 +178,16 @@
   expanded_ = expanded;
 
   UpdateViewForExpandedState();
+
   PreferredSizeChanged();
+  Layout();
+  SchedulePaint();
 }
 
-gfx::Size MediaNotificationView::CalculatePreferredSize() const {
-  // The size of the notification should be the standard width and the height
-  // should be fixed to the height of the artwork based on whether the
-  // notification is expanded or not.
-  return gfx::Size(message_center::kNotificationWidth,
-                   expanded_ ? kMediaArtworkExpandedSize.height()
-                             : kMediaArtworkSize.height());
+void MediaNotificationView::UpdateCornerRadius(int top_radius,
+                                               int bottom_radius) {
+  GetMediaNotificationBackground()->UpdateCornerRadius(top_radius,
+                                                       bottom_radius);
 }
 
 void MediaNotificationView::OnMouseEvent(ui::MouseEvent* event) {
@@ -237,7 +231,9 @@
   play_pause_button_->set_tag(static_cast<int>(action));
   play_pause_button_->SetVisible(IsActionButtonVisible(action));
 
-  layout_row_->Layout();
+  PreferredSizeChanged();
+  Layout();
+  SchedulePaint();
 }
 
 void MediaNotificationView::UpdateWithMediaMetadata(
@@ -251,28 +247,34 @@
 
   if (metadata.title.empty() && metadata.artist.empty()) {
     title_artist_row_->SetVisible(false);
-    return;
+  } else {
+    title_artist_row_->SetVisible(true);
+
+    title_label_->SetText(metadata.title);
+    title_label_->SetVisible(!metadata.title.empty());
+
+    artist_label_->SetText(metadata.artist);
+    artist_label_->SetVisible(!metadata.artist.empty());
   }
 
-  title_artist_row_->SetVisible(true);
-
-  title_label_->SetText(metadata.title);
-  title_label_->SetVisible(!metadata.title.empty());
-
-  artist_label_->SetText(metadata.artist);
-  artist_label_->SetVisible(!metadata.artist.empty());
+  PreferredSizeChanged();
+  Layout();
+  SchedulePaint();
 }
 
 void MediaNotificationView::UpdateWithMediaActions(
     const std::set<media_session::mojom::MediaSessionAction>& actions) {
   enabled_actions_ = actions;
   UpdateActionButtonsVisibility();
-  layout_row_->Layout();
+
+  PreferredSizeChanged();
+  Layout();
+  SchedulePaint();
 }
 
 void MediaNotificationView::UpdateWithMediaArtwork(
     const gfx::ImageSkia& image) {
-  artwork_->SetImage(image);
+  GetMediaNotificationBackground()->UpdateArtwork(image);
 }
 
 void MediaNotificationView::UpdateControlButtonsVisibilityWithNotification(
@@ -321,8 +323,6 @@
                         kDefaultMarginSize, kRightMarginExpandedSize),
             kDefaultMarginSize))
         ->SetDefaultFlex(1);
-
-    artwork_->SetImageSize(kMediaArtworkExpandedSize);
   } else {
     main_row_
         ->SetLayoutManager(std::make_unique<views::BoxLayout>(
@@ -331,10 +331,11 @@
                         kRightMarginSize),
             kDefaultMarginSize, true))
         ->SetDefaultFlex(1);
-
-    artwork_->SetImageSize(kMediaArtworkSize);
   }
 
+  GetMediaNotificationBackground()->UpdateArtworkMaxWidthPct(
+      expanded_ ? kMediaImageMaxWidthExpandedPct : kMediaImageMaxWidthPct);
+
   header_row_->SetExpanded(expanded_);
 
   UpdateActionButtonsVisibility();
@@ -349,4 +350,9 @@
   button_row_->AddChildView(button);
 }
 
+MediaNotificationBackground*
+MediaNotificationView::GetMediaNotificationBackground() {
+  return static_cast<MediaNotificationBackground*>(background());
+}
+
 }  // namespace ash
diff --git a/ash/media/media_notification_view.h b/ash/media/media_notification_view.h
index a010c5b..ea3b9a6 100644
--- a/ash/media/media_notification_view.h
+++ b/ash/media/media_notification_view.h
@@ -29,13 +29,14 @@
 }  // namespace message_center
 
 namespace views {
-class ImageView;
 class ToggleImageButton;
 class View;
 }  // namespace views
 
 namespace ash {
 
+class MediaNotificationBackground;
+
 // MediaNotificationView will show up as a custom notification. It will show the
 // currently playing media and provide playback controls. There will also be
 // control buttons (e.g. close) in the top right corner that will hide and show
@@ -53,9 +54,9 @@
   message_center::NotificationControlButtonsView* GetControlButtonsView()
       const override;
   void SetExpanded(bool expanded) override;
+  void UpdateCornerRadius(int top_radius, int bottom_radius) override;
 
   // views::View:
-  gfx::Size CalculatePreferredSize() const override;
   void OnMouseEvent(ui::MouseEvent* event) override;
 
   // views::ButtonListener:
@@ -85,6 +86,8 @@
   void UpdateActionButtonsVisibility();
   void UpdateViewForExpandedState();
 
+  MediaNotificationBackground* GetMediaNotificationBackground();
+
   // View containing close and settings buttons.
   std::unique_ptr<message_center::NotificationControlButtonsView>
       control_buttons_view_;
@@ -104,7 +107,6 @@
   views::Label* artist_label_ = nullptr;
   views::View* layout_row_ = nullptr;
   views::View* main_row_ = nullptr;
-  views::ImageView* artwork_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(MediaNotificationView);
 };
diff --git a/ash/media/media_notification_view_unittest.cc b/ash/media/media_notification_view_unittest.cc
index d88a376..dba22a10 100644
--- a/ash/media/media_notification_view_unittest.cc
+++ b/ash/media/media_notification_view_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "ash/media/media_notification_background.h"
 #include "ash/media/media_notification_constants.h"
 #include "ash/media/media_notification_controller.h"
 #include "ash/media/media_notification_item.h"
@@ -189,8 +190,6 @@
 
   views::View* title_artist_row() const { return view_->title_artist_row_; }
 
-  views::ImageView* artwork() const { return view_->artwork_; }
-
   views::Label* title_label() const { return view_->title_label_; }
 
   views::Label* artist_label() const { return view_->artist_label_; }
@@ -219,6 +218,10 @@
 
   const base::UnguessableToken& request_id() const { return request_id_; }
 
+  const gfx::ImageSkia& GetArtworkImage() const {
+    return view_->GetMediaNotificationBackground()->artwork_;
+  }
+
  private:
   std::unique_ptr<message_center::MessageView> CreateAndCaptureCustomView(
       const message_center::Notification& notification) {
@@ -665,44 +668,29 @@
   EXPECT_FALSE(IsActionButtonVisible(MediaSessionAction::kNextTrack));
 }
 
-TEST_F(MediaNotificationViewTest, ArtworkHeightWhenCollapsedOrExpanded) {
-  EXPECT_TRUE(is_expanded());
-
-  // Ensure that the notification and the artwork are the same height.
-  int height = view()->height();
-  EXPECT_EQ(height, artwork()->height());
-
-  view()->SetExpanded(false);
-
-  // Ensure that the notification reduced in height and the artwork is the same
-  // height.
-  EXPECT_FALSE(is_expanded());
-  EXPECT_GT(height, view()->height());
-  EXPECT_EQ(view()->height(), artwork()->height());
-}
-
 TEST_F(MediaNotificationViewTest, UpdateArtworkFromItem) {
   gfx::Size size = view()->size();
 
   SkBitmap image;
   image.allocN32Pixels(10, 10);
 
-  EXPECT_TRUE(artwork()->GetImage().isNull());
+  EXPECT_TRUE(GetArtworkImage().isNull());
 
   GetItem()->MediaControllerImageChanged(
       media_session::mojom::MediaSessionImageType::kArtwork, image);
 
-  // Ensure that the image is displayed in |artwork| and that the size of the
-  // notification was not affected.
-  EXPECT_FALSE(artwork()->GetImage().isNull());
-  EXPECT_EQ(gfx::Size(10, 10), artwork()->GetImage().size());
+  // Ensure that the image is displayed in the background artwork and that the
+  // size of the notification was not affected.
+  EXPECT_FALSE(GetArtworkImage().isNull());
+  EXPECT_EQ(gfx::Size(10, 10), GetArtworkImage().size());
   EXPECT_EQ(size, view()->size());
 
   GetItem()->MediaControllerImageChanged(
       media_session::mojom::MediaSessionImageType::kArtwork, SkBitmap());
 
-  // Ensure that |artwork| was reset and the size was still not affected.
-  EXPECT_TRUE(artwork()->GetImage().isNull());
+  // Ensure that the background artwork was reset and the size was still not
+  // affected.
+  EXPECT_TRUE(GetArtworkImage().isNull());
   EXPECT_EQ(size, view()->size());
 }
 
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index da2b472..1c942689 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">መሣሪያዎች</translation>
 <translation id="4659419629803378708">ChromeVox ነቅቷል</translation>
 <translation id="4696813013609194136">በወላጅ ኮድ መሣሪያን ክፈት</translation>
+<translation id="4731797938093519117">የወላጅ መዳረሻ</translation>
 <translation id="4734965478015604180">አግድማዊ</translation>
 <translation id="4774338217796918551">ነገ <ph name="COME_BACK_TIME" /> ላይ ተመልሰው ይምጡ።</translation>
 <translation id="4776917500594043016">የ<ph name="USER_EMAIL_ADDRESS" /> ይለፍ ቃል</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index 6e2d8304..627c4844 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">الأجهزة</translation>
 <translation id="4659419629803378708">‏تم تفعيل ChromeVox</translation>
 <translation id="4696813013609194136">فتح قفل الجهاز باستخدام رمز الوالدين</translation>
+<translation id="4731797938093519117">وصول أحد الوالدين</translation>
 <translation id="4734965478015604180">أفقي</translation>
 <translation id="4774338217796918551">يمكنك العودة غدًا في <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">كلمة مرور <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb
index 7501523a..c53df3e 100644
--- a/ash/strings/ash_strings_bg.xtb
+++ b/ash/strings/ash_strings_bg.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Устройства</translation>
 <translation id="4659419629803378708">Активирахте ChromeVox</translation>
 <translation id="4696813013609194136">Отключване на устройството с код на родител</translation>
+<translation id="4731797938093519117">Достъп на родител</translation>
 <translation id="4734965478015604180">Хоризонтална ориентация</translation>
 <translation id="4774338217796918551">Заповядайте отново утре в <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Парола за <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb
index 1ed397d..86998c7 100644
--- a/ash/strings/ash_strings_bn.xtb
+++ b/ash/strings/ash_strings_bn.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">ডিভাইস</translation>
 <translation id="4659419629803378708">ChromeVox সক্ষম করা আছে</translation>
 <translation id="4696813013609194136">অভিভাবকীয় কোড দিয়ে ডিভাইস আনলক করুন</translation>
+<translation id="4731797938093519117">অভিভাবকীয় অ্যাক্সেস</translation>
 <translation id="4734965478015604180">অনুভূমিক</translation>
 <translation id="4774338217796918551">আগামীকাল <ph name="COME_BACK_TIME" />-এ আবার ব্যবহার করতে পারবেন।</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" />-এর জন্য পাসওয়ার্ড</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb
index ba5b8a5..866a39f 100644
--- a/ash/strings/ash_strings_ca.xtb
+++ b/ash/strings/ash_strings_ca.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">IGNORA</translation>
 <translation id="1537254971476575106">Lupa de pantalla completa</translation>
 <translation id="15373452373711364">Cursor del ratolí gran</translation>
+<translation id="1546492247443594934">Escriptori 2</translation>
 <translation id="1550523713251050646">Feu clic per veure més opcions</translation>
 <translation id="1570871743947603115">Activa o desactiva el Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">Accedir a tota la teva activitat d'aquesta sessió.</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">Part inferior</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation>
 <translation id="3126069444801937830">Reinicia per actualitzar</translation>
+<translation id="3139942575505304791">Escriptori 1</translation>
 <translation id="315116470104423982">Dades mòbils</translation>
 <translation id="3151786313568798007">Orientació</translation>
+<translation id="3152934361839663679">Com que el dispositiu està connectat al nombre màxim de monitors, se n'ha desconnectat un.</translation>
 <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="3154351730702813399">És possible que l'administrador del dispositiu supervisi l'activitat de navegació.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Connectat a un dispositiu}other{Connectat a # dispositius}}</translation>
@@ -232,6 +235,7 @@
 <translation id="4628757576491864469">Dispositius</translation>
 <translation id="4659419629803378708">S'ha activat ChromeVox</translation>
 <translation id="4696813013609194136">Desbloqueja el dispositiu amb el codi parental</translation>
+<translation id="4731797938093519117">Accés parental</translation>
 <translation id="4734965478015604180">Horitzontal</translation>
 <translation id="4774338217796918551">Pots tornar demà a les <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Contrasenya per a <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -257,6 +261,7 @@
 <translation id="5207949376430453814">Ressalta la marca d'inserció de text</translation>
 <translation id="5222676887888702881">Tanca la sessió</translation>
 <translation id="523505283826916779">Configuració d'accessibilitat</translation>
+<translation id="5260676007519551770">Escriptori 4</translation>
 <translation id="5283198616748585639">Afegeix 1 minut</translation>
 <translation id="5302048478445481009">Idioma</translation>
 <translation id="5313326810920013265">Configuració del Bluetooth</translation>
@@ -342,6 +347,7 @@
 <translation id="6650933572246256093">El dispositiu Bluetooth "<ph name="DEVICE_NAME" />" sol·licita permís per emparellar-se. Introduïu-hi aquesta contrasenya: <ph name="PASSKEY" />.</translation>
 <translation id="6657585470893396449">Contrasenya</translation>
 <translation id="6665545700722362599">Concedir permís als llocs web, a les aplicacions i a les extensions per utilitzar els serveis d'ubicació o el micròfon, la càmera o altres funcions del dispositiu.</translation>
+<translation id="6670153871843998651">Escriptori 3</translation>
 <translation id="6691659475504239918">Cerca+Maj+H</translation>
 <translation id="6696025732084565524">El teclat extraïble necessita una actualització molt important</translation>
 <translation id="6700713906295497288">Botó del menú d'IME</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb
index f6c4b96..d625ae9 100644
--- a/ash/strings/ash_strings_cs.xtb
+++ b/ash/strings/ash_strings_cs.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">ZAVŘÍT</translation>
 <translation id="1537254971476575106">Lupa celé obrazovky</translation>
 <translation id="15373452373711364">Velký kurzor myši</translation>
+<translation id="1546492247443594934">Stůl 2</translation>
 <translation id="1550523713251050646">Kliknutím zobrazíte další možnosti</translation>
 <translation id="1570871743947603115">Přepnout Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">Získat přístup k veškeré vaší aktivitě v této relaci</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">Až dolů</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation>
 <translation id="3126069444801937830">Restartovat a aktualizovat</translation>
+<translation id="3139942575505304791">Stůl 1</translation>
 <translation id="315116470104423982">Mobilní datové přenosy</translation>
 <translation id="3151786313568798007">Orientace</translation>
+<translation id="3152934361839663679">Zařízení je připojeno k maximálnímu počtu monitorů, jedna z obrazovek proto byla odpojena.</translation>
 <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="3154351730702813399">Správce zařízení může sledovat vaši aktivitu při procházení.</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>
@@ -232,6 +235,7 @@
 <translation id="4628757576491864469">Zařízení</translation>
 <translation id="4659419629803378708">Funkce ChromeVox je zapnutá</translation>
 <translation id="4696813013609194136">Odemkněte zařízení rodičovským kódem</translation>
+<translation id="4731797938093519117">Rodičovský přístup</translation>
 <translation id="4734965478015604180">Na šířku</translation>
 <translation id="4774338217796918551">Vrať se v <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Heslo pro účet <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -257,6 +261,7 @@
 <translation id="5207949376430453814">Zvýraznit textový kurzor</translation>
 <translation id="5222676887888702881">Odhlásit se</translation>
 <translation id="523505283826916779">Nastavení usnadnění přístupu</translation>
+<translation id="5260676007519551770">Stůl 4</translation>
 <translation id="5283198616748585639">Přidat 1 min</translation>
 <translation id="5302048478445481009">Jazyk</translation>
 <translation id="5313326810920013265">Nastavení Bluetooth</translation>
@@ -342,6 +347,7 @@
 <translation id="6650933572246256093">Zařízení Bluetooth „<ph name="DEVICE_NAME" />“ žádá o povolení ke spárování. V zařízení prosím zadejte následující přístupový klíč: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">Heslo</translation>
 <translation id="6665545700722362599">Udělit webům, aplikacím a rozšířením oprávnění používat služby určování polohy, mikrofon či fotoaparát zařízení nebo další funkce</translation>
+<translation id="6670153871843998651">Stůl 3</translation>
 <translation id="6691659475504239918">Hledat+Shift+H</translation>
 <translation id="6696025732084565524">Odpojitelná klávesnice vyžaduje kritickou aktualizaci</translation>
 <translation id="6700713906295497288">Tlačítko nabídky IME</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index 1d6f068d..ec4bec4 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Enheder</translation>
 <translation id="4659419629803378708">ChromeVox er aktiveret</translation>
 <translation id="4696813013609194136">Lås enheden op med forældrekode</translation>
+<translation id="4731797938093519117">Forældreadgang</translation>
 <translation id="4734965478015604180">Vandret</translation>
 <translation id="4774338217796918551">Kom tilbage i morgen kl. <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Adgangskode for <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb
index 90a360a..3cb272f 100644
--- a/ash/strings/ash_strings_de.xtb
+++ b/ash/strings/ash_strings_de.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Geräte</translation>
 <translation id="4659419629803378708">ChromeVox aktiviert</translation>
 <translation id="4696813013609194136">Gerät mit Elterncode entsperren</translation>
+<translation id="4731797938093519117">Elternfreigabe</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4774338217796918551">Du darfst das Gerät um <ph name="COME_BACK_TIME" /> wieder verwenden.</translation>
 <translation id="4776917500594043016">Passwort für <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb
index 115eb877..f760819 100644
--- a/ash/strings/ash_strings_el.xtb
+++ b/ash/strings/ash_strings_el.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Συσκευές</translation>
 <translation id="4659419629803378708">Το ChromeVox ενεργοποιήθηκε</translation>
 <translation id="4696813013609194136">Ξεκλείδωμα συσκευής με κωδικό γονέα</translation>
+<translation id="4731797938093519117">Γονική πρόσβαση</translation>
 <translation id="4734965478015604180">Οριζόντια περιστροφή</translation>
 <translation id="4774338217796918551">Επιστρέψτε ξανά αύριο στις <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Κωδικός πρόσβασης για <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index 4cc39e6..df0f12c50 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Devices</translation>
 <translation id="4659419629803378708">ChromeVox enabled</translation>
 <translation id="4696813013609194136">Unlock device with parent code</translation>
+<translation id="4731797938093519117">Parent access</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4774338217796918551">Come back tomorrow at <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Password for <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb
index dab584b..6b379ce 100644
--- a/ash/strings/ash_strings_es-419.xtb
+++ b/ash/strings/ash_strings_es-419.xtb
@@ -236,6 +236,7 @@
 <translation id="4628757576491864469">Dispositivos</translation>
 <translation id="4659419629803378708">Se habilitó ChromeVox</translation>
 <translation id="4696813013609194136">Desbloquea el dispositivo con el código parental</translation>
+<translation id="4731797938093519117">Acceso parental</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4774338217796918551">Regresa mañana a las <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Contraseña para <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index 1350d64..17f7a6b 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">CERRAR</translation>
 <translation id="1537254971476575106">Lupa de pantalla completa</translation>
 <translation id="15373452373711364">Cursor del ratón grande</translation>
+<translation id="1546492247443594934">Escritorio 2</translation>
 <translation id="1550523713251050646">Haz clic aquí para obtener más opciones</translation>
 <translation id="1570871743947603115">Activa o desactiva el Bluetooth. <ph name="STATE_TEXT" />.</translation>
 <translation id="1589090746204042747">Acceder a toda tu actividad de esta sesión</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">Inferior</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation>
 <translation id="3126069444801937830">Reinicia el sistema para actualizarlo.</translation>
+<translation id="3139942575505304791">Escritorio 1</translation>
 <translation id="315116470104423982">Redes móviles</translation>
 <translation id="3151786313568798007">Orientación</translation>
+<translation id="3152934361839663679">Tu dispositivo está conectado al número máximo de monitores, así que una de las pantallas se ha desconectado.</translation>
 <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="3154351730702813399">Es posible que el administrador del dispositivo supervise tu actividad de navegación.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Conectado a 1 dispositivo}other{Conectado a # dispositivos}}</translation>
@@ -233,6 +236,7 @@
 <translation id="4628757576491864469">Dispositivos</translation>
 <translation id="4659419629803378708">ChromeVox habilitado</translation>
 <translation id="4696813013609194136">Desbloquear el dispositivo con código parental</translation>
+<translation id="4731797938093519117">Acceso parental</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4774338217796918551">Vuelve mañana a las <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Contraseña de <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -258,6 +262,7 @@
 <translation id="5207949376430453814">Resaltar el símbolo de intercalación del texto</translation>
 <translation id="5222676887888702881">Cerrar sesión</translation>
 <translation id="523505283826916779">Configuración de accesibilidad</translation>
+<translation id="5260676007519551770">Escritorio 4</translation>
 <translation id="5283198616748585639">Añadir 1 minuto</translation>
 <translation id="5302048478445481009">Idioma</translation>
 <translation id="5313326810920013265">Configuración de Bluetooth</translation>
@@ -343,6 +348,7 @@
 <translation id="6650933572246256093">El dispositivo Bluetooth "<ph name="DEVICE_NAME" />" solicita permiso para vincularse. Introduce la clave de contraseña <ph name="PASSKEY" /> en el dispositivo</translation>
 <translation id="6657585470893396449">Contraseña</translation>
 <translation id="6665545700722362599">Dar permiso a los sitios web, las aplicaciones y las extensiones para usar los servicios de ubicación, el micrófono del dispositivo, la cámara y otras funciones.</translation>
+<translation id="6670153871843998651">Escritorio 3</translation>
 <translation id="6691659475504239918">Tecla de búsqueda + Mayús + H</translation>
 <translation id="6696025732084565524">Tu teclado independiente necesita una actualización crítica</translation>
 <translation id="6700713906295497288">Botón de menú de IME</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb
index 553a4b8..6994191 100644
--- a/ash/strings/ash_strings_et.xtb
+++ b/ash/strings/ash_strings_et.xtb
@@ -236,6 +236,7 @@
 <translation id="4628757576491864469">Seadmed</translation>
 <translation id="4659419629803378708">ChromeVox on lubatud</translation>
 <translation id="4696813013609194136">Avage seade lapsevanema koodiga</translation>
+<translation id="4731797938093519117">Vanema juurdepääs</translation>
 <translation id="4734965478015604180">Horisontaalne</translation>
 <translation id="4774338217796918551">Tulge tagasi homme kell <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Kasutaja <ph name="USER_EMAIL_ADDRESS" /> parool</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index 8b58dac..11a4d0e5 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -236,6 +236,7 @@
 <translation id="4628757576491864469">دستگاه‌ها</translation>
 <translation id="4659419629803378708">‏ChromeVox فعال شد</translation>
 <translation id="4696813013609194136">باز کردن قفل دستگاه با کد والدین</translation>
+<translation id="4731797938093519117">دسترسی والدین</translation>
 <translation id="4734965478015604180">افقی</translation>
 <translation id="4774338217796918551">فردا ساعت <ph name="COME_BACK_TIME" /> برگردید.</translation>
 <translation id="4776917500594043016">گذرواژه <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb
index 2fc3c0f..b55acde 100644
--- a/ash/strings/ash_strings_fi.xtb
+++ b/ash/strings/ash_strings_fi.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">HYLKÄÄ</translation>
 <translation id="1537254971476575106">Koko näytön suurennus</translation>
 <translation id="15373452373711364">Suuri hiiren osoitin</translation>
+<translation id="1546492247443594934">Pöytä 2</translation>
 <translation id="1550523713251050646">Näet lisävaihtoehtoja klikkaamalla tätä.</translation>
 <translation id="1570871743947603115">Ota Bluetooth käyttöön tai poista se käytöstä. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">nähdä kaikki tämän käyttökerran toimintosi</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">Alaosa</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation>
 <translation id="3126069444801937830">Päivitä käynnistämällä uudelleen</translation>
+<translation id="3139942575505304791">Pöytä 1</translation>
 <translation id="315116470104423982">Mobiilitiedonsiirto</translation>
 <translation id="3151786313568798007">Suunta</translation>
+<translation id="3152934361839663679">Laitteesi on yhdistetty enimmäismäärään näyttöjä, joten yhden näytön yhteys on katkaistu.</translation>
 <translation id="3153444934357957346">Voit lisätä enintään <ph name="MULTI_PROFILE_USER_LIMIT" /> tiliä useille tileille kirjautumista varten.</translation>
 <translation id="3154351730702813399">Laitteen järjestelmänvalvoja saattaa seurata selaustoimintaasi.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Yhdistetty 1 laitteeseen}other{Yhdistetty # laitteeseen}}</translation>
@@ -233,6 +236,7 @@
 <translation id="4628757576491864469">Laitteet</translation>
 <translation id="4659419629803378708">ChromeVox käytössä</translation>
 <translation id="4696813013609194136">Avaa lukitus vanhemman koodilla</translation>
+<translation id="4731797938093519117">Avaus vanhemmille</translation>
 <translation id="4734965478015604180">Vaakasuora</translation>
 <translation id="4774338217796918551">Palaa huomenna kello <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Osoitteen <ph name="USER_EMAIL_ADDRESS" /> salasana</translation>
@@ -258,6 +262,7 @@
 <translation id="5207949376430453814">Korosta tekstikursori</translation>
 <translation id="5222676887888702881">Kirjaudu ulos</translation>
 <translation id="523505283826916779">Käytettävyysasetukset</translation>
+<translation id="5260676007519551770">Pöytä 4</translation>
 <translation id="5283198616748585639">Lisää 1 min</translation>
 <translation id="5302048478445481009">Kieli</translation>
 <translation id="5313326810920013265">Bluetooth-asetukset</translation>
@@ -345,6 +350,7 @@
 <translation id="6650933572246256093">Bluetooth-laite <ph name="DEVICE_NAME" /> pyytää lupaa laiteparin muodostamiseen. Anna tämä avain kyseisellä laitteella: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">Salasana</translation>
 <translation id="6665545700722362599">Anna verkkosivustoille, sovelluksille ja laajennuksille oikeus käyttää sijaintipalveluita, laitteen mikrofonia, kameraa ja muita ominaisuuksia</translation>
+<translation id="6670153871843998651">Pöytä 3</translation>
 <translation id="6691659475504239918">Haku + vaihto + H</translation>
 <translation id="6696025732084565524">Irrotettavaan näppäimistöösi täytyy asentaa kriittinen päivitys</translation>
 <translation id="6700713906295497288">IME-valikkopainike</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index 3de2427..8c1c557 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">I-DISMISS</translation>
 <translation id="1537254971476575106">Fullscreen magnifier</translation>
 <translation id="15373452373711364">Malaking mouse cursor</translation>
+<translation id="1546492247443594934">Desk 2</translation>
 <translation id="1550523713251050646">Mag-click para sa higit pang mga opsyon</translation>
 <translation id="1570871743947603115">I-toggle ang Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">I-access ang lahat ng iyong aktibidad sa session na ito</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">Sa ilalim</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation>
 <translation id="3126069444801937830">I-restart upang mag-update</translation>
+<translation id="3139942575505304791">Desk 1</translation>
 <translation id="315116470104423982">Data sa mobile</translation>
 <translation id="3151786313568798007">Oryentasyon</translation>
+<translation id="3152934361839663679">Nakakonekta ang iyong device sa maximum na dami ng mga monitor, kaya nadiskonekta ang isa sa mga screen.</translation>
 <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="3154351730702813399">Maaaring subaybayan ng admin ng device ang iyong aktibidad sa pag-browse.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Nakakonekta sa isang device}one{Nakakonekta sa # device}other{Nakakonekta sa # na device}}</translation>
@@ -232,6 +235,7 @@
 <translation id="4628757576491864469">Mga Device</translation>
 <translation id="4659419629803378708">Na-enable ang ChromeVox</translation>
 <translation id="4696813013609194136">I-unlock ang device gamit ang parent code</translation>
+<translation id="4731797938093519117">Pangunahing access</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4774338217796918551">Bumalik nang <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Password para sa <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -257,6 +261,7 @@
 <translation id="5207949376430453814">I-highlight ang text caret</translation>
 <translation id="5222676887888702881">Mag-sign out</translation>
 <translation id="523505283826916779">Mga setting ng accessibility</translation>
+<translation id="5260676007519551770">Desk 4</translation>
 <translation id="5283198616748585639">Magdagdag ng 1 minuto</translation>
 <translation id="5302048478445481009">Wika</translation>
 <translation id="5313326810920013265">Mga setting ng Bluetooth</translation>
@@ -342,6 +347,7 @@
 <translation id="6650933572246256093">Gusto ng bluetooth device na "<ph name="DEVICE_NAME" />" ng pahintulot na magpares. Pakilagay ang passkey na ito sa device na iyon: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">Password</translation>
 <translation id="6665545700722362599">Nagbibigay ng pahintulot sa mga website, app, at extension na gumamit ng mga serbisyo ng lokasyon, gamitin ang mikropono, camera, o iba pang feature ng device</translation>
+<translation id="6670153871843998651">Desk 3</translation>
 <translation id="6691659475504239918">Search+Shift+H</translation>
 <translation id="6696025732084565524">Nangangailangan ng mahalagang update ang iyong naaalis na keyboard</translation>
 <translation id="6700713906295497288">Button ng menu ng IME</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index 52bc0dc..acc08bc 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">IGNORER</translation>
 <translation id="1537254971476575106">Loupe plein écran</translation>
 <translation id="15373452373711364">Grand curseur</translation>
+<translation id="1546492247443594934">Bureau 2</translation>
 <translation id="1550523713251050646">Cliquez pour obtenir plus d'options.</translation>
 <translation id="1570871743947603115">Activer/Désactiver le Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">Accéder à toutes vos activités dans cette session</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">Bas</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation>
 <translation id="3126069444801937830">Redémarrer pour mettre à jour</translation>
+<translation id="3139942575505304791">Bureau 1</translation>
 <translation id="315116470104423982">Données mobiles</translation>
 <translation id="3151786313568798007">Orientation</translation>
+<translation id="3152934361839663679">Votre appareil est connecté au nombre maximal d'écran. Vous devez donc déconnecter l'un des écrans.</translation>
 <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="3154351730702813399">L'administrateur de cet appareil peut contrôler votre activité de navigation.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Connecté à un appareil}one{Connecté à # appareil}other{Connecté à # appareils}}</translation>
@@ -233,6 +236,7 @@
 <translation id="4628757576491864469">Appareils</translation>
 <translation id="4659419629803378708">ChromeVox activé</translation>
 <translation id="4696813013609194136">Déverrouiller l'appareil avec le code parental</translation>
+<translation id="4731797938093519117">Accès parental</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4774338217796918551">Revenez demain à <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Mot de passe de <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -258,6 +262,7 @@
 <translation id="5207949376430453814">Mettre le curseur de texte en surbrillance</translation>
 <translation id="5222676887888702881">Déconnexion</translation>
 <translation id="523505283826916779">Paramètres d'accessibilité</translation>
+<translation id="5260676007519551770">Bureau 4</translation>
 <translation id="5283198616748585639">Ajouter une minute</translation>
 <translation id="5302048478445481009">Langue</translation>
 <translation id="5313326810920013265">Paramètres Bluetooth</translation>
@@ -343,6 +348,7 @@
 <translation id="6650933572246256093">L'appareil Bluetooth "<ph name="DEVICE_NAME" />" demande l'autorisation de s'associer. Veuillez saisir le code d'authentification suivant sur l'appareil : <ph name="PASSKEY" />.</translation>
 <translation id="6657585470893396449">Mot de passe</translation>
 <translation id="6665545700722362599">Autoriser les sites Web, les applications et les extensions à utiliser les services de localisation ou le micro, l'appareil photo ou d'autres fonctionnalités de l'appareil</translation>
+<translation id="6670153871843998651">Bureau 3</translation>
 <translation id="6691659475504239918">Recherche+Maj+H</translation>
 <translation id="6696025732084565524">Votre clavier amovible nécessite une mise à jour critique</translation>
 <translation id="6700713906295497288">Bouton de menu IME</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb
index 468a220..0f6e50d 100644
--- a/ash/strings/ash_strings_gu.xtb
+++ b/ash/strings/ash_strings_gu.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">ઉપકરણો</translation>
 <translation id="4659419629803378708">ChromeVox સક્ષમ કર્યું</translation>
 <translation id="4696813013609194136">માતાપિતાના કોડ વડે ડિવાઇસને અનલૉક કરો</translation>
+<translation id="4731797938093519117">માતાપિતા માટે ઍક્સેસ</translation>
 <translation id="4734965478015604180">આડી</translation>
 <translation id="4774338217796918551">આવતી કાલે <ph name="COME_BACK_TIME" /> વાગ્યે પાછા આવજો.</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> માટેનો પાસવર્ડ </translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index 87e6524..8e941b7 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -233,6 +233,7 @@
 <translation id="4628757576491864469">डिवाइस</translation>
 <translation id="4659419629803378708">ChromeVox सक्षम है</translation>
 <translation id="4696813013609194136">माता-पिता के कोड से डिवाइस अनलॉक करें</translation>
+<translation id="4731797938093519117">अभिभावक एक्सेस</translation>
 <translation id="4734965478015604180">क्षैतिज</translation>
 <translation id="4774338217796918551">कल <ph name="COME_BACK_TIME" /> बजे फिर से देखें.</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> के लिए पासवर्ड</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb
index 0e965145..f90be2d 100644
--- a/ash/strings/ash_strings_hr.xtb
+++ b/ash/strings/ash_strings_hr.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Uređaji</translation>
 <translation id="4659419629803378708">ChromeVox omogućen</translation>
 <translation id="4696813013609194136">Otključajte uređaj roditeljskim kodom</translation>
+<translation id="4731797938093519117">Roditeljski pristup</translation>
 <translation id="4734965478015604180">Vodoravno</translation>
 <translation id="4774338217796918551">Vrati se sutra u <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Zaporka za adresu <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb
index 57b0be04..7aa6811 100644
--- a/ash/strings/ash_strings_hu.xtb
+++ b/ash/strings/ash_strings_hu.xtb
@@ -236,6 +236,7 @@
 <translation id="4628757576491864469">Eszközök</translation>
 <translation id="4659419629803378708">ChromeVox bekapcsolva</translation>
 <translation id="4696813013609194136">Zárolás feloldása szülői kóddal</translation>
+<translation id="4731797938093519117">Szülői hozzáférés</translation>
 <translation id="4734965478015604180">Vízszintes</translation>
 <translation id="4774338217796918551">Térjen vissza holnap, ekkor: <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">A(z) <ph name="USER_EMAIL_ADDRESS" /> fiókhoz tartozó jelszó</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index eb77c9c..a5a3ddbf 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Perangkat</translation>
 <translation id="4659419629803378708">ChromeVox diaktifkan</translation>
 <translation id="4696813013609194136">Buka kunci perangkat dengan kode orang tua</translation>
+<translation id="4731797938093519117">Akses orang tua</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4774338217796918551">Gunakan lagi besok pukul <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Sandi untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb
index 2b113c2..1ebabc4 100644
--- a/ash/strings/ash_strings_it.xtb
+++ b/ash/strings/ash_strings_it.xtb
@@ -236,6 +236,7 @@
 <translation id="4628757576491864469">Dispositivi</translation>
 <translation id="4659419629803378708">ChromeVox attivato</translation>
 <translation id="4696813013609194136">Sblocca con codice genitore</translation>
+<translation id="4731797938093519117">Accesso genitore</translation>
 <translation id="4734965478015604180">Orizzontale</translation>
 <translation id="4774338217796918551">Puoi riprendere domani alle ore <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Password per <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index 37b62ce..d79d062 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">סגור</translation>
 <translation id="1537254971476575106">מגדיל למסך מלא</translation>
 <translation id="15373452373711364">סמן עכבר גדול</translation>
+<translation id="1546492247443594934">שולחן עבודה 2</translation>
 <translation id="1550523713251050646">לחץ לקבלת אפשרויות נוספות</translation>
 <translation id="1570871743947603115">‏הפעלה או השבתה של Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">גישה לכל הפעילות שלך בסשן הזה</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">תחתית</translation>
 <translation id="3105990244222795498">‏<ph name="DEVICE_NAME" />‏ (Bluetooth)</translation>
 <translation id="3126069444801937830">הפעל מחדש כדי לעדכן</translation>
+<translation id="3139942575505304791">שולחן עבודה 1</translation>
 <translation id="315116470104423982">נתוני נייד</translation>
 <translation id="3151786313568798007">כיוון</translation>
+<translation id="3152934361839663679">המכשיר מחובר למספר הצגים המרבי, ולכן אחד מהמסכים נותק.</translation>
 <translation id="3153444934357957346">אפשר לכלול עד <ph name="MULTI_PROFILE_USER_LIMIT" /> חשבונות בכניסה עם מספר חשבונות.</translation>
 <translation id="3154351730702813399">ייתכן שמנהל המכשיר עוקב אחרי פעילות הגלישה שלך.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{מחובר למכשיר אחד}two{מחובר ל-# מכשירים}many{מחובר ל-# מכשירים}other{מחובר ל-# מכשירים}}</translation>
@@ -232,6 +235,7 @@
 <translation id="4628757576491864469">מכשירים</translation>
 <translation id="4659419629803378708">‏ChromeVox הופעל</translation>
 <translation id="4696813013609194136">ביטול נעילת המכשיר באמצעות קוד הורה</translation>
+<translation id="4731797938093519117">גישת הורים</translation>
 <translation id="4734965478015604180">אופקי</translation>
 <translation id="4774338217796918551">אפשר לחזור מחר בשעה <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">סיסמה עבור <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -257,6 +261,7 @@
 <translation id="5207949376430453814">הדגשה של סמן הטקסט</translation>
 <translation id="5222676887888702881">יציאה</translation>
 <translation id="523505283826916779">הגדרות נגישות</translation>
+<translation id="5260676007519551770">שולחן עבודה 4</translation>
 <translation id="5283198616748585639">הוספת דקה</translation>
 <translation id="5302048478445481009">שפה</translation>
 <translation id="5313326810920013265">‏הגדרות Bluetooth</translation>
@@ -342,6 +347,7 @@
 <translation id="6650933572246256093">‏מכשיר ה-Bluetooth ‏"<ph name="DEVICE_NAME" />" מבקש הרשאה לביצוע התאמה. הזן את מפתח הסיסמה הבא במכשיר הזה: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">סיסמה</translation>
 <translation id="6665545700722362599">הענקת הרשאה לאתרים, לאפליקציות ולתוספים להשתמש בשירותי המיקום, במיקרופון של המכשיר, במצלמה או בתכונות אחרות.</translation>
+<translation id="6670153871843998651">שולחן עבודה 3</translation>
 <translation id="6691659475504239918">Search+Shift+H</translation>
 <translation id="6696025732084565524">המקלדת הניתנת לניתוק זקוקה לעדכון קריטי</translation>
 <translation id="6700713906295497288">‏לחצן תפריט IME</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index 1f3f230..4235ca7 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">デバイス</translation>
 <translation id="4659419629803378708">ChromeVox を有効にしました</translation>
 <translation id="4696813013609194136">保護者のコードでデバイスをロック解除</translation>
+<translation id="4731797938093519117">保護者によるアクセス</translation>
 <translation id="4734965478015604180">横</translation>
 <translation id="4774338217796918551">明日の <ph name="COME_BACK_TIME" /> になったら利用を再開できます。</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> のパスワード</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb
index 87f2a02..0a8d656 100644
--- a/ash/strings/ash_strings_kn.xtb
+++ b/ash/strings/ash_strings_kn.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">ಸಾಧನಗಳು</translation>
 <translation id="4659419629803378708">ChromeVox ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation>
 <translation id="4696813013609194136">ಪೋಷಕ ಕೋಡ್ ಬಳಸಿಕೊಂಡು ಸಾಧನವನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಿ</translation>
+<translation id="4731797938093519117">ಪೋಷಕ ಪ್ರವೇಶ ಬಟನ್‌</translation>
 <translation id="4734965478015604180">ಅಡ್ಡ</translation>
 <translation id="4774338217796918551">ನಾಳೆ <ph name="COME_BACK_TIME" /> ಸಮಯಕ್ಕೆ ಹಿಂತಿರುಗಿ.</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> ಗಾಗಿ ಪಾಸ್‌ವರ್ಡ್</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index f9d41a8..489158b 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">닫기</translation>
 <translation id="1537254971476575106">전체화면 돋보기</translation>
 <translation id="15373452373711364">큰 마우스 커서</translation>
+<translation id="1546492247443594934">데스크 2</translation>
 <translation id="1550523713251050646">더 많은 옵션을 확인하려면 클릭하세요.</translation>
 <translation id="1570871743947603115">블루투스를 전환합니다. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">이 세션의 모든 활동에 액세스</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">맨 아래</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" />(블루투스)</translation>
 <translation id="3126069444801937830">업데이트하려면 다시 시작</translation>
+<translation id="3139942575505304791">데스크 1</translation>
 <translation id="315116470104423982">모바일 데이터</translation>
 <translation id="3151786313568798007">방향</translation>
+<translation id="3152934361839663679">기기가 연결 가능한 최대 개수의 모니터에 연결되어 있으므로 스크린 중 하나가 연결 해제되었습니다.</translation>
 <translation id="3153444934357957346">멀티 로그인에는 계정을 <ph name="MULTI_PROFILE_USER_LIMIT" />개까지만 사용할 수 있습니다.</translation>
 <translation id="3154351730702813399">기기 관리자가 탐색 활동을 모니터링할 수 있습니다.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{기기 1개에 연결됨}other{기기 #개에 연결됨}}</translation>
@@ -232,6 +235,7 @@
 <translation id="4628757576491864469">기기</translation>
 <translation id="4659419629803378708">ChromeVox가 사용 설정됨</translation>
 <translation id="4696813013609194136">부모 코드로 기기 잠금 해제</translation>
+<translation id="4731797938093519117">부모 액세스</translation>
 <translation id="4734965478015604180">가로</translation>
 <translation id="4774338217796918551">내일 <ph name="COME_BACK_TIME" />에 다시 사용해 주세요.</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" />의 비밀번호</translation>
@@ -257,6 +261,7 @@
 <translation id="5207949376430453814">텍스트 캐럿 강조표시</translation>
 <translation id="5222676887888702881">로그아웃</translation>
 <translation id="523505283826916779">접근성 설정</translation>
+<translation id="5260676007519551770">데스크 4</translation>
 <translation id="5283198616748585639">1분 추가</translation>
 <translation id="5302048478445481009">언어</translation>
 <translation id="5313326810920013265">블루투스 설정</translation>
@@ -342,6 +347,7 @@
 <translation id="6650933572246256093">블루투스 기기 '<ph name="DEVICE_NAME" />'에서 페어링 허가를 요청합니다. 해당 기기에서 다음 패스키를 입력하세요. <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">비밀번호</translation>
 <translation id="6665545700722362599">웹사이트, 앱, 확장 프로그램에 위치 서비스, 기기의 마이크, 카메라 또는 기타 기능을 사용할 권한 부여</translation>
+<translation id="6670153871843998651">데스크 3</translation>
 <translation id="6691659475504239918">Search+Shift+H</translation>
 <translation id="6696025732084565524">분리식 키보드에 중요 업데이트 필요</translation>
 <translation id="6700713906295497288">IME 메뉴 버튼</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb
index ed8526a..ff53aecf 100644
--- a/ash/strings/ash_strings_lt.xtb
+++ b/ash/strings/ash_strings_lt.xtb
@@ -236,6 +236,7 @@
 <translation id="4628757576491864469">Įrenginiai</translation>
 <translation id="4659419629803378708">„ChromeVox“ įgalinta</translation>
 <translation id="4696813013609194136">Atrakinkite įrenginį naudodami tėvų kodą</translation>
+<translation id="4731797938093519117">Tėvų prieiga</translation>
 <translation id="4734965478015604180">Horizontaliai</translation>
 <translation id="4774338217796918551">Grįžkite rytoj <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> slaptažodis</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb
index a06bb34..4fc3a01 100644
--- a/ash/strings/ash_strings_lv.xtb
+++ b/ash/strings/ash_strings_lv.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Ierīces</translation>
 <translation id="4659419629803378708">ChromeVox iespējots</translation>
 <translation id="4696813013609194136">Ierīces atbloķēšana, ievadot vecāku kodu</translation>
+<translation id="4731797938093519117">Vecāku piekļuve</translation>
 <translation id="4734965478015604180">Horizontāli</translation>
 <translation id="4774338217796918551">Atgriezieties plkst. <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Parole e-pasta adresei <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index 92054061..8df12d9e 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">ഉപകരണങ്ങൾ</translation>
 <translation id="4659419629803378708">ChromeVox പ്രവർത്തനക്ഷമമാക്കി</translation>
 <translation id="4696813013609194136">രക്ഷാകർതൃ കോഡ് ഉപയോഗിച്ച് ഉപകരണം അൺലോക്ക് ചെയ്യുക</translation>
+<translation id="4731797938093519117">രക്ഷാകർതൃ ആക്‌സസ്</translation>
 <translation id="4734965478015604180">സമാന്തരം</translation>
 <translation id="4774338217796918551">നാളെ <ph name="COME_BACK_TIME" />-ന് തിരികെ വരിക.</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> എന്നതിനായുള്ള പാസ്‌വേഡ്</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index f911c56..f5bf11f 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">डिव्हाइसेस</translation>
 <translation id="4659419629803378708">ChromeVox चालू केले</translation>
 <translation id="4696813013609194136">पालक कोडने डिव्हाइस अनलॉक करा</translation>
+<translation id="4731797938093519117">पालक अ‍ॅक्सेस</translation>
 <translation id="4734965478015604180">आडवा</translation>
 <translation id="4774338217796918551"><ph name="COME_BACK_TIME" /> वाजता परत या.</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> साठी पासवर्ड</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb
index d9cfcaf..635d123 100644
--- a/ash/strings/ash_strings_ms.xtb
+++ b/ash/strings/ash_strings_ms.xtb
@@ -236,6 +236,7 @@
 <translation id="4628757576491864469">Peranti</translation>
 <translation id="4659419629803378708">ChromeVox didayakan</translation>
 <translation id="4696813013609194136">Buka kunci peranti menggunakan kod ibu bapa</translation>
+<translation id="4731797938093519117">Akses ibu bapa</translation>
 <translation id="4734965478015604180">Mendatar</translation>
 <translation id="4774338217796918551">Datang semula esok pada <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Kata laluan untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb
index 1447481..e6ab27be 100644
--- a/ash/strings/ash_strings_nl.xtb
+++ b/ash/strings/ash_strings_nl.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Apparaten</translation>
 <translation id="4659419629803378708">ChromeVox ingeschakeld</translation>
 <translation id="4696813013609194136">Apparaat ontgrendelen met oudercode</translation>
+<translation id="4731797938093519117">Toegang door ouders</translation>
 <translation id="4734965478015604180">Horizontaal</translation>
 <translation id="4774338217796918551">Kom morgen terug om <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Wachtwoord voor <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index bfabeff5..71f4452 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">AVVIS</translation>
 <translation id="1537254971476575106">Lupe for hele skjermen</translation>
 <translation id="15373452373711364">Stor markør</translation>
+<translation id="1546492247443594934">Skrivebord 2</translation>
 <translation id="1550523713251050646">Klikk for å se flere alternativer</translation>
 <translation id="1570871743947603115">Slå av/på Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">se all aktiviteten din i denne økten</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">Bunn</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation>
 <translation id="3126069444801937830">Start på nytt for å oppdatere</translation>
+<translation id="3139942575505304791">Skrivebord 1</translation>
 <translation id="315116470104423982">Mobildata</translation>
 <translation id="3151786313568798007">Retning</translation>
+<translation id="3152934361839663679">Enheten din er tilkoblet det maksimale antallet skjermer, så en av dem har blitt koblet fra.</translation>
 <translation id="3153444934357957346">Du kan bare ha opptil <ph name="MULTI_PROFILE_USER_LIMIT" /> kontoer i multipålogging.</translation>
 <translation id="3154351730702813399">Enhetsadministratoren kan overvåke surfeaktiviteten din.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Koblet til en enhet}other{Koblet til # enheter}}</translation>
@@ -232,6 +235,7 @@
 <translation id="4628757576491864469">Enheter</translation>
 <translation id="4659419629803378708">ChromeVox er slått på</translation>
 <translation id="4696813013609194136">Lås opp enheten med foreldrekode</translation>
+<translation id="4731797938093519117">Foreldretilgang</translation>
 <translation id="4734965478015604180">Horisontal</translation>
 <translation id="4774338217796918551">Kom tilbake i morgen <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Passord for <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -257,6 +261,7 @@
 <translation id="5207949376430453814">Fremhev tekstinnsettingspunktet</translation>
 <translation id="5222676887888702881">Logg av</translation>
 <translation id="523505283826916779">Tilgjengelighetsinnstillinger</translation>
+<translation id="5260676007519551770">Skrivebord 4</translation>
 <translation id="5283198616748585639">Legg til 1 min</translation>
 <translation id="5302048478445481009">Språk</translation>
 <translation id="5313326810920013265">Bluetooth-innstillinger</translation>
@@ -342,6 +347,7 @@
 <translation id="6650933572246256093">Bluetooth-enheten «<ph name="DEVICE_NAME" />» ber om tillatelse til å koble til. Skriv inn denne tilgangskoden på den aktuelle enheten: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">Passord</translation>
 <translation id="6665545700722362599">gi nettsteder, apper og utvidelser tillatelse til å bruke posisjonstjenester, enhetens mikrofon, kamera eller andre funksjoner</translation>
+<translation id="6670153871843998651">Skrivebord 3</translation>
 <translation id="6691659475504239918">Søk + Shift + H</translation>
 <translation id="6696025732084565524">Det avtakbare tastaturet trenger en kritisk oppdatering</translation>
 <translation id="6700713906295497288">IME-menyknappen</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index a9a23d5a..77bd195 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -236,6 +236,7 @@
 <translation id="4628757576491864469">Urządzenia</translation>
 <translation id="4659419629803378708">Włączono ChromeVox</translation>
 <translation id="4696813013609194136">Odblokuj urządzenie kodem rodzica</translation>
+<translation id="4731797938093519117">Dostęp rodzica</translation>
 <translation id="4734965478015604180">Orientacja pozioma</translation>
 <translation id="4774338217796918551">Możesz wrócić jutro o <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Hasło dla <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index bc74746..8d63ccd 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -236,6 +236,7 @@
 <translation id="4628757576491864469">Dispositivos</translation>
 <translation id="4659419629803378708">ChromeVox ativado</translation>
 <translation id="4696813013609194136">Desbloquear dispositivo usando o código de pai/mãe</translation>
+<translation id="4731797938093519117">Acesso de pai/mãe</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4774338217796918551">Volte amanhã, neste horário: <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Senha para <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb
index d4315260d..41accd3 100644
--- a/ash/strings/ash_strings_pt-PT.xtb
+++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Dispositivos</translation>
 <translation id="4659419629803378708">ChromeVox ativado</translation>
 <translation id="4696813013609194136">Desbloquear o dispositivo com o código parental</translation>
+<translation id="4731797938093519117">Acesso parental</translation>
 <translation id="4734965478015604180">Horizontal</translation>
 <translation id="4774338217796918551">Volte amanhã à(s) <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Palavra-passe para <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index b8e1a8c..a5659e8d 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Dispozitive</translation>
 <translation id="4659419629803378708">ChromeVox este activat</translation>
 <translation id="4696813013609194136">Deblochează dispozitivul cu codul părintelui</translation>
+<translation id="4731797938093519117">Acces pentru părinți</translation>
 <translation id="4734965478015604180">Orizontal</translation>
 <translation id="4774338217796918551">Revino mâine la <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Parolă pentru <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index 02471079..632595e 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Устройства</translation>
 <translation id="4659419629803378708">Функция ChromeVox включена</translation>
 <translation id="4696813013609194136">Требуется родительский код доступа</translation>
+<translation id="4731797938093519117">Родительский доступ</translation>
 <translation id="4734965478015604180">Горизонтальная ориентация</translation>
 <translation id="4774338217796918551">Возвращайтесь завтра в <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Пароль для адреса электронной почты <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb
index d518adf8..9e7a2ac 100644
--- a/ash/strings/ash_strings_sk.xtb
+++ b/ash/strings/ash_strings_sk.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Zariadenia</translation>
 <translation id="4659419629803378708">Funkcia ChromeVox je povolená</translation>
 <translation id="4696813013609194136">Odomknutie zariadenia kódom rodiča</translation>
+<translation id="4731797938093519117">Rodičovský prístup</translation>
 <translation id="4734965478015604180">Na šírku</translation>
 <translation id="4774338217796918551">Vráť sa zajtra o <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Heslo pre účet <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb
index de8dc62..cdf8ce3 100644
--- a/ash/strings/ash_strings_sl.xtb
+++ b/ash/strings/ash_strings_sl.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Naprave</translation>
 <translation id="4659419629803378708">Omogočen je ChromeVox</translation>
 <translation id="4696813013609194136">Odklepanje naprave s kodo starša</translation>
+<translation id="4731797938093519117">Starševski dostop</translation>
 <translation id="4734965478015604180">Vodoravno</translation>
 <translation id="4774338217796918551">Vrni se jutri ob <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Geslo za <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb
index 3514aca..01ca998d 100644
--- a/ash/strings/ash_strings_sr.xtb
+++ b/ash/strings/ash_strings_sr.xtb
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Уређаји</translation>
 <translation id="4659419629803378708">ChromeVox је омогућен</translation>
 <translation id="4696813013609194136">Откључајте уређај помоћу кода родитеља</translation>
+<translation id="4731797938093519117">Родитељски приступ</translation>
 <translation id="4734965478015604180">Хоризонтално</translation>
 <translation id="4774338217796918551">Вратите се сутра у <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Лозинка за <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb
index d69bee4..e765732 100644
--- a/ash/strings/ash_strings_sv.xtb
+++ b/ash/strings/ash_strings_sv.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">IGNORERA</translation>
 <translation id="1537254971476575106">Helskärmsförstorare</translation>
 <translation id="15373452373711364">Stor muspekare</translation>
+<translation id="1546492247443594934">Skrivbord 2</translation>
 <translation id="1550523713251050646">Klicka här för fler alternativ</translation>
 <translation id="1570871743947603115">Aktivera och inaktivera Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">Få tillgång till all aktivitet i sessionen</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">Nederst</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation>
 <translation id="3126069444801937830">Starta om för att uppdatera</translation>
+<translation id="3139942575505304791">Skrivbord 1</translation>
 <translation id="315116470104423982">Mobildata</translation>
 <translation id="3151786313568798007">Orientering</translation>
+<translation id="3152934361839663679">Enheten är ansluten till maximalt antal bildskärmar. En av skärmarna har därför kopplats från.</translation>
 <translation id="3153444934357957346">Du kan högst använda <ph name="MULTI_PROFILE_USER_LIMIT" /> konton för multiinloggning.</translation>
 <translation id="3154351730702813399">Enhetsadministratören kan övervaka din webbaktivitet.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Ansluten till en enhet}other{Ansluten till # enheter}}</translation>
@@ -232,6 +235,7 @@
 <translation id="4628757576491864469">Enheter</translation>
 <translation id="4659419629803378708">ChromeVox har aktiverats</translation>
 <translation id="4696813013609194136">Lås upp enheten med föräldrakod</translation>
+<translation id="4731797938093519117">Föräldraåtkomst</translation>
 <translation id="4734965478015604180">Horisontell</translation>
 <translation id="4774338217796918551">Prova igen i morgon klockan <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Lösenord för <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -257,6 +261,7 @@
 <translation id="5207949376430453814">Markera textmarkören</translation>
 <translation id="5222676887888702881">Logga ut</translation>
 <translation id="523505283826916779">Inställningar för tillgänglighet</translation>
+<translation id="5260676007519551770">Skrivbord 4</translation>
 <translation id="5283198616748585639">Lägg till en min</translation>
 <translation id="5302048478445481009">Språk</translation>
 <translation id="5313326810920013265">Bluetooth-inställningar</translation>
@@ -342,6 +347,7 @@
 <translation id="6650933572246256093">Bluetooth-enheten <ph name="DEVICE_NAME" /> har begärt tillstånd för koppling. Ange denna lösenordsnyckel på den enheten: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">Lösenord</translation>
 <translation id="6665545700722362599">Ge webbplatser, appar och tillägg behörighet att använda platstjänster, enhetens mikrofon, kamera eller andra funktioner</translation>
+<translation id="6670153871843998651">Skrivbord 3</translation>
 <translation id="6691659475504239918">Sök+Skift+H</translation>
 <translation id="6696025732084565524">Det behövs en viktig uppdatering till ditt frånkopplingsbara tangentbord</translation>
 <translation id="6700713906295497288">IME-menyknapp</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index ccb7603..aef12cdec 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -39,7 +39,7 @@
 <translation id="1525508553941733066">ONDOA</translation>
 <translation id="1537254971476575106">Kikuzaji cha skrini nzima</translation>
 <translation id="15373452373711364">Kishale kikubwa cha kipanya</translation>
-<translation id="1546492247443594934">Kijipicha cha 2</translation>
+<translation id="1546492247443594934">Eneokazi la 2</translation>
 <translation id="1550523713251050646">Bofya ili upate chaguo zaidi</translation>
 <translation id="1570871743947603115">Washa au uzime Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">Fikia shughuli zako zote katika kipindi hiki</translation>
@@ -144,7 +144,7 @@
 <translation id="3087734570205094154">Chini</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation>
 <translation id="3126069444801937830">Anzisha upya ili kusasisha</translation>
-<translation id="3139942575505304791">Kijipicha cha 1</translation>
+<translation id="3139942575505304791">Eneokazi la 1</translation>
 <translation id="315116470104423982">Data ya mtandao wa simu</translation>
 <translation id="3151786313568798007">Mkao</translation>
 <translation id="3152934361839663679">Kifaa chako kimeunganishwa kwenye idadi ya juu inayoruhusiwa ya skrini, kwa hivyo tumeondoa mojawapo ya skrini zako.</translation>
@@ -235,6 +235,7 @@
 <translation id="4628757576491864469">Vifaa</translation>
 <translation id="4659419629803378708">ChromeVox imewashwa</translation>
 <translation id="4696813013609194136">Fungua kifaa ukitumia msimbo wa mzazi</translation>
+<translation id="4731797938093519117">Idhini ya mzazi</translation>
 <translation id="4734965478015604180">Kimlalo</translation>
 <translation id="4774338217796918551">Rejea kesho saa <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Nenosiri la <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -260,7 +261,7 @@
 <translation id="5207949376430453814">Angazia kareti ya maandishi</translation>
 <translation id="5222676887888702881">Ondoka</translation>
 <translation id="523505283826916779">Mipangilio ya ufikiaji</translation>
-<translation id="5260676007519551770">Kijipicha cha 4</translation>
+<translation id="5260676007519551770">Eneokazi la 4</translation>
 <translation id="5283198616748585639">Ongeza dakika 1</translation>
 <translation id="5302048478445481009">Lugha</translation>
 <translation id="5313326810920013265">Mipangilio ya Bluetooth</translation>
@@ -346,7 +347,7 @@
 <translation id="6650933572246256093">Kifaa cha Bluetooth cha "<ph name="DEVICE_NAME" />" kinaomba idhini ya kuoanisha. Tafadhali weka nenosiri hili kwenye kifaa hicho: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">Nenosiri</translation>
 <translation id="6665545700722362599">Zipe tovuti, programu na viendelezi ruhusa za kutumia huduma za mahali, maikrofoni, kamera na vipengele vingine vya kifaa</translation>
-<translation id="6670153871843998651">Kijipicha cha 3</translation>
+<translation id="6670153871843998651">Eneokazi la 3</translation>
 <translation id="6691659475504239918">Search+Shift+H</translation>
 <translation id="6696025732084565524">Kibodi unayoweza kutenganisha inahitaji sasisho muhimu</translation>
 <translation id="6700713906295497288">Kitufe cha menyu ya IME</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index af91431..13d4ffd0 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">நிராகரி</translation>
 <translation id="1537254971476575106">முழுத்திரைப் பெரிதாக்கி</translation>
 <translation id="15373452373711364">பெரிய மவுஸ் இடஞ்சுட்டி</translation>
+<translation id="1546492247443594934">மேசை 2</translation>
 <translation id="1550523713251050646">மேலும் விருப்பங்களுக்குக் கிளிக் செய்யவும்</translation>
 <translation id="1570871743947603115">புளூடூத்தை நிலைமாற்றும். <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">இந்த அமர்விலுள்ள உங்கள் அனைத்துச் செயல்பாடுகளையும் அணுகுதல்</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">கீழே</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (புளூடூத்)</translation>
 <translation id="3126069444801937830">புதுப்பிக்க மீண்டும் தொடங்குக</translation>
+<translation id="3139942575505304791">மேசை 1</translation>
 <translation id="315116470104423982">மொபைல் டேட்டா</translation>
 <translation id="3151786313568798007">திசையமைப்பு</translation>
+<translation id="3152934361839663679">உங்கள் சாதனம் அதிகபட்ச எண்ணிக்கையிலான மானிட்டர்களுடன் இணைக்கப்பட்டுள்ளது, எனவே அவற்றில் ஒரு மானிட்டரின் இணைப்பை நீக்க வேண்டும்.</translation>
 <translation id="3153444934357957346">பல உள்நுழைவில் <ph name="MULTI_PROFILE_USER_LIMIT" /> கணக்குகள் வரை மட்டுமே வைத்திருக்கலாம்.</translation>
 <translation id="3154351730702813399">சாதன நிர்வாகி உங்கள் உலாவல் செயல்பாட்டைக் கண்காணிக்கக்கூடும்.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{ஒரு சாதனத்துடன் இணைக்கப்பட்டுள்ளது}other{# சாதனங்களுடன் இணைக்கப்பட்டுள்ளது}}</translation>
@@ -232,6 +235,7 @@
 <translation id="4628757576491864469">சாதனங்கள்</translation>
 <translation id="4659419629803378708">ChromeVox இயக்கப்பட்டது</translation>
 <translation id="4696813013609194136">பெற்றோர் குறியீட்டின் மூலம் சாதனத்தை திறத்தல்</translation>
+<translation id="4731797938093519117">பெற்றோர் அணுகல்</translation>
 <translation id="4734965478015604180">கிடைமட்டம்</translation>
 <translation id="4774338217796918551">நாளை <ph name="COME_BACK_TIME" />க்கு சாதனத்தை மீண்டும் பயன்படுத்தலாம்.</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> க்கான கடவுச்சொல்</translation>
@@ -257,6 +261,7 @@
 <translation id="5207949376430453814">உரைச் சுட்டியைத் தனிப்படுத்து</translation>
 <translation id="5222676887888702881">வெளியேறு</translation>
 <translation id="523505283826916779">அணுகல்தன்மை அமைப்புகள்</translation>
+<translation id="5260676007519551770">மேசை 4</translation>
 <translation id="5283198616748585639">1 நிமிடத்தைச் சேர்</translation>
 <translation id="5302048478445481009">மொழி</translation>
 <translation id="5313326810920013265">புளூடூத் அமைப்புகள்</translation>
@@ -342,6 +347,7 @@
 <translation id="6650933572246256093">புளூடூத் சாதனம் "<ph name="DEVICE_NAME" />" இணைப்பதற்கான அனுமதியை விரும்புகிறது. அந்தச் சாதனத்தில் இந்தக் கடவுச்சொல்லை உள்ளிடவும்: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">கடவுச்சொல்</translation>
 <translation id="6665545700722362599">இருப்பிடச் சேவைகள், சாதனத்தின் மைக்ரோஃபோன், கேமரா அல்லது பிற அம்சங்களை இணையதளங்கள், ஆப்ஸ், நீட்டிப்புகள் ஆகியவை பயன்படுத்த அனுமதி அளித்தல்</translation>
+<translation id="6670153871843998651">மேசை 3</translation>
 <translation id="6691659475504239918">தேடல்+Shift+H</translation>
 <translation id="6696025732084565524">உங்கள் அகற்றத்தக்க விசைப்பலகைக்கு முக்கியப் புதுப்பிப்பு வேண்டும்</translation>
 <translation id="6700713906295497288">IME மெனு பொத்தான்</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index 019146f2..c61273b 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">తీసివేయి</translation>
 <translation id="1537254971476575106">పూర్తి స్క్రీన్‌ మాగ్నిఫైయర్</translation>
 <translation id="15373452373711364">పెద్ద మౌస్ కర్సర్</translation>
+<translation id="1546492247443594934">డెస్క్ 2</translation>
 <translation id="1550523713251050646">మరిన్ని ఎంపికల కోసం క్లిక్ చేయండి</translation>
 <translation id="1570871743947603115">బ్లూటూత్‌ను టోగుల్ చేయండి. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">ఈ సెషన్‌లో మీ మొత్తం కార్యకలాపాన్ని యాక్సెస్ చేయండి</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">దిగువ</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (బ్లూటూత్)</translation>
 <translation id="3126069444801937830">అప్‌డేట్ చేయ‌డానికి పునఃప్రారంభించండి</translation>
+<translation id="3139942575505304791">డెస్క్ 1</translation>
 <translation id="315116470104423982">మొబైల్ డేటా</translation>
 <translation id="3151786313568798007">దృగ్విన్యాసం</translation>
+<translation id="3152934361839663679">మీ పరికరం గరిష్ట సంఖ్యలో మానిటర్‌లకు కనెక్ట్ చేయబడింది, కనుక స్క్రీన్‌లలో ఒకటి డిస్‌కనెక్ట్ చేయబడింది.</translation>
 <translation id="3153444934357957346">బహుళ సైన్-ఇన్‌లో గరిష్టంగా <ph name="MULTI_PROFILE_USER_LIMIT" /> ఖాతాలు మాత్రమే ఉండవచ్చు.</translation>
 <translation id="3154351730702813399">పరికర నిర్వాహకుడు మీ బ్రౌజింగ్ కార్యకలాపాన్ని పర్యవేక్షించవచ్చు.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{పరికరానికి కనెక్ట్ చేయబడింది}other{# పరికరాలకు కనెక్ట్ చేయబడింది}}</translation>
@@ -233,6 +236,7 @@
 <translation id="4628757576491864469">పరికరాలు</translation>
 <translation id="4659419629803378708">ChromeVox ప్రారంభించబడింది</translation>
 <translation id="4696813013609194136">తల్లి/తండ్రి కోడ్‌తో పరికరాన్ని అన్‌లాక్ చేయండి</translation>
+<translation id="4731797938093519117">తల్లి/తండ్రి యాక్సెస్</translation>
 <translation id="4734965478015604180">అడ్డంగా ఉంది</translation>
 <translation id="4774338217796918551">రేపు <ph name="COME_BACK_TIME" />కి తిరిగి రండి.</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> కోసం పాస్‌వర్డ్</translation>
@@ -258,6 +262,7 @@
 <translation id="5207949376430453814">వచన కర్సర్ గుర్తును హైలైట్ చేయి</translation>
 <translation id="5222676887888702881">సైన్ ఔట్</translation>
 <translation id="523505283826916779">యాక్సెస్‌ సెట్టింగ్‌లు</translation>
+<translation id="5260676007519551770">డెస్క్ 4</translation>
 <translation id="5283198616748585639">1 నిమి జోడించు</translation>
 <translation id="5302048478445481009">భాష</translation>
 <translation id="5313326810920013265">బ్లూటూత్ సెట్టింగ్‌లు</translation>
@@ -343,6 +348,7 @@
 <translation id="6650933572246256093">బ్లూటూత్ పరికరం "<ph name="DEVICE_NAME" />" జత కావడానికి అనుమతి కోరుతోంది. దయచేసి ఆ పరికరంలో ఈ పాస్‌కీని నమోదు చేయండి: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">పాస్‌వర్డ్</translation>
 <translation id="6665545700722362599">స్థాన సేవలు, పరికర మైక్రోఫోన్, కెమెరా లేదా ఇతర ఫీచర్‌లను ఉపయోగించడానికి వెబ్‌సైట్‌లు, యాప్‌లు, ఎక్స్‌టెన్షన్‌లను అనుమతించండి</translation>
+<translation id="6670153871843998651">డెస్క్ 3</translation>
 <translation id="6691659475504239918">Search+Shift+H</translation>
 <translation id="6696025732084565524">మీ తీసివేయగల కీబోర్డ్‌కి ఒక ముఖ్యమైన అప్‌డేట్ అవసరం</translation>
 <translation id="6700713906295497288">IME మెను బటన్</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 25f4efc..990e4c39 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">ปิด</translation>
 <translation id="1537254971476575106">แว่นขยายทั้งหน้าจอ</translation>
 <translation id="15373452373711364">เคอร์เซอร์เมาส์ขนาดใหญ่</translation>
+<translation id="1546492247443594934">โต๊ะที่ 2</translation>
 <translation id="1550523713251050646">คลิกเพื่อดูตัวเลือกเพิ่มเติม</translation>
 <translation id="1570871743947603115">เปิด/ปิดบลูทูธ <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">เข้าถึงกิจกรรมทั้งหมดของคุณในเซสชันนี้</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">ด้านล่าง</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (บลูทูธ)</translation>
 <translation id="3126069444801937830">รีสตาร์ทเพื่ออัปเดต</translation>
+<translation id="3139942575505304791">โต๊ะที่ 1</translation>
 <translation id="315116470104423982">เน็ตมือถือ</translation>
 <translation id="3151786313568798007">การวางแนว</translation>
+<translation id="3152934361839663679">อุปกรณ์เชื่อมต่ออยู่กับหน้าจอครบตามจำนวนสูงสุดที่อนุญาต จึงมีการยกเลิกการเชื่อมต่อหน้าจอหนึ่ง</translation>
 <translation id="3153444934357957346">คุณมีบัญชีได้สูงสุด <ph name="MULTI_PROFILE_USER_LIMIT" /> บัญชีในการลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชี</translation>
 <translation id="3154351730702813399">ผู้ดูแลระบบของอุปกรณ์อาจตรวจสอบกิจกรรมการท่องเว็บของคุณ</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{เชื่อมต่ออุปกรณ์แล้ว 1 เครื่อง}other{เชื่อมต่ออุปกรณ์แล้ว # เครื่อง}}</translation>
@@ -233,6 +236,7 @@
 <translation id="4628757576491864469">อุปกรณ์</translation>
 <translation id="4659419629803378708">เปิดใช้ ChromeVox แล้ว</translation>
 <translation id="4696813013609194136">ปลดล็อกอุปกรณ์ด้วยรหัสของผู้ปกครอง</translation>
+<translation id="4731797938093519117">การเข้าถึงของผู้ปกครอง</translation>
 <translation id="4734965478015604180">แนวนอน</translation>
 <translation id="4774338217796918551">ใช้ได้อีกครั้งพรุ่งนี้ เวลา <ph name="COME_BACK_TIME" /></translation>
 <translation id="4776917500594043016">รหัสผ่านของ <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -258,6 +262,7 @@
 <translation id="5207949376430453814">ไฮไลต์เครื่องหมาย Caret ของข้อความ</translation>
 <translation id="5222676887888702881">ออกจากระบบ</translation>
 <translation id="523505283826916779">การตั้งค่าสำหรับการเข้าถึง</translation>
+<translation id="5260676007519551770">โต๊ะที่ 4</translation>
 <translation id="5283198616748585639">เพิ่ม 1 นาที</translation>
 <translation id="5302048478445481009">ภาษา </translation>
 <translation id="5313326810920013265">การตั้งค่าบลูทูธ</translation>
@@ -343,6 +348,7 @@
 <translation id="6650933572246256093">อุปกรณ์บลูทูธ "<ph name="DEVICE_NAME" />" ต้องการสิทธิ์ในการจับคู่ โปรดป้อนรหัสผ่านนี้บนอุปกรณ์นั้น: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">รหัสผ่าน</translation>
 <translation id="6665545700722362599">ให้สิทธิ์เว็บไซต์ แอป และส่วนขยายเพื่อใช้บริการตำแหน่ง ไมโครโฟนของอุปกรณ์ กล้อง หรือฟีเจอร์อื่นๆ</translation>
+<translation id="6670153871843998651">โต๊ะที่ 3</translation>
 <translation id="6691659475504239918">Search+Shift+H</translation>
 <translation id="6696025732084565524">แป้มพิมพ์ที่ถอดได้ต้องได้รับอัปเดตที่สำคัญ</translation>
 <translation id="6700713906295497288">ปุ่มเมนู IME</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index 0983e68..d768ddab 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">KAPAT</translation>
 <translation id="1537254971476575106">Tam ekran büyüteci</translation>
 <translation id="15373452373711364">Büyük fare imleci</translation>
+<translation id="1546492247443594934">Çalışma Masası 2</translation>
 <translation id="1550523713251050646">Daha fazla seçenek için tıklayın</translation>
 <translation id="1570871743947603115">Bluetooth'u aç/kapat. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">Bu oturumdaki tüm etkinliğinize erişme</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">Alt</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation>
 <translation id="3126069444801937830">Güncellemek için yeniden başlat</translation>
+<translation id="3139942575505304791">Çalışma Masası 1</translation>
 <translation id="315116470104423982">Mobil veriler</translation>
 <translation id="3151786313568798007">Yön</translation>
+<translation id="3152934361839663679">Cihazınız maksimum sayıda monitöre bağlı olduğundan ekranlardan birinin bağlantısı kesildi.</translation>
 <translation id="3153444934357957346">Çoklu oturum açmada en fazla <ph name="MULTI_PROFILE_USER_LIMIT" /> hesabınız olabilir.</translation>
 <translation id="3154351730702813399">Cihaz yöneticisi göz atma etkinliğinizi izleyebilir.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Bir cihaza bağlı}other{# cihaza bağlı}}</translation>
@@ -232,6 +235,7 @@
 <translation id="4628757576491864469">Cihazlar</translation>
 <translation id="4659419629803378708">ChromeVox etkinleştirildi</translation>
 <translation id="4696813013609194136">Kilidi ebeveyn koduyla açın</translation>
+<translation id="4731797938093519117">Ebeveyn erişimi</translation>
 <translation id="4734965478015604180">Yatay</translation>
 <translation id="4774338217796918551">Saat <ph name="COME_BACK_TIME" /> olduğunda geri gelin.</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> için şifre</translation>
@@ -257,6 +261,7 @@
 <translation id="5207949376430453814">Metin imlecini vurgula</translation>
 <translation id="5222676887888702881">Çıkış</translation>
 <translation id="523505283826916779">Erişilebilirlik ayarları</translation>
+<translation id="5260676007519551770">Çalışma Masası 4</translation>
 <translation id="5283198616748585639">1 dk ekle</translation>
 <translation id="5302048478445481009">Dil</translation>
 <translation id="5313326810920013265">Bluetooth ayarları</translation>
@@ -343,6 +348,7 @@
 <translation id="6650933572246256093">"<ph name="DEVICE_NAME" />" adlı Bluetooth cihaz eşleme izni istiyor. Lütfen söz konusu cihazda bu parolayı girin: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">Şifre</translation>
 <translation id="6665545700722362599">Web sitelerine, uygulamalara ve uzantılara konum hizmetlerini, cihazın mikrofonunu, kamerasını ve diğer özelliklerini kullanma izni verme</translation>
+<translation id="6670153871843998651">Çalışma Masası 3</translation>
 <translation id="6691659475504239918">Arama+Üst Karakter+H</translation>
 <translation id="6696025732084565524">Çıkarılabilir klavyenizde kritik bir güncelleme yapılması gerekiyor</translation>
 <translation id="6700713906295497288">IME menü düğmesi</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb
index d587837..2596589 100644
--- a/ash/strings/ash_strings_uk.xtb
+++ b/ash/strings/ash_strings_uk.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">ЗАКРИТИ</translation>
 <translation id="1537254971476575106">Лупа для всього екрана</translation>
 <translation id="15373452373711364">Великий курсор миші</translation>
+<translation id="1546492247443594934">Робочий стіл 2</translation>
 <translation id="1550523713251050646">Натисніть, щоб побачити більше опцій</translation>
 <translation id="1570871743947603115">Увімкнути/вимкнути Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">мати доступ до всіх ваших дій у цьому сеансі</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">Низ</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation>
 <translation id="3126069444801937830">Перезапустіть, щоб оновити</translation>
+<translation id="3139942575505304791">Робочий стіл 1</translation>
 <translation id="315116470104423982">Мобільне передавання даних</translation>
 <translation id="3151786313568798007">Орієнтація</translation>
+<translation id="3152934361839663679">До пристрою підключено максимально можливу кількість моніторів, тому один екран відключено.</translation>
 <translation id="3153444934357957346">Максимальна кількість паралельних входів в обліковий запис: <ph name="MULTI_PROFILE_USER_LIMIT" />.</translation>
 <translation id="3154351730702813399">Адміністратор пристрою може відстежувати дані веб-перегляду.</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Під’єднано до пристрою}one{Під’єднано до # пристрою}few{Під’єднано до # пристроїв}many{Під’єднано до # пристроїв}other{Під’єднано до # пристрою}}</translation>
@@ -232,6 +235,7 @@
 <translation id="4628757576491864469">Пристрої</translation>
 <translation id="4659419629803378708">ChromeVox увімкнено</translation>
 <translation id="4696813013609194136">Введіть код доступу батьків</translation>
+<translation id="4731797938093519117">Батьківський доступ</translation>
 <translation id="4734965478015604180">Горизонтально</translation>
 <translation id="4774338217796918551">Поверніться завтра о <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Пароль користувача  <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -257,6 +261,7 @@
 <translation id="5207949376430453814">Підсвічувати місце введення тексту</translation>
 <translation id="5222676887888702881">Вийти</translation>
 <translation id="523505283826916779">Налаштування доступності</translation>
+<translation id="5260676007519551770">Робочий стіл 4</translation>
 <translation id="5283198616748585639">Додати 1 хв</translation>
 <translation id="5302048478445481009">Мова</translation>
 <translation id="5313326810920013265">Налаштування Bluetooth</translation>
@@ -342,6 +347,7 @@
 <translation id="6650933572246256093">Пристрою Bluetooth "<ph name="DEVICE_NAME" />" потрібен дозвіл на підключення. Введіть на пристрої цей ключ доступу: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">Пароль</translation>
 <translation id="6665545700722362599">надавати веб-сайтам, додаткам і розширенням дозвіл використовувати служби локації, мікрофон, камеру й інші функції пристрою;</translation>
+<translation id="6670153871843998651">Робочий стіл 3</translation>
 <translation id="6691659475504239918">Search+Shift+H</translation>
 <translation id="6696025732084565524">Змінну клавіатуру потрібно оновити</translation>
 <translation id="6700713906295497288">Кнопка меню IME</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb
index 59a94ada..d0dc413f 100644
--- a/ash/strings/ash_strings_vi.xtb
+++ b/ash/strings/ash_strings_vi.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">LOẠI BỎ</translation>
 <translation id="1537254971476575106">Phóng to toàn bộ màn hình</translation>
 <translation id="15373452373711364">Con trỏ chuột lớn</translation>
+<translation id="1546492247443594934">Không gian làm việc 2</translation>
 <translation id="1550523713251050646">Nhấp để xem các tùy chọn khác</translation>
 <translation id="1570871743947603115">Bật/tắt Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">Truy cập vào tất cả hoạt động của bạn trong phiên này</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">Bên dưới</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation>
 <translation id="3126069444801937830">Khởi động lại để cập nhật</translation>
+<translation id="3139942575505304791">Không gian làm việc 1</translation>
 <translation id="315116470104423982">Dữ liệu di động</translation>
 <translation id="3151786313568798007">Hướng</translation>
+<translation id="3152934361839663679">Thiết bị của bạn đã kết nối với số màn hình tối đa được phép nên một trong số những màn hình này đã bị ngắt kết nối.</translation>
 <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="3154351730702813399">Quản trị viên thiết bị có thể theo dõi hoạt động duyệt web của bạ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>
@@ -233,6 +236,7 @@
 <translation id="4628757576491864469">Thiết bị</translation>
 <translation id="4659419629803378708">Đã bật ChromeVox</translation>
 <translation id="4696813013609194136">Mở khóa thiết bị bằng mã dành cho cha mẹ</translation>
+<translation id="4731797938093519117">Quyền truy cập của cha mẹ</translation>
 <translation id="4734965478015604180">Ngang</translation>
 <translation id="4774338217796918551">Hãy quay lại lúc <ph name="COME_BACK_TIME" /> ngày mai.</translation>
 <translation id="4776917500594043016">Mật khẩu cho <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -258,6 +262,7 @@
 <translation id="5207949376430453814">Đánh dấu điểm chèn văn bản</translation>
 <translation id="5222676887888702881">Đăng xuất</translation>
 <translation id="523505283826916779">Cài đặt trợ năng</translation>
+<translation id="5260676007519551770">Không gian làm việc 4</translation>
 <translation id="5283198616748585639">Thêm 1 phút</translation>
 <translation id="5302048478445481009">Ngôn ngữ</translation>
 <translation id="5313326810920013265">Cài đặt Bluetooth</translation>
@@ -343,6 +348,7 @@
 <translation id="6650933572246256093">Thiết bị Bluetooth "<ph name="DEVICE_NAME" />" muốn được phép ghép nối. Vui lòng nhập mã xác nhận này trên thiết bị đó: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">Mật khẩu</translation>
 <translation id="6665545700722362599">Cấp cho trang web, ứng dụng và tiện ích quyền sử dụng dịch vụ vị trí, micrô, máy ảnh hoặc các tính năng khác của thiết bị</translation>
+<translation id="6670153871843998651">Không gian làm việc 3</translation>
 <translation id="6691659475504239918">Search+Shift+H</translation>
 <translation id="6696025732084565524">Bàn phím có thể tháo rời của bạn cần một bản cập nhật quan trọng</translation>
 <translation id="6700713906295497288">Nút menu IME</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb
index 057a87e3..c191c1f3 100644
--- a/ash/strings/ash_strings_zh-CN.xtb
+++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -233,6 +233,7 @@
 <translation id="4628757576491864469">设备</translation>
 <translation id="4659419629803378708">已启用 ChromeVox</translation>
 <translation id="4696813013609194136">使用家长访问代码解锁设备</translation>
+<translation id="4731797938093519117">家长访问</translation>
 <translation id="4734965478015604180">横向</translation>
 <translation id="4774338217796918551">您需要等到明天<ph name="COME_BACK_TIME" /> 才能再次使用此设备。</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> 的密码</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index c58f2de9..7d0fbad 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -39,6 +39,7 @@
 <translation id="1525508553941733066">關閉</translation>
 <translation id="1537254971476575106">全螢幕放大鏡</translation>
 <translation id="15373452373711364">大型滑鼠游標</translation>
+<translation id="1546492247443594934">桌面 2</translation>
 <translation id="1550523713251050646">按一下即可查看更多選項</translation>
 <translation id="1570871743947603115">切換藍牙設定。<ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">存取你在這個工作階段內的所有活動</translation>
@@ -143,8 +144,10 @@
 <translation id="3087734570205094154">置底</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (藍牙)</translation>
 <translation id="3126069444801937830">重新啟動即可更新</translation>
+<translation id="3139942575505304791">桌面 1</translation>
 <translation id="315116470104423982">行動數據</translation>
 <translation id="3151786313568798007">方向</translation>
+<translation id="3152934361839663679">你的裝置已達顯示器連接數量上限,因此系統已中斷其中一個畫面的連線。</translation>
 <translation id="3153444934357957346">使用多帳戶登入功能時,一次最多只能登入 <ph name="MULTI_PROFILE_USER_LIMIT" /> 個帳戶。</translation>
 <translation id="3154351730702813399">裝置管理員可能會監控你的瀏覽活動。</translation>
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{已連線至一部裝置}other{已連線至 # 部裝置}}</translation>
@@ -232,6 +235,7 @@
 <translation id="4628757576491864469">裝置</translation>
 <translation id="4659419629803378708">ChromeVox 已啟用</translation>
 <translation id="4696813013609194136">使用家長存取碼將裝置解鎖</translation>
+<translation id="4731797938093519117">家長存取</translation>
 <translation id="4734965478015604180">橫向</translation>
 <translation id="4774338217796918551"><ph name="COME_BACK_TIME" /> 裝置就會解除鎖定。</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> 的密碼</translation>
@@ -257,6 +261,7 @@
 <translation id="5207949376430453814">醒目顯示文字插入點</translation>
 <translation id="5222676887888702881">登出</translation>
 <translation id="523505283826916779">協助工具設定</translation>
+<translation id="5260676007519551770">桌面 4</translation>
 <translation id="5283198616748585639">增加 1 分鐘</translation>
 <translation id="5302048478445481009">語言</translation>
 <translation id="5313326810920013265">藍牙設定</translation>
@@ -342,6 +347,7 @@
 <translation id="6650933572246256093">藍牙裝置「<ph name="DEVICE_NAME" />」要求配對權限,請在裝置上輸入此密碼金鑰:<ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">密碼</translation>
 <translation id="6665545700722362599">將定位服務、裝置的麥克風、相機或其他功能的使用權限授予網站、應用程式及擴充功能</translation>
+<translation id="6670153871843998651">桌面 3</translation>
 <translation id="6691659475504239918">搜尋鍵 + Shift 鍵 + H 鍵</translation>
 <translation id="6696025732084565524">你的卸除式鍵盤需安裝重大更新</translation>
 <translation id="6700713906295497288">IME 選單按鈕</translation>
diff --git a/base/process/process_handle_win.cc b/base/process/process_handle_win.cc
index fca342b..ccc7590 100644
--- a/base/process/process_handle_win.cc
+++ b/base/process/process_handle_win.cc
@@ -26,8 +26,7 @@
   // This returns 0 if we have insufficient rights to query the process handle.
   // Invalid handles or non-process handles will cause a hard failure.
   ProcessId result = GetProcessId(process);
-  // TODO(davidbienvenu): Change to CHECK once we don't get reports of DCHECKs.
-  DCHECK(result != 0 || GetLastError() != ERROR_INVALID_HANDLE)
+  CHECK(result != 0 || GetLastError() != ERROR_INVALID_HANDLE)
       << "process handle = " << process;
   return result;
 }
diff --git a/base/profiler/win32_stack_frame_unwinder.cc b/base/profiler/win32_stack_frame_unwinder.cc
index 26086c5..fdf4885 100644
--- a/base/profiler/win32_stack_frame_unwinder.cc
+++ b/base/profiler/win32_stack_frame_unwinder.cc
@@ -101,42 +101,38 @@
     unwind_functions_->VirtualUnwind(image_base, ContextPC(context),
                                      runtime_function, context);
     at_top_frame_ = false;
-  } else {
-    if (at_top_frame_) {
-      at_top_frame_ = false;
+    return true;
+  }
 
-      // This is a leaf function (i.e. a function that neither calls a function,
-      // nor allocates any stack space itself).
+  if (at_top_frame_) {
+    at_top_frame_ = false;
+
+    // This is a leaf function (i.e. a function that neither calls a function,
+    // nor allocates any stack space itself).
 #if defined(ARCH_CPU_X86_64)
-      // For X64, return address is at RSP.
-      context->Rip = *reinterpret_cast<DWORD64*>(context->Rsp);
-      context->Rsp += 8;
+    // For X64, return address is at RSP.
+    context->Rip = *reinterpret_cast<DWORD64*>(context->Rsp);
+    context->Rsp += 8;
 #elif defined(ARCH_CPU_ARM64)
-      // For leaf function on Windows ARM64, return address is at LR(X30).
-      // Add CONTEXT_UNWOUND_TO_CALL flag to avoid unwind ambiguity for tailcall
-      // on ARM64, because padding after tailcall is not guaranteed.
-      context->Pc = context->Lr;
-      context->ContextFlags |= CONTEXT_UNWOUND_TO_CALL;
+    // For leaf function on Windows ARM64, return address is at LR(X30).  Add
+    // CONTEXT_UNWOUND_TO_CALL flag to avoid unwind ambiguity for tailcall on
+    // ARM64, because padding after tailcall is not guaranteed.
+    context->Pc = context->Lr;
+    context->ContextFlags |= CONTEXT_UNWOUND_TO_CALL;
 #else
 #error Unsupported Windows 64-bit Arch
 #endif
-    } else {
-      // In theory we shouldn't get here, as it means we've encountered a
-      // function without unwind information below the top of the stack, which
-      // is forbidden by the Microsoft x64 calling convention.
-      //
-      // The one known case in Chrome code that executes this path occurs
-      // because of BoringSSL unwind information inconsistent with the actual
-      // function code. See https://crbug.com/542919.
-      //
-      // Note that dodgy third-party generated code that otherwise would enter
-      // this path should be caught by the module check above, since the code
-      // typically is located outside of a module.
-      return false;
-    }
+    return true;
   }
 
-  return true;
+  // In theory we shouldn't get here, as it means we've encountered a function
+  // without unwind information below the top of the stack, which is forbidden
+  // by the Microsoft x64 calling convention.
+  //
+  // The one known case in Chrome code that executes this path occurs because
+  // of BoringSSL unwind information inconsistent with the actual function
+  // code. See https://crbug.com/542919.
+  return false;
 #else
   NOTREACHED();
   return false;
diff --git a/base/trace_event/trace_log.cc b/base/trace_event/trace_log.cc
index 83e38020..1570762e 100644
--- a/base/trace_event/trace_log.cc
+++ b/base/trace_event/trace_log.cc
@@ -1530,7 +1530,7 @@
       base::debug::ReadElfBuildId(&__executable_start, true, build_id);
   if (build_id_length > 0) {
     AddMetadataEventWhileLocked(current_thread_id, "chrome_library_module",
-                                "id", build_id);
+                                "id", std::string(build_id));
   }
 #endif
 
diff --git a/build/config/BUILD.gn b/build/config/BUILD.gn
index a67a836..4d6ba29 100644
--- a/build/config/BUILD.gn
+++ b/build/config/BUILD.gn
@@ -272,15 +272,8 @@
   }
 }
 
+# Only //build/config/BUILDCONFIG.gn should reference this.
 group("common_deps") {
-  visibility = [
-    ":executable_deps",
-    ":loadable_module_deps",
-    ":shared_library_deps",
-  ]
-
-  # WARNING: This group is a dependency of **every executable and shared
-  # library**.  Please be careful adding new dependencies here.
   public_deps = []
 
   if (using_sanitizer) {
@@ -304,17 +297,10 @@
   }
 
   if (is_fuchsia) {
-    public_deps += [
-      # Fuchsia builds don't link against any libraries that provide stack
-      # unwinding symbols, unlike Linux does with glibc.  Build and link against
-      # libunwind manually to get this functionality.
-      "//buildtools/third_party/libunwind",
-      "//third_party/fuchsia-sdk:runtime_library",
-    ]
+    public_deps += [ "//third_party/fuchsia-sdk:runtime_library" ]
   }
 }
 
-# Only the executable template in BUILDCONFIG.gn should reference this.
 group("executable_deps") {
   public_deps = [
     ":common_deps",
@@ -324,14 +310,12 @@
   }
 }
 
-# Only the loadable_module template in BUILDCONFIG.gn should reference this.
 group("loadable_module_deps") {
   public_deps = [
     ":common_deps",
   ]
 }
 
-# Only the shared_library template in BUILDCONFIG.gn should reference this.
 group("shared_library_deps") {
   public_deps = [
     ":common_deps",
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 7768b88f..11fe9bd0 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -3638,8 +3638,10 @@
 #
 #   build_config: Path to build_config of the android_apk_or_module() target.
 #
-#   dex_path_file_arg: Path to the module's dex file passed directly to the
-#     creation script. Must be a rebased path or @FileArg expression.
+#   dex_path: If module is proguarded separately from the base module, dex_path is the
+#     path to its dex file and is passed directly to the creation script.
+#     Otherwise, dex_path is undefined and we retrieve the module's dex file
+#     using its build_config.
 #
 #   native_lib_placeholders: List of placeholder filenames to add to each
 #     APK split (optional). TODO(huangs): Remove.
@@ -3680,7 +3682,6 @@
       "--format=bundle-module",
       "--output-apk",
       rebase_path(invoker.module_zip_path, root_build_dir),
-      "--dex-file=@FileArg($_rebased_build_config:final_dex:path)",
       "--resource-apk=@FileArg(" +
           "$_rebased_build_config:deps_info:proto_resources_path)",
       "--assets=@FileArg($_rebased_build_config:assets)",
@@ -3711,6 +3712,15 @@
     } else {
       args += [ "--secondary-native-lib-placeholders=@FileArg($_rebased_build_config:native:secondary_native_library_placeholders)" ]
     }
+
+    # Use either provided dex path or build config path based on type of module.
+    if (defined(invoker.dex_path)) {
+      inputs += [ invoker.dex_path ]
+      _rebased_dex_path = rebase_path(invoker.dex_path, root_build_dir)
+      args += [ "--dex-file=$_rebased_dex_path" ]
+    } else {
+      args += [ "--dex-file=@FileArg($_rebased_build_config:final_dex:path)" ]
+    }
   }
 }
 
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 4616cfd..24a3cbe8 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -3910,6 +3910,13 @@
   #      module name (which cannot be 'base', since this is reserved for the
   #      base module), and an 'apk_target' field that specified the
   #      corresponding android_apk target name the module is modeled on.
+  #      A scope may have an additional field, 'proguard_async', that
+  #      specifies whether or not the module is asynchronous. This field should
+  #      be set to true if the module is asynchronous, and set to false or left
+  #      undefined otherwise.
+  #      Async modules are those that are proguarded in a separate build step.
+  #      This ensures that changes to these modules do not change the base
+  #      module.
   #
   #    enable_language_splits: Optional. If true, enable APK splits based
   #      on languages.
@@ -3985,7 +3992,7 @@
     _rebased_base_module_build_config =
         rebase_path(_base_module_build_config, root_build_dir)
 
-    _all_modules = [
+    _sync_modules = [
       {
         name = "base"
         module_target = invoker.base_module_target
@@ -3994,11 +4001,25 @@
       },
     ]
 
+    _async_modules = []
+
+    _proguard_enabled =
+        defined(invoker.proguard_enabled) && invoker.proguard_enabled
+    _enable_multidex =
+        defined(invoker.enable_multidex) && invoker.enable_multidex
+
+    # Prevent "unused variable".
+    not_needed([ "_enable_multidex" ])
+
+    assert(_proguard_enabled || !defined(invoker.enable_multidex),
+           "Bundle only adds dexing step if proguarding is enabled.")
+
     if (defined(invoker.extra_modules)) {
       _module_count = 0
 
-      # Mark as used in case extra_modules is an empty list.
-      assert(_module_count == 0)
+      # Prevent "unused variable".
+      not_needed([ "_module_count" ])
+
       foreach(_module, invoker.extra_modules) {
         _module_count += 1
         assert(defined(_module.name),
@@ -4016,22 +4037,47 @@
             "$_module_target_gen_dir/${_module_target_name}.build_config"
         _module.build_config_target =
             "$_module_target$build_config_target_suffix"
-        _all_modules += [ _module ]
+
+        if (defined(_module.proguard_async) && _module.proguard_async) {
+          if (_proguard_enabled) {
+            # Use asynchronous proguarding for async modules.
+            # TODO(crbug.com/938635): Combine async module mapping paths with the sync one.
+            _async_proguard_mapping_path =
+                "${_bundle_path}_${_module.name}.mapping"
+
+            _dex_zip = "${target_out_dir}/${target_name}/${target_name}_${_module.name}_dex.zip"
+            _module.dex_path = _dex_zip
+
+            # Give unique name to each async dex target using module name.
+            _async_dex_target = "${target_name}_${_module.name}_dex"
+
+            dex(_async_dex_target) {
+              enable_multidex = _enable_multidex
+              proguard_enabled = true
+              proguard_mapping_path = _async_proguard_mapping_path
+              forward_variables_from(invoker, [ "proguard_jar_path" ])
+              build_config = _module.build_config
+
+              deps = [
+                _module.module_target,
+              ]
+
+              output = _dex_zip
+            }
+            _module.async_dex_target = _async_dex_target
+          }
+
+          _async_modules += [ _module ]
+        } else {
+          _sync_modules += [ _module ]
+        }
       }
     }
 
-    _proguard_enabled =
-        defined(invoker.proguard_enabled) && invoker.proguard_enabled
-    _enable_multidex =
-        defined(invoker.enable_multidex) && invoker.enable_multidex
-    assert(
-        _proguard_enabled || !_enable_multidex,
-        "Bundle only adds dexing step if synchronized proguarding is enabled.")
-
     # Make build config, which is required for synchronized proguarding.
-    _module_targets = []
-    foreach(_module, _all_modules) {
-      _module_targets += [ _module.module_target ]
+    _sync_module_targets = []
+    foreach(_module, _sync_modules) {
+      _sync_module_targets += [ _module.module_target ]
     }
     _build_config = "$target_gen_dir/${target_name}.build_config"
     _rebased_build_config = rebase_path(_build_config, root_build_dir)
@@ -4042,8 +4088,11 @@
       proguard_android_sdk_dep_ = "//third_party/android_tools:android_sdk_java"
     }
     write_build_config(_build_config_target) {
+      # We don't want async modules to be proguarded synchronously, so we leave
+      # them out of possible_config_deps.
       type = "android_app_bundle"
-      possible_config_deps = _module_targets + [ proguard_android_sdk_dep_ ]
+      possible_config_deps =
+          _sync_module_targets + [ proguard_android_sdk_dep_ ]
       build_config = _build_config
       proguard_enabled = _proguard_enabled
     }
@@ -4060,7 +4109,7 @@
         forward_variables_from(invoker, [ "proguard_jar_path" ])
         build_config = _build_config
 
-        deps = _module_targets + [ ":$_build_config_target" ]
+        deps = _sync_module_targets + [ ":$_build_config_target" ]
         output = _unsplit_dex_zip
       }
 
@@ -4068,13 +4117,16 @@
       dexsplitter(_dexsplitter_target) {
         input_dex_zip = _unsplit_dex_zip
         proguard_mapping = _proguard_mapping_path
-        all_modules = _all_modules
+        all_modules = _sync_modules
         deps = [
           ":${_unsplit_dex_target}",
         ]
       }
     }
 
+    # Merge async and sync module scopes.
+    _all_modules = _sync_modules + _async_modules
+
     _all_create_module_targets = []
     _all_module_zip_paths = []
     _all_module_build_configs = []
@@ -4083,10 +4135,12 @@
       _module_build_config = _module.build_config
       _module_build_config_target = _module.build_config_target
 
-      if (_proguard_enabled) {
-        _dex_target_for_module = ":$_dexsplitter_target"
-      } else {
+      if (!_proguard_enabled) {
         _dex_target_for_module = "${_module_target}__final_dex"
+      } else if (defined(_module.dex_path)) {
+        _dex_target_for_module = ":${_module.async_dex_target}"
+      } else {
+        _dex_target_for_module = ":$_dexsplitter_target"
       }
 
       # Generate one module .zip file per bundle module.
@@ -4115,6 +4169,12 @@
         build_config = _module_build_config
         module_zip_path = _module_zip_path
 
+        # If module is async, use defined dex_path directly rather than
+        # build config FileArg.
+        if (defined(_module.dex_path)) {
+          dex_path = _module.dex_path
+        }
+
         deps = [
           _dex_target_for_module,
           _module_build_config_target,
@@ -4215,10 +4275,16 @@
     # Create size info files for targets that care about size
     # (have proguard enabled).
     if (_proguard_enabled) {
+      # Merge all module targets to obtain size info files for all targets.
+      _all_module_targets = _sync_module_targets
+      foreach(_async_module, _async_modules) {
+        _all_module_targets += [ _async_module.module_target ]
+      }
+
       _size_info_target = "${target_name}__size_info"
       create_size_info_files(_size_info_target) {
         name = "$_bundle_name.aab"
-        deps = _module_targets + [ ":$_build_config_target" ]
+        deps = _all_module_targets + [ ":$_build_config_target" ]
         module_build_configs = _all_module_build_configs
       }
     }
@@ -4266,6 +4332,8 @@
           invoker.command_line_flags_file,
         ]
       }
+
+      # TODO(crbug.com/938635): Combine async module mapping paths with the sync one.
       if (_proguard_enabled) {
         args += [
           "--proguard-mapping-path",
diff --git a/buildtools/DEPS b/buildtools/DEPS
index d868c69..a56d460 100644
--- a/buildtools/DEPS
+++ b/buildtools/DEPS
@@ -1,26 +1,26 @@
 use_relative_paths = True
 
 vars = {
-  "chromium_url": "https://chromium.googlesource.com",
+  'chromium_url': 'https://chromium.googlesource.com',
 
   # When changing these, also update the svn revisions in deps_revisions.gni
-  "clang_format_revision": "96636aa0e9f047f17447f2d45a094d0b59ed7917",
-  "libcxx_revision":       "a50f5035629b7621e92acef968403f71b7d48553",
-  "libcxxabi_revision":    "0d529660e32d77d9111912d73f2c74fc5fa2a858",
-  "libunwind_revision":    "69d9b84cca8354117b9fe9705a4430d789ee599b",
+  'clang_format_revision': '96636aa0e9f047f17447f2d45a094d0b59ed7917',
+  'libcxx_revision':       'a50f5035629b7621e92acef968403f71b7d48553',
+  'libcxxabi_revision':    '0d529660e32d77d9111912d73f2c74fc5fa2a858',
+  'libunwind_revision':    '69d9b84cca8354117b9fe9705a4430d789ee599b',
 }
 
 deps = {
-  "clang_format/script":
-    Var("chromium_url") + "/chromium/llvm-project/cfe/tools/clang-format.git@" +
-    Var("clang_format_revision"),
-  "third_party/libc++/trunk":
-    Var("chromium_url") + "/chromium/llvm-project/libcxx.git" + "@" +
-    Var("libcxx_revision"),
-  "third_party/libc++abi/trunk":
-    Var("chromium_url") + "/chromium/llvm-project/libcxxabi.git" + "@" +
-    Var("libcxxabi_revision"),
-  "third_party/libunwind/trunk":
-    Var("chromium_url") + "/external/llvm.org/libunwind.git" + "@" +
-    Var("libunwind_revision"),
+  'clang_format/script':
+    Var('chromium_url') + '/chromium/llvm-project/cfe/tools/clang-format.git@' +
+    Var('clang_format_revision'),
+  'third_party/libc++/trunk':
+    Var('chromium_url') + '/chromium/llvm-project/libcxx.git' + '@' +
+    Var('libcxx_revision'),
+  'third_party/libc++abi/trunk':
+    Var('chromium_url') + '/chromium/llvm-project/libcxxabi.git' + '@' +
+    Var('libcxxabi_revision'),
+  'third_party/libunwind/trunk':
+    Var('chromium_url') + '/external/llvm.org/libunwind.git' + '@' +
+    Var('libunwind_revision'),
 }
diff --git a/buildtools/third_party/libc++/BUILD.gn b/buildtools/third_party/libc++/BUILD.gn
index 1654038..b6af43e 100644
--- a/buildtools/third_party/libc++/BUILD.gn
+++ b/buildtools/third_party/libc++/BUILD.gn
@@ -10,8 +10,8 @@
 config("config") {
   cflags = [ "-fstrict-aliasing" ]
   if (is_win) {
-    # libc++ wants to redefine the macros WIN32_LEAN_AND_MEAN and _CRT_RAND_S in
-    # its implementation.
+    # libc++ wants to redefine the macros WIN32_LEAN_AND_MEAN and _CRT_RAND_S in its
+    # implementation.
     cflags += [ "-Wno-macro-redefined" ]
   } else {
     cflags += [ "-fPIC" ]
@@ -24,19 +24,6 @@
   _libcxx_target_type = "source_set"
 }
 target(_libcxx_target_type, "libc++") {
-  # Most things that need to depend on libc++ should do so via the implicit
-  # 'common_deps' dependency below.  Some targets that package libc++.so may
-  # need to explicitly depend on libc++.
-  visibility = [
-    "//build/config:common_deps",
-    "//third_party/catapult/devil:devil",
-  ]
-  if (is_linux) {
-    # This target packages libc++.so, so must have an explicit dependency on
-    # libc++.
-    visibility +=
-        [ "//remoting/host/linux:remoting_me2me_host_copy_user_session" ]
-  }
   if (libcxx_is_shared) {
     no_default_deps = true
   }
diff --git a/buildtools/third_party/libc++abi/BUILD.gn b/buildtools/third_party/libc++abi/BUILD.gn
index 375ea02..759327c 100644
--- a/buildtools/third_party/libc++abi/BUILD.gn
+++ b/buildtools/third_party/libc++abi/BUILD.gn
@@ -5,10 +5,20 @@
 import("//build/config/c++/c++.gni")
 
 source_set("libc++abi") {
-  if (export_libcxxabi_from_executables) {
-    visibility = [ "//build/config:executable_deps" ]
-  } else {
-    visibility = [ "//buildtools/third_party/libc++" ]
+  visibility = [
+    "//buildtools/third_party/libc++",
+    "//build/config:executable_deps",
+    "//build/config:loadable_module_deps",
+    "//build/config:shared_library_deps",
+  ]
+  deps = []
+
+  # Fuchsia builds don't link against any libraries that provide stack
+  # unwinding symbols, unlike Linux does with glibc.  Build and link against
+  # libunwind manually to get this functionality.
+  # TODO(thomasanderson): Move this to exe_and_shlib_deps.
+  if (is_fuchsia) {
+    deps += [ "//buildtools/third_party/libunwind" ]
   }
 
   sources = [
diff --git a/buildtools/third_party/libunwind/BUILD.gn b/buildtools/third_party/libunwind/BUILD.gn
index e8bfc4643..31bc075 100644
--- a/buildtools/third_party/libunwind/BUILD.gn
+++ b/buildtools/third_party/libunwind/BUILD.gn
@@ -15,12 +15,11 @@
 }
 
 source_set("libunwind") {
-  visibility = []
-  if (is_fuchsia) {
-    visibility += [ "//build/config:common_deps" ]
-  } else {
-    visibility += [ "//components/tracing" ]
-  }
+  visibility = [
+    "//buildtools/third_party/libc++abi",
+    "//components/tracing",
+  ]
+
   if (!is_component_build) {
     defines = [ "_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS" ]
   }
diff --git a/cc/benchmarks/rasterize_and_record_benchmark_impl.cc b/cc/benchmarks/rasterize_and_record_benchmark_impl.cc
index 6f2da14..cf7f706 100644
--- a/cc/benchmarks/rasterize_and_record_benchmark_impl.cc
+++ b/cc/benchmarks/rasterize_and_record_benchmark_impl.cc
@@ -71,7 +71,8 @@
       settings.image_provider = &image_provider;
 
       raster_source->PlaybackToCanvas(
-          &canvas, raster_source->GetContentSize(contents_scale), content_rect,
+          &canvas, gfx::ColorSpace(),
+          raster_source->GetContentSize(contents_scale), content_rect,
           content_rect, gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()),
           settings);
 
diff --git a/cc/layers/draw_properties.h b/cc/layers/draw_properties.h
index 1ffc742..1b96435 100644
--- a/cc/layers/draw_properties.h
+++ b/cc/layers/draw_properties.h
@@ -45,6 +45,10 @@
   // True if the layer needs to be clipped by clip_rect.
   bool is_clipped;
 
+  // If set, it makes the layer's rounded corner not trigger a render surface if
+  // possible.
+  bool is_fast_rounded_corner;
+
   // This rect is a bounding box around what part of the layer is visible, in
   // the layer's coordinate space.
   gfx::Rect visible_layer_rect;
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc
index 366013e..6d317814 100644
--- a/cc/layers/heads_up_display_layer_impl.cc
+++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -375,8 +375,7 @@
       {
         ScopedGpuRaster gpu_raster(context_provider);
         viz::ClientResourceProvider::ScopedSkSurface scoped_surface(
-            context_provider->GrContext(),
-            pool_resource.color_space().ToSkColorSpace(), mailbox_texture_id,
+            context_provider->GrContext(), mailbox_texture_id,
             backing->texture_target, pool_resource.size(),
             pool_resource.format(), false /* can_use_lcd_text */,
             0 /* msaa_sample_count */);
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
index 3aab7c8..02fc689 100644
--- a/cc/layers/layer.cc
+++ b/cc/layers/layer.cc
@@ -55,6 +55,7 @@
       background_color(0),
       backdrop_filter_quality(1.0f),
       corner_radii({0, 0, 0, 0}),
+      is_fast_rounded_corner(false),
       scrollable(false),
       is_scrollbar(false),
       user_scrollable_horizontal(true),
@@ -602,6 +603,22 @@
   SetPropertyTreesNeedRebuild();
 }
 
+void Layer::SetIsFastRoundedCorner(bool enable) {
+  DCHECK(IsPropertyChangeAllowed());
+  if (inputs_.is_fast_rounded_corner == enable)
+    return;
+  inputs_.is_fast_rounded_corner = enable;
+
+  // If this layer does not have a rounded corner, then modifying this flag is
+  // going to have no effect.
+  if (!HasRoundedCorner())
+    return;
+
+  SetSubtreePropertyChanged();
+  SetNeedsCommit();
+  SetPropertyTreesNeedRebuild();
+}
+
 void Layer::SetOpacity(float opacity) {
   DCHECK(IsPropertyChangeAllowed());
   DCHECK_GE(opacity, 0.f);
diff --git a/cc/layers/layer.h b/cc/layers/layer.h
index 772e066..cb3b704 100644
--- a/cc/layers/layer.h
+++ b/cc/layers/layer.h
@@ -255,6 +255,13 @@
            corner_radii()[3];
   }
 
+  // Set or get the flag that disables the requirement of a render surface for
+  // this layer due to it having rounded corners. This improves performance at
+  // the cost of maybe having some blending artifacts. Not having a render
+  // surface is not guaranteed however.
+  void SetIsFastRoundedCorner(bool enable);
+  bool is_fast_rounded_corner() const { return inputs_.is_fast_rounded_corner; }
+
   // Set or get the opacity which should be applied to the contents of the layer
   // and its subtree (together as a single composited entity) when blending them
   // into their target. Note that this does not speak to the contents of this
@@ -954,6 +961,10 @@
     //     top left, top right, bottom right, bottom left
     std::array<uint32_t, 4> corner_radii;
 
+    // If set, disables this layer's rounded corner from triggering a render
+    // surface on itself if possible.
+    bool is_fast_rounded_corner : 1;
+
     gfx::ScrollOffset scroll_offset;
 
     // Size of the scroll container that this layer scrolls in.
diff --git a/cc/layers/layer_unittest.cc b/cc/layers/layer_unittest.cc
index 8cc972a..2853ea5 100644
--- a/cc/layers/layer_unittest.cc
+++ b/cc/layers/layer_unittest.cc
@@ -360,6 +360,14 @@
       grand_child->PushPropertiesTo(grand_child_impl.get()));
 
   EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1);
+  EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetIsFastRoundedCorner(true));
+  EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET(
+      root->PushPropertiesTo(root_impl.get());
+      child->PushPropertiesTo(child_impl.get());
+      child2->PushPropertiesTo(child2_impl.get());
+      grand_child->PushPropertiesTo(grand_child_impl.get()));
+
+  EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1);
   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetRoundedCorner({0, 0, 0, 0}));
   EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET(
       root->PushPropertiesTo(root_impl.get());
@@ -936,6 +944,7 @@
   EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetBackgroundColor(SK_ColorLTGRAY));
   EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetMasksToBounds(true));
   EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetRoundedCorner({1, 2, 3, 4}));
+  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetIsFastRoundedCorner(true));
   EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetOpacity(0.5f));
   EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetBlendMode(SkBlendMode::kHue));
   EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetIsRootForIsolatedGroup(true));
diff --git a/cc/paint/oop_pixeltest.cc b/cc/paint/oop_pixeltest.cc
index 3e90ba7..2ac24c2 100644
--- a/cc/paint/oop_pixeltest.cc
+++ b/cc/paint/oop_pixeltest.cc
@@ -295,8 +295,7 @@
           SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType);
     }
     SkImageInfo image_info = SkImageInfo::MakeN32Premul(
-        options.resource_size.width(), options.resource_size.height(),
-        options.color_space.ToSkColorSpace());
+        options.resource_size.width(), options.resource_size.height());
     auto surface = SkSurface::MakeRenderTarget(
         gles2_context_provider_->GrContext(), SkBudgeted::kYes, image_info);
     SkCanvas* canvas = surface->getCanvas();
@@ -308,8 +307,9 @@
     gfx::AxisTransform2d raster_transform(options.post_scale,
                                           options.post_translate);
     raster_source->PlaybackToCanvas(
-        canvas, options.content_size, options.full_raster_rect,
-        options.playback_rect, raster_transform, settings);
+        canvas, options.color_space, options.content_size,
+        options.full_raster_rect, options.playback_rect, raster_transform,
+        settings);
     surface->prepareForExternalIO();
     EXPECT_EQ(gles2_context_provider_->ContextGL()->GetError(),
               static_cast<unsigned>(GL_NO_ERROR));
diff --git a/cc/raster/gpu_raster_buffer_provider.cc b/cc/raster/gpu_raster_buffer_provider.cc
index bef3681..394e02e5 100644
--- a/cc/raster/gpu_raster_buffer_provider.cc
+++ b/cc/raster/gpu_raster_buffer_provider.cc
@@ -7,7 +7,6 @@
 #include <stdint.h>
 
 #include <algorithm>
-#include <utility>
 
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
@@ -45,7 +44,6 @@
  public:
   ScopedSkSurfaceForUnpremultiplyAndDither(
       viz::RasterContextProvider* context_provider,
-      sk_sp<SkColorSpace> color_space,
       const gfx::Rect& playback_rect,
       const gfx::Rect& raster_full_rect,
       const gfx::Size& max_tile_size,
@@ -73,9 +71,8 @@
 
     // Allocate a 32-bit surface for raster. We will copy from that into our
     // actual surface in destruction.
-    SkImageInfo n32Info = SkImageInfo::MakeN32Premul(intermediate_size.width(),
-                                                     intermediate_size.height(),
-                                                     std::move(color_space));
+    SkImageInfo n32Info = SkImageInfo::MakeN32Premul(
+        intermediate_size.width(), intermediate_size.height());
     SkSurfaceProps surface_props =
         viz::ClientResourceProvider::ScopedSkSurface::ComputeSurfaceProps(
             can_use_lcd_text);
@@ -209,18 +206,16 @@
     base::Optional<ScopedSkSurfaceForUnpremultiplyAndDither>
         scoped_dither_surface;
     SkSurface* surface;
-    sk_sp<SkColorSpace> sk_color_space = color_space.ToSkColorSpace();
     if (!unpremultiply_and_dither) {
-      scoped_surface.emplace(context_provider->GrContext(), sk_color_space,
-                             texture_id, texture_target, resource_size,
-                             resource_format, playback_settings.use_lcd_text,
-                             msaa_sample_count);
+      scoped_surface.emplace(context_provider->GrContext(), texture_id,
+                             texture_target, resource_size, resource_format,
+                             playback_settings.use_lcd_text, msaa_sample_count);
       surface = scoped_surface->surface();
     } else {
       scoped_dither_surface.emplace(
-          context_provider, sk_color_space, playback_rect, raster_full_rect,
-          max_tile_size, texture_id, resource_size,
-          playback_settings.use_lcd_text, msaa_sample_count);
+          context_provider, playback_rect, raster_full_rect, max_tile_size,
+          texture_id, resource_size, playback_settings.use_lcd_text,
+          msaa_sample_count);
       surface = scoped_dither_surface->surface();
     }
 
@@ -238,8 +233,8 @@
       canvas->discard();
 
     gfx::Size content_size = raster_source->GetContentSize(transform.scale());
-    raster_source->PlaybackToCanvas(canvas, content_size, raster_full_rect,
-                                    playback_rect, transform,
+    raster_source->PlaybackToCanvas(canvas, color_space, content_size,
+                                    raster_full_rect, playback_rect, transform,
                                     playback_settings);
   }
 
diff --git a/cc/raster/raster_buffer_provider.cc b/cc/raster/raster_buffer_provider.cc
index f5935e2..0e7d1c71 100644
--- a/cc/raster/raster_buffer_provider.cc
+++ b/cc/raster/raster_buffer_provider.cc
@@ -74,8 +74,7 @@
 
   // Uses kPremul_SkAlphaType since the result is not known to be opaque.
   SkImageInfo info =
-      SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType,
-                           target_color_space.ToSkColorSpace());
+      SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType);
 
   // Use unknown pixel geometry to disable LCD text.
   SkSurfaceProps surface_props(0, kUnknown_SkPixelGeometry);
@@ -101,18 +100,19 @@
       // invalid content, just crash the renderer and try again.
       // See: http://crbug.com/721744.
       CHECK(surface);
-      raster_source->PlaybackToCanvas(surface->getCanvas(), content_size,
-                                      canvas_bitmap_rect, canvas_playback_rect,
-                                      transform, playback_settings);
+      raster_source->PlaybackToCanvas(surface->getCanvas(), target_color_space,
+                                      content_size, canvas_bitmap_rect,
+                                      canvas_playback_rect, transform,
+                                      playback_settings);
       return;
     }
     case viz::RGBA_4444: {
       sk_sp<SkSurface> surface = SkSurface::MakeRaster(info, &surface_props);
       // TODO(reveman): Improve partial raster support by reducing the size of
       // playback rect passed to PlaybackToCanvas. crbug.com/519070
-      raster_source->PlaybackToCanvas(surface->getCanvas(), content_size,
-                                      canvas_bitmap_rect, canvas_bitmap_rect,
-                                      transform, playback_settings);
+      raster_source->PlaybackToCanvas(
+          surface->getCanvas(), target_color_space, content_size,
+          canvas_bitmap_rect, canvas_bitmap_rect, transform, playback_settings);
 
       TRACE_EVENT0("cc",
                    "RasterBufferProvider::PlaybackToMemory::ConvertRGBA4444");
diff --git a/cc/raster/raster_source.cc b/cc/raster/raster_source.cc
index 8c490e48..8f510fa 100644
--- a/cc/raster/raster_source.cc
+++ b/cc/raster/raster_source.cc
@@ -16,6 +16,7 @@
 #include "cc/paint/skia_paint_canvas.h"
 #include "components/viz/common/traced_value.h"
 #include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkColorSpaceXformCanvas.h"
 #include "third_party/skia/include/core/SkPictureRecorder.h"
 #include "ui/gfx/geometry/axis_transform2d.h"
 #include "ui/gfx/geometry/rect_conversions.h"
@@ -110,7 +111,8 @@
 }
 
 void RasterSource::PlaybackToCanvas(
-    SkCanvas* raster_canvas,
+    SkCanvas* input_canvas,
+    const gfx::ColorSpace& target_color_space,
     const gfx::Size& content_size,
     const gfx::Rect& canvas_bitmap_rect,
     const gfx::Rect& canvas_playback_rect,
@@ -123,6 +125,15 @@
   // Treat all subnormal values as zero for performance.
   ScopedSubnormalFloatDisabler disabler;
 
+  // TODO(enne): color transform needs to be replicated in gles2_cmd_decoder
+  SkCanvas* raster_canvas = input_canvas;
+  std::unique_ptr<SkCanvas> color_transform_canvas;
+  if (target_color_space.IsValid()) {
+    color_transform_canvas = SkCreateColorSpaceXformCanvas(
+        input_canvas, target_color_space.ToSkColorSpace());
+    raster_canvas = color_transform_canvas.get();
+  }
+
   bool is_partial_raster = canvas_bitmap_rect != canvas_playback_rect;
   if (!requires_clear_) {
     // Clear opaque raster sources.  Opaque rasters sources guarantee that all
diff --git a/cc/raster/raster_source.h b/cc/raster/raster_source.h
index 43ec5f3..c62ce0e 100644
--- a/cc/raster/raster_source.h
+++ b/cc/raster/raster_source.h
@@ -53,6 +53,7 @@
   // canvas_playback_rect can be used to replay only part of the recording in,
   // the content space, so only a sub-rect of the tile gets rastered.
   void PlaybackToCanvas(SkCanvas* canvas,
+                        const gfx::ColorSpace& target_color_space,
                         const gfx::Size& content_size,
                         const gfx::Rect& canvas_bitmap_rect,
                         const gfx::Rect& canvas_playback_rect,
diff --git a/cc/raster/raster_source_unittest.cc b/cc/raster/raster_source_unittest.cc
index 21338cf..c694083 100644
--- a/cc/raster/raster_source_unittest.cc
+++ b/cc/raster/raster_source_unittest.cc
@@ -30,6 +30,10 @@
 namespace cc {
 namespace {
 
+gfx::ColorSpace ColorSpaceForTesting() {
+  return gfx::ColorSpace();
+}
+
 TEST(RasterSourceTest, AnalyzeIsSolidUnscaled) {
   gfx::Size layer_bounds(400, 400);
 
@@ -342,8 +346,8 @@
       canvas.clear(SK_ColorTRANSPARENT);
 
       raster->PlaybackToCanvas(
-          &canvas, content_bounds, canvas_rect, canvas_rect,
-          gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()),
+          &canvas, ColorSpaceForTesting(), content_bounds, canvas_rect,
+          canvas_rect, gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()),
           RasterSource::PlaybackSettings());
 
       SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels());
@@ -394,8 +398,8 @@
   gfx::Rect raster_full_rect(content_bounds);
   gfx::Rect playback_rect(content_bounds);
   raster->PlaybackToCanvas(
-      &canvas, content_bounds, raster_full_rect, playback_rect,
-      gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()),
+      &canvas, ColorSpaceForTesting(), content_bounds, raster_full_rect,
+      playback_rect, gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()),
       RasterSource::PlaybackSettings());
 
   {
@@ -426,8 +430,8 @@
   // that touches the edge pixels of the recording.
   playback_rect.Inset(1, 2, 0, 1);
   raster->PlaybackToCanvas(
-      &canvas, content_bounds, raster_full_rect, playback_rect,
-      gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()),
+      &canvas, ColorSpaceForTesting(), content_bounds, raster_full_rect,
+      playback_rect, gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()),
       RasterSource::PlaybackSettings());
 
   SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels());
@@ -491,8 +495,8 @@
   gfx::Rect raster_full_rect(content_bounds);
   gfx::Rect playback_rect(content_bounds);
   raster->PlaybackToCanvas(
-      &canvas, content_bounds, raster_full_rect, playback_rect,
-      gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()),
+      &canvas, ColorSpaceForTesting(), content_bounds, raster_full_rect,
+      playback_rect, gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()),
       RasterSource::PlaybackSettings());
 
   {
@@ -531,8 +535,8 @@
   playback_rect =
       gfx::Rect(gfx::ScaleToCeiledSize(partial_bounds, contents_scale));
   raster->PlaybackToCanvas(
-      &canvas, content_bounds, raster_full_rect, playback_rect,
-      gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()),
+      &canvas, ColorSpaceForTesting(), content_bounds, raster_full_rect,
+      playback_rect, gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()),
       RasterSource::PlaybackSettings());
 
   // Test that the whole playback_rect was cleared and repainted with new alpha.
@@ -572,7 +576,7 @@
   SkCanvas canvas(bitmap);
 
   raster->PlaybackToCanvas(
-      &canvas, content_bounds, canvas_rect, canvas_rect,
+      &canvas, ColorSpaceForTesting(), content_bounds, canvas_rect, canvas_rect,
       gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()),
       RasterSource::PlaybackSettings());
 
@@ -619,8 +623,9 @@
   EXPECT_CALL(mock_canvas, willRestore()).InSequence(s);
 
   gfx::Size small_size(50, 50);
-  raster_source->PlaybackToCanvas(&mock_canvas, size, gfx::Rect(small_size),
-                                  gfx::Rect(small_size), gfx::AxisTransform2d(),
+  raster_source->PlaybackToCanvas(&mock_canvas, ColorSpaceForTesting(), size,
+                                  gfx::Rect(small_size), gfx::Rect(small_size),
+                                  gfx::AxisTransform2d(),
                                   RasterSource::PlaybackSettings());
 }
 
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc
index 17b0fc1..c3f4ec3 100644
--- a/cc/trees/draw_property_utils.cc
+++ b/cc/trees/draw_property_utils.cc
@@ -715,6 +715,13 @@
   return bounds;
 }
 
+static bool IsFastRoundedCorner(const PropertyTrees* property_trees,
+                                int effect_tree_index) {
+  const EffectTree* effect_tree = &property_trees->effect_tree;
+  const EffectNode* effect_node = effect_tree->Node(effect_tree_index);
+  return effect_node->is_fast_rounded_corner;
+}
+
 static void UpdateRenderTarget(EffectTree* effect_tree) {
   for (int i = EffectTree::kContentsRootNodeId;
        i < static_cast<int>(effect_tree->size()); ++i) {
@@ -951,6 +958,8 @@
     layer->draw_properties().rounded_corner_bounds =
         GetRoundedCornerRRect(property_trees, layer->effect_tree_index(),
                               /*from_render_surface*/ false);
+    layer->draw_properties().is_fast_rounded_corner =
+        IsFastRoundedCorner(property_trees, layer->effect_tree_index());
   }
 
   // Compute effects and determine if render surfaces have contributing layers
diff --git a/cc/trees/effect_node.cc b/cc/trees/effect_node.cc
index b8f8aeb..389be1ab 100644
--- a/cc/trees/effect_node.cc
+++ b/cc/trees/effect_node.cc
@@ -33,6 +33,7 @@
       is_masked(false),
       effect_changed(false),
       subtree_has_copy_request(false),
+      is_fast_rounded_corner(false),
       transform_id(0),
       clip_id(0),
       target_id(1),
@@ -54,6 +55,8 @@
          backdrop_filters == other.backdrop_filters &&
          backdrop_filter_bounds == other.backdrop_filter_bounds &&
          filters_origin == other.filters_origin &&
+         rounded_corner_bounds == other.rounded_corner_bounds &&
+         is_fast_rounded_corner == other.is_fast_rounded_corner &&
          blend_mode == other.blend_mode &&
          surface_contents_scale == other.surface_contents_scale &&
          unscaled_mask_target_size == other.unscaled_mask_target_size &&
@@ -86,6 +89,7 @@
   value->SetInteger("stable_id", stable_id);
   value->SetDouble("opacity", opacity);
   value->SetDouble("backdrop_filter_quality", backdrop_filter_quality);
+  value->SetBoolean("is_fast_rounded_corner", is_fast_rounded_corner);
   value->SetString("blend_mode", SkBlendMode_Name(blend_mode));
   value->SetBoolean("has_render_surface", has_render_surface);
   value->SetBoolean("cache_render_surface", cache_render_surface);
diff --git a/cc/trees/effect_node.h b/cc/trees/effect_node.h
index 8ac75b1..fe7920c9 100644
--- a/cc/trees/effect_node.h
+++ b/cc/trees/effect_node.h
@@ -84,6 +84,9 @@
   // frame. Needed in order to compute damage rect.
   bool effect_changed : 1;
   bool subtree_has_copy_request : 1;
+  // If set, the effect node tries to not trigger a render surface due to it
+  // having a rounded corner.
+  bool is_fast_rounded_corner;
   // The transform node index of the transform to apply to this effect
   // node's content when rendering to a surface.
   int transform_id;
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc
index 6657e67..d589797 100644
--- a/cc/trees/layer_tree_host_common_unittest.cc
+++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -11076,5 +11076,599 @@
                   kRoundedCorner2Radius * kDeviceScale);
 }
 
+TEST_F(LayerTreeHostCommonTest, FastRoundedCornerDoesNotTriggerRenderSurface) {
+  // Layer Tree:
+  // +root
+  // +--fast rounded corner layer [should not trigger render surface]
+  // +----layer 1
+  // +----layer 2
+  // +--rounded corner layer [should trigger render surface]
+  // +----layer 3
+  // +----layer 4
+
+  constexpr int kRoundedCorner1Radius = 2;
+  constexpr int kRoundedCorner2Radius = 5;
+
+  constexpr gfx::RectF kRoundedCornerLayer1Bound(0.f, 0.f, 50.f, 50.f);
+  constexpr gfx::RectF kRoundedCornerLayer2Bound(40.f, 40.f, 60.f, 60.f);
+
+  constexpr float kDeviceScale = 1.6f;
+
+  scoped_refptr<Layer> root = Layer::Create();
+  scoped_refptr<Layer> fast_rounded_corner_layer = Layer::Create();
+  scoped_refptr<Layer> layer_1 = Layer::Create();
+  scoped_refptr<Layer> layer_2 = Layer::Create();
+  scoped_refptr<Layer> rounded_corner_layer = Layer::Create();
+  scoped_refptr<Layer> layer_3 = Layer::Create();
+  scoped_refptr<Layer> layer_4 = Layer::Create();
+
+  // Set up layer tree
+  root->AddChild(fast_rounded_corner_layer);
+  root->AddChild(rounded_corner_layer);
+
+  fast_rounded_corner_layer->AddChild(layer_1);
+  fast_rounded_corner_layer->AddChild(layer_2);
+
+  rounded_corner_layer->AddChild(layer_3);
+  rounded_corner_layer->AddChild(layer_4);
+
+  // Set the root layer on host.
+  host()->SetRootLayer(root);
+
+  // Set layer positions.
+  fast_rounded_corner_layer->SetPosition(kRoundedCornerLayer1Bound.origin());
+  layer_1->SetPosition(gfx::PointF(0.f, 0.f));
+  layer_2->SetPosition(gfx::PointF(25.f, 0.f));
+  rounded_corner_layer->SetPosition(kRoundedCornerLayer2Bound.origin());
+  layer_3->SetPosition(gfx::PointF(0.f, 0.f));
+  layer_4->SetPosition(gfx::PointF(30.f, 0.f));
+
+  // Set up layer bounds.
+  root->SetBounds(gfx::Size(100, 100));
+  fast_rounded_corner_layer->SetBounds(
+      gfx::ToRoundedSize(kRoundedCornerLayer1Bound.size()));
+  layer_1->SetBounds(gfx::Size(25, 25));
+  layer_2->SetBounds(gfx::Size(25, 25));
+  rounded_corner_layer->SetBounds(
+      gfx::ToRoundedSize(kRoundedCornerLayer2Bound.size()));
+  layer_3->SetBounds(gfx::Size(30, 60));
+  layer_4->SetBounds(gfx::Size(30, 60));
+
+  root->SetIsDrawable(true);
+  fast_rounded_corner_layer->SetIsDrawable(true);
+  layer_1->SetIsDrawable(true);
+  layer_2->SetIsDrawable(true);
+  rounded_corner_layer->SetIsDrawable(true);
+  layer_3->SetIsDrawable(true);
+  layer_4->SetIsDrawable(true);
+
+  // Set Rounded corners
+  fast_rounded_corner_layer->SetRoundedCorner(
+      {kRoundedCorner1Radius, kRoundedCorner1Radius, kRoundedCorner1Radius,
+       kRoundedCorner1Radius});
+  rounded_corner_layer->SetRoundedCorner(
+      {kRoundedCorner2Radius, kRoundedCorner2Radius, kRoundedCorner2Radius,
+       kRoundedCorner2Radius});
+
+  fast_rounded_corner_layer->SetIsFastRoundedCorner(true);
+
+  ExecuteCalculateDrawProperties(root.get(), kDeviceScale);
+
+  const EffectTree& effect_tree =
+      root->layer_tree_host()->property_trees()->effect_tree;
+
+  // Since this layer has a fast rounded corner, it should not have a render
+  // surface even though it has 2 layers in the subtree that draws content.
+  const EffectNode* effect_node =
+      effect_tree.Node(fast_rounded_corner_layer->effect_tree_index());
+  gfx::RRectF rounded_corner_bounds_1 = effect_node->rounded_corner_bounds;
+  EXPECT_FALSE(effect_node->has_render_surface);
+  EXPECT_TRUE(effect_node->is_fast_rounded_corner);
+  EXPECT_FLOAT_EQ(rounded_corner_bounds_1.GetSimpleRadius(),
+                  kRoundedCorner1Radius);
+  EXPECT_EQ(rounded_corner_bounds_1.rect(),
+            gfx::RectF(kRoundedCornerLayer1Bound.size()));
+
+  // Since this node has 2 descendants that draw, it will have a rounded corner.
+  effect_node = effect_tree.Node(rounded_corner_layer->effect_tree_index());
+  gfx::RRectF rounded_corner_bounds_2 = effect_node->rounded_corner_bounds;
+  EXPECT_TRUE(effect_node->has_render_surface);
+  EXPECT_FALSE(effect_node->is_fast_rounded_corner);
+  EXPECT_FLOAT_EQ(rounded_corner_bounds_2.GetSimpleRadius(),
+                  kRoundedCorner2Radius);
+  EXPECT_EQ(rounded_corner_bounds_2.rect(),
+            gfx::RectF(kRoundedCornerLayer2Bound.size()));
+
+  host()->host_impl()->CreatePendingTree();
+  host()->CommitAndCreatePendingTree();
+  // TODO(https://crbug.com/939968) This call should be handled by
+  // FakeLayerTreeHost instead of manually pushing the properties from the
+  // layer tree host to the pending tree.
+  root->layer_tree_host()->PushLayerTreePropertiesTo(host()->pending_tree());
+  host()->host_impl()->ActivateSyncTree();
+  LayerTreeImpl* layer_tree_impl = host()->host_impl()->active_tree();
+
+  // Get the layer impl for each Layer.
+  LayerImpl* root_impl = layer_tree_impl->LayerById(root->id());
+  LayerImpl* fast_rounded_corner_layer_impl =
+      layer_tree_impl->LayerById(fast_rounded_corner_layer->id());
+  LayerImpl* layer_1_impl = layer_tree_impl->LayerById(layer_1->id());
+  LayerImpl* layer_2_impl = layer_tree_impl->LayerById(layer_2->id());
+  LayerImpl* rounded_corner_layer_impl =
+      layer_tree_impl->LayerById(rounded_corner_layer->id());
+  LayerImpl* layer_3_impl = layer_tree_impl->LayerById(layer_3->id());
+  LayerImpl* layer_4_impl = layer_tree_impl->LayerById(layer_4->id());
+
+  // Set the root layer on host.
+  ExecuteCalculateDrawProperties(root_impl, kDeviceScale);
+
+  // Fast rounded corner layer.
+  // The render target for this layer is |root|, hence its target bounds are
+  // relative to |root|.
+  // The offset from the origin of the render target is [0, 0] and the device
+  // scale factor is 1.6.
+  const gfx::RRectF actual_rrect_1 =
+      fast_rounded_corner_layer_impl->draw_properties().rounded_corner_bounds;
+  gfx::RectF bounds_in_target_space = kRoundedCornerLayer1Bound;
+  bounds_in_target_space.Scale(kDeviceScale);
+  EXPECT_EQ(actual_rrect_1.rect(), bounds_in_target_space);
+  EXPECT_FLOAT_EQ(actual_rrect_1.GetSimpleRadius(),
+                  kRoundedCorner1Radius * kDeviceScale);
+
+  // Layer 1 and layer 2 rounded corner bounds
+  // This should have the same rounded corner boudns as fast rounded corner
+  // layer.
+  const gfx::RRectF layer_1_rrect =
+      layer_1_impl->draw_properties().rounded_corner_bounds;
+  const gfx::RRectF layer_2_rrect =
+      layer_2_impl->draw_properties().rounded_corner_bounds;
+  EXPECT_EQ(actual_rrect_1, layer_1_rrect);
+  EXPECT_EQ(actual_rrect_1, layer_2_rrect);
+
+  // Rounded corner layer
+  // The render target for this layer is |root|.
+  // The offset from the origin of the render target is [40, 40] and the device
+  // scale factor is 1.6 thus giving the target space origin of [64, 64]. The
+  // corner radius is also scaled by a factor of 1.6.
+  const gfx::RRectF actual_self_rrect_2 =
+      rounded_corner_layer_impl->draw_properties().rounded_corner_bounds;
+  EXPECT_TRUE(actual_self_rrect_2.IsEmpty());
+
+  bounds_in_target_space = kRoundedCornerLayer2Bound;
+  bounds_in_target_space.Scale(kDeviceScale);
+  const gfx::RRectF actual_render_target_rrect_2 =
+      rounded_corner_layer_impl->render_target()->rounded_corner_bounds();
+  EXPECT_EQ(actual_render_target_rrect_2.rect(), bounds_in_target_space);
+  EXPECT_FLOAT_EQ(actual_render_target_rrect_2.GetSimpleRadius(),
+                  kRoundedCorner2Radius * kDeviceScale);
+
+  // Layer 3 and layer 4 should have no rounded corner bounds set as their
+  // parent is a render surface.
+  const gfx::RRectF layer_3_rrect =
+      layer_3_impl->draw_properties().rounded_corner_bounds;
+  const gfx::RRectF layer_4_rrect =
+      layer_4_impl->draw_properties().rounded_corner_bounds;
+  EXPECT_TRUE(layer_3_rrect.IsEmpty());
+  EXPECT_TRUE(layer_4_rrect.IsEmpty());
+}
+
+TEST_F(LayerTreeHostCommonTest,
+       FastRoundedCornerTriggersRenderSurfaceInAncestor) {
+  // Layer Tree:
+  // +root
+  // +--rounded corner layer [1] [should trigger render surface]
+  // +----fast rounded corner layer [2] [should not trigger render surface]
+  // +--rounded corner layer [3] [should trigger render surface]
+  // +----rounded corner layer [4] [should not trigger render surface]
+
+  constexpr int kRoundedCorner1Radius = 2;
+  constexpr int kRoundedCorner2Radius = 5;
+  constexpr int kRoundedCorner3Radius = 1;
+  constexpr int kRoundedCorner4Radius = 3;
+
+  constexpr gfx::RectF kRoundedCornerLayer1Bound(5.f, 5.f, 50.f, 50.f);
+  constexpr gfx::RectF kRoundedCornerLayer2Bound(0.f, 0.f, 25.f, 25.f);
+  constexpr gfx::RectF kRoundedCornerLayer3Bound(40.f, 40.f, 60.f, 60.f);
+  constexpr gfx::RectF kRoundedCornerLayer4Bound(30.f, 0.f, 30.f, 60.f);
+
+  constexpr float kDeviceScale = 1.6f;
+
+  scoped_refptr<Layer> root = Layer::Create();
+  scoped_refptr<Layer> rounded_corner_layer_1 = Layer::Create();
+  scoped_refptr<Layer> fast_rounded_corner_layer_2 = Layer::Create();
+  scoped_refptr<Layer> rounded_corner_layer_3 = Layer::Create();
+  scoped_refptr<Layer> rounded_corner_layer_4 = Layer::Create();
+
+  // Set up layer tree
+  root->AddChild(rounded_corner_layer_1);
+  root->AddChild(rounded_corner_layer_3);
+
+  rounded_corner_layer_1->AddChild(fast_rounded_corner_layer_2);
+
+  rounded_corner_layer_3->AddChild(rounded_corner_layer_4);
+
+  // Set the root layer on host.
+  host()->SetRootLayer(root);
+
+  // Set layer positions.
+  rounded_corner_layer_1->SetPosition(kRoundedCornerLayer1Bound.origin());
+  fast_rounded_corner_layer_2->SetPosition(kRoundedCornerLayer2Bound.origin());
+  rounded_corner_layer_3->SetPosition(kRoundedCornerLayer3Bound.origin());
+  rounded_corner_layer_4->SetPosition(kRoundedCornerLayer4Bound.origin());
+
+  // Set up layer bounds.
+  root->SetBounds(gfx::Size(100, 100));
+  rounded_corner_layer_1->SetBounds(
+      gfx::ToRoundedSize(kRoundedCornerLayer1Bound.size()));
+  fast_rounded_corner_layer_2->SetBounds(
+      gfx::ToRoundedSize(kRoundedCornerLayer2Bound.size()));
+  rounded_corner_layer_3->SetBounds(
+      gfx::ToRoundedSize(kRoundedCornerLayer3Bound.size()));
+  rounded_corner_layer_4->SetBounds(
+      gfx::ToRoundedSize(kRoundedCornerLayer4Bound.size()));
+
+  root->SetIsDrawable(true);
+  rounded_corner_layer_1->SetIsDrawable(true);
+  fast_rounded_corner_layer_2->SetIsDrawable(true);
+  rounded_corner_layer_3->SetIsDrawable(true);
+  rounded_corner_layer_4->SetIsDrawable(true);
+
+  // Set Rounded corners
+  rounded_corner_layer_1->SetRoundedCorner(
+      {kRoundedCorner1Radius, kRoundedCorner1Radius, kRoundedCorner1Radius,
+       kRoundedCorner1Radius});
+  fast_rounded_corner_layer_2->SetRoundedCorner(
+      {kRoundedCorner2Radius, kRoundedCorner2Radius, kRoundedCorner2Radius,
+       kRoundedCorner2Radius});
+  rounded_corner_layer_3->SetRoundedCorner(
+      {kRoundedCorner3Radius, kRoundedCorner3Radius, kRoundedCorner3Radius,
+       kRoundedCorner3Radius});
+  rounded_corner_layer_4->SetRoundedCorner(
+      {kRoundedCorner4Radius, kRoundedCorner4Radius, kRoundedCorner4Radius,
+       kRoundedCorner4Radius});
+
+  fast_rounded_corner_layer_2->SetIsFastRoundedCorner(true);
+
+  ExecuteCalculateDrawProperties(root.get(), kDeviceScale);
+
+  const EffectTree& effect_tree =
+      root->layer_tree_host()->property_trees()->effect_tree;
+
+  // Since this layer has a descendant that has rounded corner, this node will
+  // require a render surface.
+  const EffectNode* effect_node =
+      effect_tree.Node(rounded_corner_layer_1->effect_tree_index());
+  gfx::RRectF rounded_corner_bounds_1 = effect_node->rounded_corner_bounds;
+  EXPECT_TRUE(effect_node->has_render_surface);
+  EXPECT_FALSE(effect_node->is_fast_rounded_corner);
+  EXPECT_FLOAT_EQ(rounded_corner_bounds_1.GetSimpleRadius(),
+                  kRoundedCorner1Radius);
+  EXPECT_EQ(rounded_corner_bounds_1.rect(),
+            gfx::RectF(kRoundedCornerLayer1Bound.size()));
+
+  // Since this layer has no descendant with rounded corner or drawable, it will
+  // not have a render surface.
+  effect_node =
+      effect_tree.Node(fast_rounded_corner_layer_2->effect_tree_index());
+  gfx::RRectF rounded_corner_bounds_2 = effect_node->rounded_corner_bounds;
+  EXPECT_FALSE(effect_node->has_render_surface);
+  EXPECT_TRUE(effect_node->is_fast_rounded_corner);
+  EXPECT_FLOAT_EQ(rounded_corner_bounds_2.GetSimpleRadius(),
+                  kRoundedCorner2Radius);
+  EXPECT_EQ(rounded_corner_bounds_2.rect(),
+            gfx::RectF(kRoundedCornerLayer2Bound.size()));
+
+  // Since this layer has 1 descendant with a rounded corner, it should have a
+  // render surface.
+  effect_node = effect_tree.Node(rounded_corner_layer_3->effect_tree_index());
+  gfx::RRectF rounded_corner_bounds_3 = effect_node->rounded_corner_bounds;
+  EXPECT_TRUE(effect_node->has_render_surface);
+  EXPECT_FALSE(effect_node->is_fast_rounded_corner);
+  EXPECT_FLOAT_EQ(rounded_corner_bounds_3.GetSimpleRadius(),
+                  kRoundedCorner3Radius);
+  EXPECT_EQ(rounded_corner_bounds_3.rect(),
+            gfx::RectF(kRoundedCornerLayer3Bound.size()));
+
+  // Since this layer no descendants, it would no thave a render pass.
+  effect_node = effect_tree.Node(rounded_corner_layer_4->effect_tree_index());
+  gfx::RRectF rounded_corner_bounds_4 = effect_node->rounded_corner_bounds;
+  EXPECT_FALSE(effect_node->has_render_surface);
+  EXPECT_FALSE(effect_node->is_fast_rounded_corner);
+  EXPECT_FLOAT_EQ(rounded_corner_bounds_4.GetSimpleRadius(),
+                  kRoundedCorner4Radius);
+  EXPECT_EQ(rounded_corner_bounds_4.rect(),
+            gfx::RectF(kRoundedCornerLayer4Bound.size()));
+
+  host()->host_impl()->CreatePendingTree();
+  host()->CommitAndCreatePendingTree();
+  // TODO(https://crbug.com/939968) This call should be handled by
+  // FakeLayerTreeHost instead of manually pushing the properties from the
+  // layer tree host to the pending tree.
+  root->layer_tree_host()->PushLayerTreePropertiesTo(host()->pending_tree());
+  host()->host_impl()->ActivateSyncTree();
+  LayerTreeImpl* layer_tree_impl = host()->host_impl()->active_tree();
+
+  // Get the layer impl for each Layer.
+  LayerImpl* root_impl = layer_tree_impl->LayerById(root->id());
+  LayerImpl* rounded_corner_layer_impl_1 =
+      layer_tree_impl->LayerById(rounded_corner_layer_1->id());
+  LayerImpl* fast_rounded_corner_layer_impl_2 =
+      layer_tree_impl->LayerById(fast_rounded_corner_layer_2->id());
+  LayerImpl* rounded_corner_layer_impl_3 =
+      layer_tree_impl->LayerById(rounded_corner_layer_3->id());
+  LayerImpl* rounded_corner_layer_impl_4 =
+      layer_tree_impl->LayerById(rounded_corner_layer_4->id());
+
+  // Set the root layer on host.
+  ExecuteCalculateDrawProperties(root_impl, kDeviceScale);
+
+  // Rounded corner layer 1.
+  // The render target for this layer is |root|, hence its target bounds are
+  // relative to |root|.
+  // The offset from the origin of the render target is [5, 5] and the device
+  // scale factor is 1.6 giving a total offset of [8, 8].
+  const gfx::RRectF actual_self_rrect_1 =
+      rounded_corner_layer_impl_1->draw_properties().rounded_corner_bounds;
+  EXPECT_TRUE(actual_self_rrect_1.IsEmpty());
+
+  gfx::RectF bounds_in_target_space = kRoundedCornerLayer1Bound;
+  bounds_in_target_space.Scale(kDeviceScale);
+  const gfx::RRectF actual_render_target_rrect_1 =
+      rounded_corner_layer_impl_1->render_target()->rounded_corner_bounds();
+  EXPECT_EQ(actual_render_target_rrect_1.rect(), bounds_in_target_space);
+  EXPECT_FLOAT_EQ(actual_render_target_rrect_1.GetSimpleRadius(),
+                  kRoundedCorner1Radius * kDeviceScale);
+
+  // Fast rounded corner layer 2
+  // The render target for this layer is |rounded_corner_layer_1|.
+  // The offset from the origin of the render target is [0, 0] and the device
+  // scale factor is 1.6. The corner radius is also scaled by a factor of 1.6.
+  const gfx::RRectF actual_self_rrect_2 =
+      fast_rounded_corner_layer_impl_2->draw_properties().rounded_corner_bounds;
+  bounds_in_target_space = kRoundedCornerLayer2Bound;
+  bounds_in_target_space.Scale(kDeviceScale);
+  EXPECT_EQ(actual_self_rrect_2.rect(), bounds_in_target_space);
+  EXPECT_FLOAT_EQ(actual_self_rrect_2.GetSimpleRadius(),
+                  kRoundedCorner2Radius * kDeviceScale);
+
+  // Rounded corner layer 3
+  // The render target for this layer is |root|.
+  // The offset from the origin of the render target is [40, 40] and the device
+  // scale factor is 1.6 thus giving the target space origin of [64, 64]. The
+  // corner radius is also scaled by a factor of 1.6.
+  const gfx::RRectF actual_self_rrect_3 =
+      rounded_corner_layer_impl_3->draw_properties().rounded_corner_bounds;
+  EXPECT_TRUE(actual_self_rrect_3.IsEmpty());
+
+  bounds_in_target_space = kRoundedCornerLayer3Bound;
+  bounds_in_target_space.Scale(kDeviceScale);
+  const gfx::RRectF actual_render_target_rrect_3 =
+      rounded_corner_layer_impl_3->render_target()->rounded_corner_bounds();
+  EXPECT_EQ(actual_render_target_rrect_3.rect(), bounds_in_target_space);
+  EXPECT_FLOAT_EQ(actual_render_target_rrect_3.GetSimpleRadius(),
+                  kRoundedCorner3Radius * kDeviceScale);
+
+  // Rounded corner layer 4
+  // The render target for this layer is |rounded_corner_layer_3|.
+  // The offset from the origin of the render target is [30, 0] and the device
+  // scale factor is 1.6 thus giving the target space origin of [48, 0]. The
+  // corner radius is also scaled by a factor of 1.6.
+  const gfx::RRectF actual_self_rrect_4 =
+      rounded_corner_layer_impl_4->draw_properties().rounded_corner_bounds;
+  bounds_in_target_space = kRoundedCornerLayer4Bound;
+  bounds_in_target_space.Scale(kDeviceScale);
+  EXPECT_EQ(actual_self_rrect_4.rect(), bounds_in_target_space);
+  EXPECT_FLOAT_EQ(actual_self_rrect_4.GetSimpleRadius(),
+                  kRoundedCorner4Radius * kDeviceScale);
+}
+
+TEST_F(LayerTreeHostCommonTest,
+       FastRoundedCornerDoesNotTriggerRenderSurfaceFromSubtree) {
+  // Layer Tree:
+  // +root
+  // +--fast rounded corner layer 1 [should trigger render surface]
+  // +----rounded corner layer 1 [should not trigger render surface]
+  // +--rounded corner layer 2 [should trigger render surface]
+  // +----rounded corner layer 3 [should not trigger render surface]
+  constexpr int kRoundedCorner1Radius = 2;
+  constexpr int kRoundedCorner2Radius = 5;
+  constexpr int kRoundedCorner3Radius = 4;
+  constexpr int kRoundedCorner4Radius = 5;
+
+  constexpr gfx::RectF kRoundedCornerLayer1Bound(10.f, 5.f, 45.f, 50.f);
+  constexpr gfx::RectF kRoundedCornerLayer2Bound(5.f, 5.f, 20.f, 20.f);
+  constexpr gfx::RectF kRoundedCornerLayer3Bound(60.f, 5.f, 40.f, 25.f);
+  constexpr gfx::RectF kRoundedCornerLayer4Bound(0.f, 10.f, 10.f, 20.f);
+
+  constexpr float kDeviceScale = 1.6f;
+
+  scoped_refptr<Layer> root = Layer::Create();
+  scoped_refptr<Layer> fast_rounded_corner_layer_1 = Layer::Create();
+  scoped_refptr<Layer> rounded_corner_layer_1 = Layer::Create();
+  scoped_refptr<Layer> rounded_corner_layer_2 = Layer::Create();
+  scoped_refptr<Layer> rounded_corner_layer_3 = Layer::Create();
+
+  // Set up layer tree
+  root->AddChild(fast_rounded_corner_layer_1);
+  root->AddChild(rounded_corner_layer_2);
+
+  fast_rounded_corner_layer_1->AddChild(rounded_corner_layer_1);
+  rounded_corner_layer_2->AddChild(rounded_corner_layer_3);
+
+  // Set the root layer on host.
+  host()->SetRootLayer(root);
+
+  // Set layer positions.
+  fast_rounded_corner_layer_1->SetPosition(kRoundedCornerLayer1Bound.origin());
+  rounded_corner_layer_1->SetPosition(kRoundedCornerLayer2Bound.origin());
+  rounded_corner_layer_2->SetPosition(kRoundedCornerLayer3Bound.origin());
+  rounded_corner_layer_3->SetPosition(kRoundedCornerLayer4Bound.origin());
+
+  // Set up layer bounds.
+  root->SetBounds(gfx::Size(100, 100));
+  fast_rounded_corner_layer_1->SetBounds(
+      gfx::ToRoundedSize(kRoundedCornerLayer1Bound.size()));
+  rounded_corner_layer_1->SetBounds(
+      gfx::ToRoundedSize(kRoundedCornerLayer2Bound.size()));
+  rounded_corner_layer_2->SetBounds(
+      gfx::ToRoundedSize(kRoundedCornerLayer3Bound.size()));
+  rounded_corner_layer_3->SetBounds(
+      gfx::ToRoundedSize(kRoundedCornerLayer4Bound.size()));
+
+  root->SetIsDrawable(true);
+  fast_rounded_corner_layer_1->SetIsDrawable(true);
+  rounded_corner_layer_1->SetIsDrawable(true);
+  rounded_corner_layer_2->SetIsDrawable(true);
+  rounded_corner_layer_3->SetIsDrawable(true);
+
+  // Set Rounded corners
+  fast_rounded_corner_layer_1->SetRoundedCorner(
+      {kRoundedCorner1Radius, kRoundedCorner1Radius, kRoundedCorner1Radius,
+       kRoundedCorner1Radius});
+  rounded_corner_layer_1->SetRoundedCorner(
+      {kRoundedCorner2Radius, kRoundedCorner2Radius, kRoundedCorner2Radius,
+       kRoundedCorner2Radius});
+  rounded_corner_layer_2->SetRoundedCorner(
+      {kRoundedCorner3Radius, kRoundedCorner3Radius, kRoundedCorner3Radius,
+       kRoundedCorner3Radius});
+  rounded_corner_layer_3->SetRoundedCorner(
+      {kRoundedCorner4Radius, kRoundedCorner4Radius, kRoundedCorner4Radius,
+       kRoundedCorner4Radius});
+
+  fast_rounded_corner_layer_1->SetIsFastRoundedCorner(true);
+
+  ExecuteCalculateDrawProperties(root.get(), kDeviceScale);
+
+  const EffectTree& effect_tree =
+      root->layer_tree_host()->property_trees()->effect_tree;
+
+  // Since this layer has a descendant with rounded corner, it needs a render
+  // surface.
+  const EffectNode* effect_node =
+      effect_tree.Node(fast_rounded_corner_layer_1->effect_tree_index());
+  gfx::RRectF rounded_corner_bounds_1 = effect_node->rounded_corner_bounds;
+  EXPECT_TRUE(effect_node->has_render_surface);
+  EXPECT_TRUE(effect_node->is_fast_rounded_corner);
+  EXPECT_FLOAT_EQ(rounded_corner_bounds_1.GetSimpleRadius(),
+                  kRoundedCorner1Radius);
+  EXPECT_EQ(rounded_corner_bounds_1.rect(),
+            gfx::RectF(kRoundedCornerLayer1Bound.size()));
+
+  // Since this layer has no descendant with rounded corner or drawable, it will
+  // not have a render surface.
+  effect_node = effect_tree.Node(rounded_corner_layer_1->effect_tree_index());
+  gfx::RRectF rounded_corner_bounds_2 = effect_node->rounded_corner_bounds;
+  EXPECT_FALSE(effect_node->has_render_surface);
+  EXPECT_FALSE(effect_node->is_fast_rounded_corner);
+  EXPECT_FLOAT_EQ(rounded_corner_bounds_2.GetSimpleRadius(),
+                  kRoundedCorner2Radius);
+  EXPECT_EQ(rounded_corner_bounds_2.rect(),
+            gfx::RectF(kRoundedCornerLayer2Bound.size()));
+
+  // Since this layer has a descendant with rounded corner, it should have a
+  // render surface.
+  effect_node = effect_tree.Node(rounded_corner_layer_2->effect_tree_index());
+  gfx::RRectF rounded_corner_bounds_3 = effect_node->rounded_corner_bounds;
+  EXPECT_TRUE(effect_node->has_render_surface);
+  EXPECT_FALSE(effect_node->is_fast_rounded_corner);
+  EXPECT_FLOAT_EQ(rounded_corner_bounds_3.GetSimpleRadius(),
+                  kRoundedCorner3Radius);
+  EXPECT_EQ(rounded_corner_bounds_3.rect(),
+            gfx::RectF(kRoundedCornerLayer3Bound.size()));
+
+  // Since this layer has no descendant, it does not need a render surface.
+  effect_node = effect_tree.Node(rounded_corner_layer_3->effect_tree_index());
+  gfx::RRectF rounded_corner_bounds_4 = effect_node->rounded_corner_bounds;
+  EXPECT_FALSE(effect_node->has_render_surface);
+  EXPECT_FALSE(effect_node->is_fast_rounded_corner);
+  EXPECT_FLOAT_EQ(rounded_corner_bounds_4.GetSimpleRadius(),
+                  kRoundedCorner4Radius);
+  EXPECT_EQ(rounded_corner_bounds_4.rect(),
+            gfx::RectF(kRoundedCornerLayer4Bound.size()));
+
+  host()->host_impl()->CreatePendingTree();
+  host()->CommitAndCreatePendingTree();
+  // TODO(https://crbug.com/939968) This call should be handled by
+  // FakeLayerTreeHost instead of manually pushing the properties from the
+  // layer tree host to the pending tree.
+  root->layer_tree_host()->PushLayerTreePropertiesTo(host()->pending_tree());
+  host()->host_impl()->ActivateSyncTree();
+  LayerTreeImpl* layer_tree_impl = host()->host_impl()->active_tree();
+
+  // Get the layer impl for each Layer.
+  LayerImpl* root_impl = layer_tree_impl->LayerById(root->id());
+  LayerImpl* fast_rounded_corner_layer_impl_1 =
+      layer_tree_impl->LayerById(fast_rounded_corner_layer_1->id());
+  LayerImpl* rounded_corner_layer_impl_1 =
+      layer_tree_impl->LayerById(rounded_corner_layer_1->id());
+  LayerImpl* rounded_corner_layer_impl_2 =
+      layer_tree_impl->LayerById(rounded_corner_layer_2->id());
+  LayerImpl* rounded_corner_layer_impl_3 =
+      layer_tree_impl->LayerById(rounded_corner_layer_3->id());
+
+  // Set the root layer on host.
+  ExecuteCalculateDrawProperties(root_impl, kDeviceScale);
+
+  // Fast rounded corner layer 1.
+  // The render target for this layer is |root|, hence its target bounds are
+  // relative to |root|.
+  // The offset from the origin of the render target is [5, 5] and the device
+  // scale factor is 1.6.
+  const gfx::RRectF actual_self_rrect_1 =
+      fast_rounded_corner_layer_impl_1->draw_properties().rounded_corner_bounds;
+  EXPECT_TRUE(actual_self_rrect_1.IsEmpty());
+
+  gfx::RectF bounds_in_target_space = kRoundedCornerLayer1Bound;
+  bounds_in_target_space.Scale(kDeviceScale);
+  const gfx::RRectF actual_render_target_rrect_1 =
+      fast_rounded_corner_layer_impl_1->render_target()
+          ->rounded_corner_bounds();
+  EXPECT_EQ(actual_render_target_rrect_1.rect(), bounds_in_target_space);
+  EXPECT_FLOAT_EQ(actual_render_target_rrect_1.GetSimpleRadius(),
+                  kRoundedCorner1Radius * kDeviceScale);
+
+  // Rounded corner layer 1
+  // The render target for this layer is |fast_rounded_corner_layer_1|.
+  // The offset from the origin of the render target is [0, 0] and the device
+  // scale factor is 1.6. The corner radius is also scaled by a factor of 1.6.
+  const gfx::RRectF actual_self_rrect_2 =
+      rounded_corner_layer_impl_1->draw_properties().rounded_corner_bounds;
+  bounds_in_target_space = kRoundedCornerLayer2Bound;
+  bounds_in_target_space.Scale(kDeviceScale);
+  EXPECT_EQ(actual_self_rrect_2.rect(), bounds_in_target_space);
+  EXPECT_FLOAT_EQ(actual_self_rrect_2.GetSimpleRadius(),
+                  kRoundedCorner2Radius * kDeviceScale);
+
+  // Rounded corner layer 3
+  // The render target for this layer is |root|.
+  // The offset from the origin of the render target is [5, 5] and the device
+  // scale factor is 1.6 thus giving the target space origin of [8, 8]. The
+  // corner radius is also scaled by a factor of 1.6.
+  const gfx::RRectF actual_self_rrect_3 =
+      rounded_corner_layer_impl_2->draw_properties().rounded_corner_bounds;
+  EXPECT_TRUE(actual_self_rrect_3.IsEmpty());
+
+  bounds_in_target_space = kRoundedCornerLayer3Bound;
+  bounds_in_target_space.Scale(kDeviceScale);
+  const gfx::RRectF actual_render_target_rrect_3 =
+      rounded_corner_layer_impl_2->render_target()->rounded_corner_bounds();
+  EXPECT_EQ(actual_render_target_rrect_3.rect(), bounds_in_target_space);
+  EXPECT_FLOAT_EQ(actual_render_target_rrect_3.GetSimpleRadius(),
+                  kRoundedCorner3Radius * kDeviceScale);
+
+  // Rounded corner layer 4
+  // The render target for this layer is |rounded_corner_layer_2|.
+  // The offset from the origin of the render target is [0, 5] and the device
+  // scale factor is 1.6 thus giving the target space origin of [0, 8]. The
+  // corner radius is also scaled by a factor of 1.6.
+  const gfx::RRectF actual_self_rrect_4 =
+      rounded_corner_layer_impl_3->draw_properties().rounded_corner_bounds;
+  bounds_in_target_space = kRoundedCornerLayer4Bound;
+  bounds_in_target_space.Scale(kDeviceScale);
+  EXPECT_EQ(actual_self_rrect_4.rect(), bounds_in_target_space);
+  EXPECT_FLOAT_EQ(actual_self_rrect_4.GetSimpleRadius(),
+                  kRoundedCorner4Radius * kDeviceScale);
+}
+
 }  // namespace
 }  // namespace cc
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc
index 16ac1fd2..b49e76d 100644
--- a/cc/trees/property_tree_builder.cc
+++ b/cc/trees/property_tree_builder.cc
@@ -114,6 +114,12 @@
       LayerType* layer,
       DataForRecursion<LayerType>* data_for_children) const;
 
+  bool UpdateRenderSurfaceIfNeeded(
+      int parent_effect_tree_id,
+      DataForRecursion<LayerType>* data_for_children,
+      bool subtree_has_rounded_corner,
+      bool created_transform_node) const;
+
   LayerType* root_layer_;
   const LayerType* page_scale_layer_;
   const LayerType* inner_viewport_scroll_layer_;
@@ -188,6 +194,14 @@
   return layer->test_properties()->filters;
 }
 
+static bool IsFastRoundedCorner(Layer* layer) {
+  return layer->is_fast_rounded_corner();
+}
+
+static bool IsFastRoundedCorner(LayerImpl* layer) {
+  return false;
+}
+
 static bool HasRoundedCorner(Layer* layer) {
   return layer->HasRoundedCorner();
 }
@@ -870,8 +884,10 @@
     return true;
   }
 
-  if (HasRoundedCorner(layer) && num_descendants_that_draw_content > 1)
+  if (!IsFastRoundedCorner(layer) && HasRoundedCorner(layer) &&
+      num_descendants_that_draw_content > 1) {
     return true;
+  }
 
   // If the layer has blending.
   // TODO(rosca): this is temporary, until blending is implemented for other
@@ -1074,6 +1090,7 @@
     // space. Once we have the associated transform node for this effect node,
     // we will update this to the transform node's coordinate space.
     node->rounded_corner_bounds = RoundedCornerBounds(layer);
+    node->is_fast_rounded_corner = IsFastRoundedCorner(layer);
   }
 
   if (!is_root) {
@@ -1126,6 +1143,48 @@
   return should_create_render_surface;
 }
 
+template <typename LayerType>
+bool PropertyTreeBuilderContext<LayerType>::UpdateRenderSurfaceIfNeeded(
+    int parent_effect_tree_id,
+    DataForRecursion<LayerType>* data_for_children,
+    bool subtree_has_rounded_corner,
+    bool created_transform_node) const {
+  // No effect node was generated for this layer.
+  if (parent_effect_tree_id == data_for_children->effect_tree_parent) {
+    *data_for_children->subtree_has_rounded_corner = subtree_has_rounded_corner;
+    return false;
+  }
+
+  EffectNode* effect_node =
+      effect_tree_.Node(data_for_children->effect_tree_parent);
+  const bool has_rounded_corner = !effect_node->rounded_corner_bounds.IsEmpty();
+
+  // Having a rounded corner should trigger a transform node.
+  if (has_rounded_corner)
+    DCHECK(created_transform_node);
+
+  // If the subtree has a rounded corner and this node also has a rounded
+  // corner, then this node needs to have a render surface to prevent any
+  // intersections between the rrects. Since GL renderer can only handle a
+  // single rrect per quad at draw time, it would be unable to handle
+  // intersections thus resulting in artifacts.
+  if (subtree_has_rounded_corner && has_rounded_corner)
+    effect_node->has_render_surface = true;
+
+  // Inform the parent that its subtree has rounded corners if one of the two
+  // scenario is true:
+  //   - The subtree rooted at this node has a rounded corner and this node
+  //     does not have a render surface.
+  //   - This node has a rounded corner.
+  // The parent may have a rounded corner and would want to create a render
+  // surface of its own to prevent blending artifacts due to intersecting
+  // rounded corners.
+  *data_for_children->subtree_has_rounded_corner =
+      (subtree_has_rounded_corner && !effect_node->has_render_surface) ||
+      has_rounded_corner;
+  return effect_node->has_render_surface;
+}
+
 static inline bool UserScrollableHorizontal(Layer* layer) {
   return layer->GetUserScrollableHorizontal();
 }
@@ -1346,36 +1405,9 @@
     BuildPropertyTreesInternal(scroll_child, data_for_children);
   }
 
-  // Update the effect node, if one exists, for the given |layer|.
-  bool has_rounded_corner = false;
-  if (data_for_children.effect_tree_parent !=
-      data_from_parent.effect_tree_parent) {
-    EffectNode* effect_node =
-        effect_tree_.Node(data_for_children.effect_tree_parent);
-    has_rounded_corner = !effect_node->rounded_corner_bounds.IsEmpty();
-
-    // Having a rounded corner should trigger a transform node.
-    if (has_rounded_corner)
-      DCHECK(created_transform_node);
-
-    // If the subtree has a rounded corner and this node also has a rounded
-    // corner, then this node needs to have a render surface to prevent
-    // any intersections between the rrects.
-    if (subtree_has_rounded_corner && has_rounded_corner)
-      effect_node->has_render_surface = created_render_surface = true;
-  }
-
-  // Inform the parent that its subtree has rounded corners if one of the two
-  // scenario is true:
-  //   - The subtree rooted at this node has a rounded corner and this node
-  //     does not have a render surface.
-  //   - This node has a rounded corner.
-  // The parent may have a rounded corner and would want to create a render
-  // surface of its own to prevent blending artifacts due to intersecting
-  // rounded corners.
-  *data_for_children.subtree_has_rounded_corner =
-      (subtree_has_rounded_corner && !created_render_surface) ||
-      has_rounded_corner;
+  created_render_surface = UpdateRenderSurfaceIfNeeded(
+      data_from_parent.effect_tree_parent, &data_for_children,
+      subtree_has_rounded_corner, created_transform_node);
 
   if (MaskLayer(layer)) {
     MaskLayer(layer)->set_property_tree_sequence_number(
diff --git a/chrome/VERSION b/chrome/VERSION
index 52e5d0d..97d9170 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=75
 MINOR=0
-BUILD=3733
+BUILD=3734
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index ae6b1d8..3fa111c 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -445,6 +445,10 @@
     "//base/android/jni_generator:jni_processor",
     "//third_party/android_deps:dagger_processor",
   ]
+
+  if (async_ar) {
+    proguard_configs = [ "//chrome/android/features/ar/proguard_async.flags" ]
+  }
 }
 
 # This is a list of all our base module java dependencies. New features should
@@ -2069,6 +2073,7 @@
         {
           name = "ar"
           module_target = ":${target_name}__ar_bundle_module"
+          proguard_async = async_ar
         },
       ]
     }
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni
index f2833952..2b5624d 100644
--- a/chrome/android/chrome_public_apk_tmpl.gni
+++ b/chrome/android/chrome_public_apk_tmpl.gni
@@ -242,6 +242,10 @@
       deps += [ "//chrome/android/features/vr:java" ]
     }
 
+    if (_target_type == "android_apk") {
+      deps += [ "//chrome/android/features/tab_ui:java" ]
+    }
+
     if (!defined(version_code)) {
       if (_use_trichrome_library) {
         version_code = trichrome_version_code
diff --git a/chrome/android/features/ar/proguard_async.flags b/chrome/android/features/ar/proguard_async.flags
new file mode 100644
index 0000000..282db1e1
--- /dev/null
+++ b/chrome/android/features/ar/proguard_async.flags
@@ -0,0 +1,7 @@
+# Explicitly keep the ArCoreShim interface. Because ArCoreShim
+# is in base, and its implementing class ArCoreShimImpl is in AR,
+# asynchronous proguarding of AR will cause ArCoreShim to be removed
+# during synchronous proguarding, which causes AR on Chrome to crash.
+-keep interface org.chromium.chrome.browser.vr.ArCoreShim {
+  *;
+}
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ca.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ca.xtb
index 8ed0d284..db28d18 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ca.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ca.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Chrome enviarà a <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> les dades personals que hagis seleccionat</translation>
 <translation id="3604604794717279723">Accepto</translation>
 <translation id="5014174725590676422">Es mostra la pantalla de la primera execució de l'Assistent de Google a Chrome</translation>
+<translation id="5188078772080029703">Chrome enviarà a Google l'URL i el contingut del lloc web, així com l'adreça electrònica i el tipus de targeta de crèdit que tens desats al navegador. Pots desactivar aquesta funció a la configuració de Chrome. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">Veig que estàs navegant pel teu compte. Et deixo fer. Que vagi bé el dia :)</translation>
 <translation id="7670842975141217779">L'Assistent de Google\na Chrome</translation>
 <translation id="7871791972254842204">Llegeix i accepta els termes i condicions del domini <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> més tard</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb
index d919d46c..19853c9 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Osobní údaje, které jste vybrali, Chrome odešle webu <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="3604604794717279723">Přijímám</translation>
 <translation id="5014174725590676422">Je zobrazena obrazovka prvního spuštění Asistenta Google v Chromu</translation>
+<translation id="5188078772080029703">Adresu URL a obsah webu a váš e-mail a typ platební karty uložený v Chromu odešle Chrome do Googlu. Tuto možnost můžete vypnout v nastavení. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">Zdá se, že jste sami přešli jinam. Nechám to na vás. Mějte se hezky :-)</translation>
 <translation id="7670842975141217779">Asistent Google\nv Chromu</translation>
 <translation id="7871791972254842204">Přečíst si a odsouhlasit smluvní podmínky domény <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> později</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es.xtb
index 331dd972..361df66b 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Chrome enviará la información personal que hayas seleccionado a <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="3604604794717279723">Acepto</translation>
 <translation id="5014174725590676422">Se muestra la primera pantalla de ejecución del Asistente de Google en Chrome</translation>
+<translation id="5188078772080029703">Chrome enviará a Google la URL y el contenido del sitio web, así como tu correo electrónico y el tipo de tarjeta de crédito guardada en Chrome. Puedes desactivar esta opción en los ajustes de Chrome. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">Parece que estás navegando sin mi ayuda, avísame si necesitas algo. ¡Que tengas un buen día! :-)</translation>
 <translation id="7670842975141217779">Asistente de Google\nen Chrome</translation>
 <translation id="7871791972254842204">Leer y aceptar los términos y condiciones de <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> en otro momento</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fi.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fi.xtb
index 4daa0a6..b5379e6 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fi.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fi.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Chrome lähettää valitsemaasi henkilökohtaista dataa: <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="3604604794717279723">Hyväksyn</translation>
 <translation id="5014174725590676422">Chromen Google Assistantin ensimmäisen käyttökerran näyttö näkyy</translation>
+<translation id="5188078772080029703">Chrome lähettää Googlelle sivuston URL-osoitteen ja sisällön sekä Chromeen tallennetun sähköpostiosoitteen ja luottokorttityypin. Voit poistaa tämän käytöstä Chromen asetuksissa. <ph name="BEGIN_LINK" />Lue lisää<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">Siirryit näköjään itse pois, joten asetun taka-alalle. Mukavaa päivänjatkoa :)</translation>
 <translation id="7670842975141217779">Google Assistant\nChromessa</translation>
 <translation id="7871791972254842204">Lue ja hyväksy verkkosivuston <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> käyttöehdot myöhemmin</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fil.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fil.xtb
index f2df50c8..5f120ea 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fil.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fil.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Ipapadala ng Chrome sa <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> ang napili mong personal na data</translation>
 <translation id="3604604794717279723">Tinatanggap ko</translation>
 <translation id="5014174725590676422">Ipinapakita ang screen ng unang pagtakbo ng Google Assistant sa Chrome</translation>
+<translation id="5188078772080029703">Ipapadala ng Chrome sa Google ang URL at content ng site pati na rin ang iyong email at uri ng credit card na naka-save sa Chrome. Puwede mo itong i-off sa mga setting ng Chrome. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">Mukhang nag-navigate ka na nang mag-isa, hahayaan na kita. Sana ay maging maganda ang araw mo :)</translation>
 <translation id="7670842975141217779">Google Assistant\nsa Chrome</translation>
 <translation id="7871791972254842204">Basahin at sumang-ayon sa mga tuntunin at kundisyon sa <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> sa ibang pagkakataon</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fr.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fr.xtb
index 5d0def7..4aabffe 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fr.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fr.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Chrome envoie les données à caractère personnel sélectionnées par vos soins à <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="3604604794717279723">J'accepte</translation>
 <translation id="5014174725590676422">L'écran de première utilisation de l'Assistant Google dans Chrome est affiché</translation>
+<translation id="5188078772080029703">L'URL et le contenu du site sont envoyés à Google via Chrome, tout comme votre adresse e-mail et le type de votre carte de crédit enregistrés dans Chrome. Vous pouvez désactiver cette option dans les paramètres de Chrome. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">Il semble que vous n'ayez plus besoin de mon aide, alors je vous laisse. Bonne journée :)</translation>
 <translation id="7670842975141217779">Assistant Google\ndans Chrome</translation>
 <translation id="7871791972254842204">Lire et accepter les conditions d'utilisation de <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> plus tard</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_iw.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_iw.xtb
index 12c8b0d..c281079 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_iw.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_iw.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">‏Chrome ישלח את המידע האישי שבחרת אל <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="3604604794717279723">אני מסכים/ה</translation>
 <translation id="5014174725590676422">‏מוצג מסך ההפעלה הראשונה של Google Assistant ב-Chrome</translation>
+<translation id="5188078772080029703">‏Chrome ישלח אל Google את כתובת ה-URL של האתר ואת התוכן שלו, כמו גם את כתובת האימייל וסוג כרטיס האשראי ששמרת ב-Chrome. ניתן להשבית את האפשרות הזו בהגדרות Chrome. <ph name="BEGIN_LINK" />מידע נוסף<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">נראה שהמשכת כבר לדף אחר. שיהיה לך המשך יום נעים.</translation>
 <translation id="7670842975141217779">‏Google Assistant\nב-Chrome</translation>
 <translation id="7871791972254842204">אקרא ואאשר את התנאים וההגבלות ב-<ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> מאוחר יותר</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ko.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ko.xtb
index 1f3e0ec8..d861a96 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ko.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ko.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Chrome에서 사용자가 선택한 개인 정보가 <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />에 전송됩니다.</translation>
 <translation id="3604604794717279723">동의</translation>
 <translation id="5014174725590676422">Chrome의 Google 어시스턴트 첫 실행 화면이 표시됩니다.</translation>
+<translation id="5188078772080029703">사이트의 URL과 콘텐츠, Chrome에 저장된 이메일 및 신용카드 종류가 Google에 전송됩니다. 이 기능은 Chrome 설정에서 사용 중지할 수 있습니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">직접 입력하시기로 하셨군요. 방해하지 않겠습니다. 좋은 하루 보내세요. ^^</translation>
 <translation id="7670842975141217779">Chrome의\nGoogle 어시스턴트</translation>
 <translation id="7871791972254842204">나중에 <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />의 이용약관을 읽고 동의하겠습니다.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lv.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lv.xtb
index 27f26ad..b3f06995 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lv.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lv.xtb
@@ -4,7 +4,7 @@
 <translation id="1135993792949700405">Chrome sūtīs jūsu atlasītos personas datus uz <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="3604604794717279723">Piekrītu</translation>
 <translation id="5014174725590676422">Tiek rādīts Google asistenta pirmās palaišanas ekrāns pārlūkprogrammā Chrome.</translation>
-<translation id="5188078772080029703">Chrome nosūtīs vietnes URL un saturu, kā arī jūsu e-pasta adresi un kredītkartes veidu, kas saglabāts pārlūkā, uz Google. Šo iespēju varat izslēgt Chrome iestatījumos. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" /></translation>
+<translation id="5188078772080029703">Chrome nosūtīs vietnes URL un saturu, kā arī jūsu pārlūkā saglabāto e-pasta adresi un kredītkartes veidu uz Google. Šo iespēju varat izslēgt Chrome iestatījumos. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">Izskatās, ka jūs pats pārgājāt, es ļaušu jums darboties. Jauku dienu! :)</translation>
 <translation id="7670842975141217779">Google asistents\npārlūkprogrammā Chrome</translation>
 <translation id="7871791972254842204">Vēlāk izlasīt <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> pakalpojumu sniegšanas noteikumus un piekrist tiem</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb
index 0adc9eb..707e592 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Chrome sender personopplysningene du har valgt, til <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="3604604794717279723">Godta</translation>
 <translation id="5014174725590676422">Skjermen for første kjøring av Google-assistenten i Chrome vises</translation>
+<translation id="5188078772080029703">Chrome sender nettstedets nettadresse og innhold, samt e-postadressen din og kredittkorttypen som er lagret i Chrome, til Google. Du kan slå av dette i Chrome-innstillingene. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">Det ser ut som om du har gått videre, så da lar jeg deg være i fred. Ha en fin dag :)</translation>
 <translation id="7670842975141217779">Google-assistenten\ni Chrome</translation>
 <translation id="7871791972254842204">Les og godta vilkårene på <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> senere</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb
index 629fbf8..ea828b6 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ru">
-<translation id="1135993792949700405">Ваши персональные данные, выбранные для автозаполнения, будут переданы <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />.</translation>
+<translation id="1135993792949700405">Ваши персональные данные, выбранные вами для автозаполнения, будут переданы <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />.</translation>
 <translation id="3604604794717279723">Принимаю</translation>
 <translation id="5014174725590676422">Показан экран первого запуска Google Ассистента в Chrome</translation>
 <translation id="5188078772080029703">URL сайта и его содержимое, а также адрес электронной почты и тип кредитной карты, сохраненные в Chrome, будут переданы в Google. Вы можете отключить эти параметры в настройках Chrome. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sv.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sv.xtb
index f1e0b9f..20a0a67 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sv.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sv.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Chrome skickar valda personuppgifter till <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="3604604794717279723">Godkänn</translation>
 <translation id="5014174725590676422">Skärmen vid första användningen av Googe-assistenten i Chrome visas</translation>
+<translation id="5188078772080029703">Chrome skickar webbplatsens adress och innehåll tillsammans med den e-postadress och den kreditkortstyp som du har sparat i Chrome till Google. Du kan inaktivera detta i inställningarna i Chrome. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">Det verkar som att du har navigerat i väg själv, så jag lämnar dig i fred. Ha en fin dag :)</translation>
 <translation id="7670842975141217779">Google Assistent\ni Chrome</translation>
 <translation id="7871791972254842204">Läs igenom och godkänn användarvillkoren på <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> senare</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ta.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ta.xtb
index 6048e63..2a766d5 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ta.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ta.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Chrome நீங்கள் தேர்ந்தெடுத்த தனிப்பட்ட தரவை <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> டொமைனுக்கு அனுப்பும்</translation>
 <translation id="3604604794717279723">ஏற்கிறேன்</translation>
 <translation id="5014174725590676422">’Chromeமில் Google அசிஸ்டண்ட்’ முதன்மைத் திரை காண்பிக்கப்படுகிறது</translation>
+<translation id="5188078772080029703">தளத்தின் URL, உள்ளடக்கம், Chromeமில் சேமிக்கப்பட்ட உங்கள் மின்னஞ்சல் முகவரி, கிரெடிட் கார்டு வகை ஆகியவற்றை Googleளுக்கு Chrome அனுப்பும். இதை Chrome அமைப்புகளில் முடக்கலாம். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">நீங்களே வழி கண்டுபிடித்துவிட்டதாகத் தோன்றுகிறது. இந்த நாள் இனிய நாளாகட்டும் :)</translation>
 <translation id="7670842975141217779">Chromeமில்\nGoogle அசிஸ்டண்ட்</translation>
 <translation id="7871791972254842204"><ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> டொமைனில் விதிமுறைகள் &amp; நிபந்தனைகளைப் பின்னர் படித்து, ஏற்கிறேன்</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_te.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_te.xtb
index 09fe63c0..818f3a3 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_te.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_te.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Chrome మీరు ఎంచుకున్న వ్యక్తిగత డేటాను <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />కు పంపుతుంది</translation>
 <translation id="3604604794717279723">నేను ఆమోదిస్తున్నాను</translation>
 <translation id="5014174725590676422">Chromeలో Google అసిస్టెంట్ మొదటి అమలు స్క్రీన్ చూపబడింది</translation>
+<translation id="5188078772080029703">Chrome ఈ సైట్ యొక్క URL మరియు కంటెంట్‌తో పాటు Chromeలో సేవ్ చేసిన మీ ఇమెయిల్ మరియు క్రెడిట్ కార్డ్ రకాన్ని Googleకి పంపుతుంది. మీరు Chrome సెట్టింగ్‌లలో దీన్ని ఆఫ్ చేయవచ్చు. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">మీరే స్వయంగా నావిగేట్ చేసినట్లున్నారు, నియంత్రణను మీకే ఇస్తున్నాను. మీకు శుభం కలగాలి :)</translation>
 <translation id="7670842975141217779">Chromeలో\n Google అసిస్టెంట్</translation>
 <translation id="7871791972254842204"><ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />లోని నిబంధనలు &amp; షరతులను తర్వాత చదివి, అంగీకరించండి</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_th.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_th.xtb
index ec7d108..7e99257 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_th.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_th.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Chrome จะส่งข้อมูลส่วนตัวที่คุณเลือกไปยัง <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="3604604794717279723">ฉันยอมรับ</translation>
 <translation id="5014174725590676422">กำลังแสดงหน้าจอเรียกใช้ Google Assistant ครั้งแรกใน Chrome</translation>
+<translation id="5188078772080029703">Chrome จะส่ง URL และเนื้อหาของเว็บไซต์ รวมถึงอีเมลและประเภทบัตรเครดิตที่คุณบันทึกไว้ใน Chrome ไปยัง Google คุณปิดการดำเนินการนี้ได้ในการตั้งค่า Chrome <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">ฉันหยุดการป้อนอัตโนมัติเพราะดูเหมือนคุณจะเลือกกรอกข้อมูลในช่องต่างๆ เอง ขอให้โชคดี :)</translation>
 <translation id="7670842975141217779">Google Assistant\nใน Chrome</translation>
 <translation id="7871791972254842204">อ่านและยอมรับข้อกำหนดและเงื่อนไขเกี่ยวกับ <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> ภายหลัง</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_tr.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_tr.xtb
index 5034840..a4e2a9b 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_tr.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_tr.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Chrome, seçtiğiniz kişisel verileri <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> sitesine gönderecektir</translation>
 <translation id="3604604794717279723">Kabul ediyorum</translation>
 <translation id="5014174725590676422">Chrome'da Google Asistan'ın ilk kez çalışma ekranı aşağıda gösterilmiştir</translation>
+<translation id="5188078772080029703">Chrome, sitenin URL'sinin ve içeriğinin yanı sıra Chrome'da kayıtlı e-posta adresinizi ve kredi kartınızın türünü de Google'a gönderecektir. Bu işlevi Chrome ayarlarından kapatabilirsiniz. <ph name="BEGIN_LINK" />Daha fazla bilgi<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">Görünüşe göre siz zaten kendi başınıza yolunuzu bulmuşsunuz, bana gerek kalmadı. İyi günler :)</translation>
 <translation id="7670842975141217779">Chrome'daki\nGoogle Asistan</translation>
 <translation id="7871791972254842204"><ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> sitesindeki şartlar ve koşulları daha sonra okuyup kabul edin</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uk.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uk.xtb
index 37a6869..3b614a7 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uk.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uk.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Chrome надсилатиме вибрані персональні дані на веб-сайт <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="3604604794717279723">Прийняти</translation>
 <translation id="5014174725590676422">Показано екран першого запуску Google Асистента в Chrome</translation>
+<translation id="5188078772080029703">Chrome надсилатиме в Google URL-адресу та вміст сайту, а також електронну адресу й тип кредитної картки, збереженої у веб-переглядачі. Ви можете вимкнути цю функцію в налаштуваннях Chrome. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">Схоже, моя допомога вже не потрібна. Хорошого вам дня :)</translation>
 <translation id="7670842975141217779">Google Асистент\nу Chrome</translation>
 <translation id="7871791972254842204">Прийняти умови використання для <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> пізніше</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_vi.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_vi.xtb
index 5b08959..7e3dca9 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_vi.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_vi.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Chrome sẽ gửi dữ liệu cá nhân mà bạn đã chọn tới <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="3604604794717279723">Tôi chấp nhận</translation>
 <translation id="5014174725590676422">Màn hình chạy đầu tiên của Trợ lý Google trong Chrome đã được hiển thị</translation>
+<translation id="5188078772080029703">Chrome sẽ gửi URL và nội dung của trang web cũng như địa chỉ email và loại thẻ tín dụng bạn đã lưu trong Chrome cho Google. Bạn có thể tắt tính năng này trong phần cài đặt Chrome. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">Có vẻ như bạn đã chuyển sang trang khác nên tôi sẽ không can thiệp nữa. Chúc bạn một ngày tốt lành :)</translation>
 <translation id="7670842975141217779">Trợ lý Google\ntrong Chrome</translation>
 <translation id="7871791972254842204">Đọc và đồng ý với điều khoản và điều kiện của <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> vào lúc khác</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-TW.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-TW.xtb
index 005ddee..42597ac 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-TW.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-TW.xtb
@@ -4,6 +4,7 @@
 <translation id="1135993792949700405">Chrome 會將你所選的個人資料傳送給 <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="3604604794717279723">我接受</translation>
 <translation id="5014174725590676422">目前顯示 Chrome 版 Google 助理首次執行的畫面</translation>
+<translation id="5188078772080029703">Chrome 會將網站的網址和內容,以及 Chrome 中儲存的電子郵件和信用卡類型資訊傳送給 Google。你可以在 Chrome 設定中關閉這項功能。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
 <translation id="5461666840533392417">你似乎已瀏覽到其他頁面,我就不插手了。祝你有個愉快的一天 :)</translation>
 <translation id="7670842975141217779">Chrome 版\nGoogle 助理</translation>
 <translation id="7871791972254842204">稍後閱讀並同意 <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> 的條款及細則</translation>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java
index 78885772c..27cc222 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java
@@ -11,9 +11,12 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.notifications.ChromeNotification;
 import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder;
 import org.chromium.chrome.browser.notifications.NotificationBuilderFactory;
 import org.chromium.chrome.browser.notifications.NotificationConstants;
+import org.chromium.chrome.browser.notifications.NotificationManagerProxy;
+import org.chromium.chrome.browser.notifications.NotificationManagerProxyImpl;
 import org.chromium.chrome.browser.notifications.NotificationMetadata;
 import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
 import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions;
@@ -56,12 +59,12 @@
                         .setShowWhen(false)
                         .setLocalOnly(true)
                         .setGroup(NotificationConstants.GROUP_INCOGNITO);
-        NotificationManager nm =
-                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
-        Notification notification = builder.build();
-        nm.notify(INCOGNITO_TABS_OPEN_TAG, INCOGNITO_TABS_OPEN_ID, notification);
+        NotificationManagerProxy nm = new NotificationManagerProxyImpl(context);
+        ChromeNotification notification = builder.buildChromeNotification();
+        nm.notify(notification);
         NotificationUmaTracker.getInstance().onNotificationShown(
-                NotificationUmaTracker.SystemNotificationType.CLOSE_INCOGNITO, notification);
+                NotificationUmaTracker.SystemNotificationType.CLOSE_INCOGNITO,
+                notification.getNotification());
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java
index e956630..a11bc9b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java
@@ -4,8 +4,6 @@
 
 package org.chromium.chrome.browser.media;
 
-import android.app.Notification;
-import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.app.Service;
 import android.content.Context;
@@ -20,9 +18,14 @@
 import org.chromium.base.Log;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.notifications.ChromeNotification;
 import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder;
 import org.chromium.chrome.browser.notifications.NotificationBuilderFactory;
+import org.chromium.chrome.browser.notifications.NotificationManagerProxy;
+import org.chromium.chrome.browser.notifications.NotificationManagerProxyImpl;
+import org.chromium.chrome.browser.notifications.NotificationMetadata;
 import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
+import org.chromium.chrome.browser.notifications.PendingIntentProvider;
 import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabWebContentsDelegateAndroid;
@@ -60,15 +63,14 @@
     private static final int MEDIATYPE_AUDIO_ONLY = 3;
     private static final int MEDIATYPE_SCREEN_CAPTURE = 4;
 
-    private NotificationManager mNotificationManager;
+    private NotificationManagerProxy mNotificationManager;
     private SharedPreferences mSharedPreferences;
     private final SparseIntArray mNotifications = new SparseIntArray();
 
     @Override
     public void onCreate() {
         mNotificationManager =
-                (NotificationManager) ContextUtils.getApplicationContext().getSystemService(
-                        Context.NOTIFICATION_SERVICE);
+                new NotificationManagerProxyImpl(ContextUtils.getApplicationContext());
         mSharedPreferences = ContextUtils.getAppSharedPreferences();
         super.onCreate();
     }
@@ -181,7 +183,11 @@
 
         ChromeNotificationBuilder builder =
                 NotificationBuilderFactory
-                        .createChromeNotificationBuilder(true /* preferCompat */, channelId)
+                        .createChromeNotificationBuilder(true /* preferCompat */, channelId,
+                                null /*remoteAppPackageName*/,
+                                new NotificationMetadata(
+                                        NotificationUmaTracker.SystemNotificationType.MEDIA_CAPTURE,
+                                        NOTIFICATION_NAMESPACE, notificationId))
                         .setAutoCancel(false)
                         .setOngoing(true)
                         .setSmallIcon(getNotificationIconId(mediaType))
@@ -189,7 +195,7 @@
 
         Intent tabIntent = IntentUtils.createBringTabToFrontIntent(notificationId);
         if (tabIntent != null) {
-            PendingIntent contentIntent = PendingIntent.getActivity(
+            PendingIntentProvider contentIntent = PendingIntentProvider.getActivity(
                     ContextUtils.getApplicationContext(), notificationId, tabIntent, 0);
             builder.setContentIntent(contentIntent);
             if (mediaType == MEDIATYPE_SCREEN_CAPTURE) {
@@ -239,12 +245,13 @@
         }
         builder.setContentText(contentText);
 
-        Notification notification = builder.buildWithBigTextStyle(contentText);
-        mNotificationManager.notify(NOTIFICATION_NAMESPACE, notificationId, notification);
+        ChromeNotification notification = builder.buildWithBigTextStyle(contentText);
+        mNotificationManager.notify(notification);
         mNotifications.put(notificationId, mediaType);
         updateSharedPreferencesEntry(notificationId, false);
         NotificationUmaTracker.getInstance().onNotificationShown(
-                NotificationUmaTracker.SystemNotificationType.MEDIA_CAPTURE, notification);
+                NotificationUmaTracker.SystemNotificationType.MEDIA_CAPTURE,
+                notification.getNotification());
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
index f9b6357..848210d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.media.ui;
 
-import android.app.Notification;
 import android.app.PendingIntent;
 import android.app.Service;
 import android.content.BroadcastReceiver;
@@ -43,9 +42,13 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.notifications.ChromeNotification;
 import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder;
 import org.chromium.chrome.browser.notifications.NotificationBuilderFactory;
 import org.chromium.chrome.browser.notifications.NotificationConstants;
+import org.chromium.chrome.browser.notifications.NotificationManagerProxy;
+import org.chromium.chrome.browser.notifications.NotificationManagerProxyImpl;
+import org.chromium.chrome.browser.notifications.NotificationMetadata;
 import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
 import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions;
 import org.chromium.media_session.mojom.MediaSessionAction;
@@ -283,11 +286,15 @@
     // responsible for hiding it afterwards.
     private static void finishStartingForegroundService(ListenerService s) {
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return;
+        NotificationMetadata metadata =
+                new NotificationMetadata(NotificationUmaTracker.SystemNotificationType.MEDIA,
+                        null /* notificationTag */, s.getNotificationId());
         ChromeNotificationBuilder builder =
-                NotificationBuilderFactory.createChromeNotificationBuilder(
-                        true /* preferCompat */, ChannelDefinitions.ChannelId.MEDIA);
-        AppHooks.get().startForeground(
-                s, s.getNotificationId(), builder.build(), 0 /* foregroundServiceType */);
+                NotificationBuilderFactory.createChromeNotificationBuilder(true /* preferCompat */,
+                        ChannelDefinitions.ChannelId.MEDIA, null /* remoteAppPackageName */,
+                        metadata);
+        AppHooks.get().startForeground(s, s.getNotificationId(),
+                builder.buildChromeNotification().getNotification(), 0 /* foregroundServiceType */);
     }
 
     /**
@@ -916,13 +923,13 @@
         updateMediaSession();
         updateNotificationBuilder();
 
-        Notification notification = mNotificationBuilder.build();
+        ChromeNotification notification = mNotificationBuilder.buildChromeNotification();
 
         // On O, finish starting the foreground service nevertheless, or Android will
         // crash Chrome.
         boolean foregroundedService = false;
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && serviceStarting) {
-            mService.startForeground(mMediaNotificationInfo.id, notification);
+            mService.startForeground(mMediaNotificationInfo.id, notification.getNotification());
             foregroundedService = true;
         }
 
@@ -933,21 +940,27 @@
         if (mMediaNotificationInfo.supportsSwipeAway() && mMediaNotificationInfo.isPaused) {
             mService.stopForeground(false /* removeNotification */);
 
-            NotificationManagerCompat manager = NotificationManagerCompat.from(getContext());
-            manager.notify(mMediaNotificationInfo.id, notification);
+            NotificationManagerProxy manager = new NotificationManagerProxyImpl(getContext());
+            manager.notify(notification);
         } else if (!foregroundedService) {
-            mService.startForeground(mMediaNotificationInfo.id, notification);
+            mService.startForeground(mMediaNotificationInfo.id, notification.getNotification());
         }
         if (shouldLogNotification) {
             mNotificationUmaTracker.onNotificationShown(
-                    NotificationUmaTracker.SystemNotificationType.MEDIA, notification);
+                    NotificationUmaTracker.SystemNotificationType.MEDIA,
+                    notification.getNotification());
         }
     }
 
     @VisibleForTesting
     void updateNotificationBuilder() {
+        assert (mMediaNotificationInfo != null);
+        NotificationMetadata metadata =
+                new NotificationMetadata(NotificationUmaTracker.SystemNotificationType.MEDIA,
+                        null /* notificationTag */, mMediaNotificationInfo.id);
         mNotificationBuilder = NotificationBuilderFactory.createChromeNotificationBuilder(
-                true /* preferCompat */, ChannelDefinitions.ChannelId.MEDIA);
+                true /* preferCompat */, ChannelDefinitions.ChannelId.MEDIA,
+                null /* remoteAppPackageName*/, metadata);
         setMediaStyleLayoutForNotificationBuilder(mNotificationBuilder);
 
         // TODO(zqzhang): It's weird that setShowWhen() doesn't work on K. Calling setWhen() to
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/ChromeNotificationBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/ChromeNotificationBuilder.java
index a085395f..4e2bd2f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/ChromeNotificationBuilder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/ChromeNotificationBuilder.java
@@ -101,7 +101,7 @@
 
     Notification buildWithBigContentView(RemoteViews bigView);
 
-    Notification buildWithBigTextStyle(String bigText);
+    ChromeNotification buildWithBigTextStyle(String bigText);
 
     @Deprecated
     Notification build();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilder.java
index cdfd21754..448f7273 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilder.java
@@ -338,11 +338,13 @@
     }
 
     @Override
-    public Notification buildWithBigTextStyle(String bigText) {
+    public ChromeNotification buildWithBigTextStyle(String bigText) {
         Notification.BigTextStyle bigTextStyle = new Notification.BigTextStyle();
         bigTextStyle.setBuilder(mBuilder);
         bigTextStyle.bigText(bigText);
-        return bigTextStyle.build();
+
+        assert mMetadata != null;
+        return new ChromeNotification(bigTextStyle.build(), mMetadata);
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationCompatBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationCompatBuilder.java
index 8375669..38d9841d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationCompatBuilder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationCompatBuilder.java
@@ -278,11 +278,13 @@
     }
 
     @Override
-    public Notification buildWithBigTextStyle(String bigText) {
+    public ChromeNotification buildWithBigTextStyle(String bigText) {
         NotificationCompat.BigTextStyle bigTextStyle =
                 new NotificationCompat.BigTextStyle(mBuilder);
         bigTextStyle.bigText(bigText);
-        return bigTextStyle.build();
+
+        assert mMetadata != null;
+        return new ChromeNotification(bigTextStyle.build(), mMetadata);
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
index 3d3d62d..2cecd979 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
@@ -4,8 +4,6 @@
 
 package org.chromium.chrome.browser.sync;
 
-import android.app.Notification;
-import android.app.PendingIntent;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -16,12 +14,15 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.notifications.ChromeNotification;
 import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder;
 import org.chromium.chrome.browser.notifications.NotificationBuilderFactory;
 import org.chromium.chrome.browser.notifications.NotificationConstants;
 import org.chromium.chrome.browser.notifications.NotificationManagerProxy;
 import org.chromium.chrome.browser.notifications.NotificationManagerProxyImpl;
+import org.chromium.chrome.browser.notifications.NotificationMetadata;
 import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
+import org.chromium.chrome.browser.notifications.PendingIntentProvider;
 import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions;
 import org.chromium.chrome.browser.preferences.PreferencesLauncher;
 import org.chromium.chrome.browser.preferences.SyncAndServicesPreferences;
@@ -97,14 +98,18 @@
         String text = applicationContext.getString(R.string.sign_in_sync) + ": "
                 + applicationContext.getString(message);
 
-        PendingIntent contentIntent = PendingIntent.getActivity(applicationContext, 0, intent, 0);
+        PendingIntentProvider contentIntent =
+                PendingIntentProvider.getActivity(applicationContext, 0, intent, 0);
 
         // There is no need to provide a group summary notification because the NOTIFICATION_ID_SYNC
         // notification id ensures there's only one sync notification at a time.
         ChromeNotificationBuilder builder =
                 NotificationBuilderFactory
-                        .createChromeNotificationBuilder(
-                                true /* preferCompat */, ChannelDefinitions.ChannelId.BROWSER)
+                        .createChromeNotificationBuilder(true /* preferCompat */,
+                                ChannelDefinitions.ChannelId.BROWSER, null /*remoteAppPackageName*/,
+                                new NotificationMetadata(
+                                        NotificationUmaTracker.SystemNotificationType.SYNC, null,
+                                        NotificationConstants.NOTIFICATION_ID_SYNC))
                         .setAutoCancel(true)
                         .setContentIntent(contentIntent)
                         .setContentTitle(title)
@@ -114,11 +119,11 @@
                         .setLocalOnly(true)
                         .setGroup(NotificationConstants.GROUP_SYNC);
 
-        Notification notification = builder.buildWithBigTextStyle(text);
+        ChromeNotification notification = builder.buildWithBigTextStyle(text);
 
-        mNotificationManager.notify(NotificationConstants.NOTIFICATION_ID_SYNC, notification);
+        mNotificationManager.notify(notification);
         NotificationUmaTracker.getInstance().onNotificationShown(
-                NotificationUmaTracker.SystemNotificationType.SYNC, notification);
+                NotificationUmaTracker.SystemNotificationType.SYNC, notification.getNotification());
     }
 
     private boolean shouldSyncAuthErrorBeShown() {
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 76c932b..9ab3db6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529"><ph name="APP_NAME" /> també té dades a Chrome</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB en altres aplicacions</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">El lloc web s'ha posat en pausa</translation>
 <translation id="2063713494490388661">Toca per cercar</translation>
 <translation id="2079545284768500474">Desfés</translation>
 <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">Notícies</translation>
 <translation id="6710213216561001401">Anterior</translation>
 <translation id="6712388303105732168">Mostra més contingut com aquest de Google amb el botó Més contingut com aquest</translation>
+<translation id="671481426037969117">S'ha esgotat el temps definit al temporitzador per a <ph name="FQDN" />. Es tornarà a iniciar demà.</translation>
 <translation id="6738867403308150051">Baixada en curs...</translation>
 <translation id="6746124502594467657">Mou avall</translation>
 <translation id="6766622839693428701">Llisca cap avall per tancar el full.</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 0e5a884..a415cd19 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529">Aplikace <ph name="APP_NAME" /> má také data v Chromu</translation>
 <translation id="2045104531052923016">Ostatní aplikace: <ph name="GIGABYTES" /> GB</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">Web je pozastaven</translation>
 <translation id="2063713494490388661">Vyhledání klepnutím</translation>
 <translation id="2079545284768500474">Vrátit zpět</translation>
 <translation id="2082238445998314030">Výsledek <ph name="RESULT_NUMBER" /> z <ph name="TOTAL_RESULTS" /></translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">Zprávy</translation>
 <translation id="6710213216561001401">Předchozí</translation>
 <translation id="6712388303105732168">Zobrazit podobné návrhy od Googlu pomocí tlačítka Další podobné návrhy</translation>
+<translation id="671481426037969117">Časovač <ph name="FQDN" /> vypršel. Spustí se zase zítra.</translation>
 <translation id="6738867403308150051">Stahování…</translation>
 <translation id="6746124502594467657">Posunout dolů</translation>
 <translation id="6766622839693428701">Zavřete přejetím prstem dolů.</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 1cadd238..0efa89c0 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529"><ph name="APP_NAME" /> también tiene datos en Chrome</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB de otras aplicaciones</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">Sitio web en pausa</translation>
 <translation id="2063713494490388661">Tocar para buscar</translation>
 <translation id="2079545284768500474">Deshacer</translation>
 <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">Noticias</translation>
 <translation id="6710213216561001401">Anterior</translation>
 <translation id="6712388303105732168">Descubre sugerencias similares de Google con el botón Sugerencias similares</translation>
+<translation id="671481426037969117">Se ha agotado el temporizador de <ph name="FQDN" />. Se reiniciará mañana.</translation>
 <translation id="6738867403308150051">Descargando…</translation>
 <translation id="6746124502594467657">Bajar</translation>
 <translation id="6766622839693428701">Desliza el dedo hacia abajo para cerrarla.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
index eeb269f..02944bf 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529"><ph name="APP_NAME" /> sisältää dataa myös Chromessa</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> Gt muita sovelluksia</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">Sivusto keskeytetty</translation>
 <translation id="2063713494490388661">Hae napauttamalla</translation>
 <translation id="2079545284768500474">Kumoa</translation>
 <translation id="2082238445998314030">Tulos <ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /></translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">Uutiset</translation>
 <translation id="6710213216561001401">Edellinen</translation>
 <translation id="6712388303105732168">Hae samankaltaista sisältöä Googlesta käyttämällä Samanlaisia-painiketta</translation>
+<translation id="671481426037969117">Ajastimesta (<ph name="FQDN" />) loppui aika. Se alkaa alusta huomenna.</translation>
 <translation id="6738867403308150051">Ladataan…</translation>
 <translation id="6746124502594467657">Siirrä alas</translation>
 <translation id="6766622839693428701">Sulje pyyhkäisemällä alas.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
index f4fe3e4..1fcf9cd 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529">May data rin ang <ph name="APP_NAME" /> sa Chrome</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB na iba pang mga app</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">Naka-pause ang site</translation>
 <translation id="2063713494490388661">Mag-tap upang Maghanap</translation>
 <translation id="2079545284768500474">I-undo</translation>
 <translation id="2082238445998314030">Resulta <ph name="RESULT_NUMBER" /> sa <ph name="TOTAL_RESULTS" /></translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">Balita</translation>
 <translation id="6710213216561001401">Nakaraan</translation>
 <translation id="6712388303105732168">Makakita ng higit pang tulad nito mula sa Google gamit ang button na Higit Pang Tulad Nito</translation>
+<translation id="671481426037969117">Natapos na ang iyong timer ng <ph name="FQDN" />. Magsisimula itong muli bukas.</translation>
 <translation id="6738867403308150051">Nagda-download...</translation>
 <translation id="6746124502594467657">Ibaba</translation>
 <translation id="6766622839693428701">Mag-swipe pababa para isara.</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 a80d93d2..cf463aa 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529"><ph name="APP_NAME" /> a également des données dans Chrome</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> Go par d'autres applis</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">Site en pause</translation>
 <translation id="2063713494490388661">Appuyer pour rechercher</translation>
 <translation id="2079545284768500474">Annuler</translation>
 <translation id="2082238445998314030">Résultat <ph name="RESULT_NUMBER" /> sur <ph name="TOTAL_RESULTS" /></translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">Actualités</translation>
 <translation id="6710213216561001401">Précédent</translation>
 <translation id="6712388303105732168">Affichez plus de suggestions similaires en cliquant sur le bouton Plus de suggestions similaires</translation>
+<translation id="671481426037969117">Votre minuteur <ph name="FQDN" /> a expiré. Il redémarrera demain.</translation>
 <translation id="6738867403308150051">Téléchargement en cours…</translation>
 <translation id="6746124502594467657">Descendre</translation>
 <translation id="6766622839693428701">Balayez l'écran vers le bas pour fermer la feuille.</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 f9738f0..d16ce8a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529">‏ל-<ph name="APP_NAME" /> יש נתונים גם ב-Chrome</translation>
 <translation id="2045104531052923016">‏‎<ph name="GIGABYTES" /> GB ליישומים אחרים</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">האתר מושהה</translation>
 <translation id="2063713494490388661">הקש כדי לחפש</translation>
 <translation id="2079545284768500474">בטל פעולה</translation>
 <translation id="2082238445998314030">תוצאה <ph name="RESULT_NUMBER" /> מתוך <ph name="TOTAL_RESULTS" /></translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">חדשות</translation>
 <translation id="6710213216561001401">הקודם</translation>
 <translation id="6712388303105732168">‏כדי ש-Google תציע עוד דברים כאלה, יש ללחוץ על הלחצן 'עוד דברים כאלה'</translation>
+<translation id="671481426037969117">זמן השימוש באפליקציה <ph name="FQDN" /> הסתיים. הטיימר יופעל מחדש מחר ואז אפשר יהיה להשתמש שוב באפליקציה.</translation>
 <translation id="6738867403308150051">מוריד...</translation>
 <translation id="6746124502594467657">הזז למטה</translation>
 <translation id="6766622839693428701">החלקה מטה סוגרת.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
index 94a4e0ec..c7e63d7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529"><ph name="APP_NAME" />도 Chrome에서 데이터를 보유하고 있습니다</translation>
 <translation id="2045104531052923016">기타 앱 <ph name="GIGABYTES" />GB</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">사이트 일시중지됨</translation>
 <translation id="2063713494490388661">탭하여 검색</translation>
 <translation id="2079545284768500474">실행취소</translation>
 <translation id="2082238445998314030">전체 결과 <ph name="TOTAL_RESULTS" />개 중 <ph name="RESULT_NUMBER" />개</translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">뉴스</translation>
 <translation id="6710213216561001401">이전</translation>
 <translation id="6712388303105732168">'비슷한 항목 더보기' 버튼을 사용하여 Google에서 비슷한 항목을 더 확인하세요.</translation>
+<translation id="671481426037969117"><ph name="FQDN" /> 타이머가 종료되었습니다. 타이머는 내일 다시 시작됩니다.</translation>
 <translation id="6738867403308150051">다운로드 중...</translation>
 <translation id="6746124502594467657">아래로 이동</translation>
 <translation id="6766622839693428701">닫으려면 아래로 스와이프하세요.</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 51e7a26..f545d78c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529"><ph name="APP_NAME" /> har også data i Chrome</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB andre apper</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">Nettstedet er satt på pause</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>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">Nyheter</translation>
 <translation id="6710213216561001401">Forrige</translation>
 <translation id="6712388303105732168">Se mer av dette fra Google ved å bruke Mer av dette-knappen</translation>
+<translation id="671481426037969117">Tidtakeren for <ph name="FQDN" /> gikk ut. Den starter igjen i morgen.</translation>
 <translation id="6738867403308150051">Laster ned …</translation>
 <translation id="6746124502594467657">Flytt ned</translation>
 <translation id="6766622839693428701">Sveip ned for å lukke.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
index beac407..cb89e1b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -617,7 +617,7 @@
 <translation id="557283862590186398">Для этого сайта Chrome запрашивает разрешение на доступ к микрофону.</translation>
 <translation id="55737423895878184">Может определять местоположение и отправлять уведомления</translation>
 <translation id="5578795271662203820">Найти это изображение в <ph name="SEARCH_ENGINE" /></translation>
-<translation id="5581519193887989363">Вы всегда можете изменить данные для синхронизации в <ph name="BEGIN_LINK1" />настройках<ph name="END_LINK1" />.</translation>
+<translation id="5581519193887989363">Вы всегда можете выбрать, что синхронизировать, в <ph name="BEGIN_LINK1" />настройках<ph name="END_LINK1" />.</translation>
 <translation id="5595485650161345191">Изменить адрес</translation>
 <translation id="5596627076506792578">Ещё</translation>
 <translation id="5620299005957670886">Разрешить сайтам использовать датчики (рекомендуется)</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 5fff5af..5c53692 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529">Data för <ph name="APP_NAME" /> finns även i Chrome</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB används av övriga appar</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">Webbplatsen har pausats</translation>
 <translation id="2063713494490388661">Tryck för att söka</translation>
 <translation id="2079545284768500474">Ångra</translation>
 <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> av <ph name="TOTAL_RESULTS" /></translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">Nyheter</translation>
 <translation id="6710213216561001401">Föregående</translation>
 <translation id="6712388303105732168">Se mer som detta från Google med knappen Fler liknande</translation>
+<translation id="671481426037969117">Timern för <ph name="FQDN" /> har löpt ut. Den börjar om igen i morgon.</translation>
 <translation id="6738867403308150051">Laddar ned …</translation>
 <translation id="6746124502594467657">Flytta ned</translation>
 <translation id="6766622839693428701">Svep nedåt när du vill stänga.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
index 8903934..bdde14d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529"><ph name="APP_NAME" /> ஆப்ஸின் தரவும் Chromeமில் உள்ளது</translation>
 <translation id="2045104531052923016">பிற பயன்பாடுகள் பயன்படுத்தும் அளவு: <ph name="GIGABYTES" /> ஜி.பை.</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">தளம் இடைநிறுத்தப்பட்டுள்ளது</translation>
 <translation id="2063713494490388661">தேடத் தட்டுக</translation>
 <translation id="2079545284768500474">செயல்தவிர்</translation>
 <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> முடிவுகளில் <ph name="RESULT_NUMBER" />வது முடிவு</translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">செய்திகள்</translation>
 <translation id="6710213216561001401">முந்தையது</translation>
 <translation id="6712388303105732168">‘இது போன்று மேலும்’ பட்டனைப் பயன்படுத்தி Google வழங்கும் இதே போன்ற பரிந்துரைகளைப் பாருங்கள்</translation>
+<translation id="671481426037969117">உங்கள் <ph name="FQDN" /> டைமர் நேரம் முடிந்தது. நாளை மீண்டும் தொடங்கும்.</translation>
 <translation id="6738867403308150051">பதிவிறக்குகிறது…</translation>
 <translation id="6746124502594467657">கீழே நகர்த்து</translation>
 <translation id="6766622839693428701">மூடுவதற்கு, கீழே ஸ்வைப் செய்யவும்.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
index 6e84a2436..2158254 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529"><ph name="APP_NAME" /> డేటాను Chromeలో కూడా కలిగి ఉంటుంది</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB ఇతర యాప్‌లు</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">సైట్ పాజ్ చేయబడింది</translation>
 <translation id="2063713494490388661">వెతకడానికి నొక్కండి</translation>
 <translation id="2079545284768500474">చర్య రద్దు</translation>
 <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" />లో <ph name="RESULT_NUMBER" />వ ఫలితం</translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">వార్తలు</translation>
 <translation id="6710213216561001401">మునుపటి</translation>
 <translation id="6712388303105732168">ఇలాంటివి మరిన్ని బటన్‌ను ఉపయోగించి Google నుండి ఇలాంటివి మరిన్ని చూడండి</translation>
+<translation id="671481426037969117">మీ <ph name="FQDN" /> టైమర్ పూర్తయింది. అది మళ్లీ రేపు ప్రారంభమవుతుంది.</translation>
 <translation id="6738867403308150051">డౌన్‌లోడ్ చేస్తోంది...</translation>
 <translation id="6746124502594467657">క్రిందికి తరలించు</translation>
 <translation id="6766622839693428701">మూసివేయడానికి దిగువకు స్వైప్ చేయండి.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
index fccdf72..df5fd26 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529"><ph name="APP_NAME" /> มีข้อมูลอยู่ใน Chrome ด้วย</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB จากแอปอื่นๆ</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">เว็บไซต์หยุดชั่วคราว</translation>
 <translation id="2063713494490388661">แตะเพื่อค้นหา</translation>
 <translation id="2079545284768500474">เลิกทำ</translation>
 <translation id="2082238445998314030">ผลลัพธ์ <ph name="RESULT_NUMBER" /> จาก <ph name="TOTAL_RESULTS" /> รายการ</translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">ข่าวสาร</translation>
 <translation id="6710213216561001401">ก่อนหน้า</translation>
 <translation id="6712388303105732168">ดูคำแนะนำแบบนี้จาก Google อีกโดยใช้ปุ่ม "ดูคำแนะนำแบบนี้อีก"</translation>
+<translation id="671481426037969117">ตัวจับเวลา <ph name="FQDN" /> หมดเวลาแล้ว และจะเริ่มอีกครั้งพรุ่งนี้</translation>
 <translation id="6738867403308150051">กำลังดาวน์โหลด…</translation>
 <translation id="6746124502594467657">เลื่อนลง</translation>
 <translation id="6766622839693428701">เลื่อนลงเพื่อปิด</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
index d10c436..4b9fe20d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529"><ph name="APP_NAME" /> uygulamasına ait veriler Chrome'da da mevcut</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB diğer uygulamalar</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">Site duraklatıldı</translation>
 <translation id="2063713494490388661">Aramak İçin Hafifçe Dokunma</translation>
 <translation id="2079545284768500474">Geri al</translation>
 <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> sonuçtan <ph name="RESULT_NUMBER" /> numaralı sonuç</translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">Haberler</translation>
 <translation id="6710213216561001401">Önceki</translation>
 <translation id="6712388303105732168">Bunun Gibi Daha Fazlası düğmesini kullanarak Google'dan buna benzer daha fazla içerik görün</translation>
+<translation id="671481426037969117"><ph name="FQDN" /> zamanlayıcınızın süresi doldu. Yarın tekrar başlatılacak.</translation>
 <translation id="6738867403308150051">İndiriliyor…</translation>
 <translation id="6746124502594467657">Aşağı taşı</translation>
 <translation id="6766622839693428701">Kapatmak için aşağı kaydırın.</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 1d4dbe1..e7d6dce 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529">Дані додатка <ph name="APP_NAME" /> також містяться в Chrome</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> ГБ використовується іншими додатками</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">Роботу сайту призупинено</translation>
 <translation id="2063713494490388661">Торкніться, щоб шукати</translation>
 <translation id="2079545284768500474">Відмінити</translation>
 <translation id="2082238445998314030">Результат <ph name="RESULT_NUMBER" /> з <ph name="TOTAL_RESULTS" /></translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">Новини</translation>
 <translation id="6710213216561001401">Попереднє</translation>
 <translation id="6712388303105732168">Переглядайте інший подібний вміст від Google за допомогою кнопки "Більше подібного"</translation>
+<translation id="671481426037969117">Вийшов час на таймері веб-сайту <ph name="FQDN" />. Завтра він знову запрацює.</translation>
 <translation id="6738867403308150051">Завантаження…</translation>
 <translation id="6746124502594467657">Вниз</translation>
 <translation id="6766622839693428701">Проведіть пальцем униз, щоб закрити.</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 01d0f70..15cd50e1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -149,6 +149,7 @@
 <translation id="204321170514947529"><ph name="APP_NAME" /> cũng có dữ liệu trong Chrome</translation>
 <translation id="2045104531052923016">Các ứng dụng khác chiếm <ph name="GIGABYTES" /> GB</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">Đã tạm dừng trang web</translation>
 <translation id="2063713494490388661">Nhấn để tìm kiếm</translation>
 <translation id="2079545284768500474">Hoàn tác</translation>
 <translation id="2082238445998314030">Kết quả <ph name="RESULT_NUMBER" /> trong tổng số <ph name="TOTAL_RESULTS" /></translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">Tin tức</translation>
 <translation id="6710213216561001401">Trước đó</translation>
 <translation id="6712388303105732168">Xem nội dung tương tự khác từ Google bằng cách sử dụng nút Nội dung tương tự</translation>
+<translation id="671481426037969117">Thời gian hẹn giờ của <ph name="FQDN" /> đã hết. Thời gian hẹn giờ sẽ bắt đầu lại vào ngày mai.</translation>
 <translation id="6738867403308150051">Đang tải xuống...</translation>
 <translation id="6746124502594467657">Di chuyển xuống</translation>
 <translation id="6766622839693428701">Vuốt xuống để đóng.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
index 1cb4d8f..83c52fa 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -407,7 +407,7 @@
 <translation id="4056223980640387499">棕色调</translation>
 <translation id="4060598801229743805">选项位于屏幕顶部附近</translation>
 <translation id="4062305924942672200">法律信息</translation>
-<translation id="4084682180776658562">已保存的书签</translation>
+<translation id="4084682180776658562">添加书签</translation>
 <translation id="4084712963632273211">来自 <ph name="PUBLISHER_ORIGIN" /> - <ph name="BEGIN_DEEMPHASIZED" />由 Google 提供<ph name="END_DEEMPHASIZED" /></translation>
 <translation id="4084836577264234537">下载内容已占用的空间:<ph name="MEGABYTES" /> MB</translation>
 <translation id="4095146165863963773">要删除应用数据吗?</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 bb1e118..6730fad 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
@@ -149,6 +149,7 @@
 <translation id="204321170514947529">「<ph name="APP_NAME" />」在 Chrome 中也有資料</translation>
 <translation id="2045104531052923016">其他應用程式佔 <ph name="GIGABYTES" /> GB</translation>
 <translation id="2049574241039454490"><ph name="FILE_SIZE_OF_TOTAL" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
+<translation id="2056878612599315956">網站已暫停</translation>
 <translation id="2063713494490388661">輕觸搜尋</translation>
 <translation id="2079545284768500474">復原</translation>
 <translation id="2082238445998314030">第 <ph name="RESULT_NUMBER" /> 個結果,共 <ph name="TOTAL_RESULTS" /> 個</translation>
@@ -777,6 +778,7 @@
 <translation id="6709133671862442373">新聞內容</translation>
 <translation id="6710213216561001401">返回</translation>
 <translation id="6712388303105732168">你可以使用「更多類似內容」按鈕查看更多來自 Google 的類似內容</translation>
+<translation id="671481426037969117">「<ph name="FQDN" />」計時器已結束計時,將於明天重新開始。</translation>
 <translation id="6738867403308150051">下載中…</translation>
 <translation id="6746124502594467657">下移</translation>
 <translation id="6766622839693428701">向下滑動即可關閉。</translation>
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerNotificationTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerNotificationTest.java
index 90a8c69..59a7deb2 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerNotificationTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerNotificationTest.java
@@ -213,7 +213,6 @@
             assertTrue((notification.flags & Notification.FLAG_LOCAL_ONLY) != 0);
             assertEquals(NOTIFICATION_GROUP_NAME, notification.getGroup());
             assertTrue(notification.isGroupSummary());
-            assertNull(notification.deleteIntent);
             assertNotNull(notification.contentIntent);
             assertEquals(Notification.VISIBILITY_PRIVATE, notification.visibility);
         }
diff --git a/chrome/app/md_extensions_strings.grdp b/chrome/app/md_extensions_strings.grdp
index cec490b8e..807efad 100644
--- a/chrome/app/md_extensions_strings.grdp
+++ b/chrome/app/md_extensions_strings.grdp
@@ -163,6 +163,9 @@
   <message name="IDS_MD_EXTENSIONS_EMPTY_STREAM_STOPPED" desc="The message shown to the user when there are no activities in the activity log stream and there are no listeners for the stream.">
     Press "Start" to listen for extension activities
   </message>
+  <message name="IDS_MD_EXTENSIONS_ACTIVITY_ARGUMENTS_HEADING" desc="The heading for the arguments list for an activity log stream entry.">
+    API function arguments
+  </message>
   <message name="IDS_MD_EXTENSIONS_ITEM_ID" desc="The text for the label next to the extension id.">
     &lt;span&gt;ID: &lt;/span&gt;<ph name="EXTENSION_ID">$1<ex>cfhdojbkjhnklbpkdaibdccddilifddb</ex></ph>
   </message>
diff --git a/chrome/app/onboarding_welcome_strings.grdp b/chrome/app/onboarding_welcome_strings.grdp
index b9ed172..9ac5803 100644
--- a/chrome/app/onboarding_welcome_strings.grdp
+++ b/chrome/app/onboarding_welcome_strings.grdp
@@ -121,12 +121,4 @@
   <message name="IDS_ONBOARDING_WELCOME_SIGNIN_VIEW_SIGNIN" desc="The label for a button to let users sign in to chrome.">
     Continue
   </message>
-
-  <!-- Email interstitial view -->
-  <message name="IDS_ONBOARDING_WELCOME_EMAIL_INTERSTITIAL_TITLE" desc="Text shown to ask users whether or not they want to be directed to the email provider they previously selected, or skip this and start using the browser.">
-    Continue to your email?
-  </message>
-  <message name="IDS_ONBOARDING_WELCOME_EMAIL_INTERSTITIAL_CONTINUE" desc="Label for the button to direct the user to the email provider they previously selected.">
-    Continue
-  </message>
 </grit-part>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb
index 164b7dd..7bd1ff8 100644
--- a/chrome/app/resources/chromium_strings_ca.xtb
+++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -18,7 +18,9 @@
 <translation id="1585657529869845941">Si es mostra l'opció <ph name="BEGIN_BOLD" />Canvia igualment<ph name="END_BOLD" />, fes-hi clic</translation>
 <translation id="1668054258064581266">Després de suprimir el vostre compte de Chromium, pot ser que hàgiu de tornar a carregar les pestanyes obertes.</translation>
 <translation id="1688750314291223739">Configureu la sincronització per desar al web les funcions personalitzades del navegador i per accedir-hi des de qualsevol equip mitjançant Chromium.</translation>
+<translation id="1701453112166152218">Si una imatge no té una descripció útil, Chromium provarà d'oferir-te'n una. Google escaneja les imatges. Pots desactivar aquesta funció en qualsevol moment a la configuració.</translation>
 <translation id="1708666629004767631">Hi ha disponible una versió nova més segura de Chromium.</translation>
+<translation id="1736416771649788185">Si una imatge no té una descripció útil, Chromium provarà d'oferir-te'n una. Google escaneja les imatges.</translation>
 <translation id="1766096484055239003">L'administrador necessita que reiniciïs Chromium per aplicar una actualització</translation>
 <translation id="1774152462503052664">Permet que Chromium s'executi en segon pla</translation>
 <translation id="1779356040007214683">Perquè Chromium sigui més segur, hem desactivat algunes de les extensions que no apareixen a <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> i que és possible que s'hagin afegit sense que ho sapigueu.</translation>
@@ -268,6 +270,7 @@
 <translation id="9089354809943900324">Chromium no està actualitzat</translation>
 <translation id="91086099826398415">Obre l'enllaç en una pes&amp;tanya nova a Chromium</translation>
 <translation id="911206726377975832">També voleu suprimir les dades de navegació?</translation>
+<translation id="9158494823179993217">L'administrador del sistema ha configurat Chromium perquè obri un navegador alternatiu per accedir a <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="918373042641772655">Si desconnecteu <ph name="USERNAME" /> s'esborraran l'historial, les adreces d'interès, la configuració i la resta de dades de Chromium que hàgiu desat en aquest dispositiu. Les dades emmagatzemades al compte de Google no s'esborraran, i es poden gestionar des del <ph name="GOOGLE_DASHBOARD_LINK" />Tauler de Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9197815481970649201">S'ha iniciat la sessió a Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb
index 56d5b83..2fc7063 100644
--- a/chrome/app/resources/chromium_strings_cs.xtb
+++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -20,7 +20,9 @@
 <translation id="1585657529869845941">Pokud je zobrazeno tlačítko <ph name="BEGIN_BOLD" />Přesto přepnout<ph name="END_BOLD" />, klikněte na něj</translation>
 <translation id="1668054258064581266">Odebrání účtu z aplikace Chromium se může projevit až po opětovném načtení otevřených karet.</translation>
 <translation id="1688750314291223739">Chcete-li uložit personalizované funkce prohlížeče na web a získat k nim přístup z prohlížeče Chromium v libovolném prohlížeči, nastavte synchronizaci.</translation>
+<translation id="1701453112166152218">Pokud obrázek nemá užitečný popis, Chromium se vám jej pokusí poskytnout. Google obrázky skenuje. Tuto funkci můžete kdykoliv vypnout v nastavení.</translation>
 <translation id="1708666629004767631">K dispozici je nová, bezpečnější verze prohlížeče Chromium.</translation>
+<translation id="1736416771649788185">Pokud obrázek nemá užitečný popis, Chromium se vám jej pokusí poskytnout. Google obrázky skenuje.</translation>
 <translation id="1766096484055239003">Váš administrátor vyžaduje, abyste kvůli použití této aktualizace Chromium restartovali</translation>
 <translation id="1774152462503052664">Nechat prohlížeč Chromium spuštěný na pozadí</translation>
 <translation id="1779356040007214683">Aby bylo Chromium bezpečnější, deaktivovali jsme některá rozšíření, která nejsou uvedena na webu <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> a mohla být přidána bez vašeho vědomí.</translation>
@@ -270,6 +272,7 @@
 <translation id="9089354809943900324">Prohlížeč Chromium je zastaralý</translation>
 <translation id="91086099826398415">Otevřít odkaz na nové kar&amp;tě prohlížeče Chromium</translation>
 <translation id="911206726377975832">Vymazat také všechna data procházení?</translation>
+<translation id="9158494823179993217">Administrátor systému nakonfiguroval prohlížeč Chromium tak, aby pro přístup k adrese <ph name="TARGET_URL_HOSTNAME" /> otevřel alternativní prohlížeč.</translation>
 <translation id="918373042641772655">Odpojení uživatele <ph name="USERNAME" /> smaže také historii, záložky, nastavení a další data prohlížeče Chromium uložená v tomto zařízení. Data uložená ve vašem účtu Google nebudou vymazána a lze je spravovat na <ph name="GOOGLE_DASHBOARD_LINK" />Hlavním panelu Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9197815481970649201">Nyní jste do prohlížeče Chromium přihlášeni</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb
index b19fbe9..6afa15b 100644
--- a/chrome/app/resources/chromium_strings_es.xtb
+++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -20,7 +20,9 @@
 <translation id="1585657529869845941">Haz clic en <ph name="BEGIN_BOLD" />Cambiar de todos modos<ph name="END_BOLD" /> (si aparece)</translation>
 <translation id="1668054258064581266">Después de eliminar tu cuenta de Chromium, es posible que tengas que volver a cargar las pestañas abiertas para que se aplique el cambio.</translation>
 <translation id="1688750314291223739">Configura la sincronización para guardar las funciones personalizadas de tu navegador en la Web y acceder a ellas desde Chromium en cualquier ordenador.</translation>
+<translation id="1701453112166152218">Si una imagen no tiene una descripción útil, Chromium intentará proporcionarte una. Google se encarga de analizar las imágenes. Puedes desactivar esta opción cuando quieras desde la configuración.</translation>
 <translation id="1708666629004767631">Hay disponible una nueva versión más segura de Chromium.</translation>
+<translation id="1736416771649788185">Si una imagen no tiene una descripción útil, Chromium intentará proporcionarte una. Google se encarga de analizar las imágenes.</translation>
 <translation id="1766096484055239003">Tu administrador pide que reinicies Chromium para aplicar una actualización</translation>
 <translation id="1774152462503052664">Permitir que Chromium se ejecute en segundo plano</translation>
 <translation id="1779356040007214683">Para aumentar la seguridad de Chromium, hemos inhabilitado algunas extensiones que no figuran en <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> y que se podrían haber añadido sin tu conocimiento.</translation>
@@ -270,6 +272,7 @@
 <translation id="9089354809943900324">Chromium no está actualizado</translation>
 <translation id="91086099826398415">Abrir enlace en una pes&amp;taña nueva de Chromium</translation>
 <translation id="911206726377975832">¿Quieres borrar también los datos de navegación?</translation>
+<translation id="9158494823179993217">El administrador del sistema ha configurado Chromium para que abra otro navegador al acceder a <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="918373042641772655">Si desvinculas a <ph name="USERNAME" />, se borrarán tu historial, tus marcadores, tu configuración y otros datos de Chromium almacenados en este dispositivo. No obstante, no se borrarán los datos almacenados en tu cuenta de Google y se podrán administrar en el <ph name="GOOGLE_DASHBOARD_LINK" />Panel de control de Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="9190841055450128916">Chromium (tráfico mDNS entrante)</translation>
 <translation id="9197815481970649201">Has iniciado sesión en Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb
index 729853b..e19bad5b 100644
--- a/chrome/app/resources/chromium_strings_fi.xtb
+++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -18,7 +18,9 @@
 <translation id="1585657529869845941">Klikkaa <ph name="BEGIN_BOLD" />Vaihda joka tapauksessa<ph name="END_BOLD" /> ‑painiketta, jos se tulee näkyviin.</translation>
 <translation id="1668054258064581266">Kun olet poistanut tilisi Chromiumista, sinun on ehkä avattava avoinna olleet välilehdet uudelleen, jotta muutos tulee voimaan.</translation>
 <translation id="1688750314291223739">Määrittämällä synkronoinnin voit tallentaa selaimesi tiedot verkkoon ja käyttää niitä minkä tahansa tietokoneen Chromiumilla.</translation>
+<translation id="1701453112166152218">Jos kuvalla ei ole hyödyllistä kuvausta, Chromium yrittää luoda sellaisen. Google skannaa kuvat. Voit milloin tahansa poistaa tämän käytöstä asetuksissa.</translation>
 <translation id="1708666629004767631">Chromiumista on saatavilla uusi, turvallisempi versio.</translation>
+<translation id="1736416771649788185">Jos kuvalla ei ole hyödyllistä kuvausta, Chromium yrittää luoda sellaisen. Google skannaa kuvat.</translation>
 <translation id="1766096484055239003">Ylläpitäjä vaatii Chromiumin uudelleenkäynnistystä, jotta päivitys voidaan ottaa käyttöön.</translation>
 <translation id="1774152462503052664">Jätä Chromium käyntiin taustalle</translation>
 <translation id="1779356040007214683">Paransimme Chromiumin turvallisuutta poistamalla käytöstä sovelluksia, joita ei löydy kohteesta <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> ja jotka on voitu lisätä ilman lupaasi.</translation>
@@ -268,6 +270,7 @@
 <translation id="9089354809943900324">Chromium on vanhentunut</translation>
 <translation id="91086099826398415">Avaa linkki uudella Chromiumin välilehdellä</translation>
 <translation id="911206726377975832">Poistetaanko myös selailutiedot?</translation>
+<translation id="9158494823179993217">Järjestelmänvalvojasi on määrittänyt Chromiumin avaamaan toisen selaimen, jolla <ph name="TARGET_URL_HOSTNAME" /> avataan.</translation>
 <translation id="918373042641772655">Jos irrotat tilin <ph name="USERNAME" />, historiasi, kirjanmerkkisi ja muut laitteelle tallennetut Chromium-tiedot poistetaan. Google-tiliisi tallennetut tiedot säilyvät ennallaan, ja voit hallinnoida niitä <ph name="GOOGLE_DASHBOARD_LINK" />Google Hallintapaneelin kautta<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="9190841055450128916">Chromium (saapuva mDNS)</translation>
 <translation id="9197815481970649201">Olet nyt kirjautuneena Chromiumiin</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb
index 9f993609..8085468 100644
--- a/chrome/app/resources/chromium_strings_fil.xtb
+++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -20,7 +20,9 @@
 <translation id="1585657529869845941">I-click ang <ph name="BEGIN_BOLD" />Lumipat pa rin<ph name="END_BOLD" />, kung lalabas ito</translation>
 <translation id="1668054258064581266">Pagkatapos alisin ang iyong account sa Chromium, maaaring kailangan mong i-reload ang mga nakabukas mong tab upang magkabisa.</translation>
 <translation id="1688750314291223739">I-set up ang Pag-sync upang i-save ang iyong personalized na mga tampok ng browser sa web at i-access ang mga iyon mula sa Chromium sa anumang computer.</translation>
+<translation id="1701453112166152218">Kung walang kapaki-pakinabang na paglalarawan ang isang larawan, susubukan ng Chromium na magbigay nito para sa iyo. Sina-scan ng Google ang mga larawan. Puwede mo itong i-off sa mga setting anumang oras.</translation>
 <translation id="1708666629004767631">May available na bago at mas ligtas na bersyon ng Chromium.</translation>
+<translation id="1736416771649788185">Kung walang kapaki-pakinabang na paglalarawan ang isang larawan, susubukan ng Chromium na magbigay nito para sa iyo. Sina-scan ng Google ang mga larawan.</translation>
 <translation id="1766096484055239003">Inaatasan ka ng iyong administrator na muling ilunsad ang Chromium para malapat ang update</translation>
 <translation id="1774152462503052664">Hayaang tumakbo ang Chromium sa background</translation>
 <translation id="1779356040007214683">Upang gawing mas ligtas ang Chromium, nag-disable kami ng ilang extension na hindi nakalista sa <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> at maaaring naidagdag nang hindi mo nalalaman.</translation>
@@ -270,6 +272,7 @@
 <translation id="9089354809943900324">Luma na ang Chromium</translation>
 <translation id="91086099826398415">Buksan ang Link sa bagong &amp;tab ng Chromium</translation>
 <translation id="911206726377975832">Tatanggalin din ang iyong data sa pag-browse?</translation>
+<translation id="9158494823179993217">Na-configure ng iyong system administrator ang Chromium na magbukas ng alternatibong browser para i-access ang <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="918373042641772655">Iki-clear ng pagdiskonekta kay <ph name="USERNAME" /> ang iyong history, mga bookmark, setting at iba pang data ng Chromium na naka-imbak sa device na ito. Hindi iki-clear ang data na naka-imbak sa iyong Google Account at maaaring pamahalaan sa <ph name="GOOGLE_DASHBOARD_LINK" />Google Dashboard<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9197815481970649201">Naka-sign in ka ngayon sa Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb
index 4391293..8edd628b 100644
--- a/chrome/app/resources/chromium_strings_fr.xtb
+++ b/chrome/app/resources/chromium_strings_fr.xtb
@@ -19,7 +19,9 @@
 <translation id="1585657529869845941">Si le bouton <ph name="BEGIN_BOLD" />Changer quand même<ph name="END_BOLD" /> s'affiche, cliquez dessus</translation>
 <translation id="1668054258064581266">Une fois votre compte Chromium supprimé, vous devrez peut-être charger de nouveau les onglets ouverts pour que les modifications prennent effet.</translation>
 <translation id="1688750314291223739">Configurez la synchronisation pour enregistrer sur le Web les fonctionnalités personnalisées de votre navigateur et y accéder à partir de Chromium sur n'importe quel ordinateur.</translation>
+<translation id="1701453112166152218">Si une image n'est pas accompagnée d'une description utile, Chromium essaiera de vous en proposer une. Les images sont analysées par Google. Vous pouvez désactiver à tout moment cette option dans les paramètres.</translation>
 <translation id="1708666629004767631">Une nouvelle version de Chromium encore plus sûre est disponible.</translation>
+<translation id="1736416771649788185">Si une image n'est pas accompagnée d'une description utile, Chromium essaiera de vous en proposer une. Les images sont analysées par Google.</translation>
 <translation id="1766096484055239003">À la demande de votre administrateur, vous devez relancer Chromium pour installer une mise à jour</translation>
 <translation id="1774152462503052664">Laisser Chromium s'exécuter en arrière-plan</translation>
 <translation id="1779356040007214683">Afin de rendre Chrome plus sûr, nous avons désactivé certaines extensions qui ne sont pas répertoriées sur le <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> et qui ont pu être ajoutées à votre insu.</translation>
@@ -269,6 +271,7 @@
 <translation id="9089354809943900324">Version de Chromium obsolète</translation>
 <translation id="91086099826398415">Ouvrir le lien dans un nouvel ongle&amp;t Chromium</translation>
 <translation id="911206726377975832">Supprimer également vos données de navigation ?</translation>
+<translation id="9158494823179993217">Votre administrateur système a configuré Chromium de sorte qu'un autre navigateur s'ouvre pour accéder à <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="918373042641772655">La déconnexion de <ph name="USERNAME" /> a pour effet d'effacer votre historique, vos favoris, vos paramètres et les autres données Chromium stockées sur cet appareil. Les données stockées dans votre compte Google ne sont pas effacées ; vous pouvez les gérer dans <ph name="GOOGLE_DASHBOARD_LINK" />Google Dashboard<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9197815481970649201">Vous êtes connecté à Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb
index 732c6cd..9b39194 100644
--- a/chrome/app/resources/chromium_strings_iw.xtb
+++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -18,7 +18,9 @@
 <translation id="1585657529869845941">אם הלחצן <ph name="BEGIN_BOLD" />אני רוצה להחליף בכל מקרה<ph name="END_BOLD" /> מופיע, צריך ללחוץ עליו</translation>
 <translation id="1668054258064581266">‏לאחר הסרת החשבון שלך מ-Chromeium, ייתכן שתידרש לטעון מחדש את הכרטיסיות הפתוחות שלך כדי שההסרה תיושם בפועל.</translation>
 <translation id="1688750314291223739">‏הגדר סנכרון כדי לשמור את תכונות הדפדפן המותאמות אישית שלך באינטרנט ולגשת אליהן מ-Chromium בכל מחשב.</translation>
+<translation id="1701453112166152218">‏אם אין לתמונה תיאור מועיל, Chromium ינסה לספק לך תיאור. התמונות נסרקות על-ידי Google. אפשר להשבית את האפשרות הזו בכל זמן דרך ההגדרות.</translation>
 <translation id="1708666629004767631">‏גרסה חדשה ובטוחה יותר של Chromium זמינה כעת.</translation>
+<translation id="1736416771649788185">‏אם אין לתמונה תיאור מועיל, Chromium ינסה לספק לך תיאור. התמונות נסרקות על-ידי Google.</translation>
 <translation id="1766096484055239003">‏לפי דרישת מנהל המערכת, יש להפעיל מחדש את Chromium כדי להחיל עדכון</translation>
 <translation id="1774152462503052664">‏אפשר ל-Chromium לפעול ברקע</translation>
 <translation id="1779356040007214683">‏כדי לשפר את האבטחה של Chromium, השבתנו חלק מהתוספים שלא רשומים ב<ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> וייתכן שנוספו ללא ידיעתך.</translation>
@@ -266,6 +268,7 @@
 <translation id="9089354809943900324">‏Chromium אינו מעודכן</translation>
 <translation id="91086099826398415">‏פתח את הקישור &amp;בכרטיסיית Chromium חדשה</translation>
 <translation id="911206726377975832">למחוק גם את נתוני הגלישה שלך?</translation>
+<translation id="9158494823179993217">‏לפי הגדרת מנהל המערכת, Chromium יפתח דפדפן חלופי כדי לגשת אל <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="918373042641772655">‏ניתוק <ph name="USERNAME" /> ינקה את ההיסטוריה, הסימניות, ההגדרות ונתוני Chromium אחרים המאוחסנים במכשיר הזה. נתונים המאוחסנים בחשבון Google לא ינוקו, וניתן לנהל אותם <ph name="GOOGLE_DASHBOARD_LINK" />במרכז השליטה של Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="9190841055450128916">‏Chromium ‏(mDNS-In)</translation>
 <translation id="9197815481970649201">‏אתה מחובר כעת ל-Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb
index 741f495..72503d1c 100644
--- a/chrome/app/resources/chromium_strings_ko.xtb
+++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -20,7 +20,9 @@
 <translation id="1585657529869845941"><ph name="BEGIN_BOLD" />전환하기<ph name="END_BOLD" /> 버튼이 표시되면 클릭하세요</translation>
 <translation id="1668054258064581266">Chromium에서 계정을 삭제한 후 열려 있는 탭을 새로고침해야 적용됩니다.</translation>
 <translation id="1688750314291223739">맞춤설정한 브라우저 기능을 웹에 저장하고 모든 컴퓨터의 Chromium에서 액세스할 수 있도록 동기화를 설정합니다.</translation>
+<translation id="1701453112166152218">이미지에 유용한 설명이 없으면 Chromium이 자동으로 설명 제공을 시도합니다. Google에서 이미지를 스캔합니다. 이 기능은 언제든지 설정에서 사용 중지할 수 있습니다.</translation>
 <translation id="1708666629004767631">새롭고 안전한 Chromium의 새 버전을 사용할 수 있습니다.</translation>
+<translation id="1736416771649788185">이미지에 유용한 설명이 없으면 Chromium이 자동으로 설명 제공을 시도합니다. Google에서 이미지를 스캔합니다.</translation>
 <translation id="1766096484055239003">관리자가 업데이트를 적용하려면 사용자가 반드시 Chromium을 다시 시작하도록 설정했습니다.</translation>
 <translation id="1774152462503052664">백그라운드에서 Chromium을 실행</translation>
 <translation id="1779356040007214683">Google에서는 Chromium의 보안을 강화하기 위해 <ph name="IDS_EXTENSION_WEB_STORE_TITLE" />에 표시되지 않고 사용자 모르게 추가되었을 수 있는 일부 확장 프로그램의 사용을 중지했습니다.</translation>
@@ -270,6 +272,7 @@
 <translation id="9089354809943900324">Chromium이 이전 버전임</translation>
 <translation id="91086099826398415">새 Chromium 탭에서 링크 열기(&amp;T)</translation>
 <translation id="911206726377975832">인터넷 사용 기록도 삭제하시겠습니까?</translation>
+<translation id="9158494823179993217">시스템 관리자가 <ph name="TARGET_URL_HOSTNAME" /> 액세스를 위해 대체 브라우저를 열도록 Chromium을 구성했습니다.</translation>
 <translation id="918373042641772655"><ph name="USERNAME" />의 연결을 해제하면 이 기기에 저장된 방문 기록, 북마크, 설정 및 Chromium 데이터가 삭제됩니다. Google 계정에 저장된 데이터는 삭제되지 않으며 <ph name="GOOGLE_DASHBOARD_LINK" />Google 대시보드<ph name="END_GOOGLE_DASHBOARD_LINK" />에서 관리될 수 있습니다.</translation>
 <translation id="9190841055450128916">Chromium(mDNS-In)</translation>
 <translation id="9197815481970649201">이제 Chromium에 로그인되었습니다.</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb
index 23325743..eb09922 100644
--- a/chrome/app/resources/chromium_strings_no.xtb
+++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -18,7 +18,9 @@
 <translation id="1585657529869845941">Klikk på <ph name="BEGIN_BOLD" />Bytt likevel<ph name="END_BOLD" /> (hvis knappen vises)</translation>
 <translation id="1668054258064581266">Når du har fjernet kontoen din fra Chromium, kan det hende at du må laste inn de åpne fanene på nytt før endringene trer i kraft.</translation>
 <translation id="1688750314291223739">Konfigurer Synkronisering til å lagre de personlig tilpassede nettleserfunksjonene dine på nettet slik at du kan bruke dem fra Chromium på enhver datamaskin.</translation>
+<translation id="1701453112166152218">Hvis et bilde ikke har noen nyttig beskrivelse, prøver Chromium å finne en til deg. Bildene skannes av Google. Du kan slå av dette i innstillingene når som helst.</translation>
 <translation id="1708666629004767631">En ny, sikrere versjon av Chromium er tilgjengelig.</translation>
+<translation id="1736416771649788185">Hvis et bilde ikke har noen nyttig beskrivelse, prøver Chromium å finne en til deg. Bildene skannes av Google.</translation>
 <translation id="1766096484055239003">Administratoren din krever at du starter Chromium på nytt for at en oppdatering skal tas i bruk</translation>
 <translation id="1774152462503052664">La Chromium kjøre i bakgrunnen</translation>
 <translation id="1779356040007214683">For å gjøre Chromium tryggere, har vi deaktivert noen utvidelser som ikke er oppført i <ph name="IDS_EXTENSION_WEB_STORE_TITLE" />, og som kan ha blitt lagt uten at du har vært klar over det.</translation>
@@ -268,6 +270,7 @@
 <translation id="9089354809943900324">Chromium er utdatert</translation>
 <translation id="91086099826398415">Åpne linken i en ny &amp;fane i Chromium</translation>
 <translation id="911206726377975832">Vil du slette all nettleserdata også?</translation>
+<translation id="9158494823179993217">Systemadministratoren din har konfigurert Chromium til å åpne en annen nettleser når du går til <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="918373042641772655">Hvis du kobler fra <ph name="USERNAME" />, slettes loggen din, bokmerkene, innstillingene og andre Chromium-data som er lagret på denne enheten. Data som er lagret i Google-kontoen din, blir ikke tømt og kan administreres på <ph name="GOOGLE_DASHBOARD_LINK" />Google Oversikt<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-Inn)</translation>
 <translation id="9197815481970649201">Du er logget på Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb
index fc522b1..ceb6dd6 100644
--- a/chrome/app/resources/chromium_strings_sv.xtb
+++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -20,7 +20,9 @@
 <translation id="1585657529869845941">Klicka på <ph name="BEGIN_BOLD" />Byt ändå<ph name="END_BOLD" /> om det visas</translation>
 <translation id="1668054258064581266">När du har tagit bort kontot från Chromium kan öppna flikar behöva läsas in på nytt för att ändringen ska träda i kraft.</translation>
 <translation id="1688750314291223739">Konfigurera synkronisering för att spara dina webbläsarfunktioner på webben och använda dem i Chromium på alla datorer.</translation>
+<translation id="1701453112166152218">Om en bild inte har någon användbar beskrivning försöker Chromium ange en åt dig. Bilden skannas av Google. Du kan när som helst inaktivera den här inställningen.</translation>
 <translation id="1708666629004767631">Det finns en ny, ännu säkrare version av Chromium.</translation>
+<translation id="1736416771649788185">Om en bild inte har någon användbar beskrivning försöker Chromium ange en åt dig. Bilden skannas av Google.</translation>
 <translation id="1766096484055239003">Administratören meddelar att du måste starta om Chromium så att en uppdatering tillämpas</translation>
 <translation id="1774152462503052664">Låt Chromium köras i bakgrunden</translation>
 <translation id="1779356040007214683">Vi har gjort Chromium säkrare genom att inaktivera vissa tillägg som inte finns i <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> och som kan ha lagts till utan att du vet om det.</translation>
@@ -270,6 +272,7 @@
 <translation id="9089354809943900324">Den här versionen av Chromium är inaktuell</translation>
 <translation id="91086099826398415">Öppna länken i en ny &amp;flik i Chromium</translation>
 <translation id="911206726377975832">Vill du även ta bort din webbinformation?</translation>
+<translation id="9158494823179993217">Systemadministratören har konfigurerat Chromium så att <ph name="TARGET_URL_HOSTNAME" /> öppnas i en annan webbläsare.</translation>
 <translation id="918373042641772655">Om du kopplar från <ph name="USERNAME" /> rensas din historik, dina bokmärken, dina inställningar och annan Chromium-data som du har lagrat på enheten. Data som lagras i Google-kontot rensas inte utan kan hanteras via <ph name="GOOGLE_DASHBOARD_LINK" />Google Översikt<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9197815481970649201">Du är nu inloggad i Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_ta.xtb b/chrome/app/resources/chromium_strings_ta.xtb
index a151bea..6e2a2bd 100644
--- a/chrome/app/resources/chromium_strings_ta.xtb
+++ b/chrome/app/resources/chromium_strings_ta.xtb
@@ -18,7 +18,9 @@
 <translation id="1585657529869845941"><ph name="BEGIN_BOLD" />பரவாயில்லை, மாற்று<ph name="END_BOLD" /> எனும் பொத்தான் தெரிந்தால், அதைக் கிளிக் செய்யவும்</translation>
 <translation id="1668054258064581266">Chromium இலிருந்து உங்கள் கணக்கை அகற்றிய பின்னர், செயல்படுத்த உங்கள் திறந்த தாவல்களை மீண்டும் ஏற்ற வேண்டியிருக்கலாம்.</translation>
 <translation id="1688750314291223739">உங்கள் தனிப்பயனாக்கப்பட்ட உலாவி அம்சங்களை வலையில் சேமிக்க, ஒத்திசைவை அமைத்து, எந்தக் கணினியில் உள்ள Chromium இலிருந்தும் அவற்றை அணுகலாம்.</translation>
+<translation id="1701453112166152218">ஒரு படத்திற்குப் பயனுள்ள விளக்கம் இல்லையென்றால், Chromium உங்களுக்காக அதை வழங்க முயலும். படங்களை Google ஸ்கேன் செய்யும். எப்போது வேண்டுமானாலும் இதை அமைப்புகளில் முடக்கலாம்.</translation>
 <translation id="1708666629004767631">Chromium இன் புதிய, பாதுகாப்பான பதிப்பு கிடைக்கிறது.</translation>
+<translation id="1736416771649788185">ஒரு படத்திற்குப் பயனுள்ள விளக்கம் இல்லையென்றால், Chromium உங்களுக்காக அதை வழங்க முயலும். படங்களை Google ஸ்கேன் செய்யும்.</translation>
 <translation id="1766096484055239003">புதுப்பிப்பைப் பயன்படுத்த, Chromiumஐ மீண்டும் தொடங்கும்படி உங்கள் நிர்வாகி சொல்கிறார்</translation>
 <translation id="1774152462503052664">பின்புலத்தில் Chromium ஐ இயக்கு</translation>
 <translation id="1779356040007214683">Chromium ஐப் பாதுகாப்பானதாக்க <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> இல் பட்டியலிடப்படாத சில நீட்டிப்புகளை நாங்கள் முடக்கிவிட்டோம், மேலும் அவை உங்களுக்குத் தெரியாமல் சேர்க்கப்பட்டிருக்கலாம்.</translation>
@@ -268,6 +270,7 @@
 <translation id="9089354809943900324">Chromium காலாவதியானது</translation>
 <translation id="91086099826398415">புதிய Chromium &amp;தாவலில் இணைப்பைத் திற</translation>
 <translation id="911206726377975832">உங்கள் உலாவுதல் தரவையும் நீக்க வேண்டுமா?</translation>
+<translation id="9158494823179993217"><ph name="TARGET_URL_HOSTNAME" />ஐ அணுக Chromium அதை மாற்று உலாவியில் திறக்கும்படி உங்கள் சிஸ்டம் நிர்வாகி உள்ளமைத்துள்ளார்.</translation>
 <translation id="918373042641772655"><ph name="USERNAME" /> ஐத் துண்டிப்பது, இந்தச் சாதனத்தில் உள்ள உங்கள் வரலாறு, புக்மார்க்குகள், அமைப்புகள் மற்றும் பிற Chromium தரவை அழிக்கும். உங்கள் Google கணக்கில் சேமிக்கப்பட்ட தரவு அழிக்கப்படாது, மேலும் <ph name="GOOGLE_DASHBOARD_LINK" />Google டாஷ்போர்டில்<ph name="END_GOOGLE_DASHBOARD_LINK" /> நிர்வகிக்கலாம்.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9197815481970649201">இப்போது Chromium இல் உள்நுழைந்துள்ளீர்கள்</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb
index 7f1365e6..c92d9670 100644
--- a/chrome/app/resources/chromium_strings_te.xtb
+++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -18,7 +18,9 @@
 <translation id="1585657529869845941">ఇది కనిపిస్తే, <ph name="BEGIN_BOLD" />అయిన కూడా మార్చు<ph name="END_BOLD" />ను క్లిక్ చేయండి</translation>
 <translation id="1668054258064581266">Chromium నుండి మీ ఖాతాను తీసివేసిన తర్వాత, ప్రభావవంతం కావడానికి మీరు మీ తెరిచిన ట్యాబ్‌లను మళ్లీ లోడ్ చేయాల్సి రావచ్చు.</translation>
 <translation id="1688750314291223739">వెబ్‌కు మీ వ్యక్తిగతీకరించిన బ్రౌజర్ ఫీచర్‌లను సేవ్ చేసి, వాటిని ఏదైనా కంప్యూటర్‌లోని Chromium నుండి యాక్సెస్ చేయడానికి సింక్‌ను సెటప్ చేయండి.</translation>
+<translation id="1701453112166152218">చిత్రంలో ఉపయోగకరమైన వివరణ లేకుంటే, మీ కోసం వివరణను అందించడానికి Chromium ప్రయత్నిస్తుంది. చిత్రాలు Google ద్వారా స్కాన్ చేయబడతాయి. మీరు దీనిని ఎప్పుడైనా సెట్టింగ్‌లలో ఆఫ్ చేయవచ్చు.</translation>
 <translation id="1708666629004767631">Chromium యొక్క కొత్త సురక్షితమైన వెర్షన్ అందుబాటులో ఉంది.</translation>
+<translation id="1736416771649788185">చిత్రంలో ఉపయోగకరమైన వివరణ లేకుంటే, మీ కోసం వివరణను అందించడానికి Chromium ప్రయత్నిస్తుంది. చిత్రాలు Google ద్వారా స్కాన్ చేయబడతాయి.</translation>
 <translation id="1766096484055239003">అప్‌డేట్‌ను వర్తింపజేయడం కోసం మీరు Chromiumను పునఃప్రారంభించాలని మీ నిర్వాహకుడు కోరుతున్నారు</translation>
 <translation id="1774152462503052664">నేపథ్యంలో Chromiumని అమలు చేయడానికి అనుమతించు</translation>
 <translation id="1779356040007214683">Chromiumను సురక్షితం చేయడానికి, మేము <ph name="IDS_EXTENSION_WEB_STORE_TITLE" />లో జాబితా చేయబడని మరియు మీకు తెలియకుండానే జోడించబడిన కొన్ని పొడిగింపులను నిలిపివేసాము.</translation>
@@ -264,6 +266,7 @@
 <translation id="9089354809943900324">Chromium కాలం చెల్లినది</translation>
 <translation id="91086099826398415">కొత్త Chromium &amp;ట్యాబ్‌లో లింక్‌ని తెరువు</translation>
 <translation id="911206726377975832">మీ బ్రౌజింగ్ డేటాను కూడా తొలగించాలా?</translation>
+<translation id="9158494823179993217"><ph name="TARGET_URL_HOSTNAME" />ని యాక్సెస్ చేయడం కోసం ఒక ప్రత్యామ్నాయ బ్రౌజర్‌ని తెరిచే విధంగా Chromiumని మీ సిస్టమ్ నిర్వాహకులు కాన్ఫిగర్ చేసారు.</translation>
 <translation id="918373042641772655"><ph name="USERNAME" />ను డిస్‌కనెక్ట్ చేయడం వలన ఈ పరికరంలో నిల్వ చేయబడిన మీ చరిత్ర, బుక్‌మార్క్‌లు, సెట్టింగ్‌లు మరియు ఇతర Chromium డేటా క్లియర్ చేయబడతాయి. మీ Google ఖాతాలో నిల్వ చేయబడిన డేటా క్లియర్ చేయబడదు మరియు దాన్ని <ph name="GOOGLE_DASHBOARD_LINK" />Google డాష్‌బోర్డ్<ph name="END_GOOGLE_DASHBOARD_LINK" />లో నిర్వహించవచ్చు.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9197815481970649201">మీరు ఇప్పుడు Chromiumకు సైన్ ఇన్ చేసారు</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb
index 9dac95a6..2b829fea 100644
--- a/chrome/app/resources/chromium_strings_th.xtb
+++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -18,7 +18,9 @@
 <translation id="1585657529869845941">คลิก<ph name="BEGIN_BOLD" />สลับ<ph name="END_BOLD" /> หากเห็นปุ่มดังกล่าว</translation>
 <translation id="1668054258064581266">เมื่อลบบัญชีของคุณออกจาก Chromium แล้ว คุณต้องโหลดแท็บที่เปิดอยู่ซ้ำเพื่อให้มีผล</translation>
 <translation id="1688750314291223739">ตั้งค่าการซิงค์เพื่อบัน​​ทึกฟีเจอร์เบราว์เซอร์ในแบบของคุณไปยังเว็บและเข้าถึงได้จาก Chromium บนคอมพิวเตอร์เครื่องใดก็ได้</translation>
+<translation id="1701453112166152218">หากรูปภาพไม่มีคำอธิบายที่เป็นประโยชน์ Chromium จะพยายามใส่คำอธิบายให้คุณ รูปภาพจะได้รับการสแกนโดย Google คุณปิดการดำเนินการนี้ได้ทุกเมื่อในการตั้งค่า</translation>
 <translation id="1708666629004767631">Chromium รุ่นใหม่ที่ปลอดภัยกว่าเดิมพร้อมให้ใช้งานแล้ว</translation>
+<translation id="1736416771649788185">หากรูปภาพไม่มีคำอธิบายที่เป็นประโยชน์ Chromium จะพยายามใส่คำอธิบายให้คุณ รูปภาพจะได้รับการสแกนโดย Google</translation>
 <translation id="1766096484055239003">ผู้ดูแลระบบต้องการให้คุณเปิด Chromium ขึ้นมาใหม่เพื่อใช้การอัปเดต</translation>
 <translation id="1774152462503052664">ให้ Chromium ทำงานในพื้นหลัง</translation>
 <translation id="1779356040007214683">เพื่อให้ Chromium ปลอดภัยขึ้น เราได้ปิดส่วนขยายบางรายการที่ไม่ได้ระบุไว้ใน <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> และอาจถูกเพิ่มเข้ามาโดยที่คุณไม่รู้ตัว</translation>
@@ -268,6 +270,7 @@
 <translation id="9089354809943900324">Chromium ล้าสมัย</translation>
 <translation id="91086099826398415">เปิดลิงก์ใน Chromium แท็บใหม่</translation>
 <translation id="911206726377975832">ลบข้อมูลการท่องเว็บด้วยหรือไม่</translation>
+<translation id="9158494823179993217">ผู้ดูแลระบบของคุณกำหนดค่าให้ Chromium เปิดเบราว์เซอร์สำรองเพื่อเข้าถึง <ph name="TARGET_URL_HOSTNAME" /></translation>
 <translation id="918373042641772655">การยกเลิกการเชื่อมต่อกับ <ph name="USERNAME" /> จะล้างประวัติการเข้าชม บุ๊กมาร์ก การตั้งค่า และข้อมูลอื่นๆ ของ Chromium ที่เก็บไว้ในอุปกรณ์นี้ ข้อมูลที่เก็บไว้ในบัญชี Google ของคุณจะไม่ถูกล้างและสามารถจัดการได้บน <ph name="GOOGLE_DASHBOARD_LINK" />Google แดชบอร์ด<ph name="END_GOOGLE_DASHBOARD_LINK" /></translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9197815481970649201">คุณได้ลงชื่อเข้าใช้ Chromium แล้ว</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb
index 0666b4e5..2b5d937d 100644
--- a/chrome/app/resources/chromium_strings_tr.xtb
+++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -18,7 +18,9 @@
 <translation id="1585657529869845941">Görünürse <ph name="BEGIN_BOLD" />Yine de değiştir<ph name="END_BOLD" />'i tıklayın</translation>
 <translation id="1668054258064581266">Hesabınızı Chromium'dan kaldırdıktan sonra, bu durumun etkili olması için açık sekmelerinizi yeniden yüklemeniz gerekebilir.</translation>
 <translation id="1688750314291223739">Kişiselleştirilmiş tarayıcı özelliklerinizi Web'e kaydetmek ve herhangi bir bilgisayardan Chromium ile bu özelliklere erişmek için senkronizasyonu ayarlayın.</translation>
+<translation id="1701453112166152218">Bir resmin işe yarar bir açıklaması yoksa, Chromium sizin için bir açıklama sağlamaya çalışır. Resimler Google tarafından taranır. Bu özelliği istediğiniz zaman ayarlardan kapatabilirsiniz.</translation>
 <translation id="1708666629004767631">Chromium'un kullanabileceğiniz yeni, daha güvenli bir sürümü var.</translation>
+<translation id="1736416771649788185">Bir resmin işe yarar bir açıklaması yoksa, Chromium sizin için bir açıklama sağlamaya çalışır. Resimler Google tarafından taranır.</translation>
 <translation id="1766096484055239003">Yöneticiniz bir güncellemeyi uygulamak için Chromium'u yeniden başlatmanızı gerektiriyor</translation>
 <translation id="1774152462503052664">Chromium'un arka planda çalışmasına izin ver</translation>
 <translation id="1779356040007214683">Chromium'u daha güvenli bir hale getirmek için <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> altında listelenmeyen ve bilginiz dışında eklenmiş olabilecek bazı uzantıları devre dışı bıraktık.</translation>
@@ -266,6 +268,7 @@
 <translation id="9089354809943900324">Chromium sürümü eski</translation>
 <translation id="91086099826398415">Bağlantıyı Yeni Chromium &amp;sekmesinde aç</translation>
 <translation id="911206726377975832">Tarama verileriniz de silinsin mi?</translation>
+<translation id="9158494823179993217">Sistem yöneticiniz, Chromium'u, <ph name="TARGET_URL_HOSTNAME" /> sitesini alternatif bir tarayıcıda açacak şekilde yapılandırmış.</translation>
 <translation id="918373042641772655"><ph name="USERNAME" /> kullanıcısının bağlantısını kesmek, geçmişinizi, yer işaretlerinizi, ayarlarınızı ve bu cihazda depolanan diğer Chromium verilerinizi temizler. Google Hesabınızda depolanan veriler temizlenmez ve <ph name="GOOGLE_DASHBOARD_LINK" />Google Hesap Özeti<ph name="END_GOOGLE_DASHBOARD_LINK" />'nden yönetilebilir.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9197815481970649201">Şu anda Chromium'da oturum açtınız</translation>
diff --git a/chrome/app/resources/chromium_strings_uk.xtb b/chrome/app/resources/chromium_strings_uk.xtb
index c427702..7359f3c 100644
--- a/chrome/app/resources/chromium_strings_uk.xtb
+++ b/chrome/app/resources/chromium_strings_uk.xtb
@@ -18,7 +18,9 @@
 <translation id="1585657529869845941">Натисніть кнопку <ph name="BEGIN_BOLD" />Усе одно змінити<ph name="END_BOLD" />, якщо вона з’явиться</translation>
 <translation id="1668054258064581266">Якщо видалити обліковий запис із Chromium, можливо, потрібно оновити відкриті вкладки, щоб зміни почали діяти.</translation>
 <translation id="1688750314291223739">Налаштуйте синхронізацію, щоб зберегти свої персоналізовані функції веб-переглядача в Інтернеті й мати до них доступ із Chromium на будь-якому комп’ютері.</translation>
+<translation id="1701453112166152218">Якщо зображення не має корисного опису, Chromium спробує додати його. Google сканує зображення. Ви можете будь-коли вимкнути це в налаштуваннях.</translation>
 <translation id="1708666629004767631">Доступна нова, надійніша версія Chromium.</translation>
+<translation id="1736416771649788185">Якщо зображення не має корисного опису, Chromium спробує додати його. Google сканує зображення.</translation>
 <translation id="1766096484055239003">Адміністратор вимагає перезапустити Chromium, щоб застосувати оновлення</translation>
 <translation id="1774152462503052664">Дозволити Chromium працювати у фоновому режимі</translation>
 <translation id="1779356040007214683">Щоб зробити Chromium безпечнішим, ми вимкнути деякі розширення, джерелом яких не є <ph name="IDS_EXTENSION_WEB_STORE_TITLE" />, і які, можливо, було додано без вашого відома.</translation>
@@ -268,6 +270,7 @@
 <translation id="9089354809943900324">Версія Chromium застаріла</translation>
 <translation id="91086099826398415">Відкрити посилання в новій &amp;вкладці Chromium</translation>
 <translation id="911206726377975832">Також видалити дані веб-перегляду?</translation>
+<translation id="9158494823179993217">Ваш системний адміністратор налаштував Chromium відкривати сторінку <ph name="TARGET_URL_HOSTNAME" /> в альтернативному веб-переглядачі.</translation>
 <translation id="918373042641772655">Якщо від’єднати користувача <ph name="USERNAME" />, вашу історію, закладки, налаштування й інші дані Chromium, збережені на цьому пристрої, буде видалено. Дані, які зберігаються в обліковому записі Google, не буде видалено. Ними можна керувати на <ph name="GOOGLE_DASHBOARD_LINK" />Інформаційній панелі Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9197815481970649201">Ви ввійшли в Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb
index 109a9ff..ddcd6a9 100644
--- a/chrome/app/resources/chromium_strings_vi.xtb
+++ b/chrome/app/resources/chromium_strings_vi.xtb
@@ -18,7 +18,9 @@
 <translation id="1585657529869845941">Hãy nhấp vào nút <ph name="BEGIN_BOLD" />Vẫn chuyển<ph name="END_BOLD" /> khi nút này xuất hiện</translation>
 <translation id="1668054258064581266">Sau khi xóa tài khoản khỏi Chromium, bạn có thể cần tải lại các tab đang mở của mình để tác vụ có hiệu lực.</translation>
 <translation id="1688750314291223739">Thiết lập đồng bộ hóa để lưu các tính năng trình duyệt được cá nhân hóa của bạn vào web và truy cập chúng từ Chromium trên bất kỳ máy tính nào.</translation>
+<translation id="1701453112166152218">Chromium sẽ cố gắng mô tả cho bạn những hình ảnh không có nội dung mô tả hữu ích. Các hình ảnh đều do Google quét. Bạn có thể tắt dịch vụ này trong phần cài đặt bất kỳ lúc nào.</translation>
 <translation id="1708666629004767631">Hiện đã có phiên bản Chromium mới an toàn hơn.</translation>
+<translation id="1736416771649788185">Chromium sẽ cố gắng mô tả cho bạn những hình ảnh không có nội dung mô tả hữu ích. Các hình ảnh đều do Google quét.</translation>
 <translation id="1766096484055239003">Quản trị viên của bạn yêu cầu bạn chạy lại Chromium để áp dụng bản cập nhật</translation>
 <translation id="1774152462503052664">Cho phép Chromium chạy dưới nền</translation>
 <translation id="1779356040007214683">Để làm cho Chromium an toàn hơn, chúng tôi đã vô hiệu hóa một số tiện ích không được liệt kê trong <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> và có thể đã được thêm mà bạn không biết.</translation>
@@ -268,6 +270,7 @@
 <translation id="9089354809943900324">Chromium đã lỗi thời</translation>
 <translation id="91086099826398415">Mở liên kết trong tab mới của Chromium</translation>
 <translation id="911206726377975832">Bạn cũng muốn xóa dữ liệu duyệt web của mình?</translation>
+<translation id="9158494823179993217">Quản trị viên hệ thống của bạn đã định cấu hình Chromium để mở một trình duyệt thay thế khi truy cập vào <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="918373042641772655">Ngắt kết nối <ph name="USERNAME" /> sẽ xóa lịch sử, dấu trang, cài đặt và các dữ liệu Chromium khác của bạn trên thiết bị này. Dữ liệu được lưu trữ trong tài khoản Google của bạn sẽ không bị xóa và có thể được quản lý trên <ph name="GOOGLE_DASHBOARD_LINK" />Trang tổng quan của Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9197815481970649201">Bạn hiện đã đăng nhập vào Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb
index 6a8f04e1..55756ff 100644
--- a/chrome/app/resources/chromium_strings_zh-TW.xtb
+++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -18,7 +18,9 @@
 <translation id="1585657529869845941">請點選 [確定切換] (如有顯示)<ph name="BEGIN_BOLD" /><ph name="END_BOLD" /></translation>
 <translation id="1668054258064581266">將你的帳戶從 Chromium 移除後,可能需要重新載入開啟的分頁,這項操作才會生效。</translation>
 <translation id="1688750314291223739">設定同步處理功能,即可在網路上儲存你的個人化瀏覽器功能,並且透過任何電腦從 Chromium 使用這些功能。</translation>
+<translation id="1701453112166152218">如果圖片缺少有用的說明,Chromium 會嘗試為你提供說明。Google 會對圖片進行掃描。你隨時可以在設定中關閉這項功能。</translation>
 <translation id="1708666629004767631">新版 Chromium 現已推出,安全更上一層樓。</translation>
+<translation id="1736416771649788185">如果圖片缺少有用的說明,Chromium 會嘗試為你提供說明。Google 會對圖片進行掃描。</translation>
 <translation id="1766096484055239003">你的管理員要求你重新啟動 Chromium,以套用更新</translation>
 <translation id="1774152462503052664">讓 Chromium 在背景執行</translation>
 <translation id="1779356040007214683">為了讓 Chromium 的安全性更有保障,我們已將部分未列在 <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> 中的擴充功能停用,它們可能在你不知情的情況下加入瀏覽器。</translation>
@@ -268,6 +270,7 @@
 <translation id="9089354809943900324">Chromium 版本過舊</translation>
 <translation id="91086099826398415">在新的 Chromium 分頁中開啟連結(&amp;T)</translation>
 <translation id="911206726377975832">你要一併刪除瀏覽資料嗎?</translation>
+<translation id="9158494823179993217">系統管理員已設定 Chromium 開啟替代瀏覽器來存取 <ph name="TARGET_URL_HOSTNAME" />。</translation>
 <translation id="918373042641772655">解除與 <ph name="USERNAME" /> 的連結將會清除此裝置上已儲存的歷史記錄、書籤、設定和其他 Chromium 資料。不過,這不會清除 Google 帳戶中儲存的資料,你可以在 <ph name="GOOGLE_DASHBOARD_LINK" />Google 資訊主頁<ph name="END_GOOGLE_DASHBOARD_LINK" />管理這些資料。</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9197815481970649201">你現在已登入 Chromium</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index bce2b52..d12a90f 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -3419,7 +3419,6 @@
 <translation id="6103681770816982672">ማስጠንቀቂያ፦ ወደ የገንቢ ሰርጥ እየቀየሩ ነው</translation>
 <translation id="6104068876731806426">የGoogle መለያዎች</translation>
 <translation id="6104311680260824317">መሣሪያን ከጎራው ጋር ማቀላቀል አልተቻለም። አገልጋዩ የተጠቀሱትን የKerberos ምሥጠራ ዓይነቶችን አይደግፍም። ለምሥጠራ ቅንብሮች «ተጨማሪ አማራጮች» ላይ ምልክት ያድርጉ።</translation>
-<translation id="6105877918873366097">ለመጨረሻ ጊዜ የተደረሰው</translation>
 <translation id="6107012941649240045">ለእዚህ ቀርቧል</translation>
 <translation id="6112294629795967147">መጠን ለመቀየር ይንኩ</translation>
 <translation id="6112931163620622315">ስልክዎን ይፈትሹ</translation>
@@ -4197,7 +4196,6 @@
 <translation id="7289225569524511578">የልጣፍ መተግበሪያውን ክፈት</translation>
 <translation id="7290242001003353852">ይህ በ<ph name="SAML_DOMAIN" /> የሚስተናገድ የመለያ መግቢያ አገልግሎት የእርስዎን ካሜራ እየደረሰበት ነው።</translation>
 <translation id="7290594223351252791">ምዝገባ ያረጋግጡ</translation>
-<translation id="7292696521213967957">ረዳትን ለማረም መረጃ</translation>
 <translation id="7295662345261934369">ከሌሎች ጋር ተጋራ</translation>
 <translation id="729583233778673644">የAES እና የRC4 ምሥጠራን ይፍቀዱ። የRC4 ምሥጠራዎች ለደህንነት አስተማማኝ ስላልሆኑ ይህን አማራጭ መጠቀም የእርስዎን አደጋ ይጨምራል።</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> ውል</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index ea3129e..81245655 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -3418,7 +3418,6 @@
 <translation id="6103681770816982672">تحذير: أنت الآن تجري تحويلاً إلى قناة المطوّر</translation>
 <translation id="6104068876731806426">‏حسابات Google</translation>
 <translation id="6104311680260824317">‏يتعذَّر ضم الجهاز إلى النطاق لأن الخادم لا يدعم أنواع تشفير Kerberos المحدَّدة. يُرجى الانتقال إلى "مزيد من الخيارات" للاطِّلاع على إعدادات التشفير.</translation>
-<translation id="6105877918873366097">آخر دخول</translation>
 <translation id="6107012941649240045">الجهة صاحبة الإصدار</translation>
 <translation id="6112294629795967147">اللمس لتغيير الحجم</translation>
 <translation id="6112931163620622315">تحقَّق من هاتفك</translation>
@@ -4197,7 +4196,6 @@
 <translation id="7289225569524511578">فتح تطبيق الخلفية</translation>
 <translation id="7290242001003353852">تحاول خدمة تسجيل الدخول هذه، المُستضافة من قبل <ph name="SAML_DOMAIN" />، الدخول إلى الكاميرا.</translation>
 <translation id="7290594223351252791">تأكيد التسجيل</translation>
-<translation id="7292696521213967957">‏معلومات لتصحيح أخطاء "مساعد Google"</translation>
 <translation id="7295662345261934369">المشاركة مع الآخرين</translation>
 <translation id="729583233778673644">‏السماح بتشفير AES وRC4: يؤدي استخدام هذا الخيار إلى زيادة المخاطر، لأن رموز RC4 غير آمنة.</translation>
 <translation id="7296774163727375165">بنود <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 65ec9cb..59f89f11 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -3423,7 +3423,6 @@
 <translation id="6103681770816982672">Предупреждение: превключвате към канала за програмисти</translation>
 <translation id="6104068876731806426">Профили в Google</translation>
 <translation id="6104311680260824317">Устройството не може да се присъедини към домейна. Сървърът не поддържа посочените типове шифроване в Kerberos. Вижте „Още опции“ за настройки на шифроването.</translation>
-<translation id="6105877918873366097">Последен достъп</translation>
 <translation id="6107012941649240045">Издаден на</translation>
 <translation id="6112294629795967147">Докоснете за преоразмеряване</translation>
 <translation id="6112931163620622315">Проверете телефона си</translation>
@@ -4201,7 +4200,6 @@
 <translation id="7289225569524511578">Отваряне на приложението за тапети</translation>
 <translation id="7290242001003353852">Тази услуга за вход, хоствана от <ph name="SAML_DOMAIN" />, осъществява достъп до камерата ви.</translation>
 <translation id="7290594223351252791">Потвърждаване на регистрацията</translation>
-<translation id="7292696521213967957">Информация за отстраняване на грешки в Асистент</translation>
 <translation id="7295662345261934369">Споделяне с други хора</translation>
 <translation id="729583233778673644">Разрешаване на AES и RC4 шифроване. Използването на тази опция увеличава риска, тъй като шифрите RC4 са несигурни.</translation>
 <translation id="7296774163727375165">Условия на <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 2a111bca..1ce106b 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -3419,7 +3419,6 @@
 <translation id="6103681770816982672">সতর্কতা: আপনি পরীক্ষাকারীদের চ্যানেলে স্যুইচ করছেন৷</translation>
 <translation id="6104068876731806426">Google অ্যাকাউন্ট</translation>
 <translation id="6104311680260824317">ডোমেনে ডিভাইসটি যোগ করা যাবে না। সার্ভারটি নির্দিষ্ট Kerberos এনক্রিপশনের ধরন সমর্থন করে না। এনক্রিপশন সেটিংসের জন্য "আরও বিকল্প" দেখুন।</translation>
-<translation id="6105877918873366097">শেষবার অ্যাক্সেস করা হয়েছে</translation>
 <translation id="6107012941649240045">একে ইস্যু করা হয়েছিল</translation>
 <translation id="6112294629795967147">সাইজ পরিবর্তন করতে টাচ করুন</translation>
 <translation id="6112931163620622315">আপনার ফোনে দেখুন</translation>
@@ -4198,7 +4197,6 @@
 <translation id="7289225569524511578">ওয়ালপেপার অ্যাপ্লিকেশানটি খুলুন</translation>
 <translation id="7290242001003353852"><ph name="SAML_DOMAIN" /> দ্বারা হোস্ট করা এই সাইন ইন পরিষেবাটি আপনার ক্যামেরা অ্যাক্সেস করছে।</translation>
 <translation id="7290594223351252791">নিবন্ধিকরণ নিশ্চিত করুন</translation>
-<translation id="7292696521213967957">অ্যাসিস্ট্যান্ট ডিবাগ করা সংক্রান্ত তথ্য</translation>
 <translation id="7295662345261934369">অন্যদের সাথে শেয়ার করুন</translation>
 <translation id="729583233778673644">AES এবং RC4 এনক্রিপশন অনুমতি দিন। এই বিকল্পটির ব্যবহার ঝুঁকি বাড়ায় কারণ RC4 সাইফারটি নিরাপদ নয়।</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> এর শর্তাবলী</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 4fe80b51..fa0a495 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -1006,6 +1006,7 @@
 <translation id="2484959914739448251">Per esborrar les dades de navegació de tots els dispositius sincronitzats i del Compte de Google, <ph name="BEGIN_LINK" />introdueix la frase de contrasenya<ph name="END_LINK" />.</translation>
 <translation id="2485422356828889247">Desinstal·la</translation>
 <translation id="2487067538648443797">Afegeix una adreça d'interès nova</translation>
+<translation id="2489829450872380594">La propera vegada, <ph name="DEVICE_TYPE" /> es desbloquejarà amb un altre telèfon. Pots desactivar Smart Lock des de Configuració.</translation>
 <translation id="2489918096470125693">Afegeix una &amp;carpeta...</translation>
 <translation id="249113932447298600">El dispositiu <ph name="DEVICE_LABEL" /> no és compatible en aquests moments.</translation>
 <translation id="249303669840926644">El registre no s'ha pogut completar</translation>
@@ -1759,6 +1760,7 @@
 <translation id="3627588569887975815">Obre l'enllaç en una finestra d'incò&amp;gnit</translation>
 <translation id="3627671146180677314">Data i hora de renovació de certificat de Netscape</translation>
 <translation id="3627879631695760395">Instal·la <ph name="APP" />...</translation>
+<translation id="3629631988386925734">Introdueix la contrasenya per activar Smart Lock. La propera vegada, <ph name="DEVICE_TYPE" /> es desbloquejarà amb el telèfon. Pots desactivar Smart Lock des de Configuració.</translation>
 <translation id="3630132874740063857">El teu telèfon</translation>
 <translation id="3630995161997703415">Afegeix aquest lloc web al teu prestatge per utilitzar-lo en qualsevol moment</translation>
 <translation id="3636096452488277381">Hola, <ph name="USER_GIVEN_NAME" />.</translation>
@@ -2103,6 +2105,7 @@
 <translation id="4109135793348361820">Mou la finestra a <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110490973560452005">S'ha completat la baixada: <ph name="FILE_NAME" />. Prem Maj+F6 per anar a l'àrea de la barra de baixades.</translation>
 <translation id="4110895898888439383">Navega per Internet en mode d'alt contrast</translation>
+<translation id="4112221174576828331">Si una imatge no té una descripció útil, Chrome te n'oferirà una. Google escaneja les imatges.</translation>
 <translation id="4115002065223188701">La xarxa és fora de l'abast</translation>
 <translation id="4115080753528843955">Alguns serveis de contingut fan servir identificadors únics per autoritzar l'accés a contingut protegit</translation>
 <translation id="4118579674665737931">Reinicia el dispositiu i torna-ho a provar.</translation>
@@ -2655,6 +2658,7 @@
 <translation id="4998873842614926205">Confirma els canvis</translation>
 <translation id="5000922062037820727">Bloquejat (recomanat)</translation>
 <translation id="5004584466530475658"><ph name="FILE_COUNT" /> fotos noves</translation>
+<translation id="5008936837313706385">Nom de l'activitat</translation>
 <translation id="5010043101506446253">Autoritats certificadores</translation>
 <translation id="5010406651457630570">Ordinadors</translation>
 <translation id="5015344424288992913">Resolent el servidor intermediari...</translation>
@@ -2987,6 +2991,7 @@
 <translation id="5507756662695126555">No repudiació</translation>
 <translation id="5509693895992845810">Desa &amp;com a...</translation>
 <translation id="5509914365760201064">Emissor: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">Obtén descripcions d'imatges de Google</translation>
 <translation id="5511379779384092781">Molt petit</translation>
 <translation id="5511823366942919280">Confirmes que vols configurar aquest dispositiu com a "Tauró"?</translation>
 <translation id="5512653252560939721">El certificat d'usuari ha de ser al maquinari.</translation>
@@ -3414,7 +3419,6 @@
 <translation id="6103681770816982672">Advertiment: esteu canviant al canal per a desenvolupadors</translation>
 <translation id="6104068876731806426">Comptes de Google</translation>
 <translation id="6104311680260824317">No es pot connectar el dispositiu al domini. El servidor no admet els tipus d'encriptació de Kerberos especificats. Pots accedir a la configuració d'encriptació des de Més opcions.</translation>
-<translation id="6105877918873366097">Darrer accés</translation>
 <translation id="6107012941649240045">Emès per a</translation>
 <translation id="6112294629795967147">Toca la finestra per canviar-ne la mida</translation>
 <translation id="6112931163620622315">Comprova el telèfon</translation>
@@ -3570,6 +3574,7 @@
 <translation id="6341850831632289108">Detecteu la vostra ubicació física</translation>
 <translation id="6344170822609224263">Accedir a la llista de connexions de xarxa</translation>
 <translation id="6346310558342052870">Accés restringit</translation>
+<translation id="6349101878882523185">Instal·la <ph name="APP_NAME" /></translation>
 <translation id="6349170655202535379">La sincronització no funciona. Tanca la sessió i torna-la a iniciar.</translation>
 <translation id="6351063337294363751">Pots esborrar les dades de navegació des d'aquest menú</translation>
 <translation id="6352773953037195952">El més alt</translation>
@@ -3987,6 +3992,7 @@
 <translation id="6990081529015358884">Us heu quedat sense espai</translation>
 <translation id="6990778048354947307">Tema fosc</translation>
 <translation id="6991665348624301627">Selecció d'una destinació</translation>
+<translation id="6997642619627518301">Registre d'activitat a <ph name="NAME_PH" /></translation>
 <translation id="6997707937646349884">Als teus dispositius:</translation>
 <translation id="6998711733709403587">S'han seleccionat <ph name="SELCTED_FOLDERS_COUNT" /> carpetes</translation>
 <translation id="6998793565256476099">Inscriu el dispositiu per a la videoconferència</translation>
@@ -4190,7 +4196,6 @@
 <translation id="7289225569524511578">Obre l'aplicació de fons de pantalla</translation>
 <translation id="7290242001003353852">Aquest servei d'inici de sessió, que s'allotja a <ph name="SAML_DOMAIN" />, està accedint a la càmera.</translation>
 <translation id="7290594223351252791">Confirmació del registre</translation>
-<translation id="7292696521213967957">Informació per depurar l'Assistent</translation>
 <translation id="7295662345261934369">Comparteix amb altres persones</translation>
 <translation id="729583233778673644">Permet l'encriptació AES i RC4. L'ús d'aquesta opció augmenta el risc, ja que els xifratges RC4 no són segurs.</translation>
 <translation id="7296774163727375165">Condicions de <ph name="DOMAIN" /></translation>
@@ -4289,6 +4294,7 @@
 <translation id="7456142309650173560">dev</translation>
 <translation id="7456847797759667638">Obre la ubicació...</translation>
 <translation id="7461924472993315131">Fixa</translation>
+<translation id="746216226901520237">La propera vegada, <ph name="DEVICE_TYPE" /> es desbloquejarà amb el telèfon. Pots desactivar Smart Lock a Configuració.</translation>
 <translation id="7463006580194749499">Afegeix una persona</translation>
 <translation id="7465778193084373987">URL de revocació de certificats de Netscape</translation>
 <translation id="7469894403370665791">Connecta automàticament a aquesta xarxa</translation>
@@ -4365,6 +4371,7 @@
 <translation id="7580671184200851182">Reprodueix el mateix àudio per tots els altaveus (àudio mono)</translation>
 <translation id="7581462281756524039">Eina per netejar</translation>
 <translation id="7582582252461552277">Estableix aquesta xarxa com a preferida</translation>
+<translation id="7583948862126372804">Recompte</translation>
 <translation id="7586498138629385861">Chrome continuarà funcionant mentre hi hagi aplicacions de Chrome obertes.</translation>
 <translation id="7589461650300748890">Aneu amb compte</translation>
 <translation id="7589661784326793847">Espereu un moment.</translation>
@@ -5475,6 +5482,7 @@
 <translation id="93393615658292258">Només la contrasenya</translation>
 <translation id="934503638756687833">Si cal, també se suprimiran elements no inclosos en aquesta llista. Obtén més informació sobre la &lt;a href="<ph name="URL" />"&gt;protecció contra programari no desitjat&lt;/a&gt; a l'informe de privadesa de Chrome.</translation>
 <translation id="935490618240037774">Les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració se sincronitzaran amb el teu compte de Google, perquè els puguis utilitzar en tots els dispositius</translation>
+<translation id="935854577147268200">El telèfon Smart Lock ha canviat. Introdueix la contrasenya per actualitzar Smart Lock. La propera vegada, <ph name="DEVICE_TYPE" /> es desbloquejarà amb el telèfon. Pots desactivar Smart Lock a Configuració.</translation>
 <translation id="936801553271523408">Dades de diagnòstic del sistema</translation>
 <translation id="93766956588638423">Repara l'extensió</translation>
 <translation id="938339467127511841">Emmagatzematge a Linux (beta)</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index b393395..4e0afd2 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -1006,6 +1006,7 @@
 <translation id="2484959914739448251">Chcete-li vymazat údaje o prohlížení ze všech synchronizovaných zařízení i z účtu Google, <ph name="BEGIN_LINK" />zadejte heslovou frázi<ph name="END_LINK" />.</translation>
 <translation id="2485422356828889247">Odinstalovat</translation>
 <translation id="2487067538648443797">Přidat novou záložku</translation>
+<translation id="2489829450872380594">Příště toto zařízení <ph name="DEVICE_TYPE" /> odemkne nový telefon. Funkci Smart Lock můžete vypnout v Nastavení.</translation>
 <translation id="2489918096470125693">Přidat &amp;složku...</translation>
 <translation id="249113932447298600">Je nám líto, zařízení <ph name="DEVICE_LABEL" /> není v současné době podporováno.</translation>
 <translation id="249303669840926644">Registraci se nepodařilo dokončit</translation>
@@ -1761,6 +1762,7 @@
 <translation id="3627588569887975815">Otevřít odkaz v &amp;anonymním okně</translation>
 <translation id="3627671146180677314">Čas obnovení certifikátu Netscape</translation>
 <translation id="3627879631695760395">Nainstalovat aplikaci <ph name="APP" />...</translation>
+<translation id="3629631988386925734">Chcete-li zapnout funkci Smart Lock, zadejte heslo. Příště váš telefon zařízení <ph name="DEVICE_TYPE" /> odemkne. Funkci Smart Lock můžete vypnout v Nastavení.</translation>
 <translation id="3630132874740063857">Váš telefon</translation>
 <translation id="3630995161997703415">Pokud si tento web přidáte na poličku, budete jej moci kdykoliv použít</translation>
 <translation id="3636096452488277381">Ahoj uživateli <ph name="USER_GIVEN_NAME" />.</translation>
@@ -2105,6 +2107,7 @@
 <translation id="4109135793348361820">Přesunout okno k uživateli <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110490973560452005">Stažení bylo dokončeno: <ph name="FILE_NAME" />. Stisknutím kombinace kláves Shift+F6 přejdete na lištu se staženými soubory.</translation>
 <translation id="4110895898888439383">Prohlížejte internet v režimu vysokého kontrastu</translation>
+<translation id="4112221174576828331">Pokud obrázek nemá užitečný popis, Chrome vám jej poskytne. Google obrázky skenuje.</translation>
 <translation id="4115002065223188701">Síť je mimo dosah</translation>
 <translation id="4115080753528843955">Některé obsahové služby k ověření přístupu k chráněnému obsahu používají jedinečné identifikátory</translation>
 <translation id="4118579674665737931">Restartujte zařízení a zkuste to znovu.</translation>
@@ -2657,6 +2660,7 @@
 <translation id="4998873842614926205">Potvrdit změny</translation>
 <translation id="5000922062037820727">Blokováno (doporučeno)</translation>
 <translation id="5004584466530475658">nové fotky (<ph name="FILE_COUNT" />)</translation>
+<translation id="5008936837313706385">Název aktivity</translation>
 <translation id="5010043101506446253">Certifikační autorita</translation>
 <translation id="5010406651457630570">Počítače</translation>
 <translation id="5015344424288992913">Rozpoznávání proxy serveru...</translation>
@@ -2987,6 +2991,7 @@
 <translation id="5507756662695126555">Neodvolatelnost</translation>
 <translation id="5509693895992845810">Uložit &amp;jako...</translation>
 <translation id="5509914365760201064">Vydal: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">Získat popisy obrázků z Googlu</translation>
 <translation id="5511379779384092781">Velmi malý</translation>
 <translation id="5511823366942919280">Opravdu toto zařízení chcete nastavit jako zařízení Shark?</translation>
 <translation id="5512653252560939721">Certifikát uživatele musí být hardwarový.</translation>
@@ -3413,7 +3418,6 @@
 <translation id="6103681770816982672">Upozornění: přepínáte na kanál pro vývojáře</translation>
 <translation id="6104068876731806426">Účty Google</translation>
 <translation id="6104311680260824317">Zařízení do domény nelze přidat. Server nepodporuje zadané typy šifrování Kerberos. Zkontrolujte nastavení šifrování v části Další možnosti.</translation>
-<translation id="6105877918873366097">Poslední přístup</translation>
 <translation id="6107012941649240045">Vydán pro</translation>
 <translation id="6112294629795967147">Klepnutím změníte velikost</translation>
 <translation id="6112931163620622315">Zkontrolujte telefon</translation>
@@ -3569,6 +3573,7 @@
 <translation id="6341850831632289108">Určit vaše fyzické umístění</translation>
 <translation id="6344170822609224263">Zobrazení seznamu síťových připojení</translation>
 <translation id="6346310558342052870">Přístup je omezen</translation>
+<translation id="6349101878882523185">Nainstalovat aplikaci <ph name="APP_NAME" /></translation>
 <translation id="6349170655202535379">Synchronizace nefunguje. Zkuste se odhlásit a znovu přihlásit.</translation>
 <translation id="6351063337294363751">Z této nabídky lze vymazat údaje o prohlížení</translation>
 <translation id="6352773953037195952">Nejvyšší</translation>
@@ -3986,6 +3991,7 @@
 <translation id="6990081529015358884">Došlo vám místo</translation>
 <translation id="6990778048354947307">Tmavý motiv</translation>
 <translation id="6991665348624301627">Vybrat cíl</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> – protokol aktivit</translation>
 <translation id="6997707937646349884">Ve vašich zařízeních:</translation>
 <translation id="6998711733709403587">Vybrané soubory: <ph name="SELCTED_FOLDERS_COUNT" /></translation>
 <translation id="6998793565256476099">Zaregistrovat zařízení pro videokonference</translation>
@@ -4189,7 +4195,6 @@
 <translation id="7289225569524511578">Spustit aplikaci tapety</translation>
 <translation id="7290242001003353852">Přihlašovací služba hostovaná doménou <ph name="SAML_DOMAIN" /> požádala o přístup ke kameře.</translation>
 <translation id="7290594223351252791">Potvrzení registrace</translation>
-<translation id="7292696521213967957">Informace k ladění Asistenta</translation>
 <translation id="7295662345261934369">Sdílet s dalšími uživateli</translation>
 <translation id="729583233778673644">Povolit šifrování AES a RC4. Použití této možnosti zvyšuje riziko, protože šifry RC4 nejsou bezpečné.</translation>
 <translation id="7296774163727375165">Smluvní podmínky domény <ph name="DOMAIN" /></translation>
@@ -4288,6 +4293,7 @@
 <translation id="7456142309650173560">pro vývojáře</translation>
 <translation id="7456847797759667638">Otevřít umístění...</translation>
 <translation id="7461924472993315131">Připnout</translation>
+<translation id="746216226901520237">Příště váš telefon zařízení <ph name="DEVICE_TYPE" /> odemkne. Funkci Smart Lock můžete vypnout v Nastavení.</translation>
 <translation id="7463006580194749499">Přidat osobu</translation>
 <translation id="7465778193084373987">Adresa URL pro odvolání certifikátu Netscape</translation>
 <translation id="7469894403370665791">Automaticky připojit k této síti</translation>
@@ -4364,6 +4370,7 @@
 <translation id="7580671184200851182">Přehrávat ve všech reproduktorech stejný zvuk (mono)</translation>
 <translation id="7581462281756524039">Nástroj na vyčištění</translation>
 <translation id="7582582252461552277">Preferovat tuto síť</translation>
+<translation id="7583948862126372804">Počet</translation>
 <translation id="7586498138629385861">Pokud jsou otevřeny aplikace Chrome, zůstane Chrome spuštěný.</translation>
 <translation id="7589461650300748890">Pozor, buďte opatrní!</translation>
 <translation id="7589661784326793847">Chvilku strpení</translation>
@@ -5474,6 +5481,7 @@
 <translation id="93393615658292258">Pouze heslo</translation>
 <translation id="934503638756687833">V případě potřeby budou odstraněny i položky, které zde nejsou uvedeny. Další informace o &lt;a href="<ph name="URL" />"&gt;ochraně před nežádoucím softwarem&lt;/a&gt; najdete v informační brožuře o ochraně soukromí v Chromu.</translation>
 <translation id="935490618240037774">Vaše záložky, historie, hesla a další nastavení budou synchronizována do účtu Google, abyste je mohli používat ve všech svých zařízeních.</translation>
+<translation id="935854577147268200">Telefon pro Smart Lock se změnil. Chcete-li funkci Smart Lock aktualizovat, zadejte heslo. Příště váš telefon zařízení <ph name="DEVICE_TYPE" /> odemkne. Funkci Smart Lock můžete vypnout v Nastavení.</translation>
 <translation id="936801553271523408">Diagnostická data o systému</translation>
 <translation id="93766956588638423">Opravit rozšíření</translation>
 <translation id="938339467127511841">Úložiště systému Linux (beta)</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 03ed243c..b77f714 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -3421,7 +3421,6 @@
 <translation id="6103681770816982672">Advarsel! Du er ved at skifte til udviklerkanal</translation>
 <translation id="6104068876731806426">Google Konti</translation>
 <translation id="6104311680260824317">Enheden kunne ikke knyttes til domænet. Serveren understøtter ikke de angivne Kerberos-krypteringstyper. Tjek krypteringsindstillingerne under "Flere valgmuligheder".</translation>
-<translation id="6105877918873366097">Sidst åbnet</translation>
 <translation id="6107012941649240045">Udstedt til</translation>
 <translation id="6112294629795967147">Tryk for at vælge en anden størrelse</translation>
 <translation id="6112931163620622315">Tjek din telefon</translation>
@@ -4200,7 +4199,6 @@
 <translation id="7289225569524511578">Åbn baggrundsappen</translation>
 <translation id="7290242001003353852">Denne logintjeneste, som hostes af <ph name="SAML_DOMAIN" />, har adgang til dit kamera.</translation>
 <translation id="7290594223351252791">Bekræft registrering</translation>
-<translation id="7292696521213967957">Oplysninger til fejlretning i Assistent</translation>
 <translation id="7295662345261934369">Del med andre</translation>
 <translation id="729583233778673644">Tillad AES- og RC4-kryptering. Du løber en større risiko, hvis du vælger denne mulighed, da RC4-krypteringsalgoritmerne er usikre.</translation>
 <translation id="7296774163727375165">Vilkår for <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 4e673056..27aae0e 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1761,7 +1761,7 @@
 <translation id="3627671146180677314">Verlängerungszeit für Netscape-Zertifikate</translation>
 <translation id="3627879631695760395"><ph name="APP" /> installieren...</translation>
 <translation id="3629631988386925734">Geben Sie Ihr Passwort ein, um Smart Lock zu aktivieren. Beim nächsten Mal wird Ihr <ph name="DEVICE_TYPE" /> durch Ihr Smartphone entsperrt. Sie können Smart Lock in den Einstellungen deaktivieren.</translation>
-<translation id="3630132874740063857">Meine Telefonnummer</translation>
+<translation id="3630132874740063857">Mein Smartphone</translation>
 <translation id="3630995161997703415">Fügen Sie diese Website Ihrer Ablage hinzu, um sie jederzeit zu verwenden</translation>
 <translation id="3636096452488277381">Hallo <ph name="USER_GIVEN_NAME" /></translation>
 <translation id="3636766455281737684"><ph name="PERCENTAGE" /> % – Restzeit: <ph name="TIME" /></translation>
@@ -3418,7 +3418,6 @@
 <translation id="6103681770816982672">Achtung: Sie wechseln zum Entwicklerkanal.</translation>
 <translation id="6104068876731806426">Google Konten</translation>
 <translation id="6104311680260824317">Das Gerät konnte der Domain nicht beitreten. Der Server bietet keine Unterstützung für die angegebenen Kerberos-Verschlüsselungstypen. Unter "Weitere Optionen" finden Sie die Verschlüsselungseinstellungen.</translation>
-<translation id="6105877918873366097">Letzter Zugriff am:</translation>
 <translation id="6107012941649240045">Ausgestellt für</translation>
 <translation id="6112294629795967147">Zum Anpassen der Größe tippen</translation>
 <translation id="6112931163620622315">Smartphone prüfen</translation>
@@ -4196,7 +4195,6 @@
 <translation id="7289225569524511578">Hintergrund-App öffnen</translation>
 <translation id="7290242001003353852">Dieser Anmeldedienst wird von <ph name="SAML_DOMAIN" /> gehostet und greift auf Ihre Kamera zu.</translation>
 <translation id="7290594223351252791">Registrierung bestätigen</translation>
-<translation id="7292696521213967957">Informationen für die Fehlerbehebung bei Assistant</translation>
 <translation id="7295662345261934369">Mit anderen teilen</translation>
 <translation id="729583233778673644">AES- und RC4-Verschlüsselung erlauben. Mit dieser Option ist ein höheres Risiko verbunden, da RC4-Verschlüsselungen nicht sicher sind.</translation>
 <translation id="7296774163727375165">Nutzungsbedingungen für <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index e7665c7..fdfbc8e9 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -3424,7 +3424,6 @@
 <translation id="6103681770816982672">Προσοχή: πρόκειται να μεταβείτε στο κανάλι προγραμματιστή</translation>
 <translation id="6104068876731806426">Λογαριασμοί Google</translation>
 <translation id="6104311680260824317">Δεν είναι δυνατή η σύνδεση της συσκευής στον τομέα. Ο διακομιστής δεν υποστηρίζει τους προσδιορισμένους τύπους κρυπτογράφησης Kerberos. Ελέγξτε την ενότητα "Περισσότερες επιλογές" για τις ρυθμίσεις κρυπτογράφησης.</translation>
-<translation id="6105877918873366097">Τελευταία πρόσβαση</translation>
 <translation id="6107012941649240045">Εκδόθηκε σε</translation>
 <translation id="6112294629795967147">Αγγίξτε για αλλαγή μεγέθους</translation>
 <translation id="6112931163620622315">Ελέγξτε το τηλέφωνό σας</translation>
@@ -4202,7 +4201,6 @@
 <translation id="7289225569524511578">Ανοίξτε την εφαρμογή ταπετσαρίας</translation>
 <translation id="7290242001003353852">Η υπηρεσία σύνδεσης που φιλοξενείται από τον τομέα <ph name="SAML_DOMAIN" />, έχει πρόσβαση στην κάμερά σας.</translation>
 <translation id="7290594223351252791">Επιβεβαίωση εγγραφής</translation>
-<translation id="7292696521213967957">Πληροφορίες για τον εντοπισμό σφαλμάτων του Βοηθού</translation>
 <translation id="7295662345261934369">Κοινοποίηση σε άλλα άτομα</translation>
 <translation id="729583233778673644">Να επιτρέπεται η κρυπτογράφηση AES και RC4. Η χρήση αυτής της επιλογής αυξάνει τον κίνδυνο, επειδή η κρυπτογράφηση RC4 δεν είναι ασφαλής.</translation>
 <translation id="7296774163727375165">Όροι <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index c2b2704f..ce78cbe 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -3422,7 +3422,6 @@
 <translation id="6103681770816982672">Warning: You are switching to developer channel</translation>
 <translation id="6104068876731806426">Google Accounts</translation>
 <translation id="6104311680260824317">Can't join the device to the domain. The server does not support specified Kerberos encryption types. Check 'More options' for encryption settings.</translation>
-<translation id="6105877918873366097">Last accessed</translation>
 <translation id="6107012941649240045">Issued To</translation>
 <translation id="6112294629795967147">Touch to resize</translation>
 <translation id="6112931163620622315">Check your phone</translation>
@@ -4200,7 +4199,6 @@
 <translation id="7289225569524511578">Open the wallpaper app</translation>
 <translation id="7290242001003353852">This sign-in service, hosted by <ph name="SAML_DOMAIN" />, is accessing your camera.</translation>
 <translation id="7290594223351252791">Confirm registration</translation>
-<translation id="7292696521213967957">Info to debug Assistant</translation>
 <translation id="7295662345261934369">Share with others</translation>
 <translation id="729583233778673644">Allow AES and RC4 encryption. Using this option increases your risk, as the RC4 ciphers are insecure.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> Terms</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index f07485c..f7e67b35 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -3420,7 +3420,6 @@
 <translation id="6103681770816982672">Advertencia: vas a cambiar al canal de programadores</translation>
 <translation id="6104068876731806426">Cuentas de Google</translation>
 <translation id="6104311680260824317">No se puede unir el dispositivo con el dominio. El servidor no es compatible con los tipos de encriptación de Kerberos especificados. Para conocer la configuración de la encriptación, consulta "Más opciones".</translation>
-<translation id="6105877918873366097">Último acceso</translation>
 <translation id="6107012941649240045">Emitido a</translation>
 <translation id="6112294629795967147">Tocar para cambiar el tamaño</translation>
 <translation id="6112931163620622315">Revisa el teléfono</translation>
@@ -4198,7 +4197,6 @@
 <translation id="7289225569524511578">Abrir la app de fondos de pantalla</translation>
 <translation id="7290242001003353852">Este servicio de acceso, alojado por <ph name="SAML_DOMAIN" />, está accediendo a tu cámara.</translation>
 <translation id="7290594223351252791">Confirmar registro</translation>
-<translation id="7292696521213967957">Información para depurar el Asistente</translation>
 <translation id="7295662345261934369">Compartir con otros</translation>
 <translation id="729583233778673644">Permite la encriptación AES y RC4. Esta opción es riesgosa, ya que los cifrados RC4 son inseguros.</translation>
 <translation id="7296774163727375165">Condiciones de <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 21d0143..7c0515e 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1007,6 +1007,7 @@
 <translation id="2484959914739448251">Para borrar los datos de navegación de todos los dispositivos sincronizados y de tu cuenta de Google, <ph name="BEGIN_LINK" />introduce tu frase de contraseña<ph name="END_LINK" />.</translation>
 <translation id="2485422356828889247">Desinstalar</translation>
 <translation id="2487067538648443797">Añadir nuevo marcador</translation>
+<translation id="2489829450872380594">La próxima vez, un teléfono nuevo desbloqueará este <ph name="DEVICE_TYPE" />. Puedes desactivar Smart Lock en la configuración.</translation>
 <translation id="2489918096470125693">Añadir &amp;carpeta...</translation>
 <translation id="249113932447298600">Lo sentimos, pero el dispositivo <ph name="DEVICE_LABEL" /> no se admite en este momento.</translation>
 <translation id="249303669840926644">No se ha podido completar el registro</translation>
@@ -1762,6 +1763,7 @@
 <translation id="3627588569887975815">Abrir el enlace en una ventana de incó&amp;gnito</translation>
 <translation id="3627671146180677314">Tiempo de renovación de certificado de Netscape</translation>
 <translation id="3627879631695760395">Instalar <ph name="APP" />...</translation>
+<translation id="3629631988386925734">Introduce tu contraseña para habilitar Smart Lock. La próxima vez, el teléfono desbloqueará tu <ph name="DEVICE_TYPE" />. Puedes desactivar Smart Lock en la configuración.</translation>
 <translation id="3630132874740063857">Tu teléfono</translation>
 <translation id="3630995161997703415">Añade este sitio web a tu estantería para usarlo en cualquier momento</translation>
 <translation id="3636096452488277381">Hola, <ph name="USER_GIVEN_NAME" />.</translation>
@@ -2106,6 +2108,7 @@
 <translation id="4109135793348361820">Mover ventana a <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110490973560452005">Descarga completa: <ph name="FILE_NAME" />. Pulsa Mayús+F6 para desplazarte al área de la barra de descargas.</translation>
 <translation id="4110895898888439383">Navega por la Web con el modo de contraste alto</translation>
+<translation id="4112221174576828331">Si una imagen no tiene una descripción útil, Chrome te proporcionará una. Google se encarga de analizar las imágenes.</translation>
 <translation id="4115002065223188701">La red está fuera del alcance</translation>
 <translation id="4115080753528843955">Algunos servicios de contenido utilizan identificadores únicos para autorizar el acceso a contenido protegido</translation>
 <translation id="4118579674665737931">Reinicia el dispositivo e inténtalo de nuevo.</translation>
@@ -2658,6 +2661,7 @@
 <translation id="4998873842614926205">Confirmar cambios</translation>
 <translation id="5000922062037820727">Bloqueado (recomendado)</translation>
 <translation id="5004584466530475658"><ph name="FILE_COUNT" /> fotos nuevas</translation>
+<translation id="5008936837313706385">Nombre de la actividad</translation>
 <translation id="5010043101506446253">Entidad emisora de certificados</translation>
 <translation id="5010406651457630570">Ordenadores</translation>
 <translation id="5015344424288992913">Resolviendo proxy...</translation>
@@ -2989,6 +2993,7 @@
 <translation id="5507756662695126555">Sin rechazo</translation>
 <translation id="5509693895992845810">Guardar &amp;como...</translation>
 <translation id="5509914365760201064">Emisor: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">Obtener descripciones de imagen de Google</translation>
 <translation id="5511379779384092781">Muy pequeño</translation>
 <translation id="5511823366942919280">¿Seguro que quieres configurar este dispositivo como un "Shark"?</translation>
 <translation id="5512653252560939721">El certificado de usuario debe estar respaldado por hardware.</translation>
@@ -3415,7 +3420,6 @@
 <translation id="6103681770816982672">Advertencia: Vas a cambiar al canal para desarrolladores</translation>
 <translation id="6104068876731806426">Cuentas de Google</translation>
 <translation id="6104311680260824317">No se puede vincular el dispositivo con el dominio. El servidor no admite los tipos de cifrado Kerberos específicos. Marca Más opciones para configurar el cifrado.</translation>
-<translation id="6105877918873366097">Último acceso</translation>
 <translation id="6107012941649240045">Enviado a</translation>
 <translation id="6112294629795967147">Tocar para cambiar el tamaño</translation>
 <translation id="6112931163620622315">Comprobar el teléfono</translation>
@@ -3571,6 +3575,7 @@
 <translation id="6341850831632289108">Detectar tu ubicación física</translation>
 <translation id="6344170822609224263">Accede a la lista de conexiones de red</translation>
 <translation id="6346310558342052870">Acceso restringido</translation>
+<translation id="6349101878882523185">Instalar <ph name="APP_NAME" /></translation>
 <translation id="6349170655202535379">La sincronización no funciona. Prueba a cerrar sesión y volver a iniciarla.</translation>
 <translation id="6351063337294363751">En este menú puedes borrar los datos de navegación</translation>
 <translation id="6352773953037195952">El más alto</translation>
@@ -3988,6 +3993,7 @@
 <translation id="6990081529015358884">Te has quedado sin espacio.</translation>
 <translation id="6990778048354947307">Tema oscuro</translation>
 <translation id="6991665348624301627">Seleccionar un destino</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" />: Registro de actividad</translation>
 <translation id="6997707937646349884">En tus dispositivos:</translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> carpetas seleccionadas</translation>
 <translation id="6998793565256476099">Registrar dispositivo para hacer videoconferencias</translation>
@@ -4191,7 +4197,6 @@
 <translation id="7289225569524511578">Abrir aplicación de fondos de pantalla</translation>
 <translation id="7290242001003353852">Este servicio de inicio de sesión (que se aloja en <ph name="SAML_DOMAIN" />) está accediendo a la cámara.</translation>
 <translation id="7290594223351252791">Confirmar registro</translation>
-<translation id="7292696521213967957">Información para la depuración del Asistente</translation>
 <translation id="7295662345261934369">Compartir con otros usuarios</translation>
 <translation id="729583233778673644">Permite los cifrados AES y RC4. Esta opción aumenta el riesgo, ya que los algoritmos de cifrado de RC4 no son seguros.</translation>
 <translation id="7296774163727375165">Condiciones de <ph name="DOMAIN" /></translation>
@@ -4290,6 +4295,7 @@
 <translation id="7456142309650173560">dev</translation>
 <translation id="7456847797759667638">Abrir ubicación...</translation>
 <translation id="7461924472993315131">Fijar</translation>
+<translation id="746216226901520237">La próxima vez, el teléfono desbloqueará tu <ph name="DEVICE_TYPE" />. Puedes desactivar Smart Lock en la configuración.</translation>
 <translation id="7463006580194749499">Añadir perfil</translation>
 <translation id="7465778193084373987">URL de revocación de certificado de Netscape</translation>
 <translation id="7469894403370665791">Conectarse automáticamente a esta red</translation>
@@ -4368,6 +4374,7 @@
 <translation id="7580671184200851182">Reproducir el mismo audio en todos los altavoces (audio mono)</translation>
 <translation id="7581462281756524039">Una herramienta de limpieza</translation>
 <translation id="7582582252461552277">Establecer esta red como preferida</translation>
+<translation id="7583948862126372804">Recuento</translation>
 <translation id="7586498138629385861">Chrome seguirá ejecutándose mientras estén abiertas aplicaciones de Chrome.</translation>
 <translation id="7589461650300748890">¡Atención! Ten cuidado.</translation>
 <translation id="7589661784326793847">Espera un segundo</translation>
@@ -5479,6 +5486,7 @@
 <translation id="93393615658292258">Solo contraseña</translation>
 <translation id="934503638756687833">Si es necesario, también se eliminarán elementos que no se incluyan aquí. Consulta más información sobre la &lt;a href="<ph name="URL" />"&gt;protección contra software no deseado&lt;/a&gt; en el informe de privacidad de Chrome.</translation>
 <translation id="935490618240037774">Tus marcadores, historial, contraseñas y otros ajustes se sincronizarán con tu cuenta de Google para que puedas utilizarlos en todos tus dispositivos.</translation>
+<translation id="935854577147268200">El teléfono de Smart Lock ha cambiado. Introduce tu contraseña para actualizar Smart Lock. La próxima vez, el teléfono desbloqueará tu <ph name="DEVICE_TYPE" />. Puedes desactivar Smart Lock en la configuración.</translation>
 <translation id="936801553271523408">Datos de diagnóstico del sistema</translation>
 <translation id="93766956588638423">Reparar extensión</translation>
 <translation id="938339467127511841">Almacenamiento de Linux (beta)</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index b0c20e0..55b9b5a 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -3423,7 +3423,6 @@
 <translation id="6103681770816982672">Hoiatus: lülitute arendajakanalile</translation>
 <translation id="6104068876731806426">Google'i kontod</translation>
 <translation id="6104311680260824317">Seadet ei saa domeeniga ühendada. Server ei toeta määratud Kerberose krüpteerimistüüpe. Krüpteerimisseaded leiate jaotisest „Rohkem valikuid”.</translation>
-<translation id="6105877918873366097">Viimati kasutatud</translation>
 <translation id="6107012941649240045">Väljastatud subjektile:</translation>
 <translation id="6112294629795967147">Puudutage suuruse muutmiseks</translation>
 <translation id="6112931163620622315">Kontrollige oma telefoni</translation>
@@ -4201,7 +4200,6 @@
 <translation id="7289225569524511578">Ava taustapildi rakendus</translation>
 <translation id="7290242001003353852">See domeeni <ph name="SAML_DOMAIN" /> hostitud sisselogimisteenus pääseb teie kaamerale juurde.</translation>
 <translation id="7290594223351252791">Registreerimise kinnitamine</translation>
-<translation id="7292696521213967957">Teave assistendi silumiseks</translation>
 <translation id="7295662345261934369">Jaga teistega</translation>
 <translation id="729583233778673644">Lubatakse AES- ja RC4-krüpteerimine. Selle valiku kasutamine suurendab riski, kuna RC4-šifrid on ebaturvalised.</translation>
 <translation id="7296774163727375165">Domeeni <ph name="DOMAIN" /> tingimused</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index cc93b44..ad8a133 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -3419,7 +3419,6 @@
 <translation id="6103681770816982672">هشدار: شما به کانال برنامه‌نویس می‌روید</translation>
 <translation id="6104068876731806426">‏حساب‌های Google</translation>
 <translation id="6104311680260824317">‏نمی‌توان دستگاه را به دامنه وصل کرد. این سرور از رمزگذاری‌های Kerberos مشخص‌شده پشتیبانی نمی‌کند. برای تنظیمات رمزگذاری «گزینه‌های بیشتر» را بررسی کنید.</translation>
-<translation id="6105877918873366097">آخرین دسترسی</translation>
 <translation id="6107012941649240045">صادر شده برای</translation>
 <translation id="6112294629795967147">لمس کردن برای تغییر اندازه</translation>
 <translation id="6112931163620622315">تلفن را بررسی کنید</translation>
@@ -4197,7 +4196,6 @@
 <translation id="7289225569524511578">باز کردن برنامه کاغذ دیواری</translation>
 <translation id="7290242001003353852">این سرویس ورود به سیستم با میزبانی <ph name="SAML_DOMAIN" /> در حال دسترسی به دوربین شما است.</translation>
 <translation id="7290594223351252791">تأیید ثبت</translation>
-<translation id="7292696521213967957">اطلاعات برای اشکال‌زدایی «دستیار»</translation>
 <translation id="7295662345261934369">هم‌رسانی با دیگران</translation>
 <translation id="729583233778673644">‏مجاز کردن رمزگذاری AES و RC4. استفاده از این گزینه احتمال خطر را بالا می‌برد، زیرا رمزهای RC4 امن نیست.</translation>
 <translation id="7296774163727375165">شرایط <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index d9556b16..24ab131 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1007,6 +1007,7 @@
 <translation id="2484959914739448251">Jos haluat poistaa selailutiedot kaikilta synkronoiduilta laitteiltasi ja Google-tililtäsi, <ph name="BEGIN_LINK" />kirjoita tunnuslauseesi<ph name="END_LINK" />.</translation>
 <translation id="2485422356828889247">Poista</translation>
 <translation id="2487067538648443797">Lisää kirjanmerkki</translation>
+<translation id="2489829450872380594">Ensi kerralla tämä <ph name="DEVICE_TYPE" /> avataan lukituksesta uudella puhelimella. Voit poistaa Smart Lockin käytöstä asetuksissa.</translation>
 <translation id="2489918096470125693">Lisää kansio...</translation>
 <translation id="249113932447298600">Laitetta <ph name="DEVICE_LABEL" /> ei tueta tällä hetkellä.</translation>
 <translation id="249303669840926644">Rekisteröintiä ei voi suorittaa loppuun</translation>
@@ -1765,6 +1766,7 @@
 <translation id="3627588569887975815">Avaa linkki inco&amp;gnito-ikkunassa</translation>
 <translation id="3627671146180677314">Netscape-varmenteen uusimisaika</translation>
 <translation id="3627879631695760395">Asenna <ph name="APP" />…</translation>
+<translation id="3629631988386925734">Ota Smart Lock käyttöön kirjoittamalla salasanasi. Seuraavalla kerralla <ph name="DEVICE_TYPE" /> voidaan avata puhelimellasi. Voit poistaa Smart Lockin käytöstä asetuksissa.</translation>
 <translation id="3630132874740063857">Oma puhelin</translation>
 <translation id="3630995161997703415">Lisää tämä sivusto hyllyysi, niin voit käyttää sitä milloin tahansa.</translation>
 <translation id="3636096452488277381">Heipä hei, <ph name="USER_GIVEN_NAME" />!</translation>
@@ -2107,6 +2109,7 @@
 <translation id="4109135793348361820">Siirrä ikkuna käyttäjälle <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110490973560452005">Lataus valmis: <ph name="FILE_NAME" />. Paina Shift + F6 siirtyäksesi latauspalkkialueelle.</translation>
 <translation id="4110895898888439383">Selaa internetiä Suuri kontrasti ‑tilassa</translation>
+<translation id="4112221174576828331">Jos kuvalla ei ole hyödyllistä kuvausta, Chrome luo sellaisen. Google skannaa kuvat.</translation>
 <translation id="4115002065223188701">Verkon kantama ei riitä</translation>
 <translation id="4115080753528843955">Jotkin sisältöpalvelut käyttävät yksilöllisiä tunnuksia suojatun sisällön käyttöoikeuden myöntämiseen.</translation>
 <translation id="4118579674665737931">Käynnistä laite uudelleen ja yritä sen jälkeen uudelleen.</translation>
@@ -2659,6 +2662,7 @@
 <translation id="4998873842614926205">Vahvista muutokset</translation>
 <translation id="5000922062037820727">Estetty (suositus)</translation>
 <translation id="5004584466530475658"><ph name="FILE_COUNT" /> uutta kuvaa</translation>
+<translation id="5008936837313706385">Toiminnon nimi</translation>
 <translation id="5010043101506446253">Varmenteen myöntäjä</translation>
 <translation id="5010406651457630570">Tietokoneet</translation>
 <translation id="5015344424288992913">Jäsennetään välityspalvelinta...</translation>
@@ -2990,6 +2994,7 @@
 <translation id="5507756662695126555">Kiistämättömyys</translation>
 <translation id="5509693895992845810">T&amp;allenna nimellä...</translation>
 <translation id="5509914365760201064">Myöntäjä: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">Käytä Googlen kuvaselityksiä</translation>
 <translation id="5511379779384092781">Erittäin pieni</translation>
 <translation id="5511823366942919280">Haluatko varmasti antaa tälle laitteelle tunnuksen Shark?</translation>
 <translation id="5512653252560939721">Käyttäjävarmenteen tulee olla laitteiston tukema.</translation>
@@ -3416,7 +3421,6 @@
 <translation id="6103681770816982672">Varoitus: olet vaihtamassa kehittäjäkanavalle</translation>
 <translation id="6104068876731806426">Google-tilit</translation>
 <translation id="6104311680260824317">Laitetta ei voi liittää verkkotunnukseen. Palvelin ei tue määritettyjä Kerberos-salaustyyppejä. Katso salausasetukset valitsemalla Lisää vaihtoehtoja.</translation>
-<translation id="6105877918873366097">Viimeksi käytetty</translation>
 <translation id="6107012941649240045">Myönnetty kohteelle</translation>
 <translation id="6112294629795967147">Muuta kokoa koskettamalla</translation>
 <translation id="6112931163620622315">Tarkista puhelimesi</translation>
@@ -3574,6 +3578,7 @@
 <translation id="6341850831632289108">Tunnistaa sijaintisi</translation>
 <translation id="6344170822609224263">Pääsy verkkoyhteysluetteloon</translation>
 <translation id="6346310558342052870">Käyttö rajoitettu</translation>
+<translation id="6349101878882523185">Asenna <ph name="APP_NAME" /></translation>
 <translation id="6349170655202535379">Synkronointi ei onnistu. Yritä kirjautua ensin ulos ja sitten takaisin sisään.</translation>
 <translation id="6351063337294363751">Voit tyhjentää selaustiedot tämän valikon kautta.</translation>
 <translation id="6352773953037195952">Korkein</translation>
@@ -3991,6 +3996,7 @@
 <translation id="6990081529015358884">Tila ei riitä</translation>
 <translation id="6990778048354947307">Tumma teema</translation>
 <translation id="6991665348624301627">Valitse kohde</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> – toimintaloki</translation>
 <translation id="6997707937646349884">Laitteillasi:</translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> kansiota valittu</translation>
 <translation id="6998793565256476099">Ota videokonferenssit käyttöön laitteessa</translation>
@@ -4194,7 +4200,6 @@
 <translation id="7289225569524511578">Avaa taustakuvasovellus.</translation>
 <translation id="7290242001003353852">Tämä kirjautumispalvelu, jota isännöi <ph name="SAML_DOMAIN" />, käyttää kameraasi.</translation>
 <translation id="7290594223351252791">Vahvista rekisteröityminen</translation>
-<translation id="7292696521213967957">Assistantin viankorjaustiedot</translation>
 <translation id="7295662345261934369">Jaa muille</translation>
 <translation id="729583233778673644">Salli AES- ja RC4-salaus. Tämä valinta lisää riskejä, koska RC4-salaustekniikat ovat suojaamattomia.</translation>
 <translation id="7296774163727375165">Verkkotunnuksen <ph name="DOMAIN" /> käyttöehdot</translation>
@@ -4293,6 +4298,7 @@
 <translation id="7456142309650173560">kehitys</translation>
 <translation id="7456847797759667638">Avaa sijainti...</translation>
 <translation id="7461924472993315131">Kiinnitä</translation>
+<translation id="746216226901520237">Ensi kerralla <ph name="DEVICE_TYPE" /> avataan lukituksesta puhelimellasi. Voit poistaa Smart Lockin käytöstä asetuksissa.</translation>
 <translation id="7463006580194749499">Lisää käyttäjä</translation>
 <translation id="7465778193084373987">Netscape-varmenteen kumoamis-URL</translation>
 <translation id="7469894403370665791">Yhdistä automaattisesti tähän verkkoon</translation>
@@ -4371,6 +4377,7 @@
 <translation id="7580671184200851182">Toista äänet samanlaisina kaikista kaiuttimista (monotoisto)</translation>
 <translation id="7581462281756524039">Poistotyökalu</translation>
 <translation id="7582582252461552277">Käytä tätä verkkoa</translation>
+<translation id="7583948862126372804">Määrä</translation>
 <translation id="7586498138629385861">Chrome pysyy käynnissä, kun Chrome-sovelluksia on avoinna.</translation>
 <translation id="7589461650300748890">Hei, varo vähän.</translation>
 <translation id="7589661784326793847">Odota hetki</translation>
@@ -5481,6 +5488,7 @@
 <translation id="93393615658292258">Vain salasana</translation>
 <translation id="934503638756687833">Myös tämän luettelon ulkopuolisia kohteita voidaan poistaa tarvittaessa. Lue lisää &lt;a href="<ph name="URL" />"&gt;ei-toivotuilta ohjelmilta suojautumisesta&lt;/a&gt; Chromen tietosuojailmoituksesta.</translation>
 <translation id="935490618240037774">Kirjanmerkkisi, historiasi, salasanasi ja muut asetuksesi synkronoidaan Google-tilillesi, jotta voit käyttää niitä kaikilla laitteillasi.</translation>
+<translation id="935854577147268200">Smart Lock ‑puhelin on vaihtunut. Kirjoita salasana, jotta Smart Lock voidaan päivittää. Seuraavalla kerralla puhelimesi avaa laitteen <ph name="DEVICE_TYPE" /> lukituksen. Voit poistaa Smart Lockin käytöstä asetuksissa.</translation>
 <translation id="936801553271523408">Järjestelmän diagnostiikkatiedot</translation>
 <translation id="93766956588638423">Korjaa laajennus</translation>
 <translation id="938339467127511841">Linux-tallennustila (beta)</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 846f650..d248005 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1007,6 +1007,7 @@
 <translation id="2484959914739448251">Para i-clear ang data mula sa pag-browse sa lahat ng iyong naka-sync na device at sa Google Account mo, <ph name="BEGIN_LINK" />ilagay ang iyong passphrase<ph name="END_LINK" />.</translation>
 <translation id="2485422356828889247">I-uninstall</translation>
 <translation id="2487067538648443797">Magdagdag ng bagong bookmark</translation>
+<translation id="2489829450872380594">Sa susunod, ia-unlock ng bagong telepono ang <ph name="DEVICE_TYPE" /> na ito. Puwede mong i-off ang Smart Lock sa Mga Setting.</translation>
 <translation id="2489918096470125693">Magdagdag ng &amp;Folder...</translation>
 <translation id="249113932447298600">Paumanhin, hindi sinusuportahan ang device na <ph name="DEVICE_LABEL" /> sa oras na ito.</translation>
 <translation id="249303669840926644">Hindi makumpleto ang pagpaparehistro</translation>
@@ -1764,6 +1765,7 @@
 <translation id="3627588569887975815">Buksan ang link sa inco&amp;gnito window</translation>
 <translation id="3627671146180677314">Oras ng Pag-renew ng Netscape Certificate</translation>
 <translation id="3627879631695760395">I-install ang <ph name="APP" />...</translation>
+<translation id="3629631988386925734">Ilagay ang iyong password para i-enable ang Smart Lock. Sa susunod, ia-unlock ng iyong telepono ang <ph name="DEVICE_TYPE" /> mo. Puwede mong i-off ang Smart Lock sa Mga Setting.</translation>
 <translation id="3630132874740063857">Iyong telepono</translation>
 <translation id="3630995161997703415">Idagdag ang site na ito sa iyong shelf upang magamit ito anumang oras</translation>
 <translation id="3636096452488277381">Kamusta, <ph name="USER_GIVEN_NAME" />.</translation>
@@ -2109,6 +2111,7 @@
 <translation id="4109135793348361820">Ilipat ang window sa <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110490973560452005">Na-download na: <ph name="FILE_NAME" />. Pindutin ang Shift+F6 para mag-cycle sa lugar ng bar ng mga download.</translation>
 <translation id="4110895898888439383">I-browse ang web sa high contrast mode</translation>
+<translation id="4112221174576828331">Kung walang kapaki-pakinabang na paglalarawan ang isang larawan, magbibigay nito ang Chrome para sa iyo. Sina-scan ng Google ang mga larawan.</translation>
 <translation id="4115002065223188701">Hindi nasasagap ang network</translation>
 <translation id="4115080753528843955">Gumagamit ang ilang serbisyo ng content ng mga natatanging identifier para sa pagpapahintulot ng access sa pinoprotektahang content</translation>
 <translation id="4118579674665737931">Paki-reboot ang device at subukang muli.</translation>
@@ -2661,6 +2664,7 @@
 <translation id="4998873842614926205">Kumpirmahin ang mga Pagbabago</translation>
 <translation id="5000922062037820727">Naka-block (inirerekomenda)</translation>
 <translation id="5004584466530475658"><ph name="FILE_COUNT" /> (na) bagong larawan</translation>
+<translation id="5008936837313706385">Pangalan ng Aktibidad</translation>
 <translation id="5010043101506446253">Awtoridad ng certificate</translation>
 <translation id="5010406651457630570">Mga Computer</translation>
 <translation id="5015344424288992913">Nilulutas ang proxy...</translation>
@@ -2992,6 +2996,7 @@
 <translation id="5507756662695126555">Hindi makokontra</translation>
 <translation id="5509693895992845810">I-save &amp;Bilang...</translation>
 <translation id="5509914365760201064">Nagbigay: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">Kumuha ng Mga Paglalarawan ng Larawan mula sa Google</translation>
 <translation id="5511379779384092781">Sobrang liit</translation>
 <translation id="5511823366942919280">Sigurado ka bang gusto mong i-set up ang device na ito bilang "Shark"?</translation>
 <translation id="5512653252560939721">Dapat na hardware-backed ang certificate ng user.</translation>
@@ -3418,7 +3423,6 @@
 <translation id="6103681770816982672">Babala: lumilipat ka sa channel ng developer</translation>
 <translation id="6104068876731806426">Mga Google Account</translation>
 <translation id="6104311680260824317">Hindi maisama ang device sa domain. Hindi sinusuportahan ng server ang mga natukoy na uri ng Kerberos na pag-encrypt. Suriin ang "Higit pang opsyon" para sa mga setting ng pag-encrypt.</translation>
-<translation id="6105877918873366097">Huling na-access</translation>
 <translation id="6107012941649240045">Ibinigay Kay</translation>
 <translation id="6112294629795967147">Pindutin para i-resize</translation>
 <translation id="6112931163620622315">Tingnan ang iyong telepono</translation>
@@ -3574,6 +3578,7 @@
 <translation id="6341850831632289108">Tukuyin ang iyong aktwal na lokasyon</translation>
 <translation id="6344170822609224263">I-access ang listahan ng mga koneksyon sa network</translation>
 <translation id="6346310558342052870">Pinaghihigpitan ang access</translation>
+<translation id="6349101878882523185">I-install ang <ph name="APP_NAME" /></translation>
 <translation id="6349170655202535379">Hindi gumagana ang pag-sync. Subukang mag-sign out at muling mag-sign in.</translation>
 <translation id="6351063337294363751">Maaari mong i-clear ang iyong data mula sa pagba-browse sa menu na ito</translation>
 <translation id="6352773953037195952">Pinakamataas</translation>
@@ -3991,6 +3996,7 @@
 <translation id="6990081529015358884">Naubusan ka na ng espasyo</translation>
 <translation id="6990778048354947307">Madilim na Tema</translation>
 <translation id="6991665348624301627">Pumili ng patutunguhan</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> - Log ng Aktibidad</translation>
 <translation id="6997707937646349884">Sa iyong mga device:</translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> (na) folder ang napili</translation>
 <translation id="6998793565256476099">Magpatala ng device para sa pakikipagkumperensya gamit ang video</translation>
@@ -4194,7 +4200,6 @@
 <translation id="7289225569524511578">Buksan ang wallpaper app</translation>
 <translation id="7290242001003353852">Ina-access ng serbisyo sa pag-sign in na ito, na hino-host ng <ph name="SAML_DOMAIN" />, ang iyong camera.</translation>
 <translation id="7290594223351252791">Kumpirmahin ang pagpaparehistro</translation>
-<translation id="7292696521213967957">Impormasyon para i-debug ang Assistant</translation>
 <translation id="7295662345261934369">Ibahagi sa iba</translation>
 <translation id="729583233778673644">Payagan ang AES at RC4 encryption. Magiging mas mapanganib para sa iyo kapag ginamit ang opsyong ito, dahil hindi secure ang mga RC4 cipher.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> Mga Tuntunin</translation>
@@ -4293,6 +4298,7 @@
 <translation id="7456142309650173560">dev</translation>
 <translation id="7456847797759667638">Buksan ang Lokasyon...</translation>
 <translation id="7461924472993315131">I-pin</translation>
+<translation id="746216226901520237">Sa susunod, ia-unlock ng iyong telepono ang <ph name="DEVICE_TYPE" /> mo. Puwede mong i-off ang Smart Lock sa Mga Setting.</translation>
 <translation id="7463006580194749499">Magdagdag ng tao</translation>
 <translation id="7465778193084373987">URL ng Pagpapawalang-bisa ng Netscape Certificate</translation>
 <translation id="7469894403370665791">Awtomatikong kumonekta sa network na ito</translation>
@@ -4371,6 +4377,7 @@
 <translation id="7580671184200851182">I-play ang parehong audio sa lahat ng speaker (mono audio)</translation>
 <translation id="7581462281756524039">Isang tool sa paglilinis</translation>
 <translation id="7582582252461552277">Gustuhin ang network na ito</translation>
+<translation id="7583948862126372804">Bilang</translation>
 <translation id="7586498138629385861">Patuloy na tatakbo ang Chrome habang nakabukas ang Chrome Apps.</translation>
 <translation id="7589461650300748890">Naku. Mag-ingat.</translation>
 <translation id="7589661784326793847">Maghintay lamang ng isang segundo</translation>
@@ -5484,6 +5491,7 @@
 <translation id="93393615658292258">Password lang</translation>
 <translation id="934503638756687833">Aalisin din ang mga item na hindi nakalista rito kung kinakailangan. Matuto pa tungkol sa &lt;a href="<ph name="URL" />"&gt;proteksyon laban sa hindi gustong software&lt;/a&gt; sa puting papel ukol sa privacy ng Chrome.</translation>
 <translation id="935490618240037774">Masi-sync sa iyong Google Account ang iyong mga bookmark, history, mga password at iba pang mga setting upang magamit mo ang mga ito sa lahat ng iyong device.</translation>
+<translation id="935854577147268200">Pinalitan ang telepono ng Smart Lock. Ilagay ang iyong password para i-update ang Smart Lock. Sa susunod, ia-unlock ng iyong telepono ang <ph name="DEVICE_TYPE" /> mo. Puwede mong i-off ang Smart Lock sa Mga Setting</translation>
 <translation id="936801553271523408">Diagnostic data ng system</translation>
 <translation id="93766956588638423">Ayusin ang extension</translation>
 <translation id="938339467127511841">Storage ng Linux (Beta)</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 237e802..93dfdd2 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1007,6 +1007,7 @@
 <translation id="2484959914739448251">Pour effacer les données de navigation sur tous vos appareils synchronisés et dans votre compte Google, <ph name="BEGIN_LINK" />saisissez votre phrase secrète<ph name="END_LINK" />.</translation>
 <translation id="2485422356828889247">Désinstaller</translation>
 <translation id="2487067538648443797">Ajouter un favori</translation>
+<translation id="2489829450872380594">La prochaine fois, un nouveau téléphone déverrouillera ce <ph name="DEVICE_TYPE" />. Vous pouvez désactiver Smart Lock dans les paramètres.</translation>
 <translation id="2489918096470125693">Ajouter un &amp;dossier...</translation>
 <translation id="249113932447298600">Désolé, le périphérique <ph name="DEVICE_LABEL" /> n'est pas compatible pour le moment.</translation>
 <translation id="249303669840926644">Impossible de terminer l'enregistrement</translation>
@@ -1764,6 +1765,7 @@
 <translation id="3627588569887975815">Ouvrir le lien dans une fenêtre en navi&amp;gation privée</translation>
 <translation id="3627671146180677314">Date de renouvellement du certificat Netscape</translation>
 <translation id="3627879631695760395">Installer <ph name="APP" />...</translation>
+<translation id="3629631988386925734">Saisissez votre mot de passe pour activer Smart Lock. La prochaine fois, votre téléphone déverrouillera votre <ph name="DEVICE_TYPE" />. Vous pouvez désactiver Smart Lock dans les paramètres.</translation>
 <translation id="3630132874740063857">Votre téléphone</translation>
 <translation id="3630995161997703415">Ajoutez ce site à votre étagère pour l'utiliser à tout moment</translation>
 <translation id="3636096452488277381">Bonjour <ph name="USER_GIVEN_NAME" /></translation>
@@ -2109,6 +2111,7 @@
 <translation id="4109135793348361820">Déplacer la fenêtre vers <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110490973560452005">Téléchargement terminé : <ph name="FILE_NAME" />. Appuyez sur Maj+F6 pour accéder à la zone de la barre de téléchargements.</translation>
 <translation id="4110895898888439383">Parcourir le Web en mode Contraste élevé</translation>
+<translation id="4112221174576828331">Si une image n'est pas accompagnée d'une description utile, Chrome vous en proposera une. Les images sont analysées par Google.</translation>
 <translation id="4115002065223188701">Réseau hors de portée</translation>
 <translation id="4115080753528843955">Certains services de contenu utilisent des identifiants uniques dans le but d'autoriser l'accès au contenu protégé</translation>
 <translation id="4118579674665737931">Veuillez redémarrer l'appareil et réessayer.</translation>
@@ -2661,6 +2664,7 @@
 <translation id="4998873842614926205">Confirmer les modifications</translation>
 <translation id="5000922062037820727">Bloquée (recommandé)</translation>
 <translation id="5004584466530475658"><ph name="FILE_COUNT" /> nouvelles photos</translation>
+<translation id="5008936837313706385">Nom de l'activité</translation>
 <translation id="5010043101506446253">Autorité de certification</translation>
 <translation id="5010406651457630570">Ordinateurs</translation>
 <translation id="5015344424288992913">Résolution du proxy...</translation>
@@ -2992,6 +2996,7 @@
 <translation id="5507756662695126555">Non-répudiation</translation>
 <translation id="5509693895992845810">Enregistrer &amp;sous...</translation>
 <translation id="5509914365760201064">Émetteur : <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">Obtenir des descriptions d'images de Google</translation>
 <translation id="5511379779384092781">Très léger</translation>
 <translation id="5511823366942919280">Voulez-vous vraiment configurer cet appareil en tant que "requin" ?</translation>
 <translation id="5512653252560939721">Le certificat utilisateur doit être intégré à l'ordinateur.</translation>
@@ -3419,7 +3424,6 @@
 <translation id="6103681770816982672">Avertissement : Vous êtes sur le point de passer à la version développeur</translation>
 <translation id="6104068876731806426">Comptes Google</translation>
 <translation id="6104311680260824317">Impossible d'associer l'appareil au domaine. Le serveur n'accepte pas les types de chiffrement Kerberos spécifiés. Pour consulter les paramètres de chiffrement, sélectionnez "Plus d'options".</translation>
-<translation id="6105877918873366097">Dernier accès</translation>
 <translation id="6107012941649240045">Émis pour</translation>
 <translation id="6112294629795967147">Appuyer pour redimensionner</translation>
 <translation id="6112931163620622315">Vérifier le téléphone</translation>
@@ -3575,6 +3579,7 @@
 <translation id="6341850831632289108">Détecter votre position géographique</translation>
 <translation id="6344170822609224263">Accéder à la liste des connexions réseau</translation>
 <translation id="6346310558342052870">Accès limité</translation>
+<translation id="6349101878882523185">Installer <ph name="APP_NAME" /></translation>
 <translation id="6349170655202535379">La synchronisation ne fonctionne pas. Essayez de vous déconnecter, puis de vous reconnecter.</translation>
 <translation id="6351063337294363751">Vous pouvez effacer vos données de navigation à partir de ce menu.</translation>
 <translation id="6352773953037195952">Le plus aigu</translation>
@@ -3992,6 +3997,7 @@
 <translation id="6990081529015358884">Vous avez utilisé tout l'espace de stockage.</translation>
 <translation id="6990778048354947307">Thème sombre</translation>
 <translation id="6991665348624301627">Sélectionner un emplacement de destination</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> – Journal d'activité</translation>
 <translation id="6997707937646349884">Sur vos appareils :</translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> dossiers sélectionnés</translation>
 <translation id="6998793565256476099">Enregistrer un appareil pour la visioconférence</translation>
@@ -4195,7 +4201,6 @@
 <translation id="7289225569524511578">Ouvrir l'application des fonds d'écran</translation>
 <translation id="7290242001003353852">Ce service de connexion hébergé par <ph name="SAML_DOMAIN" /> accède actuellement à votre caméra.</translation>
 <translation id="7290594223351252791">Confirmer l'enregistrement</translation>
-<translation id="7292696521213967957">Informations pour déboguer l'Assistant</translation>
 <translation id="7295662345261934369">Partager</translation>
 <translation id="729583233778673644">Autorisez le chiffrement AES et RC4. L'activation de cette option est risquée, car les algorithmes de chiffrement RC4 ne sont pas sécurisés.</translation>
 <translation id="7296774163727375165">Conditions d'utilisation du domaine "<ph name="DOMAIN" />"</translation>
@@ -4294,6 +4299,7 @@
 <translation id="7456142309650173560">développeur</translation>
 <translation id="7456847797759667638">Ouvrir une adresse</translation>
 <translation id="7461924472993315131">Épingler</translation>
+<translation id="746216226901520237">La prochaine fois, votre téléphone déverrouillera votre <ph name="DEVICE_TYPE" />. Vous pouvez désactiver Smart Lock dans les paramètres.</translation>
 <translation id="7463006580194749499">Ajouter une personne</translation>
 <translation id="7465778193084373987">URL de révocation de certificat Netscape</translation>
 <translation id="7469894403370665791">Se connecter automatiquement à ce réseau</translation>
@@ -4372,6 +4378,7 @@
 <translation id="7580671184200851182">Lire le même contenu audio sur toutes les enceintes (son mono)</translation>
 <translation id="7581462281756524039">Un outil de nettoyage</translation>
 <translation id="7582582252461552277">Préférer ce réseau</translation>
+<translation id="7583948862126372804">Nombre</translation>
 <translation id="7586498138629385861">Chrome continuera à fonctionner tant que des applications Chrome sont ouvertes.</translation>
 <translation id="7589461650300748890">Attention !</translation>
 <translation id="7589661784326793847">Veuillez patienter un court instant.</translation>
@@ -5483,6 +5490,7 @@
 <translation id="93393615658292258">Mot de passe uniquement</translation>
 <translation id="934503638756687833">Au besoin, les éléments non indiqués ici seront également supprimés. Pour en savoir plus sur la &lt;a href="<ph name="URL" />"&gt;protection contre les logiciels malveillants&lt;/a&gt;, consultez le livre blanc sur les règles de confidentialité de Chrome.</translation>
 <translation id="935490618240037774">Vos favoris, votre historique, vos mots de passe et d'autres paramètres seront synchronisés avec votre compte Google, afin que vous puissiez les utiliser sur tous vos appareils.</translation>
+<translation id="935854577147268200">Le téléphone Smart Lock a changé. Saisissez votre mot de passe pour activer Smart Lock. La prochaine fois, votre téléphone déverrouillera votre <ph name="DEVICE_TYPE" />. Vous pouvez désactiver Smart Lock dans les paramètres.</translation>
 <translation id="936801553271523408">Données de diagnostic système</translation>
 <translation id="93766956588638423">Réparer l'extension</translation>
 <translation id="938339467127511841">Stockage Linux (version bêta)</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 8b5a32c..b9d01bb 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -3421,7 +3421,6 @@
 <translation id="6103681770816982672">ચેતવણી: તમે વિકાસકર્તાની ચેનલ પર સ્વિચ કરી રહ્યાં છો</translation>
 <translation id="6104068876731806426">Google એકાઉન્ટ</translation>
 <translation id="6104311680260824317">ઉપકરણ ડોમેન સાથે જોડી શકાતું નથી. સર્વર આપેલ Kerberos ઍન્ક્રિપ્શન પ્રકારોનું સમર્થન કરતું નથી. ઍન્ક્રિપ્શન સેટિંગ માટે "વધુ વિકલ્પો" ચેક કરો.</translation>
-<translation id="6105877918873366097">છેલ્લે ઍક્સેસ કર્યાની તારીખ</translation>
 <translation id="6107012941649240045">આને રજૂ કરેલું</translation>
 <translation id="6112294629795967147">કદ બદલવા માટે સ્પર્શ કરો</translation>
 <translation id="6112931163620622315">તમારો ફોન તપાસો</translation>
@@ -4199,7 +4198,6 @@
 <translation id="7289225569524511578">વૉલપેપર ઍપ્લિકેશન ખોલો</translation>
 <translation id="7290242001003353852"><ph name="SAML_DOMAIN" /> દ્વારા હોસ્ટ થયેલ સાઇન-ઇન સેવા, તમારા કૅમેરાને ઍક્સેસ કરી રહી છે.</translation>
 <translation id="7290594223351252791">નોંધણીની પુષ્ટિ કરો</translation>
-<translation id="7292696521213967957">આસિસ્ટંટ ડિબગ કરવા માટેની માહિતી</translation>
 <translation id="7295662345261934369">બીજા સાથે શેર કરો</translation>
 <translation id="729583233778673644">AES અને RC4 એન્ક્રિપ્શનની મંજૂરી આપો. આનાથી વિકલ્પનો ઉપયોગ કરવાનું તમારું જોખમ વધે છે, કારણ કે RC4 સાઇફર અસુરક્ષિત હોય છે.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> શરતો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 67fbb0c..0c2454c 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -3417,7 +3417,6 @@
 <translation id="6103681770816982672">चेतावनी: आप डेवलपर चैनल पर स्विच कर रहे हैं</translation>
 <translation id="6104068876731806426">Google खाते</translation>
 <translation id="6104311680260824317">डिवाइस को डोमेन से नहीं जोड़ सकते. सर्वर पर बताया गया सुरक्षा का तरीका केर्बेरोस काम नहीं करता है. सुरक्षित करने की सेटिंग के लिए "और विकल्प" देखें.</translation>
-<translation id="6105877918873366097">पिछले एक्सेस का दिनांक</translation>
 <translation id="6107012941649240045">इसको जारी</translation>
 <translation id="6112294629795967147">आकार बदलने के लिए छुएं</translation>
 <translation id="6112931163620622315">अपना फ़ोन जांचें</translation>
@@ -4193,7 +4192,6 @@
 <translation id="7289225569524511578">वॉलपेपर ऐप्लिकेशन खोलें</translation>
 <translation id="7290242001003353852"><ph name="SAML_DOMAIN" /> द्वारा होस्ट की गई यह प्रवेश सेवा, आपका कैमरा एक्सेस कर रही है.</translation>
 <translation id="7290594223351252791">पंजीकरण की दुबारा पूछें</translation>
-<translation id="7292696521213967957">Assistant को डीबग करने की जानकारी</translation>
 <translation id="7295662345261934369">दूसरों से शेयर करें</translation>
 <translation id="729583233778673644">AES और RC4 सुरक्षा की अनुमति दें. इस विकल्प का इस्तेमाल करने से आपका खतरा बढ़ जाता है, क्योंकि RC4 सिफ़र असुरक्षित होते हैं.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> शर्तें</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 281a0b9..f245b15c 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -3423,7 +3423,6 @@
 <translation id="6103681770816982672">Upozorenje: prelazite na razvojni kanal</translation>
 <translation id="6104068876731806426">Google računi</translation>
 <translation id="6104311680260824317">Uređaj nije moguće pridružiti domeni. Poslužitelj ne podržava navedene vrste enkripcije Kerberos. Postavke enkripcije potražite u odjeljku "Više opcija".</translation>
-<translation id="6105877918873366097">Zadnji pristup</translation>
 <translation id="6107012941649240045">Izdano za</translation>
 <translation id="6112294629795967147">Dodirnite za promjenu veličine</translation>
 <translation id="6112931163620622315">Provjerite telefon</translation>
@@ -4201,7 +4200,6 @@
 <translation id="7289225569524511578">Otvori aplikaciju pozadine</translation>
 <translation id="7290242001003353852">Usluga prijave, koju hostira <ph name="SAML_DOMAIN" />, pristupa vašoj kameri.</translation>
 <translation id="7290594223351252791">Potvrda registracije</translation>
-<translation id="7292696521213967957">Informacije za otklanjanje pogrešaka Asistenta</translation>
 <translation id="7295662345261934369">Dijeli s drugima</translation>
 <translation id="729583233778673644">Dopuštanje AES i RC4 šifriranja. Upotreba te opcije izlaže vas većoj opasnosti jer RC4 šifre nisu sigurne.</translation>
 <translation id="7296774163727375165">Uvjeti domene <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index ba82b842..02019ab 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -3425,7 +3425,6 @@
 <translation id="6103681770816982672">Figyelem: a fejlesztői csatornára készül átváltani</translation>
 <translation id="6104068876731806426">Google-fiók</translation>
 <translation id="6104311680260824317">Nem sikerült csatlakoztatni az eszközt a domainre. A szerver nem támogatja a megadott Kerberos-titkosítástípusokat. A titkosítási beállításokat a „További lehetőségek” részben találja.</translation>
-<translation id="6105877918873366097">Utolsó hozzáférés ideje</translation>
 <translation id="6107012941649240045">Tulajdonos</translation>
 <translation id="6112294629795967147">Érintse meg az átméretezéshez</translation>
 <translation id="6112931163620622315">Folytassa a telefonján</translation>
@@ -4203,7 +4202,6 @@
 <translation id="7289225569524511578">Nyissa meg a háttérkép alkalmazást</translation>
 <translation id="7290242001003353852">Ez a bejelentkezési szolgáltatás, amelyet a(z) <ph name="SAML_DOMAIN" /> üzemeltet, hozzáfér a kamerához.</translation>
 <translation id="7290594223351252791">Regisztráció megerősítése</translation>
-<translation id="7292696521213967957">Hibakeresését szolgáló adatok a Segédhez</translation>
 <translation id="7295662345261934369">Megosztás másokkal</translation>
 <translation id="729583233778673644">Az AES és RC4 titkosítás engedélyezése. A beállítás használata növeli a kockázatot, mivel az RC4-kódok nem biztonságosak.</translation>
 <translation id="7296774163727375165">A(z) <ph name="DOMAIN" /> feltételei</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index bc214a3..09d924ff 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -3421,7 +3421,6 @@
 <translation id="6103681770816982672">Perhatian: Anda beralih ke saluran pengembang</translation>
 <translation id="6104068876731806426">Akun Google</translation>
 <translation id="6104311680260824317">Tidak dapat menggabungkan perangkat ke domain. Server tidak mendukung jenis enkripsi Kerberos yang ditentukan. Centang "Opsi lainnya" untuk melihat setelan enkripsi.</translation>
-<translation id="6105877918873366097">Terakhir diakses</translation>
 <translation id="6107012941649240045">Diterbitkan Untuk</translation>
 <translation id="6112294629795967147">Sentuh untuk mengubah ukuran</translation>
 <translation id="6112931163620622315">Periksa ponsel Anda</translation>
@@ -4199,7 +4198,6 @@
 <translation id="7289225569524511578">Buka aplikasi wallpaper</translation>
 <translation id="7290242001003353852">Layanan masuk ini, dihosting oleh <ph name="SAML_DOMAIN" /> dan sedang mengakses kamera Anda.</translation>
 <translation id="7290594223351252791">Konfirmasi pendaftaran</translation>
-<translation id="7292696521213967957">Info untuk melakukan debug Asisten</translation>
 <translation id="7295662345261934369">Bagikan dengan yang lain</translation>
 <translation id="729583233778673644">Izinkan enkripsi AES dan RC4. Penggunaan opsi ini akan meningkatkan risiko, karena cipher RC4 tidak aman.</translation>
 <translation id="7296774163727375165">Persyaratan <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 2d380868..e77e076f 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -3418,7 +3418,6 @@
 <translation id="6103681770816982672">Avviso. Stai per passare al canale per gli sviluppatori</translation>
 <translation id="6104068876731806426">Account Google</translation>
 <translation id="6104311680260824317">Impossibile aggiungere il dispositivo al dominio. Il server non supporta i tipi di crittografia Kerberos specificati. Consulta "Altre opzioni" per le impostazioni di crittografia.</translation>
-<translation id="6105877918873366097">Ultimo accesso</translation>
 <translation id="6107012941649240045">Rilasciato a</translation>
 <translation id="6112294629795967147">Tocca per ridimensionare</translation>
 <translation id="6112931163620622315">Controlla il tuo telefono</translation>
@@ -4196,7 +4195,6 @@
 <translation id="7289225569524511578">Apri l'app wallpaper</translation>
 <translation id="7290242001003353852">Questo servizio di accesso, ospitato da <ph name="SAML_DOMAIN" />, sta accedendo alla videocamera.</translation>
 <translation id="7290594223351252791">Conferma registrazione</translation>
-<translation id="7292696521213967957">Informazioni per il debug dell'assistente</translation>
 <translation id="7295662345261934369">Condividi con altri</translation>
 <translation id="729583233778673644">Consenti la crittografia AES e RC4. Se scegli di utilizzare quest'opzione vai incontro a un rischio maggiore, in quanto le crittografie RC4 non sono sicure.</translation>
 <translation id="7296774163727375165">Termini di <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 9652e6f..c293ffd 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1004,6 +1004,7 @@
 <translation id="2484959914739448251">‏כדי לנקות את נתוני הגלישה מכל המכשירים המסונכרנים ומחשבון Google שלך, <ph name="BEGIN_LINK" />יש להזין את ביטוי הסיסמה<ph name="END_LINK" />.</translation>
 <translation id="2485422356828889247">הסר התקנה</translation>
 <translation id="2487067538648443797">הוספת סימניה חדשה</translation>
+<translation id="2489829450872380594">‏בפעם הבאה, טלפון חדש יבטל את הנעילה של ה-<ph name="DEVICE_TYPE" /> הזה. אפשר להשבית את Smart Lock דרך ההגדרות.</translation>
 <translation id="2489918096470125693">הוסף &amp;תיקיה...</translation>
 <translation id="249113932447298600">מצטערים, המכשיר <ph name="DEVICE_LABEL" /> אינו נתמך בשלב זה.</translation>
 <translation id="249303669840926644">לא ניתן היה להשלים את הרישום</translation>
@@ -1761,6 +1762,7 @@
 <translation id="3627588569887975815">פתח קישור בחלון גלישה פרטית</translation>
 <translation id="3627671146180677314">‏מועד חידוש של אישור Netscape</translation>
 <translation id="3627879631695760395">התקנת <ph name="APP" />...</translation>
+<translation id="3629631988386925734">‏כדי להפעיל את Smart Lock צריך להזין סיסמה. בפעם הבאה, הטלפון יבטל את הנעילה של <ph name="DEVICE_TYPE" />. אפשר להשבית את Smart Lock דרך ההגדרות.</translation>
 <translation id="3630132874740063857">הטלפון שלך</translation>
 <translation id="3630995161997703415">כדי שניתן יהיה תמיד להשתמש באתר הזה יש להוסיף אותו למדף</translation>
 <translation id="3636096452488277381">אהלן, <ph name="USER_GIVEN_NAME" />.</translation>
@@ -2106,6 +2108,7 @@
 <translation id="4109135793348361820">העבר חלון אל <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110490973560452005">‏ההורדה הושלמה: <ph name="FILE_NAME" />. אפשר להקיש על Shift+F6 כדי לעבור לאזור סרגל ההורדות.</translation>
 <translation id="4110895898888439383">גלישה באינטרנט במצב ניגודיות גבוהה</translation>
+<translation id="4112221174576828331">‏אם אין לתמונה תיאור מועיל, Chrome יספק לך תיאור. התמונות נסרקות על-ידי Google.</translation>
 <translation id="4115002065223188701">הרשת מחוץ לטווח</translation>
 <translation id="4115080753528843955">שירותי תוכן מסוימים משתמשים במזהים ייחודיים כדי להעניק הרשאת גישה לתוכן מוגן</translation>
 <translation id="4118579674665737931">אפשר להפעיל מחדש את המכשיר ולנסות שוב.</translation>
@@ -2658,6 +2661,7 @@
 <translation id="4998873842614926205">אשר שינויים</translation>
 <translation id="5000922062037820727">חסומה (מומלץ)</translation>
 <translation id="5004584466530475658"><ph name="FILE_COUNT" /> תמונות חדשות</translation>
+<translation id="5008936837313706385">שם הפעילות</translation>
 <translation id="5010043101506446253">רשות אישורים</translation>
 <translation id="5010406651457630570">מחשבים</translation>
 <translation id="5015344424288992913">פותר פרוקסי...</translation>
@@ -2990,6 +2994,7 @@
 <translation id="5507756662695126555">אי התכחשות</translation>
 <translation id="5509693895992845810">שמור &amp;כ...</translation>
 <translation id="5509914365760201064">מנפיק: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">‏קבלת תיאורי תמונות מ-Google</translation>
 <translation id="5511379779384092781">קטן במיוחד</translation>
 <translation id="5511823366942919280">האם אתה בטוח שברצונך להגדיר מכשיר זה כ'כריש'?</translation>
 <translation id="5512653252560939721">חובה לבצע גיבוי-חומרה לאישור המשתמש.</translation>
@@ -3416,7 +3421,6 @@
 <translation id="6103681770816982672">‏אזהרה: מתבצע מעבר ל-developer channel</translation>
 <translation id="6104068876731806426">‏חשבונות Google</translation>
 <translation id="6104311680260824317">‏אי אפשר לצרף את המכשיר הזה אל הדומיין. השרת לא תומך בסוגי הצפנת Kerberos שצוינו. יש לעיין ב"אפשרויות נוספות" כדי לקרוא על הגדרות ההצפנה.</translation>
-<translation id="6105877918873366097">גישה אחרונה</translation>
 <translation id="6107012941649240045">מונפק ל</translation>
 <translation id="6112294629795967147">שינוי גודל באמצעות נגיעה</translation>
 <translation id="6112931163620622315">בדיקת הטלפון</translation>
@@ -3990,6 +3994,7 @@
 <translation id="6990081529015358884">לא נשאר לך מקום פנוי</translation>
 <translation id="6990778048354947307">עיצוב כהה</translation>
 <translation id="6991665348624301627">בחר יעד</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> - יומן פעילות</translation>
 <translation id="6997707937646349884">במכשירים שלך:</translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> תיקיות נבחרו</translation>
 <translation id="6998793565256476099">רישום של מכשיר לשיחות ועידה בטלפון</translation>
@@ -4193,7 +4198,6 @@
 <translation id="7289225569524511578">פתח את אפליקציית הטפט</translation>
 <translation id="7290242001003353852">שירות הכניסה הזה, המתארח ב-<ph name="SAML_DOMAIN" />, ניגש אל המצלמה שלך.</translation>
 <translation id="7290594223351252791">אישור רישום</translation>
-<translation id="7292696521213967957">‏מידע לניפוי באגים ב-Assistant</translation>
 <translation id="7295662345261934369">שתף עם אחרים</translation>
 <translation id="729583233778673644">‏התרה של הצפנת AES ו-RC4. שימוש באפשרות הזו מגדיל את הסיכון, כי הצפנות RC4 אינן מאובטחות.</translation>
 <translation id="7296774163727375165">תנאים של <ph name="DOMAIN" /></translation>
@@ -4292,6 +4296,7 @@
 <translation id="7456142309650173560">מפתח</translation>
 <translation id="7456847797759667638">פתח מיקום...</translation>
 <translation id="7461924472993315131">הצמד</translation>
+<translation id="746216226901520237">‏בפעם הבאה, הטלפון יבטל את הנעילה של <ph name="DEVICE_TYPE" />. אפשר להשבית את Smart Lock דרך ההגדרות.</translation>
 <translation id="7463006580194749499">הוספת משתמש</translation>
 <translation id="7465778193084373987">‏כתובת אתר לביטול אישור של Netscape</translation>
 <translation id="7469894403370665791">התחבר אוטומטית לרשת זו.</translation>
@@ -4368,6 +4373,7 @@
 <translation id="7580671184200851182">השמע את אותו אודיו מכל הרמקולים (אודיו מונו)</translation>
 <translation id="7581462281756524039">כלי לניקוי</translation>
 <translation id="7582582252461552277">העדף רשת זו</translation>
+<translation id="7583948862126372804">מספר</translation>
 <translation id="7586498138629385861">‏Chrome ימשיך לפעול כל עוד יש אפליקציות Chrome פתוחות.</translation>
 <translation id="7589461650300748890">היי! תיזהר.</translation>
 <translation id="7589661784326793847">המתן מספר רגעים</translation>
@@ -5480,6 +5486,7 @@
 <translation id="93393615658292258">סיסמה בלבד</translation>
 <translation id="934503638756687833">‏במקרה הצורך ייתכן שיוסרו גם פריטים שלא מופיעים כאן. מידע נוסף על &lt;a href="<ph name="URL" />"&gt;הגנה מפני תוכנות לא רצויות&lt;/a&gt; זמין בסקירה הטכנית לגבי פרטיות ב-Chrome.</translation>
 <translation id="935490618240037774">‏הסימניות, ההיסטוריה, הסיסמאות והגדרות נוספות יסונכרנו עם חשבון Google, כך שתוכל להשתמש בהן בכל המכשירים שלך.</translation>
+<translation id="935854577147268200">‏הטלפון שהוגדר ב-Smart Lock השתנה. עליך להזין את הסיסמה כדי לעדכן את Smart Lock. בפעם הבאה, הטלפון יבטל את הנעילה של <ph name="DEVICE_TYPE" />. אפשר להשבית את Smart Lock בהגדרות.</translation>
 <translation id="936801553271523408">נתוני אבחון של מערכת</translation>
 <translation id="93766956588638423">תיקון התוסף</translation>
 <translation id="938339467127511841">‏אחסון Linux (בטא)</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 32f1e20..f2054368 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -3423,7 +3423,6 @@
 <translation id="6103681770816982672">警告: Dev チャンネルに切り替えようとしています</translation>
 <translation id="6104068876731806426">Google アカウント</translation>
 <translation id="6104311680260824317">端末をドメインに追加できません。指定した Kerberos 暗号化タイプがサーバーでサポートされていません。[その他のオプション] で暗号化の設定をご確認ください。</translation>
-<translation id="6105877918873366097">最終アクセス日</translation>
 <translation id="6107012941649240045">発行先</translation>
 <translation id="6112294629795967147">タップしてサイズを変更</translation>
 <translation id="6112931163620622315">スマートフォンを確認してください</translation>
@@ -4201,7 +4200,6 @@
 <translation id="7289225569524511578">壁紙アプリを開きます</translation>
 <translation id="7290242001003353852">このログイン サービスは <ph name="SAML_DOMAIN" /> でホストされており、カメラにアクセスしています。</translation>
 <translation id="7290594223351252791">登録の確認</translation>
-<translation id="7292696521213967957">アシスタントをデバッグするための情報</translation>
 <translation id="7295662345261934369">他のユーザーと共有</translation>
 <translation id="729583233778673644">AES 暗号化と RC4 暗号化を許可します。なお RC4 暗号は安全でないため、このオプションを使用するとリスクが高まります。</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> 利用規約</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 287aa719..8a6a8db 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -3421,7 +3421,6 @@
 <translation id="6103681770816982672">ಎಚ್ಚರಿಕೆ: ನೀವು ಡೆವಲಪರ್ ಚಾನಲ್‌ಗೆ ಬದಲಾಯಿಸುತ್ತಿರುವಿರಿ</translation>
 <translation id="6104068876731806426">Google ಖಾತೆಗಳು</translation>
 <translation id="6104311680260824317">ಡೊಮೇನ್‌ಗೆ ಸಾಧನವನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿರ್ದಿಷ್ಟ Kerberos ಎನ್‌ಕ್ರಿಪ್ಶನ್ ಪ್ರಕಾರಗಳನ್ನು ಸರ್ವರ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಎನ್‌ಕ್ರಿಪ್ಶನ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗಾಗಿ "ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳನ್ನು" ಪರಿಶೀಲಿಸಿ.</translation>
-<translation id="6105877918873366097">ಕೊನೆಯ ಬಾರಿ ಪ್ರವೇಶಿಸಿರುವುದು</translation>
 <translation id="6107012941649240045">ಇವರಿಗೆ ನೀಡಲಾಗಿದೆ</translation>
 <translation id="6112294629795967147">ಮರುಗಾತ್ರಗೊಳಿಸಲು ಸ್ಪರ್ಶಿಸಿ</translation>
 <translation id="6112931163620622315">ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ</translation>
@@ -4199,7 +4198,6 @@
 <translation id="7289225569524511578">ವಾಲ್‌ಪೇಪರ್ ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಿರಿ</translation>
 <translation id="7290242001003353852">ಈ ಸೈನ್ ಇನ್ ಸೇವೆಯನ್ನು <ph name="SAML_DOMAIN" /> ಮೂಲಕ ಹೋಸ್ಟ್ ಮಾಡಲಾಗಿದೆ, ಇದು ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಪ್ರವೇಶಿಸುತ್ತದೆ.</translation>
 <translation id="7290594223351252791">ನೋಂದಣಿಯನ್ನು ದೃಢೀಕರಿಸಿ</translation>
-<translation id="7292696521213967957">ಅಸಿಸ್ಟೆಂಟ್ ಡೀಬಗ್‌ಗೆ ಮಾಹಿತಿ</translation>
 <translation id="7295662345261934369">ಇತರರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ</translation>
 <translation id="729583233778673644">AES ಮತ್ತು RC4 ಎನ್‌ಕ್ರಿಪ್ಶನ್ ಅನ್ನು ಅನುಮತಿಸಿ . RC4 ಸೈಫರ್‌ಗಳು ಅಸುರಕ್ಷಿತವಾಗಿರುವುದರಿಂದ ಈ ಆಯ್ಕೆಯನ್ನು ಬಳಸುವುದು ನಿಮ್ಮ ಅಪಾಯವನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> ನಿಯಮಗಳು</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index ec9916a..6c9c9d9 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1007,6 +1007,7 @@
 <translation id="2484959914739448251">동기화된 모든 기기 및 Google 계정에서 인터넷 사용 기록을 삭제하려면 <ph name="BEGIN_LINK" />암호를 입력<ph name="END_LINK" />하세요.</translation>
 <translation id="2485422356828889247">제거</translation>
 <translation id="2487067538648443797">새 북마크 추가</translation>
+<translation id="2489829450872380594">다음번에는 새로운 휴대전화를 통해 <ph name="DEVICE_TYPE" />이(가) 잠금 해제됩니다. 설정에서 Smart Lock을 사용 중지할 수 없습니다.</translation>
 <translation id="2489918096470125693">폴더 추가(&amp;F)...</translation>
 <translation id="249113932447298600">죄송합니다. 현재 이 기기(<ph name="DEVICE_LABEL" />)는 지원되지 않습니다.</translation>
 <translation id="249303669840926644">등록을 완료할 수 없습니다.</translation>
@@ -1764,6 +1765,7 @@
 <translation id="3627588569887975815">시크릿 창에서 링크 열기(&amp;G)</translation>
 <translation id="3627671146180677314">Netscape Certificate Renewal Time</translation>
 <translation id="3627879631695760395"><ph name="APP" /> 설치...</translation>
+<translation id="3629631988386925734">비밀번호를 입력하여 Smart Lock을 사용 설정하세요. 다음번에는 휴대전화를 통해 <ph name="DEVICE_TYPE" />이(가) 잠금 해제됩니다. 설정에서 Smart Lock을 사용 중지할 수 있습니다.</translation>
 <translation id="3630132874740063857">휴대전화</translation>
 <translation id="3630995161997703415">이 사이트를 언제든지 사용할 수 있도록 실행기에 추가합니다</translation>
 <translation id="3636096452488277381"><ph name="USER_GIVEN_NAME" />님, 반갑습니다.</translation>
@@ -2107,6 +2109,7 @@
 <translation id="4109135793348361820">창을 <ph name="USER_NAME" />(<ph name="USER_EMAIL" />)님에게로 이동</translation>
 <translation id="4110490973560452005">다운로드 완료: <ph name="FILE_NAME" />. 다운로드바 영역으로 이동하려면 Shift+F6를 누르세요.</translation>
 <translation id="4110895898888439383">고대비 모드로 웹 탐색</translation>
+<translation id="4112221174576828331">이미지에 유용한 설명이 없으면 Chrome에서 자동으로 설명을 제공합니다. Google에서 이미지를 스캔합니다.</translation>
 <translation id="4115002065223188701">네트워크 범위를 벗어남</translation>
 <translation id="4115080753528843955">일부 콘텐츠 서비스는 보호된 콘텐츠에 액세스 권한을 부여할 수 있도록 고유 식별자를 사용합니다.</translation>
 <translation id="4118579674665737931">기기를 재부팅한 후 다시 시도해 주세요.</translation>
@@ -2659,6 +2662,7 @@
 <translation id="4998873842614926205">변경사항 확인</translation>
 <translation id="5000922062037820727">차단(권장)</translation>
 <translation id="5004584466530475658">새로운 사진 <ph name="FILE_COUNT" />장</translation>
+<translation id="5008936837313706385">활동 이름</translation>
 <translation id="5010043101506446253">인증 기관</translation>
 <translation id="5010406651457630570">컴퓨터</translation>
 <translation id="5015344424288992913">프록시 알아내는 중...</translation>
@@ -2990,6 +2994,7 @@
 <translation id="5507756662695126555">부인 방지</translation>
 <translation id="5509693895992845810">다른 이름으로 저장(&amp;A)...</translation>
 <translation id="5509914365760201064">발행기관: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">Google에서 이미지 설명 가져오기</translation>
 <translation id="5511379779384092781">아주 작게</translation>
 <translation id="5511823366942919280">이 기기를 'Shark'로 설정하시겠습니까?</translation>
 <translation id="5512653252560939721">사용자 인증서를 하드웨어에 백업해야 합니다.</translation>
@@ -3416,7 +3421,6 @@
 <translation id="6103681770816982672">경고: 개발자 채널로 전환</translation>
 <translation id="6104068876731806426">Google 계정</translation>
 <translation id="6104311680260824317">기기가 도메인에 가입하지 못했습니다. 서버가 지정된 Kerberos 암호화 유형을 지원하지 않습니다. '옵션 더보기'에서 암호화 설정을 확인하세요.</translation>
-<translation id="6105877918873366097">마지막 액세스 날짜</translation>
 <translation id="6107012941649240045">발급 대상</translation>
 <translation id="6112294629795967147">터치하여 크기 조정</translation>
 <translation id="6112931163620622315">휴대전화 확인</translation>
@@ -3572,6 +3576,7 @@
 <translation id="6341850831632289108">실제 위치 감지</translation>
 <translation id="6344170822609224263">네트워크 연결 목록에 액세스</translation>
 <translation id="6346310558342052870">액세스 제한됨</translation>
+<translation id="6349101878882523185"><ph name="APP_NAME" /> 설치</translation>
 <translation id="6349170655202535379">동기화가 작동하지 않습니다. 로그아웃한 후 다시 로그인하세요.</translation>
 <translation id="6351063337294363751">이 메뉴에서 인터넷 사용 기록을 삭제할 수 있습니다.</translation>
 <translation id="6352773953037195952">가장 높음</translation>
@@ -3989,6 +3994,7 @@
 <translation id="6990081529015358884">저장 공간이 부족합니다.</translation>
 <translation id="6990778048354947307">다크 테마</translation>
 <translation id="6991665348624301627">대상 선택</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> - 활동 로그</translation>
 <translation id="6997707937646349884">기기에서 다음과 같이 설정하세요.</translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" />개의 폴더가 선택됨</translation>
 <translation id="6998793565256476099">화상회의용 기기 등록</translation>
@@ -4192,7 +4198,6 @@
 <translation id="7289225569524511578">배경화면 앱 열기</translation>
 <translation id="7290242001003353852"><ph name="SAML_DOMAIN" />에서 호스팅하는 이 로그인 서비스는 카메라에 액세스합니다.</translation>
 <translation id="7290594223351252791">등록 확인</translation>
-<translation id="7292696521213967957">어시스턴트를 디버그하기 위한 정보</translation>
 <translation id="7295662345261934369">다른 사용자와 공유</translation>
 <translation id="729583233778673644">AES 및 RC4 암호화를 허용합니다. RC4 암호화는 안전하지 않으므로 이 옵션을 사용하면 보안 위험도가 높아집니다.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> 약관</translation>
@@ -4291,6 +4296,7 @@
 <translation id="7456142309650173560">개발자</translation>
 <translation id="7456847797759667638">위치 열기...</translation>
 <translation id="7461924472993315131">고정</translation>
+<translation id="746216226901520237">다음번에는 휴대전화를 통해 <ph name="DEVICE_TYPE" />이(가) 잠금 해제됩니다. 설정에서 Smart Lock을 사용 중지할 수 있습니다.</translation>
 <translation id="7463006580194749499">사용자 추가</translation>
 <translation id="7465778193084373987">Netscape Certificate Revocation URL</translation>
 <translation id="7469894403370665791">네트워크에 자동 연결</translation>
@@ -4369,6 +4375,7 @@
 <translation id="7580671184200851182">모든 스피커에서 동일한 오디오 실행(모노 오디오)</translation>
 <translation id="7581462281756524039">정리도구</translation>
 <translation id="7582582252461552277">이 네트워크를 사용</translation>
+<translation id="7583948862126372804">득표 수</translation>
 <translation id="7586498138629385861">Chrome 앱이 열려 있을 때 Chrome이 계속 실행됩니다.</translation>
 <translation id="7589461650300748890">주의하세요.</translation>
 <translation id="7589661784326793847">잠시만 기다려 주세요.</translation>
@@ -5480,6 +5487,7 @@
 <translation id="93393615658292258">비밀번호만</translation>
 <translation id="934503638756687833">필요한 경우 여기에 표시되지 않은 항목도 삭제됩니다. Chrome 개인정보 보호 백서에서 &lt;a href="<ph name="URL" />"&gt;원치 않는 소프트웨어 보호&lt;/a&gt;에 관해 자세히 알아보세요.</translation>
 <translation id="935490618240037774">북마크, 방문 기록, 비밀번호, 기타 설정이 Google 계정에 동기화되므로 모든 기기에서 사용할 수 있습니다.</translation>
+<translation id="935854577147268200">Smart Lock 휴대전화가 변경되었습니다. Smart Lock을 업데이트하려면 비밀번호를 입력하세요. 다음번에는 휴대전화를 통해 <ph name="DEVICE_TYPE" />이(가) 잠금 해제됩니다. 설정에서 Smart Lock을 사용 중지할 수 있습니다.</translation>
 <translation id="936801553271523408">시스템 진단 데이터</translation>
 <translation id="93766956588638423">확장 프로그램 복구</translation>
 <translation id="938339467127511841">Linux(베타) 저장용량</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index a779bf38..2bb39c6 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -3424,7 +3424,6 @@
 <translation id="6103681770816982672">Įspėjimas: perjungiate į kūrėjo kanalą</translation>
 <translation id="6104068876731806426">„Google“ paskyros</translation>
 <translation id="6104311680260824317">Nepavyko susieti įrenginio su domenu. Serveris nepalaiko nurodytų „Kerberos“ šifruotės tipų. Jei reikia šifruotės nustatymų, žr. „Daugiau parinkčių“.</translation>
-<translation id="6105877918873366097">Paskutinį kartą pasiekta</translation>
 <translation id="6107012941649240045">Išduotas</translation>
 <translation id="6112294629795967147">Palieskite, kad pakeistumėte dydį</translation>
 <translation id="6112931163620622315">Patikrinkite telefoną</translation>
@@ -4202,7 +4201,6 @@
 <translation id="7289225569524511578">Atidaryti ekrano fonų programą</translation>
 <translation id="7290242001003353852">Ši prisijungimo paslauga, priglobiama <ph name="SAML_DOMAIN" />, pasiekia jūsų fotoaparatą.</translation>
 <translation id="7290594223351252791">Patvirtinti registraciją</translation>
-<translation id="7292696521213967957">Padėjėjo derinimo informacija</translation>
 <translation id="7295662345261934369">Bendrinti su kitais žmonėmis</translation>
 <translation id="729583233778673644">Leisti AES ir RC4 šifruotes. Naudojant šią parinktį padidėja rizika, nes RC4 šifrai nesaugūs.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> sąlygos</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index a11061f3..c53c880 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -3423,7 +3423,6 @@
 <translation id="6103681770816982672">Brīdinājums: jūs pārslēdzat izstrādātāja versiju</translation>
 <translation id="6104068876731806426">Google konti</translation>
 <translation id="6104311680260824317">Ierīci nevar saistīt ar domēnu. Serveris neatbalsta norādītos Kerberos šifrēšanas veidus. Šifrēšanas iestatījumus skatiet sadaļā “Vairāk opciju”.</translation>
-<translation id="6105877918873366097">Pēdējoreiz piekļūts</translation>
 <translation id="6107012941649240045">Izsniegts</translation>
 <translation id="6112294629795967147">Pieskarties, lai mainītu lielumu</translation>
 <translation id="6112931163620622315">Pārbaudiet savu tālruni</translation>
@@ -4201,7 +4200,6 @@
 <translation id="7289225569524511578">Atvērt fona tapešu lietotni</translation>
 <translation id="7290242001003353852">Šis domēnā <ph name="SAML_DOMAIN" /> mitinātais pierakstīšanās pakalpojums piekļūst jūsu kamerai.</translation>
 <translation id="7290594223351252791">Reģistrācijas apstiprināšana</translation>
-<translation id="7292696521213967957">Informācija Asistenta atkļūdošanai</translation>
 <translation id="7295662345261934369">Kopīgot ar citiem</translation>
 <translation id="729583233778673644">Atļaut AES un RC4 šifrēšanu. Ja izmantosiet šo opciju, palielināsies risks, jo RC4 šifri nav droši.</translation>
 <translation id="7296774163727375165">Vietnes <ph name="DOMAIN" /> noteikumi</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index e52a8d3..6bf58da0 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -3421,7 +3421,6 @@
 <translation id="6104068876731806426">Google അക്കൗണ്ടുകൾ</translation>
 <translation id="6104311680260824317">ഉപകരണത്തെ ഡൊമെയ്‌നുമായി ബന്ധിപ്പിക്കാനാവില്ല. നിർദ്ദിഷ്‌ട Kerberos എൻക്രിപ്ഷൻ തരങ്ങൾ സെർവർ പിന്തുണയ്ക്കുന്നില്ല. എൻക്രിപ്‌ഷൻ ക്രമീകരണത്തിനായി "കൂടുതൽ ഓപ്‌ഷനുകൾ
 " പരിശോധിക്കുക.</translation>
-<translation id="6105877918873366097">അവസാനം ആക്‌സസ് ചെയ്‌തത്</translation>
 <translation id="6107012941649240045">ഇതിന് നല്‍‌കി</translation>
 <translation id="6112294629795967147">വലുപ്പം മാറ്റാൻ സ്പർശിക്കുക</translation>
 <translation id="6112931163620622315">നിങ്ങളുടെ ഫോൺ പരിശോധിക്കുക</translation>
@@ -4200,7 +4199,6 @@
 <translation id="7289225569524511578">വാൾപേപ്പർ ആപ്പ് തുറക്കുക</translation>
 <translation id="7290242001003353852"><ph name="SAML_DOMAIN" /> ഹോസ്‌റ്റുചെയ്യുന്ന ഈ സൈൻ ഇൻ സേവനം നിങ്ങളുടെ ക്യാമറ ആക്‌സസ്സ് ചെയ്യുന്നുണ്ട്.</translation>
 <translation id="7290594223351252791">രജിസ്ട്രേഷൻ സ്ഥിരീകരിക്കുക</translation>
-<translation id="7292696521213967957">അസിസ്‌റ്റന്‍റ് ഡീബഗ് ചെയ്യാനുള്ള വിവരം</translation>
 <translation id="7295662345261934369">മറ്റുള്ളവരുമായി പങ്കിടുക</translation>
 <translation id="729583233778673644">AES,RC4 എൻക്രിപ്ഷനുകൾ അനുവദിക്കുക. RC4 രഹസ്യലിപി സുരക്ഷിതമല്ലാത്തതിനാൽ ഈ ഓപ്ഷൻ അനുവദിക്കുന്നത് അപകടസാധ്യത വർദ്ധിപ്പിക്കുന്നു.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> നിബന്ധനകൾ</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index bf6f7592..92326f6 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -3423,7 +3423,6 @@
 <translation id="6103681770816982672">चेतावणी: तुम्ही विकासक चॅनेलवर स्विच करत आहात</translation>
 <translation id="6104068876731806426">Google खाती</translation>
 <translation id="6104311680260824317">डिव्हाइस डोमेनशी जोडू शकत नाही. सर्व्हर नमूद केलेल्या Kerberos एंक्रिप्शन प्रकारांना सपोर्ट करत नाही. एंक्रिप्शन सेटिंग्जसाठी "आणखी पर्याय" तपासा.</translation>
-<translation id="6105877918873366097">अखेरचा प्रवेश केला</translation>
 <translation id="6107012941649240045">यांना जारी केलेले</translation>
 <translation id="6112294629795967147">आकार बदलण्यासाठी स्पर्श करा</translation>
 <translation id="6112931163620622315">तुमचा फोन तपासा</translation>
@@ -4201,7 +4200,6 @@
 <translation id="7289225569524511578">वॉलपेपर ॲप उघडा</translation>
 <translation id="7290242001003353852"><ph name="SAML_DOMAIN" /> नी होस्ट केलेली, ही साइन-इन सेवा, आपल्या कॅमेर्‍यामध्ये प्रवेश करीत आहे.</translation>
 <translation id="7290594223351252791">नोंदणीची पुष्टी करा</translation>
-<translation id="7292696521213967957">असिस्टंट डीबग करण्याबाबत माहिती</translation>
 <translation id="7295662345261934369">इतरांशी शेअर करा</translation>
 <translation id="729583233778673644">AES आणि RC4 एंक्रिप्‍शनला अनुमती द्या. हा पर्याय वापरल्याने तुमचा धोका वाढतो, कारण RC4 सायफर असुरक्षित आहेत.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> अटी</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 6204496..f79ce18 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -3424,7 +3424,6 @@
 <translation id="6103681770816982672">Amaran: anda beralih ke saluran pemaju</translation>
 <translation id="6104068876731806426">Akaun Google</translation>
 <translation id="6104311680260824317">Tidak dapat menghubungkan peranti ke domain. Pelayan tidak menyokong jenis penyulitan Kerberos yang dinyatakan. Semak "Lagi pilihan" untuk tetapan penyulitan.</translation>
-<translation id="6105877918873366097">Kali terakhir diakses</translation>
 <translation id="6107012941649240045">Dikeluarkan Kepada</translation>
 <translation id="6112294629795967147">Sentuh untuk mengubah saiz</translation>
 <translation id="6112931163620622315">Semak telefon anda</translation>
@@ -4202,7 +4201,6 @@
 <translation id="7289225569524511578">Buka apl kertas dinding</translation>
 <translation id="7290242001003353852">Perkhidmatan log masuk yang dihoskan oleh <ph name="SAML_DOMAIN" /> ini sedang mengakses kamera anda.</translation>
 <translation id="7290594223351252791">Sahkan pendaftaran</translation>
-<translation id="7292696521213967957">Maklumat untuk menyahpepijat Assistant</translation>
 <translation id="7295662345261934369">Kongsi dengan orang lain</translation>
 <translation id="729583233778673644">Benarkan penyulitan AES dan RC4. Penggunaan pilihan ini akan meningkatkan risiko anda, kerana sifer RC4 tidak selamat.</translation>
 <translation id="7296774163727375165">Syarat <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 6a2adfa8..2022379 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -3424,7 +3424,6 @@
 <translation id="6103681770816982672">Waarschuwing: je schakelt over naar een ontwikkelaarskanaal</translation>
 <translation id="6104068876731806426">Google-accounts</translation>
 <translation id="6104311680260824317">Kan het apparaat niet aan het domein koppelen. De server ondersteunt de opgegeven typen Kerberos-versleuteling niet. De instellingen voor versleuteling vind je bij 'Meer opties'.</translation>
-<translation id="6105877918873366097">Laatst geopend</translation>
 <translation id="6107012941649240045">Verleend aan</translation>
 <translation id="6112294629795967147">Tikken om het formaat aan te passen</translation>
 <translation id="6112931163620622315">Controleer je telefoon</translation>
@@ -4202,7 +4201,6 @@
 <translation id="7289225569524511578">De achtergrond-app openen</translation>
 <translation id="7290242001003353852">Deze inlogservice wordt gehost door <ph name="SAML_DOMAIN" /> en heeft toegang tot je camera.</translation>
 <translation id="7290594223351252791">Registratie bevestigen</translation>
-<translation id="7292696521213967957">Foutopsporingsgegevens voor de Assistent</translation>
 <translation id="7295662345261934369">Delen met anderen</translation>
 <translation id="729583233778673644">AES- en RC4-versleuteling toestaan. Als je deze optie gebruikt, loop je meer risico, aangezien RC4-codering onbeveiligd is.</translation>
 <translation id="7296774163727375165">Voorwaarden voor <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index fca3d78..9b45447 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1004,6 +1004,7 @@
 <translation id="2484959914739448251">For å slette nettleserdata på alle synkroniserte enheter og Google-kontoen din må du <ph name="BEGIN_LINK" />skrive inn passordfrasen din<ph name="END_LINK" />.</translation>
 <translation id="2485422356828889247">Avinstaller</translation>
 <translation id="2487067538648443797">Legg til nytt bokmerke</translation>
+<translation id="2489829450872380594">Neste gang låser en ny telefon opp denne <ph name="DEVICE_TYPE" />-enheten. Du kan slå av Smart Lock i innstillingene.</translation>
 <translation id="2489918096470125693">Legg til &amp;mappe</translation>
 <translation id="249113932447298600">Beklager, men enheten <ph name="DEVICE_LABEL" /> støttes foreløpig ikke.</translation>
 <translation id="249303669840926644">Kunne ikke fullføre registreringen</translation>
@@ -1759,6 +1760,7 @@
 <translation id="3627588569887975815">Åpne linken i inko&amp;gnitovindu</translation>
 <translation id="3627671146180677314">Tid for fornying av Netscape-sertifikat</translation>
 <translation id="3627879631695760395">Installer <ph name="APP" />…</translation>
+<translation id="3629631988386925734">Skriv inn passordet ditt for å slå på Smart Lock. Neste gang låser telefonen opp <ph name="DEVICE_TYPE" />-enheten din. Du kan slå av Smart Lock i innstillingene.</translation>
 <translation id="3630132874740063857">Telefonen din</translation>
 <translation id="3630995161997703415">Legg til dette nettstedet på hyllen din, slik at det kan brukes når som helst</translation>
 <translation id="3636096452488277381">Heisann, <ph name="USER_GIVEN_NAME" />.</translation>
@@ -2102,6 +2104,7 @@
 <translation id="4109135793348361820">Flytt vinduet til <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110490973560452005">Nedlastingen er fullført: <ph name="FILE_NAME" />. Trykk på Shift+F6 for å gå til nedlastingsraden.</translation>
 <translation id="4110895898888439383">Surf på nettet i høykontrastmodus</translation>
+<translation id="4112221174576828331">Hvis et bilde ikke har noen nyttig beskrivelse, finner Chrome en til deg. Bildene skannes av Google.</translation>
 <translation id="4115002065223188701">Nettverket er utenfor rekkevidde</translation>
 <translation id="4115080753528843955">Noen innholdstjenester bruker unike identifikatorer for å godkjenne tilgang til beskyttet innhold</translation>
 <translation id="4118579674665737931">Start enheten på nytt og prøv igjen.</translation>
@@ -2654,6 +2657,7 @@
 <translation id="4998873842614926205">Bekreft endringer</translation>
 <translation id="5000922062037820727">Blokkert (anbefales)</translation>
 <translation id="5004584466530475658"><ph name="FILE_COUNT" /> nye bilder</translation>
+<translation id="5008936837313706385">Aktivitetsnavn</translation>
 <translation id="5010043101506446253">Sertifiseringsinstanser</translation>
 <translation id="5010406651457630570">Datamaskiner</translation>
 <translation id="5015344424288992913">Konverterer proxy ...</translation>
@@ -2985,6 +2989,7 @@
 <translation id="5507756662695126555">Ikke-avvisning</translation>
 <translation id="5509693895992845810">L&amp;agre som</translation>
 <translation id="5509914365760201064">Utsteder: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">Få bildebeskrivelser fra Google</translation>
 <translation id="5511379779384092781">Ekstra liten</translation>
 <translation id="5511823366942919280">Er du sikker på at du ønsker å konfigurere denne enheten som en «hai» («shark»)?</translation>
 <translation id="5512653252560939721">Brukersertifikatet må være støttet av maskinvaren.</translation>
@@ -3411,7 +3416,6 @@
 <translation id="6103681770816982672">Advarsel: du bytter til utviklerkanal</translation>
 <translation id="6104068876731806426">Google-kontoer</translation>
 <translation id="6104311680260824317">Kan ikke knytte enheten til domenet. Tjeneren støtter ikke de angitte Kerberos-krypteringstypene. Du finner innstillinger for kryptering under «Flere alternativer».</translation>
-<translation id="6105877918873366097">Sist åpnet</translation>
 <translation id="6107012941649240045">Utstedt til</translation>
 <translation id="6112294629795967147">Trykk for å endre størrelsen</translation>
 <translation id="6112931163620622315">Sjekk telefonen din</translation>
@@ -3567,6 +3571,7 @@
 <translation id="6341850831632289108">Oppdaging av den fysiske plasseringen din</translation>
 <translation id="6344170822609224263">få tilgang til liste over nettverkstilkoblinger</translation>
 <translation id="6346310558342052870">Tilgangsbegrenset</translation>
+<translation id="6349101878882523185">Installer <ph name="APP_NAME" /></translation>
 <translation id="6349170655202535379">Synkroniseringen fungerer ikke. Prøv å logge av og på igjen.</translation>
 <translation id="6351063337294363751">Du kan slette nettleserloggen fra denne menyen</translation>
 <translation id="6352773953037195952">Høyest</translation>
@@ -3984,6 +3989,7 @@
 <translation id="6990081529015358884">Du har ikke tilgjengelig lagringsplass</translation>
 <translation id="6990778048354947307">Mørkt tema</translation>
 <translation id="6991665348624301627">Velg en destinasjon</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> – aktivitetslogg</translation>
 <translation id="6997707937646349884">På enhetene dine:</translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> mapper er valgt</translation>
 <translation id="6998793565256476099">Registrer enheten for videokonferanser</translation>
@@ -4187,7 +4193,6 @@
 <translation id="7289225569524511578">Åpne bakgrunnsappen</translation>
 <translation id="7290242001003353852">Denne påloggingstjenesten, som driftes av <ph name="SAML_DOMAIN" />, har tilgang til kameraet ditt</translation>
 <translation id="7290594223351252791">Bekreft registrering</translation>
-<translation id="7292696521213967957">Feilsøkingsinfo for assistenten</translation>
 <translation id="7295662345261934369">Del med andre</translation>
 <translation id="729583233778673644">Tillat AES- og RC4-kryptering. Hvis du bruker dette alternativet, øker risikoen, ettersom RC4-chiffere ikke er sikre.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" />-vilkår</translation>
@@ -4286,6 +4291,7 @@
 <translation id="7456142309650173560">dev</translation>
 <translation id="7456847797759667638">Åpne sted</translation>
 <translation id="7461924472993315131">Fest</translation>
+<translation id="746216226901520237">Neste gang låser telefonen opp <ph name="DEVICE_TYPE" />-enheten din. Du kan slå av Smart Lock i innstillingene.</translation>
 <translation id="7463006580194749499">Legg til person</translation>
 <translation id="7465778193084373987">Nettadresse for tilbakekalling av Netscape-sertifikat</translation>
 <translation id="7469894403370665791">Koble til dette nettverket automatisk</translation>
@@ -4362,6 +4368,7 @@
 <translation id="7580671184200851182">Spill den samme lyden på alle høyttalere (monolyd)</translation>
 <translation id="7581462281756524039">Et opprydningsverktøy</translation>
 <translation id="7582582252461552277">Foretrekk dette nettverket</translation>
+<translation id="7583948862126372804">Antall</translation>
 <translation id="7586498138629385861">Chrome fortsetter å kjøre mens Chrome-apper er åpne.</translation>
 <translation id="7589461650300748890">Oops! Vær forsiktig.</translation>
 <translation id="7589661784326793847">Vent et øyeblikk</translation>
@@ -5473,6 +5480,7 @@
 <translation id="93393615658292258">Bare passord</translation>
 <translation id="934503638756687833">Elementer som ikke er oppført her, blir også fjernet ved behov. Du kan finne ut mer om &lt;a href="<ph name="URL" />"&gt;beskyttelse mot uønsket programvare&lt;/a&gt; i det tekniske dokumentet om personvern i Chrome.</translation>
 <translation id="935490618240037774">Bokmerkene, loggoppføringene, passordene og de andre innstillingene dine blir synkronisert med Google-kontoen din, slik at du kan få dem på alle enhetene du bruker.</translation>
+<translation id="935854577147268200">Smart Lock-telefonen er endret. Skriv inn passordet ditt for å oppdatere Smart Lock. Neste gang låser telefonen opp <ph name="DEVICE_TYPE" />-enheten din. Du kan slå av Smart Lock i innstillingene</translation>
 <translation id="936801553271523408">Systemdiagnostikkdata</translation>
 <translation id="93766956588638423">Reparer utvidelsen</translation>
 <translation id="938339467127511841">Linux-lagring (beta)</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 64fe771..30868f3 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -3423,7 +3423,6 @@
 <translation id="6103681770816982672">Ostrzeżenie: przełączasz wersję na deweloperską</translation>
 <translation id="6104068876731806426">Konta Google</translation>
 <translation id="6104311680260824317">Nie można dołączyć urządzenia do domeny. Serwer nie obsługuje wybranych typów szyfrowania Kerberos. Kliknij „Więcej opcji”, by otworzyć ustawienia szyfrowania.</translation>
-<translation id="6105877918873366097">Ostatni dostęp</translation>
 <translation id="6107012941649240045">Wystawiony dla</translation>
 <translation id="6112294629795967147">Dotknij, by zmienić rozmiar</translation>
 <translation id="6112931163620622315">Sprawdź swój telefon</translation>
@@ -4201,7 +4200,6 @@
 <translation id="7289225569524511578">Otwórz aplikację tapety</translation>
 <translation id="7290242001003353852">Ta usługa logowania, pochodząca z domeny <ph name="SAML_DOMAIN" />, ma dostęp do kamery.</translation>
 <translation id="7290594223351252791">Potwierdź rejestrację</translation>
-<translation id="7292696521213967957">Informacje służące do debugowania Asystenta</translation>
 <translation id="7295662345261934369">Udostępnij innym</translation>
 <translation id="729583233778673644">Zezwala na szyfrowanie AES i RC4. Używanie tej opcji jest ryzykowne, ponieważ szyfrowanie RC4 nie zapewnia bezpieczeństwa.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> – warunki</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 2338954..438e4d05 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -3424,7 +3424,6 @@
 <translation id="6103681770816982672">Aviso: você está mudando para o canal do desenvolvedor</translation>
 <translation id="6104068876731806426">Contas do Google</translation>
 <translation id="6104311680260824317">Não é possível vincular o dispositivo ao domínio. O servidor não é compatível com os tipos de criptografia especificados do Kerberos. Para ver as configurações de criptografia, acesse "Mais opções".</translation>
-<translation id="6105877918873366097">Data do último acesso</translation>
 <translation id="6107012941649240045">Emitido para</translation>
 <translation id="6112294629795967147">Toque para redimensionar</translation>
 <translation id="6112931163620622315">Verificar o smartphone</translation>
@@ -3773,7 +3772,7 @@
 <translation id="6639554308659482635">Memória SQLite</translation>
 <translation id="6641138807883536517">A senha do módulo de segurança gerada aleatoriamente não está disponível. Isso é normal após um Powerwash.</translation>
 <translation id="6643016212128521049">Limpar</translation>
-<translation id="6644512095122093795">Oferecer salvar senhas</translation>
+<translation id="6644512095122093795">Oferecer para salvar senhas</translation>
 <translation id="6644846457769259194">Atualizando seu dispositivo (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6645437135153136856">O dispositivo Google Cloud Print selecionado não é mais compatível. <ph name="BR" />Tente configurar a impressora nas configurações do seu computador.</translation>
 <translation id="6647228709620733774">URL da revogação da Autoridade de certificação do Netscape</translation>
@@ -4203,7 +4202,6 @@
 <translation id="7289225569524511578">Abra o app de papel de parede</translation>
 <translation id="7290242001003353852">Este serviço de login, hospedado por <ph name="SAML_DOMAIN" />, está acessando sua câmara.</translation>
 <translation id="7290594223351252791">Confirmar registro</translation>
-<translation id="7292696521213967957">Informações para depurar o Assistente</translation>
 <translation id="7295662345261934369">Compartilhar com outras pessoas</translation>
 <translation id="729583233778673644">Permitir a codificação AES e RC4. O uso dessa opção é mais arriscado, porque as criptografias RC4 não são seguras.</translation>
 <translation id="7296774163727375165">Termos de <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index e716e914..66642a54 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -3424,7 +3424,6 @@
 <translation id="6103681770816982672">Aviso: Está a mudar para um canal do programador</translation>
 <translation id="6104068876731806426">Contas Google</translation>
 <translation id="6104311680260824317">Não é possível associar o dispositivo ao domínio. O servidor não suporta os tipos de encriptação Kerberos especificados. Selecione "Mais opções" para aceder às definições de encriptação.</translation>
-<translation id="6105877918873366097">Último acesso</translation>
 <translation id="6107012941649240045">Emitido para</translation>
 <translation id="6112294629795967147">Tocar para redimensionar</translation>
 <translation id="6112931163620622315">Verificar o seu telemóvel</translation>
@@ -4202,7 +4201,6 @@
 <translation id="7289225569524511578">Abrir a aplicação da imagem de fundo</translation>
 <translation id="7290242001003353852">Este serviço de início de sessão, alojado por <ph name="SAML_DOMAIN" />, está a aceder à sua câmara.</translation>
 <translation id="7290594223351252791">Confirmar registo</translation>
-<translation id="7292696521213967957">Informações para depurar o Assistente</translation>
 <translation id="7295662345261934369">Partilhar com outros</translation>
 <translation id="729583233778673644">Permitir a encriptação AES e RC4. A utilização desta opção aumenta o seu risco, uma vez que as cifras RC4 são inseguras.</translation>
 <translation id="7296774163727375165">Termos de <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index d37269e..4b80b87 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -3423,7 +3423,6 @@
 <translation id="6103681770816982672">Avertisment: comutați la canalul pentru dezvoltatori</translation>
 <translation id="6104068876731806426">Conturi Google</translation>
 <translation id="6104311680260824317">Dispozitivul nu a putut fi asociat domeniului. Serverul nu acceptă tipurile de criptare Kerberos specificate. Accesează „Mai multe opțiuni” pentru setările de criptare.</translation>
-<translation id="6105877918873366097">Ultima accesare</translation>
 <translation id="6107012941649240045">Emis către</translation>
 <translation id="6112294629795967147">Atinge pentru a redimensiona</translation>
 <translation id="6112931163620622315">Verifică pe telefon</translation>
@@ -4201,7 +4200,6 @@
 <translation id="7289225569524511578">Deschide aplicația pentru imaginea de fundal</translation>
 <translation id="7290242001003353852">Acest serviciu de conectare, găzduit de <ph name="SAML_DOMAIN" />, îți accesează camera foto.</translation>
 <translation id="7290594223351252791">Confirmarea înregistrării</translation>
-<translation id="7292696521213967957">Informații pentru a remedia erorile Asistentului</translation>
 <translation id="7295662345261934369">Permite accesul altor utilizatori</translation>
 <translation id="729583233778673644">Permite criptarea AES și RC4. Folosirea acestei opțiuni îți mărește riscul, deoarece suitele de codificare RC4 sunt nesecurizate.</translation>
 <translation id="7296774163727375165">Termenii și condițiile <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 90eca7b5..4bab519 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -546,7 +546,7 @@
 <translation id="1802687198411089702">Страница не отвечает. Вы можете закрыть ее или дождаться ответа сервера.</translation>
 <translation id="1802931390041703523">Flash-контент на этой странице заблокирован</translation>
 <translation id="1803545009660609783">Перезаписать образец голоса</translation>
-<translation id="1805472176602625930">Нажмите кнопку на электронном ключе.</translation>
+<translation id="1805472176602625930">Нажмите кнопку на электронном ключе</translation>
 <translation id="1805738995123446102">На фоновой вкладке используется микрофон.</translation>
 <translation id="1805822111539868586">Отладка страниц</translation>
 <translation id="1805967612549112634">Введите PIN-код ещё раз</translation>
@@ -2157,7 +2157,7 @@
 <translation id="4198146608511578238">Чтобы поговорить с Google Ассистентом, просто удерживайте значок панели запуска.</translation>
 <translation id="4200689466366162458">Специальные слова</translation>
 <translation id="4200983522494130825">Новая &amp;вкладка</translation>
-<translation id="4201546031411513170">Вы всегда можете изменить данные для синхронизации в настройках.</translation>
+<translation id="4201546031411513170">Вы всегда можете выбрать, что синхронизировать, в настройках.</translation>
 <translation id="4206144641569145248">Инопланетянин</translation>
 <translation id="4206323443866416204">Отправка отзыва</translation>
 <translation id="4206944295053515692">Проверка правописания Google</translation>
@@ -3423,7 +3423,6 @@
 <translation id="6103681770816982672">Внимание! Вы переходите на версию для разработчиков.</translation>
 <translation id="6104068876731806426">Аккаунты Google</translation>
 <translation id="6104311680260824317">Не удалось подключить устройство к домену. Сервер не поддерживает выбранные типы шифрования Kerberos. В настройках шифрования установите флажок "Другие параметры".</translation>
-<translation id="6105877918873366097">Последнее время доступа</translation>
 <translation id="6107012941649240045">Выдан:</translation>
 <translation id="6112294629795967147">Коснитесь для изменения размера</translation>
 <translation id="6112931163620622315">Проверьте телефон</translation>
@@ -4164,7 +4163,7 @@
 <translation id="7240120331469437312">Альтернативное имя субъекта сертификата</translation>
 <translation id="7240339475467890413">Подключиться к новой точке доступа?</translation>
 <translation id="7241389281993241388">Войдите в <ph name="TOKEN_NAME" />, чтобы импортировать сертификат клиента.</translation>
-<translation id="7241443820034350811">Если электронного ключа нет в списке, нажмите и удерживайте кнопку на ключе в течение пяти секунд.</translation>
+<translation id="7241443820034350811">Если электронного ключа нет в списке, нажмите и удерживайте его кнопку в течение пяти секунд.</translation>
 <translation id="7243632151880336635">Стереть данные и выйти</translation>
 <translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (оптимальное)</translation>
 <translation id="7246947237293279874">FTP-прокси</translation>
@@ -4202,7 +4201,6 @@
 <translation id="7289225569524511578">Откройте приложение "Обои"</translation>
 <translation id="7290242001003353852">Сервису входа, размещенному в домене <ph name="SAML_DOMAIN" />, разрешен доступ к вашей камере.</translation>
 <translation id="7290594223351252791">Подтверждение регистрации</translation>
-<translation id="7292696521213967957">Данные для отладки Ассистента</translation>
 <translation id="7295662345261934369">Предоставить доступ</translation>
 <translation id="729583233778673644">Разрешить шифрование по алгоритмам AES и RC4. Использовать этот параметр небезопасно, так как потоковый шифр RC4 ненадежен.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> – Условия использования</translation>
@@ -4455,7 +4453,7 @@
 <translation id="7704305437604973648">Задача</translation>
 <translation id="7704317875155739195">Заполнять поисковые запросы и URL автоматически</translation>
 <translation id="7704521324619958564">Открыть Play Маркет</translation>
-<translation id="7704628569466676326">Подключите электронный ключ к этому устройству, чтобы использовать его для входа в аккаунт.</translation>
+<translation id="7704628569466676326">Подключите физический ключ безопасности к этому устройству, чтобы использовать его для входа в аккаунт.</translation>
 <translation id="7705276765467986571">Не удалось загрузить модель закладок.</translation>
 <translation id="7705524343798198388">VPN</translation>
 <translation id="7707922173985738739">Использовать мобильный Интернет</translation>
@@ -4915,7 +4913,7 @@
 <translation id="8329978297633540474">Обычный текст</translation>
 <translation id="8335587457941836791">Открепить от панели запуска</translation>
 <translation id="8336153091935557858">Вчера, <ph name="YESTERDAY_DAYTIME" /></translation>
-<translation id="8337047789441383384">Вы уже зарегистрировали этот ключ ранее.</translation>
+<translation id="8337047789441383384">Вы уже зарегистрировали этот электронный ключ ранее.</translation>
 <translation id="8338952601723052325">Сайт разработчика</translation>
 <translation id="8339059274628563283">Локальные данные сайта <ph name="SITE" /></translation>
 <translation id="833986336429795709">Чтобы открыть ссылку, выберите приложение</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 60eb5cc5..07ef1a9 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -3421,7 +3421,6 @@
 <translation id="6103681770816982672">Upozornenie: prechádzate na verziu pre vývojárov</translation>
 <translation id="6104068876731806426">Účty Google</translation>
 <translation id="6104311680260824317">Zariadenie sa nepodarilo pripojiť k doméne. Server nepodporuje stanovené typy šifrovania Kerberos. Skontrolujte nastavenia šifrovania v časti Ďalšie možnosti.</translation>
-<translation id="6105877918873366097">Dátum posledného prístupu</translation>
 <translation id="6107012941649240045">Vydané pre</translation>
 <translation id="6112294629795967147">Klepnutím zmeníte veľkosť</translation>
 <translation id="6112931163620622315">Skontrolujte telefón</translation>
@@ -4199,7 +4198,6 @@
 <translation id="7289225569524511578">Otvoriť aplikáciu tapety</translation>
 <translation id="7290242001003353852">Prihlasovacia služba hostená doménou <ph name="SAML_DOMAIN" /> pristupuje k vášmu fotoaparátu.</translation>
 <translation id="7290594223351252791">Potvrdenie registrácie</translation>
-<translation id="7292696521213967957">Informácie na ladenie Asistenta</translation>
 <translation id="7295662345261934369">Zdieľať s ostatnými</translation>
 <translation id="729583233778673644">Povoľte šifrovania AES a RC4. Šifry RC4 sú nezabezpečené, takže použitím tejto možnosti zvýšite riziko.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> – Zmluvné podmienky</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 9f38918..773bdb2 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -3425,7 +3425,6 @@
 <translation id="6103681770816982672">Opozorilo: preklapljate na kanal za razvijalce</translation>
 <translation id="6104068876731806426">Google Računi</translation>
 <translation id="6104311680260824317">Naprave ni mogoče pridružiti domeni. Strežnik ne podpira navedenih vrst šifriranja Kerberos. Oglejte si nastavitve šifriranja v razdelku »Več možnosti«.</translation>
-<translation id="6105877918873366097">Zadnji dostop</translation>
 <translation id="6107012941649240045">Izdano za</translation>
 <translation id="6112294629795967147">Dotaknite se za spreminjanje velikosti</translation>
 <translation id="6112931163620622315">Preverite telefon</translation>
@@ -4203,7 +4202,6 @@
 <translation id="7289225569524511578">Odprite aplikacijo za ozadje</translation>
 <translation id="7290242001003353852">Prijavna storitev, ki jo gosti <ph name="SAML_DOMAIN" />, dostopa do vaše kamere.</translation>
 <translation id="7290594223351252791">Potrditev registracije</translation>
-<translation id="7292696521213967957">Podatki za odpravljanje napak v Pomočniku</translation>
 <translation id="7295662345261934369">Deljenje z drugimi</translation>
 <translation id="729583233778673644">Dovoli šifriranje AES in RC4. Če uporabite to možnosti, je tveganje večje, saj šifriranje RC4 ni varno.</translation>
 <translation id="7296774163727375165">Pogoji za <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index e42d5089..0edca8f6 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -3421,7 +3421,6 @@
 <translation id="6103681770816982672">Упозорење: Пребацујете на канал за програмере</translation>
 <translation id="6104068876731806426">Google налози</translation>
 <translation id="6104311680260824317">Придруживање уређаја домену није успело. Сервер не подржава наведене Kerberos типове шифровања. Погледајте подешавања шифровања у одељку „Још опција“.</translation>
-<translation id="6105877918873366097">Последњи приступ</translation>
 <translation id="6107012941649240045">Издато за</translation>
 <translation id="6112294629795967147">Додирните да бисте променили величину</translation>
 <translation id="6112931163620622315">Проверите телефон</translation>
@@ -4199,7 +4198,6 @@
 <translation id="7289225569524511578">Отварање апликације за позадине</translation>
 <translation id="7290242001003353852">Ова услуга пријављивања, коју хостује <ph name="SAML_DOMAIN" />, приступа вашој камери.</translation>
 <translation id="7290594223351252791">Потврђивање регистрације</translation>
-<translation id="7292696521213967957">Информације за отклањање грешака у Асистенту</translation>
 <translation id="7295662345261934369">Делите са другима</translation>
 <translation id="729583233778673644">Дозвољава AES и RC4 шифровање. Коришћење ове опције вас излаже већем ризику јер су RC4 шифре небезбедне.</translation>
 <translation id="7296774163727375165">Услови за <ph name="DOMAIN" /></translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 896e7cb..f2e94e8 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1006,6 +1006,7 @@
 <translation id="2484959914739448251"><ph name="BEGIN_LINK" />Ange din lösenfras<ph name="END_LINK" /> om du vill rensa webbinformation från alla synkroniserade enheter och ditt Google-konto.</translation>
 <translation id="2485422356828889247">Avinstallera</translation>
 <translation id="2487067538648443797">Lägg till ett nytt bokmärke</translation>
+<translation id="2489829450872380594">Nästa gång låser en ny mobil upp denna <ph name="DEVICE_TYPE" />. Du kan stänga av Smart Lock i inställningarna.</translation>
 <translation id="2489918096470125693">Lägg till &amp;mapp ...</translation>
 <translation id="249113932447298600">Enheten <ph name="DEVICE_LABEL" /> stöds inte just nu.</translation>
 <translation id="249303669840926644">Det gick inte att slutföra registreringen</translation>
@@ -1763,6 +1764,7 @@
 <translation id="3627588569887975815">Öppna länk i inko&amp;gnitofönster</translation>
 <translation id="3627671146180677314">Förnyelsetid för Netscape-certifikat</translation>
 <translation id="3627879631695760395">Installera <ph name="APP" /> …</translation>
+<translation id="3629631988386925734">Aktivera Smart Lock genom att ange lösenordet. Nästa gång låser din mobil upp <ph name="DEVICE_TYPE" />. Du kan inaktivera Smart Lock i inställningarna.</translation>
 <translation id="3630132874740063857">Din mobil</translation>
 <translation id="3630995161997703415">Lägg till den här webbplatsen på hyllan och använd den när som helst</translation>
 <translation id="3636096452488277381">Hejsan <ph name="USER_GIVEN_NAME" />.</translation>
@@ -2108,6 +2110,7 @@
 <translation id="4109135793348361820">Flytta fönster till <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110490973560452005">Nedladdningen är klar: <ph name="FILE_NAME" />. Stega till nedladdningsfältet med Skift+F6.</translation>
 <translation id="4110895898888439383">Surfa på webben i högkontrastläge</translation>
+<translation id="4112221174576828331">Om en bild inte har någon användbar beskrivning skapar Chrome en åt dig. Bilden skannas av Google.</translation>
 <translation id="4115002065223188701">Nätverket är utanför räckvidden</translation>
 <translation id="4115080753528843955">I vissa innehållstjänster används unika identifierare i syfte att ge åtkomst till skyddat innehåll</translation>
 <translation id="4118579674665737931">Starta om enheten och försök igen.</translation>
@@ -2660,6 +2663,7 @@
 <translation id="4998873842614926205">Bekräfta ändringar</translation>
 <translation id="5000922062037820727">Blockerad (rekommenderas)</translation>
 <translation id="5004584466530475658"><ph name="FILE_COUNT" /> nya foton</translation>
+<translation id="5008936837313706385">Aktivitetsnamn</translation>
 <translation id="5010043101506446253">Certifikatutfärdare</translation>
 <translation id="5010406651457630570">Datorer</translation>
 <translation id="5015344424288992913">Tolkar proxy...</translation>
@@ -2991,6 +2995,7 @@
 <translation id="5507756662695126555">Ej avvisande</translation>
 <translation id="5509693895992845810">Spara so&amp;m...</translation>
 <translation id="5509914365760201064">Utfärdare: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">Hämta bildbeskrivningar från Google</translation>
 <translation id="5511379779384092781">Extra liten</translation>
 <translation id="5511823366942919280">Vill du ställa in enheten som en Shark?</translation>
 <translation id="5512653252560939721">Användarcertifikat måste vara maskinvarustödda.</translation>
@@ -3417,7 +3422,6 @@
 <translation id="6103681770816982672">Varning: du byter till utvecklingskanalen</translation>
 <translation id="6104068876731806426">Google Konton</translation>
 <translation id="6104311680260824317">Det gick inte att ansluta enheten till domänen. Servern har inte stöd för de angivna typerna av Kerberos-kryptering. Inställningarna för kryptering finns under Fler alternativ.</translation>
-<translation id="6105877918873366097">Senast öppnad</translation>
 <translation id="6107012941649240045">Utfärdat till</translation>
 <translation id="6112294629795967147">Ändra storlek genom att trycka</translation>
 <translation id="6112931163620622315">Kontrollera mobilen</translation>
@@ -3573,6 +3577,7 @@
 <translation id="6341850831632289108">Identifiera din fysiska plats</translation>
 <translation id="6344170822609224263">Få åtkomst till en lista med nätverksanslutningar</translation>
 <translation id="6346310558342052870">Begränsad åtkomst</translation>
+<translation id="6349101878882523185">Installera <ph name="APP_NAME" /></translation>
 <translation id="6349170655202535379">Det går inte att synkronisera. Testa att logga ut och logga in igen.</translation>
 <translation id="6351063337294363751">Du kan rensa webbinformation från den här menyn</translation>
 <translation id="6352773953037195952">Högsta</translation>
@@ -3990,6 +3995,7 @@
 <translation id="6990081529015358884">Du har slut på utrymme</translation>
 <translation id="6990778048354947307">Mörkt tema</translation>
 <translation id="6991665348624301627">Välj en plats</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> – aktivitetslogg</translation>
 <translation id="6997707937646349884">Gör så här på dina enheter:</translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> mappar har valts</translation>
 <translation id="6998793565256476099">Registrera enheten för videokonferenser</translation>
@@ -4193,7 +4199,6 @@
 <translation id="7289225569524511578">Öppna bakgrundsappen</translation>
 <translation id="7290242001003353852">Inloggningstjänsten som tillhandahålls av <ph name="SAML_DOMAIN" /> använder din kamera.</translation>
 <translation id="7290594223351252791">Bekräfta registrering</translation>
-<translation id="7292696521213967957">Felsökningsinformation för assistenten</translation>
 <translation id="7295662345261934369">Dela med andra</translation>
 <translation id="729583233778673644">Tillåt AES- och RC4-kryptering. Det här alternativet är mer riskabelt eftersom RC4-chiffer är osäkra.</translation>
 <translation id="7296774163727375165">Villkor för <ph name="DOMAIN" /></translation>
@@ -4292,6 +4297,7 @@
 <translation id="7456142309650173560">utvecklare</translation>
 <translation id="7456847797759667638">Öppna plats...</translation>
 <translation id="7461924472993315131">Fäst</translation>
+<translation id="746216226901520237">Nästa gång låser mobilen upp din <ph name="DEVICE_TYPE" />. Du kan inaktivera Smart Lock i inställningarna.</translation>
 <translation id="7463006580194749499">Lägg till person</translation>
 <translation id="7465778193084373987">Återkallandeadress för Netscape-certifikat</translation>
 <translation id="7469894403370665791">Anslut automatiskt till det här nätverket.</translation>
@@ -4370,6 +4376,7 @@
 <translation id="7580671184200851182">Spela samma ljud i alla högtalare (monoljud)</translation>
 <translation id="7581462281756524039">Ett rensningsverktyg</translation>
 <translation id="7582582252461552277">Föredra det här nätverket</translation>
+<translation id="7583948862126372804">Antal</translation>
 <translation id="7586498138629385861">Chrome fortsätter köras när Chrome-appar är öppna.</translation>
 <translation id="7589461650300748890">Ta det försiktigt.</translation>
 <translation id="7589661784326793847">Ett ögonblick</translation>
@@ -5481,6 +5488,7 @@
 <translation id="93393615658292258">Endast lösenord</translation>
 <translation id="934503638756687833">Även objekt som inte står med här tas bort om det behövs. Läs mer om &lt;a href="<ph name="URL" />"&gt;skydd mot oönskad programvara&lt;/a&gt; i vitboken om sekretess och Chrome.</translation>
 <translation id="935490618240037774">Bokmärken, historik, lösenord och andra inställningar synkroniseras med ditt Google-konto så att du kan använda dem på alla enheter.</translation>
+<translation id="935854577147268200">Smart Lock används med en annan mobil än tidigare. Ange lösenordet och uppdatera Smart Lock. Nästa gång låser mobilen upp denna <ph name="DEVICE_TYPE" />. Du kan inaktivera Smart Lock i inställningarna</translation>
 <translation id="936801553271523408">Systemets diagnostikresultat</translation>
 <translation id="93766956588638423">Reparera tillägg</translation>
 <translation id="938339467127511841">Lagringsutrymme för Linux (beta)</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 9c49aa8..97f0effd 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1004,7 +1004,7 @@
 <translation id="2484959914739448251">Ili ufute data ya kuvinjari kwenye vifaa vyako vyote vilivyosawazishwa na Akaunti yako ya Google, <ph name="BEGIN_LINK" />weka kauli yako ya siri<ph name="END_LINK" />.</translation>
 <translation id="2485422356828889247">Ondoa</translation>
 <translation id="2487067538648443797">Ongeza alamisho mpya</translation>
-<translation id="2489829450872380594">Wakati ujao, simu yako itafungua <ph name="DEVICE_TYPE" /> hii. Unaweza kuzima Smart Lock katika Mipangilio.</translation>
+<translation id="2489829450872380594">Wakati ujao, simu mpya itafungua <ph name="DEVICE_TYPE" /> hii. Unaweza kuzima Smart Lock katika Mipangilio.</translation>
 <translation id="2489918096470125693">Ongeza &amp;Folda...</translation>
 <translation id="249113932447298600">Samahani, kifaa <ph name="DEVICE_LABEL" /> hakihimiliwi kwa wakati huu.</translation>
 <translation id="249303669840926644">Haikuweza kukamilisha usajili</translation>
@@ -3414,7 +3414,6 @@
 <translation id="6103681770816982672">Onyo: unabadilisha kwenda kituo cha msanidi programu</translation>
 <translation id="6104068876731806426">Akaunti za Google</translation>
 <translation id="6104311680260824317">Imeshindwa kuunganisha kifaa kwenye kikoa. Seva haitumii aina zilizobainishwa za usimbaji fiche wa Kerberos. Angalia "Chaguo zaidi" ili upate mipangilio ya usimbaji fiche.</translation>
-<translation id="6105877918873366097">Ilifikiwa mwisho</translation>
 <translation id="6107012941649240045">Kimetolewa Kwa</translation>
 <translation id="6112294629795967147">Gusa ili ubadilishe ukubwa</translation>
 <translation id="6112931163620622315">Angalia simu yako</translation>
@@ -4192,7 +4191,6 @@
 <translation id="7289225569524511578">Fungua programu ya mandhari</translation>
 <translation id="7290242001003353852">Huduma hii ya kuingia katika akaunti, inayopangishwa na <ph name="SAML_DOMAIN" />, ina idhini ya kufikia kamera yako.</translation>
 <translation id="7290594223351252791">Thibitisha usajili</translation>
-<translation id="7292696521213967957">Maelezo ya kusaidia kutatua programu ya Mratibu</translation>
 <translation id="7295662345261934369">Shiriki na wengine</translation>
 <translation id="729583233778673644">Ruhusu usimbaji wa AES na RC4. Kutumia chaguo hili huongeza uwezekano wa hatari, kwa kuwa misimbo ya RC45 si salama.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> Masharti</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index b42677f3..5998e0d 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1007,6 +1007,7 @@
 <translation id="2484959914739448251">உங்கள் ஒத்திசைக்கப்பட்ட சாதனங்கள் அனைத்திலிருந்தும் Google கணக்கிலிருந்தும் உலாவல் தரவை முழுமையாக அழிக்க, <ph name="BEGIN_LINK" />உங்கள் கடவுச்சொற்றொடரை உள்ளிடவும்<ph name="END_LINK" />.</translation>
 <translation id="2485422356828889247">நிறுவல் நீக்கு</translation>
 <translation id="2487067538648443797">புதிய புத்தகக்குறியைச் சேர்</translation>
+<translation id="2489829450872380594">அடுத்த முறை, இந்த <ph name="DEVICE_TYPE" />ஐ புதிய ஃபோன் திறக்கும். அமைப்புகளில் Smart Lockகை முடக்கலாம்.</translation>
 <translation id="2489918096470125693">&amp;கோப்புறையைச் சேர்...</translation>
 <translation id="249113932447298600">இந்த நேரத்தில் <ph name="DEVICE_LABEL" /> சாதனத்தை ஆதரிக்க முடியவில்லை. மன்னிக்கவும்.</translation>
 <translation id="249303669840926644">பதிவுசெய்தலை நிறைவுசெய்ய முடியவில்லை</translation>
@@ -1764,6 +1765,7 @@
 <translation id="3627588569887975815">மறை&amp;நிலை சாளரத்தில் இணைப்பைத்திற</translation>
 <translation id="3627671146180677314">Netscape சான்றிதழ் புதுப்பிப்பு நேரம்</translation>
 <translation id="3627879631695760395"><ph name="APP" />ஐ நிறுவு...</translation>
+<translation id="3629631988386925734">Smart Lockகை இயக்க, கடவுச்சொல்லை உள்ளிடவும். அடுத்த முறை <ph name="DEVICE_TYPE" />ஐ உங்கள் மொபைல் திறக்கும். அமைப்புகளில் Smart Lockகை முடக்கலாம்.</translation>
 <translation id="3630132874740063857">உங்கள் ஃபோன்</translation>
 <translation id="3630995161997703415">இந்தத் தளத்தை எந்த நேரத்திலும் பயன்படுத்த அதனை உங்கள் ஷெல்ஃபில் சேர்க்கவும்</translation>
 <translation id="3636096452488277381">நலமா <ph name="USER_GIVEN_NAME" />.</translation>
@@ -2109,6 +2111,7 @@
 <translation id="4109135793348361820"><ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) க்குச் சாளரத்தை நகர்த்து</translation>
 <translation id="4110490973560452005">பதிவிறக்கம் முடிந்தது: <ph name="FILE_NAME" />. பதிவிறக்கங்கள் பட்டிப் பகுதிக்குச் சுழற்ற, Shift+F6 விசைகளை அழுத்தவும்.</translation>
 <translation id="4110895898888439383">அதிக ஒளி மாறுபாட்டுப் பயன்முறையில் இணையத்தில் உலாவுதல்</translation>
+<translation id="4112221174576828331">ஒரு படத்திற்குப் பயனுள்ள விளக்கம் இல்லையென்றால், Chrome உங்களுக்காக அதை வழங்க முயலும். படங்களை Google ஸ்கேன் செய்யும்.</translation>
 <translation id="4115002065223188701">நெட்வொர்க் தொடர்பு எல்லைக்கு வெளியே உள்ளது</translation>
 <translation id="4115080753528843955">பாதுகாக்கப்பட்ட உள்ளடக்கத்திற்கான அணுகலை அங்கீகரிக்கும் நோக்கங்களுக்காக, சில உள்ளடக்கச் சேவைகள் தனித்துவ அடையாளங்காட்டிகளைப் பயன்படுத்துகின்றன</translation>
 <translation id="4118579674665737931">சாதனத்தை மீண்டும் தொடங்கி, அமைக்க முயலவும்.</translation>
@@ -2661,6 +2664,7 @@
 <translation id="4998873842614926205">மாற்றங்களை உறுதிசெய்</translation>
 <translation id="5000922062037820727">தடுக்கப்பட்டது (பரிந்துரைத்தது)</translation>
 <translation id="5004584466530475658"><ph name="FILE_COUNT" /> புதிய படங்கள்</translation>
+<translation id="5008936837313706385">செயல்பாட்டின் பெயர்</translation>
 <translation id="5010043101506446253">சான்றிதழ் அங்கீகாரம்</translation>
 <translation id="5010406651457630570">கம்ப்யூட்டர்கள்</translation>
 <translation id="5015344424288992913">ப்ராக்ஸியைக் கண்டறிகிறது…</translation>
@@ -2992,6 +2996,7 @@
 <translation id="5507756662695126555">மறுக்கப்படாதவை</translation>
 <translation id="5509693895992845810">&amp;இவ்வாறு சேமி...</translation>
 <translation id="5509914365760201064">வழங்குபவர்: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">பட விவரங்களை Googleளிலிருந்து பெறுக</translation>
 <translation id="5511379779384092781">மிகச்சிறியது</translation>
 <translation id="5511823366942919280">"Shark" சாதனமாக, இதை அமைக்க விரும்புகிறீர்களா?</translation>
 <translation id="5512653252560939721">பயனர் சான்றிதழானது வன்பொருளால் பாதுகாக்கப்பட்டதாக இருப்பது அவசியம்.</translation>
@@ -3419,7 +3424,6 @@
 <translation id="6103681770816982672">எச்சரிக்கை: டெவெலப்பர் சேனலுக்கு மாறுகிறீர்கள்</translation>
 <translation id="6104068876731806426">Google கணக்குகள்</translation>
 <translation id="6104311680260824317">சாதனத்தை டொமைனில் சேர்க்க முடியவில்லை. குறிப்பிடப்பட்டுள்ள Kerberos என்க்ரிப்ஷன் வகைகளைச் சேவையகம் ஆதரிக்கவில்லை. என்க்ரிப்ஷன் அமைப்புகளுக்கு, “மேலும் விருப்பங்கள்” என்பதைப் பார்க்கவும்.</translation>
-<translation id="6105877918873366097">கடைசியாக அணுகியது</translation>
 <translation id="6107012941649240045">வழங்கப்பட்டது</translation>
 <translation id="6112294629795967147">அளவை மாற்ற, தொடவும்</translation>
 <translation id="6112931163620622315">மொபைலைப் பார்க்கவும்</translation>
@@ -3575,6 +3579,7 @@
 <translation id="6341850831632289108">உங்கள் நிஜ இருப்பிடத்தைக் கண்டறியலாம்</translation>
 <translation id="6344170822609224263">நெட்வொர்க் இணைப்புகளின் பட்டியலை அணுகு</translation>
 <translation id="6346310558342052870">அணுகல் கட்டுப்படுத்தப்பட்டுள்ளது</translation>
+<translation id="6349101878882523185"><ph name="APP_NAME" /> ஆப்ஸை நிறுவுக</translation>
 <translation id="6349170655202535379">ஒத்திசைவு வேலை செய்யவில்லை. வெளியேறி, மீண்டும் உள்நுழையவும்.</translation>
 <translation id="6351063337294363751">உலாவல் தரவை இந்த மெனுவிலிருந்து அழிக்கலாம்</translation>
 <translation id="6352773953037195952">மிக அதிகமானது</translation>
@@ -3992,6 +3997,7 @@
 <translation id="6990081529015358884">இயக்குவதற்கு போதுமான இடம் இல்லை</translation>
 <translation id="6990778048354947307">அடர்த்தியான தீம்</translation>
 <translation id="6991665348624301627">இலக்கைத் தேர்ந்தெடு</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> - செயல்பாட்டுப் பதிவு</translation>
 <translation id="6997707937646349884">உங்கள் சாதனங்களில்:</translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> கோப்புறைகள் தேர்ந்தெடுக்கப்பட்டன</translation>
 <translation id="6998793565256476099">வீடியோ கலந்துரையாடலுக்கு, சாதனத்தைப் பதிவுசெய்</translation>
@@ -4195,7 +4201,6 @@
 <translation id="7289225569524511578">வால்பேப்பர் பயன்பாட்டைத் திற</translation>
 <translation id="7290242001003353852"><ph name="SAML_DOMAIN" /> ஹோஸ்ட் செய்யும் இந்த உள்நுழைவுச் சேவை உங்கள் கேமராவிற்கான அணுகலைக் கோரியுள்ளது.</translation>
 <translation id="7290594223351252791">பதிவை உறுதிசெய்க</translation>
-<translation id="7292696521213967957">அசிஸ்டண்ட்டைப் பிழைதிருத்துவதற்கான தகவல்</translation>
 <translation id="7295662345261934369">பிறருடன் பகிர்</translation>
 <translation id="729583233778673644">AES மற்றும் RC4 என்க்ரிப்ஷனை அனுமதிக்கும். RC4 சைஃபர்கள் பாதுகாப்பற்றது என்பதால், இந்த விருப்பத்தைப் பயன்படுத்துவது, உங்கள் அபாயத்தை அதிகரிக்கும்.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> விதிமுறைகள்</translation>
@@ -4294,6 +4299,7 @@
 <translation id="7456142309650173560">dev</translation>
 <translation id="7456847797759667638">இருப்பிடத்தைத் திற...</translation>
 <translation id="7461924472993315131">நிலையாக வை</translation>
+<translation id="746216226901520237">அடுத்த முறை, உங்கள் ஃபோன் <ph name="DEVICE_TYPE" />ஐத் திறக்கும். அமைப்புகளில் Smart Lockகை முடக்கலாம்.</translation>
 <translation id="7463006580194749499">நபரைச் சேர்</translation>
 <translation id="7465778193084373987">Netscape சான்றிதழ் தளர்த்தல் URL</translation>
 <translation id="7469894403370665791">இந்த நெட்வொர்க்குடன் தானாகவே இணைக்கவும்</translation>
@@ -4370,6 +4376,7 @@
 <translation id="7580671184200851182">எல்லா ஸ்பீக்கர்களிலும் ஒரே ஆடியோவை இயக்கு (மோனோ ஆடியோ)</translation>
 <translation id="7581462281756524039">சுத்திகரிப்புக் கருவி</translation>
 <translation id="7582582252461552277">இந்த நெட்வொர்க்குக்கு முன்னுரிமை வழங்குக</translation>
+<translation id="7583948862126372804">எண்ணிக்கை</translation>
 <translation id="7586498138629385861">Chrome பயன்பாடுகள் திறக்கப்பட்டிருக்கும்போதும், Chrome தொடர்ந்து இயங்கும்.</translation>
 <translation id="7589461650300748890">கவனமாக இருக்கவும்.</translation>
 <translation id="7589661784326793847">ஒரு வினாடி காத்திருக்கவும்</translation>
@@ -5485,6 +5492,7 @@
 <translation id="93393615658292258">கடவுச்சொல் மட்டும்</translation>
 <translation id="934503638756687833">தேவைப்பட்டால், இங்கே பட்டியலிடப்படாத உருப்படிகளும் அகற்றப்படும். Chrome தனியுரிமைத் தகவல் கையேட்டில் &lt;a href="<ph name="URL" />"&gt;தேவையற்ற மென்பொருளிலிருந்து பாதுகாப்பு&lt;/a&gt; பற்றி மேலும் அறிக.</translation>
 <translation id="935490618240037774">புக்மார்க்குகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகள் உங்கள் Google கணக்குடன் ஒத்திசைக்கப்படும் என்பதால் அவற்றை எல்லா சாதனங்களிலும் பயன்படுத்தலாம்.</translation>
+<translation id="935854577147268200">Smart Lock மொபைல் மாற்றப்பட்டது. Smart Lockகைப் புதுப்பிக்க, கடவுச்சொல்லை உள்ளிடவும். அடுத்த முறை, உங்கள் மொபைலானது சாதனத்தைத் <ph name="DEVICE_TYPE" /> திறக்கும். அமைப்புகளுக்குச் சென்று, Smart Lockகை முடக்கலாம்</translation>
 <translation id="936801553271523408">முறைமை பகுப்பாய்வு தரவு</translation>
 <translation id="93766956588638423">நீட்டிப்பைப் பழுதுநீக்கு</translation>
 <translation id="938339467127511841">Linux (பீட்டா) சேமிப்பகம்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 59b35a74..7c44c21 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -1007,6 +1007,7 @@
 <translation id="2484959914739448251">మీ అన్ని సమకాలీకరించబడుతున్న పరికరాలతో సహా, మీ Google ఖాతా నుండి బ్రౌజింగ్ డేటాను తీసివేయడానికి, <ph name="BEGIN_LINK" />మీ రహస్య పదబంధాన్ని నమోదు చేయండి<ph name="END_LINK" />.</translation>
 <translation id="2485422356828889247">అన్ఇన్‌స్టాల్ చేయి</translation>
 <translation id="2487067538648443797">కొత్త బుక్‌మార్క్‌ను జోడించు</translation>
+<translation id="2489829450872380594">తర్వాతసారి, ఈ <ph name="DEVICE_TYPE" />ని కొత్త ఫోన్ అన్‌లాక్ చేస్తుంది. మీరు సెట్టింగ్‌లలో స్మార్ట్ లాక్‌ని ఆఫ్ చేయవచ్చు.</translation>
 <translation id="2489918096470125693">&amp;ఫోల్డర్‌ను జోడించు...</translation>
 <translation id="249113932447298600">క్షమించండి, ఈ సమయంలో <ph name="DEVICE_LABEL" /> పరికరానికి మద్దతు లేదు.</translation>
 <translation id="249303669840926644">నమోదు పూర్తి చేయడం కుదరలేదు</translation>
@@ -1764,6 +1765,7 @@
 <translation id="3627588569887975815">అ&amp;జ్ఞాత విండోలో లింక్‌ను తెరువు</translation>
 <translation id="3627671146180677314">Netscape సర్టిఫికెట్ పునరుద్ధరణ సమయం</translation>
 <translation id="3627879631695760395"><ph name="APP" />ను ఇన్‌స్టాల్ చేయి...</translation>
+<translation id="3629631988386925734">Smart Lockని ప్రారంభించడానికి మీ పాస్‌వర్డ్‌‌ను నమోదు చేయండి. తదుపరిసారి, మీ ఫోన్ మీ <ph name="DEVICE_TYPE" />ని అన్‌లాక్ చేస్తుంది. సెట్టింగ్‌లలో మీరు Smart Lockని ఆఫ్ చేయవచ్చు.</translation>
 <translation id="3630132874740063857">మీ ఫోన్</translation>
 <translation id="3630995161997703415">ఈ సైట్‌ను ఏ సమయంలో అయినా ఉపయోగించడం కోసం దీనిని మీ 'అర'కు జోడించండి</translation>
 <translation id="3636096452488277381">హాయ్, <ph name="USER_GIVEN_NAME" />.</translation>
@@ -2109,6 +2111,7 @@
 <translation id="4109135793348361820">విండోను <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)కి తరలించండి</translation>
 <translation id="4110490973560452005">డౌన్‌లోడ్ పూర్తయింది: <ph name="FILE_NAME" />. డౌన్‌లోడ్‌ల బార్ ప్రాంతంలోకి వెళ్లడం కోసం Shift+F6 నొక్కండి.</translation>
 <translation id="4110895898888439383">అధిక కాంట్రాస్ట్ మోడ్‌లో వెబ్‌ను బ్రౌజ్ చేయండి</translation>
+<translation id="4112221174576828331">చిత్రంలో ఉపయోగకరమైన వివరణ లేకుంటే, మీ కోసం వివరణను అందించడానికి Chrome ప్రయత్నిస్తుంది. చిత్రాలు Google ద్వారా స్కాన్ చేయబడతాయి.</translation>
 <translation id="4115002065223188701">నెట్‌వర్క్ అందుబాటులో లేదు</translation>
 <translation id="4115080753528843955">రక్షిత కంటెంట్‌కు యాక్సెస్‌ను ప్రామాణీకరించే ప్రయోజనాల కోసం కొన్ని కంటెంట్ సేవలు ప్రత్యేక ఐడెంటిఫైయర్‌లను ఉపయోగిస్తాయి</translation>
 <translation id="4118579674665737931">దయచేసి పరికరాన్ని రీబూట్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
@@ -2661,6 +2664,7 @@
 <translation id="4998873842614926205">మార్పులను నిర్ధారించు</translation>
 <translation id="5000922062037820727">బ్లాక్ చేయబడింది (సిఫార్సు చేయబడింది)</translation>
 <translation id="5004584466530475658"><ph name="FILE_COUNT" /> కొత్త ఫోటోలు</translation>
+<translation id="5008936837313706385">కార్యకలాపం పేరు</translation>
 <translation id="5010043101506446253">ప్రమాణపత్ర అధికారం</translation>
 <translation id="5010406651457630570">కంప్యూటర్‌లు</translation>
 <translation id="5015344424288992913">ప్రాక్సీని పరిష్కరిస్తోంది...</translation>
@@ -2992,6 +2996,7 @@
 <translation id="5507756662695126555">అంగీకరించడం</translation>
 <translation id="5509693895992845810">&amp;ఇలా సేవ్ చేయి...</translation>
 <translation id="5509914365760201064">జారీచేసినవారు: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">Google నుండి చిత్ర వివరణలను పొందండి</translation>
 <translation id="5511379779384092781">అతి చిన్నది</translation>
 <translation id="5511823366942919280">మీరు ఖచ్చితంగా ఈ పరికరాన్ని "షార్క్"గా సెటప్ చేయాలని అనుకుంటున్నారా?</translation>
 <translation id="5512653252560939721">వినియోగదారు సర్టిఫికెట్ ఖచ్చితంగా హార్డ్‌వేర్-బ్యాకెడ్ అయి ఉండాలి.</translation>
@@ -3418,7 +3423,6 @@
 <translation id="6103681770816982672">హెచ్చరిక: మీరు డెవలపర్ ఛానెల్‌కు మారుతున్నారు</translation>
 <translation id="6104068876731806426">Google ఖాతాలు</translation>
 <translation id="6104311680260824317">పరికరాన్ని డొమైన్‌కు చేర్చడం సాధ్యపడలేదు. పేర్కొనబడిన Kerberos ఎన్‌క్రిప్షన్ రకాలకు ఈ సర్వర్ మద్దతు ఇవ్వదు. ఎన్‌క్రిప్షన్ సెట్టింగ్‌ల కోసం "మరిన్ని ఎంపికలు" చూడండి.</translation>
-<translation id="6105877918873366097">చివరిగా ప్రాప్యత చేసిన తేదీ</translation>
 <translation id="6107012941649240045">వీరికి జారీ చేయబడింది</translation>
 <translation id="6112294629795967147">పరిమాణం మార్చడం కోసం తాకండి</translation>
 <translation id="6112931163620622315">మీ ఫోన్‌ని తనిఖీ చేయండి</translation>
@@ -3574,6 +3578,7 @@
 <translation id="6341850831632289108">మీ భౌతిక స్థానాన్ని గుర్తించండి</translation>
 <translation id="6344170822609224263">నెట్‌వర్క్ కనెక్షన్‌ల జాబితాను యాక్సెస్ చేయండి</translation>
 <translation id="6346310558342052870">యాక్సెస్ నియంత్రించబడింది</translation>
+<translation id="6349101878882523185"><ph name="APP_NAME" />ని ఇన్‌స్టాల్ చేయండి</translation>
 <translation id="6349170655202535379">సింక్‌ పని చేయడం లేదు. సైన్ అవుట్ చేసి, తిరిగి మళ్లీ సైన్ ఇన్ చేయండి.</translation>
 <translation id="6351063337294363751">మీరు ఈ మెనూ నుండి మీ బ్రౌజింగ్ డేటాను తీసివేయవచ్చు</translation>
 <translation id="6352773953037195952">అత్యధికం</translation>
@@ -3991,6 +3996,7 @@
 <translation id="6990081529015358884">మీకు ఖాళీ స్థలం లేదు</translation>
 <translation id="6990778048354947307">ముదురు థీమ్</translation>
 <translation id="6991665348624301627">గమ్యస్థానాన్ని ఎంచుకోండి</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> - కార్యకలాపం లాగ్</translation>
 <translation id="6997707937646349884">మీ పరికరాలలో:</translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> ఫోల్డర్‌లు ఎంచుకోబడ్డాయి</translation>
 <translation id="6998793565256476099">వీడియో సమావేశం కోసం పరికరాన్ని నమోదు చేయండి</translation>
@@ -4194,7 +4200,6 @@
 <translation id="7289225569524511578">వాల్‌పేపర్ యాప్‌ను తెరువు</translation>
 <translation id="7290242001003353852"><ph name="SAML_DOMAIN" /> హోస్ట్ చేసిన ఈ సైన్-ఇన్ సేవ, మీ కెమెరాను యాక్సెస్ చేస్తోంది.</translation>
 <translation id="7290594223351252791">నమోదుని నిర్ధారించండి</translation>
-<translation id="7292696521213967957">అసిస్టెంట్‌ని డీబగ్ చేయడానికి సమాచారం</translation>
 <translation id="7295662345261934369">ఇతరులతో భాగస్వామ్యం చేయి</translation>
 <translation id="729583233778673644">AES మరియు RC4 ఎన్‌క్రిప్షన్‌ను అనుమతించండి. ఈ ఎంపికను ఉపయోగించడం వలన RC4 సైఫర్‌లు అసురక్షితమైనవి కాబట్టి మీకు హాని పెరుగుతుంది.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> నిబంధనలు</translation>
@@ -4293,6 +4298,7 @@
 <translation id="7456142309650173560">డెవలపర్</translation>
 <translation id="7456847797759667638">స్థానాన్ని తెరువు...</translation>
 <translation id="7461924472993315131">పిన్ చేయి</translation>
+<translation id="746216226901520237">తదుపరిసారి మీ ఫోన్ మీ <ph name="DEVICE_TYPE" />ని అన్‌లాక్ చేస్తుంది. మీరు సెట్టింగ్‌లలో Smart Lockని ఆఫ్ చేయవచ్చు.</translation>
 <translation id="7463006580194749499">వ్యక్తిని జోడించు</translation>
 <translation id="7465778193084373987">Netscape సర్టిఫికెట్ రద్దు URL</translation>
 <translation id="7469894403370665791">ఆటోమేటిక్‌గా ఈ నెట్‌వర్క్‌కు కనెక్ట్ చేయి</translation>
@@ -4371,6 +4377,7 @@
 <translation id="7580671184200851182">అన్ని స్పీకర్‌ల్లో ఒకే ఆడియోను ప్లే చేయి (మోనో ఆడియో)</translation>
 <translation id="7581462281756524039">క్లీన్‌అప్ సాధనం</translation>
 <translation id="7582582252461552277">ఈ నెట్‌వర్క్‌ను ప్రాధాన్యపరచు</translation>
+<translation id="7583948862126372804">గణన</translation>
 <translation id="7586498138629385861">Chrome యాప్‌లు తెరవబడి ఉన్నప్పుడు Chrome నిరంతరాయంగా అమలులో ఉంటుంది.</translation>
 <translation id="7589461650300748890">అయ్యో, అక్కడ. జాగ్రత్తగా ఉండండి.</translation>
 <translation id="7589661784326793847">ఒక క్షణం వేచి ఉండండి</translation>
@@ -5479,6 +5486,7 @@
 <translation id="93393615658292258">పాస్‌వర్డ్ మాత్రమే</translation>
 <translation id="934503638756687833">అవసరమైతే ఇక్కడ జాబితా చేయబడని అంశాలను కూడా తీసివేయవచ్చు. Chrome గోప్యత విధాన పత్రంలో &lt;a href="<ph name="URL" />"&gt;అవాంఛిత సాఫ్ట్‌వేర్ రక్షణ&lt;/a&gt; గురించి మరింత తెలుసుకోండి.</translation>
 <translation id="935490618240037774">మీ బుక్‌మార్క్‌లు, చరిత్ర, పాస్‌వర్డ్‌లు, ఇతర సెట్టింగ్‌లు మీ Google ఖాతాకు సింక్ చేయ‌బడతాయి. కాబ‌ట్టి మీరు వీటిని మీ అన్ని పరికరాల్లో ఉపయోగించవచ్చు.</translation>
+<translation id="935854577147268200">Smart Lock ఫోన్ మారింది. Smart Lockను అప్‌డేట్ చేయడానికి మీ పాస్‌వర్డ్‌ను నమోదు చేయండి. తదుపరిసారి, మీ ఫోన్ మీ <ph name="DEVICE_TYPE" />ను అన్‌లాక్ చేస్తుంది. మీరు సెట్టింగ్‌లలో Smart Lockను ఆఫ్ చేయవచ్చు</translation>
 <translation id="936801553271523408">సిస్టమ్ విశ్లేషణ డేటా</translation>
 <translation id="93766956588638423">పొడిగింపును సరి చేయి</translation>
 <translation id="938339467127511841">Linux (బీటా) నిల్వ</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 8f6cac3..cdf635b4 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1007,6 +1007,7 @@
 <translation id="2484959914739448251"><ph name="BEGIN_LINK" />ป้อนรหัสผ่าน<ph name="END_LINK" />เพื่อล้างข้อมูลการท่องเว็บในอุปกรณ์ทุกเครื่องที่ซิงค์และบัญชี Google</translation>
 <translation id="2485422356828889247">ถอนการติดตั้ง</translation>
 <translation id="2487067538648443797">เพิ่มบุ๊กมาร์กใหม่</translation>
+<translation id="2489829450872380594">โทรศัพท์เครื่องใหม่จะปลดล็อก <ph name="DEVICE_TYPE" /> เครื่องนี้ในครั้งถัดไป คุณปิด Smart Lock ได้ในการตั้งค่า</translation>
 <translation id="2489918096470125693">เพิ่ม&amp;โฟลเดอร์...</translation>
 <translation id="249113932447298600">ขออภัย อุปกรณ์ <ph name="DEVICE_LABEL" /> ไม่ได้รับการสนับสนุนในขณะนี้</translation>
 <translation id="249303669840926644">ไม่สามารถลงทะเบียนให้เสร็จสมบูรณ์ได้</translation>
@@ -1764,6 +1765,7 @@
 <translation id="3627588569887975815">เปิดลิงก์ในหน้าต่าง&amp;ที่ไม่เก็บในประวัติ</translation>
 <translation id="3627671146180677314">เวลาการต่ออายุใบรับรองของ Netscape</translation>
 <translation id="3627879631695760395">ติดตั้ง <ph name="APP" />...</translation>
+<translation id="3629631988386925734">ป้อนรหัสผ่านเพื่อเปิดใช้ Smart Lock โทรศัพท์จะปลดล็อก <ph name="DEVICE_TYPE" /> ของคุณในครั้งถัดไป คุณปิด Smart Lock ได้ในการตั้งค่า</translation>
 <translation id="3630132874740063857">โทรศัพท์ของคุณ</translation>
 <translation id="3630995161997703415">เพิ่มเว็บไซต์นี้ลงในชั้นวางเพื่อใช้งานได้ทุกเมื่อ</translation>
 <translation id="3636096452488277381">สวัสดี <ph name="USER_GIVEN_NAME" /></translation>
@@ -2109,6 +2111,7 @@
 <translation id="4109135793348361820">ย้ายหน้าต่างไปยัง <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110490973560452005">ดาวน์โหลดเสร็จสมบูรณ์: <ph name="FILE_NAME" /> กด Shift+F6 เพื่อวนกลับไปยังบริเวณแถบดาวน์โหลด</translation>
 <translation id="4110895898888439383">ท่องเว็บในโหมดคอนทราสต์สูง</translation>
+<translation id="4112221174576828331">หากรูปภาพไม่มีคำอธิบายที่เป็นประโยชน์ Chrome จะใส่คำอธิบายให้คุณ รูปภาพจะได้รับการสแกนโดย Google</translation>
 <translation id="4115002065223188701">เครือข่ายอยู่นอกช่วงสัญญาณ</translation>
 <translation id="4115080753528843955">บริการเนื้อหาบางอย่างใช้ตัวระบุที่ไม่ซ้ำกันเพื่อการให้สิทธิ์เข้าถึงเนื้อหาที่มีการป้องกัน</translation>
 <translation id="4118579674665737931">โปรดเริ่มต้นอุปกรณ์ใหม่และลองอีกครั้ง</translation>
@@ -2661,6 +2664,7 @@
 <translation id="4998873842614926205">ยืนยันการเปลี่ยนแปลง</translation>
 <translation id="5000922062037820727">ถูกบล็อก (แนะนำ)</translation>
 <translation id="5004584466530475658">รูปภาพใหม่ <ph name="FILE_COUNT" /> รูป</translation>
+<translation id="5008936837313706385">ชื่อกิจกรรม</translation>
 <translation id="5010043101506446253">ผู้ออกใบรับรอง</translation>
 <translation id="5010406651457630570">คอมพิวเตอร์</translation>
 <translation id="5015344424288992913">กำลังแปลงพร็อกซี...</translation>
@@ -2992,6 +2996,7 @@
 <translation id="5507756662695126555">การป้องกันการปฏิเสธความรับผิดชอบต่อข้อมูล</translation>
 <translation id="5509693895992845810">บันทึกเ&amp;ป็น...</translation>
 <translation id="5509914365760201064">ผู้ออก: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">รับคำอธิบายรูปภาพจาก Google</translation>
 <translation id="5511379779384092781">เล็กพิเศษ</translation>
 <translation id="5511823366942919280">คุณแน่ใจไหมว่าต้องการตั้งค่าอุปกรณ์นี้เป็น "Shark"</translation>
 <translation id="5512653252560939721">ใบรับรองผู้ใช้ต้องได้รับการสนับสนุนฮาร์ดแวร์</translation>
@@ -3418,7 +3423,6 @@
 <translation id="6103681770816982672">คำเตือน: คุณกำลังเปลี่ยนเป็นช่องนักพัฒนาซอฟต์แวร์</translation>
 <translation id="6104068876731806426">บัญชี Google</translation>
 <translation id="6104311680260824317">นำอุปกรณ์เข้าร่วมโดเมนไม่ได้ เซิร์ฟเวอร์ไม่รองรับประเภทการเข้ารหัส Kerberos ที่ระบุ ดูการตั้งค่าการเข้ารหัสได้จาก "ตัวเลือกเพิ่มเติม"</translation>
-<translation id="6105877918873366097">เข้าถึงครั้งสุดท้าย</translation>
 <translation id="6107012941649240045">ออกให้แก่</translation>
 <translation id="6112294629795967147">แตะเพื่อปรับขนาด</translation>
 <translation id="6112931163620622315">ตรวจสอบโทรศัพท์</translation>
@@ -3574,6 +3578,7 @@
 <translation id="6341850831632289108">ตรวจหาตำแหน่งทางกายภาพของคุณ</translation>
 <translation id="6344170822609224263">เข้าถึงรายการเชื่อมต่อเครือข่าย</translation>
 <translation id="6346310558342052870">จำกัดสิทธิ์เข้าถึง</translation>
+<translation id="6349101878882523185">ติดตั้ง <ph name="APP_NAME" /></translation>
 <translation id="6349170655202535379">การซิงค์ไม่ทำงาน ลองออกจากระบบแล้วลงชื่อเข้าใช้อีกครั้ง</translation>
 <translation id="6351063337294363751">คุณสามารถล้างข้อมูลการท่องเว็บจากเมนูนี้ได้</translation>
 <translation id="6352773953037195952">สูงสุด</translation>
@@ -3991,6 +3996,7 @@
 <translation id="6990081529015358884">คุณไม่มีพื้นที่เหลือแล้ว</translation>
 <translation id="6990778048354947307">ธีมสีเข้ม</translation>
 <translation id="6991665348624301627">เลือกปลายทาง</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> - บันทึกกิจกรรม</translation>
 <translation id="6997707937646349884">บนอุปกรณ์ของคุณ:</translation>
 <translation id="6998711733709403587">เลือก <ph name="SELCTED_FOLDERS_COUNT" /> โฟลเดอร์</translation>
 <translation id="6998793565256476099">ลงทะเบียนอุปกรณ์สำหรับการประชุมทางวิดีโอ</translation>
@@ -4194,7 +4200,6 @@
 <translation id="7289225569524511578">เปิดแอปวอลล์เปเปอร์</translation>
 <translation id="7290242001003353852">บริการลงชื่อเข้าใช้ที่โฮสต์โดย <ph name="SAML_DOMAIN" /> กำลังเข้าถึงกล้องถ่ายรูปของคุณ</translation>
 <translation id="7290594223351252791">ยืนยันการลงทะเบียน</translation>
-<translation id="7292696521213967957">ข้อมูลสำหรับการแก้ไขข้อบกพร่องของ Assistant</translation>
 <translation id="7295662345261934369">แชร์กับคนอื่นๆ</translation>
 <translation id="729583233778673644">อนุญาตการเข้ารหัส AES และ RC4 การใช้ตัวเลือกนี้เป็นการเพิ่มความเสี่ยงเนื่องจากการเข้ารหัส RC4 นั้นไม่ปลอดภัย</translation>
 <translation id="7296774163727375165">ข้อกำหนดของ <ph name="DOMAIN" /></translation>
@@ -4293,6 +4298,7 @@
 <translation id="7456142309650173560">การพัฒนา</translation>
 <translation id="7456847797759667638">เปิดตำแหน่ง...</translation>
 <translation id="7461924472993315131">ตรึง</translation>
+<translation id="746216226901520237">โทรศัพท์จะปลดล็อก <ph name="DEVICE_TYPE" /> ของคุณในครั้งถัดไป คุณปิด Smart Lock ได้ในการตั้งค่า</translation>
 <translation id="7463006580194749499">เพิ่มบุคคล</translation>
 <translation id="7465778193084373987">URL การเพิกถอนใบรับรองของ Netscape</translation>
 <translation id="7469894403370665791">เชื่อมต่อกับเครือข่ายนี้อัตโนมัติ</translation>
@@ -4371,6 +4377,7 @@
 <translation id="7580671184200851182">เล่นเสียงเหมือนกันผ่านลำโพงทุกตัว (เสียงโมโน)</translation>
 <translation id="7581462281756524039">เครื่องมือทำความสะอาด</translation>
 <translation id="7582582252461552277">ต้องการใช้เครือข่ายนี้</translation>
+<translation id="7583948862126372804">จำนวน</translation>
 <translation id="7586498138629385861">Chrome จะยังคงทำงานต่อไปขณะที่แอปของ Chrome เปิดอยู่</translation>
 <translation id="7589461650300748890">อ๊ะ โปรดระวัง</translation>
 <translation id="7589661784326793847">รอสักครู่</translation>
@@ -5482,6 +5489,7 @@
 <translation id="93393615658292258">เฉพาะรหัสผ่านเท่านั้น</translation>
 <translation id="934503638756687833">หากจำเป็น ระบบจะนำรายการที่ไม่ได้แสดงไว้ที่นี่ออกด้วย ดูข้อมูลเพิ่มเติมเกี่ยวกับ&lt;a href="<ph name="URL" />"&gt;การป้องกันซอฟต์แวร์ไม่พึงประสงค์&lt;/a&gt;ในสมุดปกขาวเกี่ยวกับความเป็นส่วนตัวของ Chrome</translation>
 <translation id="935490618240037774">บุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ จะซิงค์กับบัญชี Google เพื่อให้คุณสามารถใช้ข้อมูลเหล่านี้ได้กับอุปกรณ์ทุกเครื่อง</translation>
+<translation id="935854577147268200">เปลี่ยนโทรศัพท์ที่เปิด Smart Lock แล้ว โปรดป้อนรหัสผ่านเพื่ออัปเดต Smart Lock โทรศัพท์จะปลดล็อก <ph name="DEVICE_TYPE" /> ของคุณในครั้งถัดไป คุณปิด Smart Lock ได้ในการตั้งค่า</translation>
 <translation id="936801553271523408">ข้อมูลวินิจฉัยระบบ</translation>
 <translation id="93766956588638423">ซ่อมส่วนขยาย</translation>
 <translation id="938339467127511841">พื้นที่เก็บข้อมูล Linux (เบต้า)</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index ee9bf2fa..4281a6c 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -1007,6 +1007,7 @@
 <translation id="2484959914739448251">Tarama verilerini senkronize edilmiş tüm cihazlarınızdan ve Google Hesabınızdan temizlemek için <ph name="BEGIN_LINK" />parolanızı girin<ph name="END_LINK" />.</translation>
 <translation id="2485422356828889247">Yüklemeyi Kaldır</translation>
 <translation id="2487067538648443797">Yeni yer işareti ekle</translation>
+<translation id="2489829450872380594">Bir dahaki sefere yeni bir telefon kullanarak bu <ph name="DEVICE_TYPE" /> cihazın kilidini açabilirsiniz. Smart Lock'u Ayarlar'dan kapatabilirsiniz.</translation>
 <translation id="2489918096470125693">&amp;Klasör Ekle...</translation>
 <translation id="249113932447298600">Maalesef, <ph name="DEVICE_LABEL" /> cihazı şu anda desteklenmiyor.</translation>
 <translation id="249303669840926644">Kayıt işlemi tamamlanamadı</translation>
@@ -1764,6 +1765,7 @@
 <translation id="3627588569887975815">&amp;Bağlantıyı gizli pencerede aç</translation>
 <translation id="3627671146180677314">Netscape Sertifikası Yenileme Zamanı</translation>
 <translation id="3627879631695760395"><ph name="APP" /> Uygulamasını Yükle...</translation>
+<translation id="3629631988386925734">Smart Lock'u açmak için şifrenizi girin. Böylece, bir dahaki sefere telefonunuzu kullanarak <ph name="DEVICE_TYPE" /> cihazınızın kilidini açabilirsiniz. Ayarlar'dan Smart Lock'u kapatabilirsiniz.</translation>
 <translation id="3630132874740063857">Telefonunuz</translation>
 <translation id="3630995161997703415">Bu siteyi istediğiniz zaman kullanmak için rafınıza ekleyin</translation>
 <translation id="3636096452488277381">Merhaba <ph name="USER_GIVEN_NAME" />.</translation>
@@ -2109,6 +2111,7 @@
 <translation id="4109135793348361820">Pencereyi <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) kullanıcısına taşı</translation>
 <translation id="4110490973560452005">İndirme işlemi tamamlandı: <ph name="FILE_NAME" />. İndirme çubuğu alanına gitmek için Üst Karakter+F6 tuşlarına basın.</translation>
 <translation id="4110895898888439383">Web'e yüksek karşıtlık modunda göz atın</translation>
+<translation id="4112221174576828331">Bir resmin işe yarar bir açıklaması yoksa, Chrome sizin için bir açıklama sağlar. Resimler Google tarafından taranır.</translation>
 <translation id="4115002065223188701">Ağ, kapsama alanı dışında</translation>
 <translation id="4115080753528843955">Bazı içerik hizmetleri, korumalı içeriğe erişimi yetkilendirmek amacıyla benzersiz tanımlayıcılar kullanır</translation>
 <translation id="4118579674665737931">Lütfen cihazı yeniden başlatın ve tekrar deneyin.</translation>
@@ -2661,6 +2664,7 @@
 <translation id="4998873842614926205">Değişiklikleri Onayla</translation>
 <translation id="5000922062037820727">Engellendi (önerilir)</translation>
 <translation id="5004584466530475658"><ph name="FILE_COUNT" /> yeni fotoğraf</translation>
+<translation id="5008936837313706385">Aktivite Adı</translation>
 <translation id="5010043101506446253">Sertifika yetkilisi</translation>
 <translation id="5010406651457630570">Bilgisayarlar</translation>
 <translation id="5015344424288992913">Proxy çözümleniyor...</translation>
@@ -2992,6 +2996,7 @@
 <translation id="5507756662695126555">İnkar edilemez</translation>
 <translation id="5509693895992845810">Farklı &amp;Kaydet...</translation>
 <translation id="5509914365760201064">Sertifikayı Veren: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">Google'dan Resim Açıklamaları al</translation>
 <translation id="5511379779384092781">Çok küçük</translation>
 <translation id="5511823366942919280">Bu cihazı bir "Köpekbalığı" olarak ayarlamak istediğinizden emin misiniz?</translation>
 <translation id="5512653252560939721">Kullanıcı sertifikası donanım destekli olmalıdır.</translation>
@@ -3419,7 +3424,6 @@
 <translation id="6103681770816982672">Uyarı: Geliştirici kanalına geçiş yapıyorsunuz</translation>
 <translation id="6104068876731806426">Google Hesapları</translation>
 <translation id="6104311680260824317">Cihaz, alan adına katılamıyor. Sunucu, belirtilen Kerberos şifreleme türlerini desteklemiyor. Şifreleme ayarlarını görmek için "Diğer seçenekler"e göz atın.</translation>
-<translation id="6105877918873366097">Son erişim zamanı</translation>
 <translation id="6107012941649240045">Verilen:</translation>
 <translation id="6112294629795967147">Yeniden boyutlandırmak için dokunun</translation>
 <translation id="6112931163620622315">Telefonunuzu kontrol edin</translation>
@@ -3575,6 +3579,7 @@
 <translation id="6341850831632289108">Fiziksel konumunuzu belirleme</translation>
 <translation id="6344170822609224263">Ağ bağlantıları listesine erişme</translation>
 <translation id="6346310558342052870">Erişim kısıtlı</translation>
+<translation id="6349101878882523185"><ph name="APP_NAME" /> uygulamasını yükle</translation>
 <translation id="6349170655202535379">Senkronizasyon çalışmıyor. Oturumu kapatıp tekrar açmayı deneyin.</translation>
 <translation id="6351063337294363751">Bu menüyü kullanarak tarama verilerinizi temizleyebilirsiniz</translation>
 <translation id="6352773953037195952">En ince</translation>
@@ -3992,6 +3997,7 @@
 <translation id="6990081529015358884">Boş yeriniz kalmadı</translation>
 <translation id="6990778048354947307">Koyu Renkli Tema</translation>
 <translation id="6991665348624301627">Bir hedef seç</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> - Etkinlik Günlüğü</translation>
 <translation id="6997707937646349884">Cihazlarınızda:</translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> klasör seçildi</translation>
 <translation id="6998793565256476099">Video konferans için cihazı kaydetme</translation>
@@ -4195,7 +4201,6 @@
 <translation id="7289225569524511578">Duvar kağıdı uygulamasını aç</translation>
 <translation id="7290242001003353852"><ph name="SAML_DOMAIN" /> tarafından barındırılan bu oturum açma hizmeti kameranıza erişiyor.</translation>
 <translation id="7290594223351252791">Kaydı onaylayın</translation>
-<translation id="7292696521213967957">Asistan hatalarını ayıklama bilgileri</translation>
 <translation id="7295662345261934369">Başkalarıyla paylaş</translation>
 <translation id="729583233778673644">AES ve RC4 şifrelemesine izin ver. RC4 şifreleri güvenli olmadığından bu seçeneğin kullanılması, riskinizi artırır.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> Şartları</translation>
@@ -4294,6 +4299,7 @@
 <translation id="7456142309650173560">geliştirici</translation>
 <translation id="7456847797759667638">Konumu Aç...</translation>
 <translation id="7461924472993315131">Sabitle</translation>
+<translation id="746216226901520237">Bir dahaki sefere telefonunuzu kullanarak <ph name="DEVICE_TYPE" /> cihazınızın kilidini açabilirsiniz. Smart Lock'u Ayarlar'dan kapatabilirsiniz.</translation>
 <translation id="7463006580194749499">Kişi ekle</translation>
 <translation id="7465778193084373987">Netscape Sertifika İptali URL'si</translation>
 <translation id="7469894403370665791">Bu ağa otomatik olarak bağlan</translation>
@@ -4372,6 +4378,7 @@
 <translation id="7580671184200851182">Tüm hoparlörlerden aynı sesi çal (mono ses)</translation>
 <translation id="7581462281756524039">Temizleme aracı</translation>
 <translation id="7582582252461552277">Bu ağı tercih et</translation>
+<translation id="7583948862126372804">Sayı</translation>
 <translation id="7586498138629385861">Chrome, Chrome Uygulamaları açık olduğu sürece çalışmaya devam edecektir.</translation>
 <translation id="7589461650300748890">Aman, dikkatli olun.</translation>
 <translation id="7589661784326793847">Bir saniye bekleyin</translation>
@@ -5482,6 +5489,7 @@
 <translation id="93393615658292258">Yalnızca şifre</translation>
 <translation id="934503638756687833">Gerekirse burada listelenmeyen öğeler de kaldırılabilir. &lt;a href="<ph name="URL" />"&gt;İstenmeyen yazılım koruması&lt;/a&gt; hakkında daha fazla bilgiyi Chrome gizliliği tanıtım yazısında bulabilirsiniz.</translation>
 <translation id="935490618240037774">Yer işaretleri, geçmiş, şifreler ve diğer ayarlarınızı tüm cihazlarınızda kullanabilmeniz için bu veriler Google Hesabınızla senkronize edilecek</translation>
+<translation id="935854577147268200">Smart Lock telefonu değişti. Smart Lock'u güncellemek için şifrenizi girin. Böylece, bir dahaki sefere telefonunuzu kullanarak <ph name="DEVICE_TYPE" /> cihazınızın kilidini açabilirsiniz. Ayarlar'dan Smart Lock'u kapatabilirsiniz.</translation>
 <translation id="936801553271523408">Sistem teşhis verileri</translation>
 <translation id="93766956588638423">Uzantıyı onar</translation>
 <translation id="938339467127511841">Linux (Beta) depolama alanı</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 64f6529..8eb4a0cc 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1007,6 +1007,7 @@
 <translation id="2484959914739448251">Щоб очистити дані веб-перегляду на всіх синхронізованих пристроях і в обліковому записі Google, <ph name="BEGIN_LINK" />введіть парольну фразу<ph name="END_LINK" />.</translation>
 <translation id="2485422356828889247">Видалити</translation>
 <translation id="2487067538648443797">Додати нову закладку</translation>
+<translation id="2489829450872380594">Наступного разу цей пристрій <ph name="DEVICE_TYPE" /> можна буде розблокувати за допомогою нового телефона. Smart Lock можна вимкнути в налаштуваннях.</translation>
 <translation id="2489918096470125693">Додати &amp;папку...</translation>
 <translation id="249113932447298600">На жаль, зараз пристрій <ph name="DEVICE_LABEL" /> не підтримується.</translation>
 <translation id="249303669840926644">Не вдалося закінчити реєстрацію</translation>
@@ -1764,6 +1765,7 @@
 <translation id="3627588569887975815">Відкрити посилання в аноні&amp;мному вікні</translation>
 <translation id="3627671146180677314">Час відновлення сертифіката Netscape</translation>
 <translation id="3627879631695760395">Установити додаток <ph name="APP" />…</translation>
+<translation id="3629631988386925734">Щоб увімкнути Smart Lock, введіть пароль. Наступного разу ви зможете розблокувати пристрій <ph name="DEVICE_TYPE" /> за допомогою свого телефона. Smart Lock можна вимкнути в налаштуваннях.</translation>
 <translation id="3630132874740063857">Ваш номер телефону</translation>
 <translation id="3630995161997703415">Додайте цей сайт на полицю, щоб завжди мати його під рукою</translation>
 <translation id="3636096452488277381">Вітаємо, <ph name="USER_GIVEN_NAME" />!</translation>
@@ -2109,6 +2111,7 @@
 <translation id="4109135793348361820">Перемістити вікно на робочий стіл користувача <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110490973560452005">Завантажено: <ph name="FILE_NAME" />. Натисніть Shift+F6, щоб перейти на панель завантажень.</translation>
 <translation id="4110895898888439383">Переглядати сторінки в режимі високого контрасту</translation>
+<translation id="4112221174576828331">Якщо зображення не має опису, Chrome додасть його. Google сканує зображення.</translation>
 <translation id="4115002065223188701">Мережа недосяжна</translation>
 <translation id="4115080753528843955">Деякі служби вмісту використовують унікальні ідентифікатори, щоб надавати доступ до захищеного вмісту</translation>
 <translation id="4118579674665737931">Перезапустіть пристрій і повторіть спробу.</translation>
@@ -2661,6 +2664,7 @@
 <translation id="4998873842614926205">Підтвердьте зміни</translation>
 <translation id="5000922062037820727">Заблоковано (рекомендується)</translation>
 <translation id="5004584466530475658">Нових фотографій: <ph name="FILE_COUNT" /></translation>
+<translation id="5008936837313706385">Назва дії</translation>
 <translation id="5010043101506446253">Центр сертифікації</translation>
 <translation id="5010406651457630570">Комп’ютери</translation>
 <translation id="5015344424288992913">-...</translation>
@@ -2992,6 +2996,7 @@
 <translation id="5507756662695126555">Неспростовність</translation>
 <translation id="5509693895992845810">Зберегти &amp;як...</translation>
 <translation id="5509914365760201064">Видавець: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">Отримувати описи зображень від Google</translation>
 <translation id="5511379779384092781">Дуже мало</translation>
 <translation id="5511823366942919280">Налаштувати цей пристрій як "Shark"?</translation>
 <translation id="5512653252560939721">Сертифікату користувача потрібна апаратна підтримка.</translation>
@@ -3418,7 +3423,6 @@
 <translation id="6103681770816982672">Застереження. Ви переходите на версію для розробників</translation>
 <translation id="6104068876731806426">Облікові записи Google</translation>
 <translation id="6104311680260824317">Не вдається приєднати пристрій до домену. Сервер не підтримує вказані типи шифрування Kerberos. Перегляньте розділ "Більше опцій", щоб налаштувати шифрування.</translation>
-<translation id="6105877918873366097">Дата останнього доступу</translation>
 <translation id="6107012941649240045">Кому видано</translation>
 <translation id="6112294629795967147">Торкніться, щоб змінити розмір</translation>
 <translation id="6112931163620622315">Перевірте телефон</translation>
@@ -3574,6 +3578,7 @@
 <translation id="6341850831632289108">Визначати ваше фізичне місцезнаходження</translation>
 <translation id="6344170822609224263">Отримувати доступ до списку мережевих з’єднань</translation>
 <translation id="6346310558342052870">Доступ обмежено</translation>
+<translation id="6349101878882523185">Установіть додаток <ph name="APP_NAME" /></translation>
 <translation id="6349170655202535379">Синхронізація не працює. Вийдіть з облікового запису та ввійдіть у нього знову.</translation>
 <translation id="6351063337294363751">Ви можете очистити дані веб-перегляду з цього меню</translation>
 <translation id="6352773953037195952">Найвищий</translation>
@@ -3991,6 +3996,7 @@
 <translation id="6990081529015358884">У вас недостатньо місця</translation>
 <translation id="6990778048354947307">Темна тема</translation>
 <translation id="6991665348624301627">Вибрати місце призначення</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> – журнал активності</translation>
 <translation id="6997707937646349884">На ваших пристроях:</translation>
 <translation id="6998711733709403587">Вибрано папок: <ph name="SELCTED_FOLDERS_COUNT" /></translation>
 <translation id="6998793565256476099">Зареєструвати пристрій для відеоконференцій</translation>
@@ -4194,7 +4200,6 @@
 <translation id="7289225569524511578">Відкрити додаток Фоновий малюнок</translation>
 <translation id="7290242001003353852">Ця служба входу в обліковий запис, зареєстрована в домені <ph name="SAML_DOMAIN" />, намагається отримати доступ до вашої камери.</translation>
 <translation id="7290594223351252791">Підтвердження реєстрації</translation>
-<translation id="7292696521213967957">Інформація про налагодження роботи Асистента</translation>
 <translation id="7295662345261934369">Надати доступ іншим користувачам</translation>
 <translation id="729583233778673644">Дозволяє шифрування AES і RC4. Використання цієї опції підвищує ризик, оскільки шифри RC4 ненадійні.</translation>
 <translation id="7296774163727375165">Умови <ph name="DOMAIN" /></translation>
@@ -4293,6 +4298,7 @@
 <translation id="7456142309650173560">версія для розробників</translation>
 <translation id="7456847797759667638">Відкрити розташування...</translation>
 <translation id="7461924472993315131">Закріпити</translation>
+<translation id="746216226901520237">Наступного разу ви зможете розблокувати пристрій <ph name="DEVICE_TYPE" /> за допомогою свого телефона. Smart Lock можна вимкнути в налаштуваннях.</translation>
 <translation id="7463006580194749499">Додати користувача</translation>
 <translation id="7465778193084373987">URL-адреса відкликання сертифіката Netscape</translation>
 <translation id="7469894403370665791">Автоматично з'єднувати з цією мережею</translation>
@@ -4371,6 +4377,7 @@
 <translation id="7580671184200851182">Відтворювати один аудіозапис на всіх динаміках (монофонічне аудіо)</translation>
 <translation id="7581462281756524039">Інструмент очищення</translation>
 <translation id="7582582252461552277">Віддавати перевагу цій мережі</translation>
+<translation id="7583948862126372804">Кількість</translation>
 <translation id="7586498138629385861">Chrome працюватиме, доки будуть відкриті додатки Chrome.</translation>
 <translation id="7589461650300748890">Обережно!</translation>
 <translation id="7589661784326793847">Зачекайте</translation>
@@ -5482,6 +5489,7 @@
 <translation id="93393615658292258">Лише пароль</translation>
 <translation id="934503638756687833">Якщо потрібно, можна також видалити елементи, не перелічені тут. Докладніше про &lt;a href="<ph name="URL" />"&gt;захист від небажаних програм&lt;/a&gt; читайте в інформаційному документі про конфіденційність Chrome.</translation>
 <translation id="935490618240037774">Ваші закладки, історія, паролі й інші налаштування синхронізуватимуться з обліковим записом Google, щоб ви могли користуватися ними на всіх своїх пристроях.</translation>
+<translation id="935854577147268200">Телефон для Smart Lock змінено. Щоб оновити Smart Lock, введіть пароль. Наступного разу ви зможете розблокувати пристрій <ph name="DEVICE_TYPE" /> за допомогою свого телефона. Smart Lock можна вимкнути в налаштуваннях</translation>
 <translation id="936801553271523408">Дані діагностики системи</translation>
 <translation id="93766956588638423">Полагодити розширення</translation>
 <translation id="938339467127511841">Обсяг пам’яті Linux (бета-версія)</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 3dde167f..1d7dafc 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1007,6 +1007,7 @@
 <translation id="2484959914739448251">Để xóa dữ liệu duyệt web khỏi tất cả các thiết bị đã đồng bộ hóa và Tài khoản Google của bạn, hãy <ph name="BEGIN_LINK" />nhập cụm mật khẩu<ph name="END_LINK" />.</translation>
 <translation id="2485422356828889247">Gỡ cài đặt</translation>
 <translation id="2487067538648443797">Thêm dấu trang mới</translation>
+<translation id="2489829450872380594">Vào lần tới, một điện thoại mới sẽ mở khóa <ph name="DEVICE_TYPE" /> này. Bạn có thể tắt tính năng Smart Lock trong phần Cài đặt.</translation>
 <translation id="2489918096470125693">Thêm &amp;thư mục...</translation>
 <translation id="249113932447298600">Rất tiếc, thiết bị <ph name="DEVICE_LABEL" /> không được hỗ trợ vào thời điểm này.</translation>
 <translation id="249303669840926644">Không thể hoàn tất đăng ký</translation>
@@ -1764,6 +1765,7 @@
 <translation id="3627588569887975815">Mở liên kết bằn&amp;g cửa số ẩn danh</translation>
 <translation id="3627671146180677314">Thời gian Gia hạn Chứng chỉ Netscape</translation>
 <translation id="3627879631695760395">Cài đặt <ph name="APP" />...</translation>
+<translation id="3629631988386925734">Nhập mật khẩu để bật tính năng Smart Lock. Vào lần tới, điện thoại của bạn sẽ mở khóa <ph name="DEVICE_TYPE" />. Bạn có thể tắt tính năng Smart Lock trong phần Cài đặt.</translation>
 <translation id="3630132874740063857">Điện thoại</translation>
 <translation id="3630995161997703415">Thêm trang web này vào giá của bạn để sử dụng bất cứ lúc nào</translation>
 <translation id="3636096452488277381">Xin chào <ph name="USER_GIVEN_NAME" />!</translation>
@@ -2109,6 +2111,7 @@
 <translation id="4109135793348361820">Di chuyển cửa sổ đến <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110490973560452005">Đã tải xuống xong: <ph name="FILE_NAME" />. Nhấn tổ hợp phím Shift + F6 để chuyển tới khu vực thanh Tài nguyên đã tải xuống.</translation>
 <translation id="4110895898888439383">Duyệt web trong chế độ tương phản cao</translation>
+<translation id="4112221174576828331">Chrome sẽ cố gắng mô tả cho bạn những hình ảnh không có nội dung mô tả hữu ích. Các hình ảnh đều do Google quét.</translation>
 <translation id="4115002065223188701">Mạng nằm ngoài phạm vi</translation>
 <translation id="4115080753528843955">Một số dịch vụ nội dung sử dụng số nhận dạng duy nhất nhằm mục đích cho phép truy cập vào nội dung được bảo vệ</translation>
 <translation id="4118579674665737931">Vui lòng khởi động lại thiết bị và thử lại.</translation>
@@ -2661,6 +2664,7 @@
 <translation id="4998873842614926205">Xác nhận thay đổi</translation>
 <translation id="5000922062037820727">Bị chặn (được đề xuất)</translation>
 <translation id="5004584466530475658"><ph name="FILE_COUNT" /> ảnh mới</translation>
+<translation id="5008936837313706385">Tên hoạt động</translation>
 <translation id="5010043101506446253">Tổ chức cấp chứng chỉ</translation>
 <translation id="5010406651457630570">Máy tính</translation>
 <translation id="5015344424288992913">Đang phân giải proxy…</translation>
@@ -2992,6 +2996,7 @@
 <translation id="5507756662695126555">Không tuân thủ</translation>
 <translation id="5509693895992845810">Lưu &amp;Dưới dạng...</translation>
 <translation id="5509914365760201064">Nhà cung cấp: <ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">Nhận nội dung mô tả hình ảnh của Google</translation>
 <translation id="5511379779384092781">Quá nhỏ</translation>
 <translation id="5511823366942919280">Bạn có chắc chắn muốn thiết lập thiết bị này là "Shark" không?</translation>
 <translation id="5512653252560939721">Chứng chỉ người dùng phải được phần cứng hỗ trợ.</translation>
@@ -3418,7 +3423,6 @@
 <translation id="6103681770816982672">Cảnh báo: bạn đang chuyển sang kênh nhà phát triển</translation>
 <translation id="6104068876731806426">Tài khoản Google</translation>
 <translation id="6104311680260824317">Không thể kết hợp thiết bị với miền. Máy chủ không hỗ trợ các loại mã hóa Kerbero được chỉ định. Hãy xem phần "Tùy chọn khác" để biết các tùy chọn cài đặt mã hóa.</translation>
-<translation id="6105877918873366097">Truy cập lần cuối</translation>
 <translation id="6107012941649240045">Cấp cho</translation>
 <translation id="6112294629795967147">Chạm để đổi kích thước</translation>
 <translation id="6112931163620622315">Kiểm tra điện thoại của bạn</translation>
@@ -3574,6 +3578,7 @@
 <translation id="6341850831632289108">Phát hiện vị trí thực của bạn</translation>
 <translation id="6344170822609224263">Truy cập danh sách kết nối mạng</translation>
 <translation id="6346310558342052870">Truy cập bị hạn chế</translation>
+<translation id="6349101878882523185">Cài đặt <ph name="APP_NAME" /></translation>
 <translation id="6349170655202535379">Đồng bộ hóa không hoạt động. Thử đăng xuất và đăng nhập lại.</translation>
 <translation id="6351063337294363751">Bạn có thể xóa dữ liệu duyệt web khỏi menu này</translation>
 <translation id="6352773953037195952">Cao nhất</translation>
@@ -3991,6 +3996,7 @@
 <translation id="6990081529015358884">Bạn đã hết dung lượng lưu trữ</translation>
 <translation id="6990778048354947307">Chủ đề tối</translation>
 <translation id="6991665348624301627">Chọn máy in đích</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> - Nhật ký hoạt động</translation>
 <translation id="6997707937646349884">Trên các thiết bị của bạn:</translation>
 <translation id="6998711733709403587"><ph name="SELCTED_FOLDERS_COUNT" /> thư mục đã được chọn</translation>
 <translation id="6998793565256476099">Đăng ký thiết bị tham gia hội nghị truyền hình</translation>
@@ -4194,7 +4200,6 @@
 <translation id="7289225569524511578">Mở ứng dụng hình nền</translation>
 <translation id="7290242001003353852">Dịch vụ đăng nhập này, do <ph name="SAML_DOMAIN" /> lưu trữ, đang truy cập vào máy ảnh của bạn.</translation>
 <translation id="7290594223351252791">Xác nhận đăng ký</translation>
-<translation id="7292696521213967957">Thông tin để gỡ lỗi Trợ lý</translation>
 <translation id="7295662345261934369">Chia sẻ với những người khác</translation>
 <translation id="729583233778673644">Cho phép mã hóa AES và RC4. Việc sử dụng tùy chọn này sẽ làm gia tăng rủi ro vì các thuật toán mã hóa RC4 là không an toàn.</translation>
 <translation id="7296774163727375165">Điều khoản dành cho <ph name="DOMAIN" /></translation>
@@ -4293,6 +4298,7 @@
 <translation id="7456142309650173560">nhà phát triển</translation>
 <translation id="7456847797759667638">Mở Vị trí...</translation>
 <translation id="7461924472993315131">Ghim</translation>
+<translation id="746216226901520237">Vào lần tới, điện thoại của bạn sẽ mở khóa <ph name="DEVICE_TYPE" />. Bạn có thể tắt tính năng Smart Lock trong phần Cài đặt.</translation>
 <translation id="7463006580194749499">Thêm người</translation>
 <translation id="7465778193084373987">ULR Thu hồi của Tổ chức Cấp Chứng chỉ Netscape</translation>
 <translation id="7469894403370665791">Tự động kết nối vào mạng này</translation>
@@ -4371,6 +4377,7 @@
 <translation id="7580671184200851182">Phát cùng một âm thanh qua tất cả các loa (đơn âm)</translation>
 <translation id="7581462281756524039">Công cụ làm sạch</translation>
 <translation id="7582582252461552277">Thích mạng này</translation>
+<translation id="7583948862126372804">Số lượng</translation>
 <translation id="7586498138629385861">Chrome sẽ tiếp tục chạy khi ứng dụng Chrome đang mở.</translation>
 <translation id="7589461650300748890">Oa. Hãy cẩn thận.</translation>
 <translation id="7589661784326793847">Xin đợi một chút</translation>
@@ -5482,6 +5489,7 @@
 <translation id="93393615658292258">Chỉ mật khẩu</translation>
 <translation id="934503638756687833">Các mục không liệt kê ở đây cũng có thể bị xóa, nếu cần. Hãy tìm hiểu thêm về cách &lt;a href="<ph name="URL" />"&gt;bảo vệ khỏi phần mềm không mong muốn&lt;/a&gt; trong sách trắng về bảo mật của Chrome.</translation>
 <translation id="935490618240037774">Dấu trang, lịch sử, mật khẩu và các cài đặt khác của bạn sẽ được đồng bộ hóa với Tài khoản Google để bạn có thể sử dụng chúng trên tất cả thiết bị của mình.</translation>
+<translation id="935854577147268200">Đã thay đổi điện thoại Smart Lock. Hãy nhập mật khẩu để cập nhật Smart Lock. Vào lần tới, điện thoại của bạn sẽ mở khóa <ph name="DEVICE_TYPE" />. Bạn có thể tắt tính năng Smart Lock trong phần Cài đặt.</translation>
 <translation id="936801553271523408">Dữ liệu chẩn đoán hệ thống</translation>
 <translation id="93766956588638423">Sửa tiện ích</translation>
 <translation id="938339467127511841">Bộ nhớ Linux (Beta)</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 300d246..c702209d 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -2075,7 +2075,7 @@
 <translation id="4075639477629295004">无法投射“<ph name="FILE_NAME" />”。</translation>
 <translation id="4077917118009885966">已拦截此网站上的广告</translation>
 <translation id="4081242589061676262">无法投射文件。</translation>
-<translation id="4084682180776658562">已保存的书签</translation>
+<translation id="4084682180776658562">添加书签</translation>
 <translation id="4084835346725913160">关闭 <ph name="TAB_NAME" /></translation>
 <translation id="4085298594534903246">已拦截此网页上的 JavaScript。</translation>
 <translation id="4087089424473531098">已创建扩展程序:
@@ -3405,7 +3405,6 @@
 <translation id="6103681770816982672">警告:您打算切换到开发者版本</translation>
 <translation id="6104068876731806426">Google 帐号</translation>
 <translation id="6104311680260824317">无法将此设备加入到该网域中。相应服务器不支持所指定的 Kerberos 加密类型。请前往“更多选项”以检查加密设置。</translation>
-<translation id="6105877918873366097">上次访问时间</translation>
 <translation id="6107012941649240045">颁发对象</translation>
 <translation id="6112294629795967147">触摸即可调整大小</translation>
 <translation id="6112931163620622315">查看您的手机</translation>
@@ -4181,7 +4180,6 @@
 <translation id="7289225569524511578">打开壁纸应用</translation>
 <translation id="7290242001003353852">这项由 <ph name="SAML_DOMAIN" /> 托管的登录服务正在使用您的摄像头。</translation>
 <translation id="7290594223351252791">确认注册</translation>
-<translation id="7292696521213967957">附上用于调试 Google 助理的信息</translation>
 <translation id="7295662345261934369">与他人共享</translation>
 <translation id="729583233778673644">允许使用 AES 和 RC4 加密。选中此选项会令您面临更大的风险,因为 RC4 加密不安全。</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> 条款</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index c342393..6f928a5 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1006,6 +1006,7 @@
 <translation id="2484959914739448251">如要從所有同步的裝置和 Google 帳戶中清除瀏覽資料,請<ph name="BEGIN_LINK" />輸入通關密語<ph name="END_LINK" />。</translation>
 <translation id="2485422356828889247">解除安裝</translation>
 <translation id="2487067538648443797">新增書籤</translation>
+<translation id="2489829450872380594">手機之後會解鎖這部 <ph name="DEVICE_TYPE" />。你可以在「設定」中停用 Smart Lock。</translation>
 <translation id="2489918096470125693">新增資料夾(&amp;F)...</translation>
 <translation id="249113932447298600">很抱歉,系統目前不支援 <ph name="DEVICE_LABEL" /> 裝置。</translation>
 <translation id="249303669840926644">無法完成註冊</translation>
@@ -1763,6 +1764,7 @@
 <translation id="3627588569887975815">在無痕式視窗中開啟連結(&amp;G)</translation>
 <translation id="3627671146180677314">Netscape 憑證更新時間</translation>
 <translation id="3627879631695760395">安裝「<ph name="APP" />」...</translation>
+<translation id="3629631988386925734">輸入密碼即可啟用 Smart Lock,這樣下次手機就會為你的 <ph name="DEVICE_TYPE" />.解鎖。你可以在「設定」中停用 Smart Lock。</translation>
 <translation id="3630132874740063857">你的電話號碼</translation>
 <translation id="3630995161997703415">請將這個網站加入檔案櫃,以便隨時使用</translation>
 <translation id="3636096452488277381"><ph name="USER_GIVEN_NAME" />,你好!</translation>
@@ -2107,6 +2109,7 @@
 <translation id="4109135793348361820">將視窗傳送給 <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110490973560452005">下載完成:<ph name="FILE_NAME" />。按下 Shift+F6 即可回到下載內容列區域。</translation>
 <translation id="4110895898888439383">以高對比模式瀏覽網路</translation>
+<translation id="4112221174576828331">如果圖片缺少有用的說明,Chrome 會嘗試為你提供說明。Google 會對圖片進行掃描。</translation>
 <translation id="4115002065223188701">偵測不到網路</translation>
 <translation id="4115080753528843955">部分內容服務會使用唯一識別碼來授予受保護內容的存取權</translation>
 <translation id="4118579674665737931">請重新啟動裝置,然後再試一次。</translation>
@@ -2659,6 +2662,7 @@
 <translation id="4998873842614926205">確認變更</translation>
 <translation id="5000922062037820727">已封鎖 (建議)</translation>
 <translation id="5004584466530475658"><ph name="FILE_COUNT" /> 張新相片</translation>
+<translation id="5008936837313706385">活動名稱</translation>
 <translation id="5010043101506446253">憑證授權單位</translation>
 <translation id="5010406651457630570">電腦</translation>
 <translation id="5015344424288992913">正在解析 proxy...</translation>
@@ -2990,6 +2994,7 @@
 <translation id="5507756662695126555">不可否認性</translation>
 <translation id="5509693895992845810">另存為(&amp;A)...</translation>
 <translation id="5509914365760201064">發行者:<ph name="CERTIFICATE_AUTHORITY" /></translation>
+<translation id="5510775624736435856">從 Google 取得圖片說明</translation>
 <translation id="5511379779384092781">特小</translation>
 <translation id="5511823366942919280">你確定要將這個裝置設為「Shark」嗎?</translation>
 <translation id="5512653252560939721">必須使用硬體支援的使用者憑證。</translation>
@@ -3416,7 +3421,6 @@
 <translation id="6103681770816982672">警告:你即將切換為開發人員版</translation>
 <translation id="6104068876731806426">Google 帳戶</translation>
 <translation id="6104311680260824317">無法將這個裝置加入網域,伺服器不支援指定的 Kerberos 加密類型。請前往「更多選項」檢查加密設定。</translation>
-<translation id="6105877918873366097">上次存取日期</translation>
 <translation id="6107012941649240045">核發對象</translation>
 <translation id="6112294629795967147">輕觸即可調整大小</translation>
 <translation id="6112931163620622315">請查看你的手機</translation>
@@ -3986,6 +3990,7 @@
 <translation id="6990081529015358884">沒有可用的空間</translation>
 <translation id="6990778048354947307">暗色主題</translation>
 <translation id="6991665348624301627">選取印表機</translation>
+<translation id="6997642619627518301"><ph name="NAME_PH" /> - 活動記錄</translation>
 <translation id="6997707937646349884">在你的裝置上:</translation>
 <translation id="6998711733709403587">已選取 <ph name="SELCTED_FOLDERS_COUNT" /> 個資料夾</translation>
 <translation id="6998793565256476099">註冊視訊會議裝置</translation>
@@ -4189,7 +4194,6 @@
 <translation id="7289225569524511578">開啟桌布應用程式</translation>
 <translation id="7290242001003353852">這項登入服務 (由 <ph name="SAML_DOMAIN" /> 代管) 正在存取您的攝影機。</translation>
 <translation id="7290594223351252791">確認註冊</translation>
-<translation id="7292696521213967957">Google 助理偵錯資訊</translation>
 <translation id="7295662345261934369">與他人共用</translation>
 <translation id="729583233778673644">允許執行 AES 和 RC4 加密。由於 RC4 加密不安全,使用這個加密選項會提高風險。</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> 條款</translation>
@@ -4288,6 +4292,7 @@
 <translation id="7456142309650173560">開發人員版</translation>
 <translation id="7456847797759667638">開啟位置...</translation>
 <translation id="7461924472993315131">固定</translation>
+<translation id="746216226901520237">下次手機會為你的 <ph name="DEVICE_TYPE" /> 解鎖。你可以在「設定」中停用 Smart Lock。</translation>
 <translation id="7463006580194749499">新增使用者</translation>
 <translation id="7465778193084373987">Netscape 憑證撤銷網址</translation>
 <translation id="7469894403370665791">自動連線至這個網路</translation>
@@ -4365,6 +4370,7 @@
 <translation id="7580671184200851182">透過所有喇叭播放相同的音效 (單聲道音訊)</translation>
 <translation id="7581462281756524039">清理工具</translation>
 <translation id="7582582252461552277">偏好使用這個網路</translation>
+<translation id="7583948862126372804">計數</translation>
 <translation id="7586498138629385861">在 Chrome 應用程式開啟的狀態下保持 Chrome 繼續執行。</translation>
 <translation id="7589461650300748890">哎唷,請注意!</translation>
 <translation id="7589661784326793847">請稍候片刻</translation>
@@ -5475,6 +5481,7 @@
 <translation id="93393615658292258">僅限密碼</translation>
 <translation id="934503638756687833">如有必要,這裡未列出的項目也會一併移除。如要進一步瞭解&lt;a href="<ph name="URL" />"&gt;垃圾軟體防護功能&lt;/a&gt;,請參閱 Chrome 隱私權白皮書。</translation>
 <translation id="935490618240037774">您的書籤、歷史記錄、密碼和其他設定都會在您的 Google 帳戶中保持同步,以便您在所有個人裝置上使用。</translation>
+<translation id="935854577147268200">Smart Lock 手機已變更,請輸入你的密碼以更新 Smart Lock,這樣下次手機就會為你的 <ph name="DEVICE_TYPE" /> 解鎖。你可以在「設定」中停用 Smart Lock</translation>
 <translation id="936801553271523408">系統診斷資料</translation>
 <translation id="93766956588638423">修復擴充功能</translation>
 <translation id="938339467127511841">Linux (測試版) 儲存空間</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb
index 6607ead..3c49b5ac 100644
--- a/chrome/app/resources/google_chrome_strings_ca.xtb
+++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -99,9 +99,11 @@
 <translation id="3398288718845740432">Amaga al menú de Chrome</translation>
 <translation id="3451115285585441894">S'està afegint a Chrome...</translation>
 <translation id="345171907106878721">Afegeix-me a Chrome</translation>
+<translation id="3457651673823986489">Si una imatge no té una descripció útil, Chrome provarà d'oferir-te'n una. Google escaneja les imatges. Pots desactivar aquesta funció en qualsevol moment a la configuració.</translation>
 <translation id="3479552764303398839">Ara no</translation>
 <translation id="34857402635545079">Esborra també les dades de Chrome (<ph name="URL" />)</translation>
 <translation id="3503306920980160878">Chrome necessita accedir a la teva ubicació per compartir-la amb aquest lloc web</translation>
+<translation id="3576528680708590453">L'administrador del sistema ha configurat Google Chrome perquè obri un navegador alternatiu per accedir a <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="3582972582564653026">Sincronitza i personalitza Chrome en tots els teus dispositius</translation>
 <translation id="3622797965165704966">Ara resulta més fàcil utilitzar Chrome amb el vostre compte de Google i en ordinadors compartits.</translation>
 <translation id="3637702109597584617"><ph name="TERMS_OF_SERVICE_LINK" />Condicions del servei<ph name="END_TERMS_OF_SERVICE_LINK" /> de Google Chrome OS</translation>
@@ -248,6 +250,7 @@
 <translation id="8129812357326543296">Quant a &amp;Google Chrome</translation>
 <translation id="8179874765710681175">Instal·la Chrome al telèfon. T'enviarem un SMS al telèfon.</translation>
 <translation id="8183957050892517584">Chrome emmagatzemarà de manera segura les vostres dades personals perquè no les hàgiu de tornar a escriure</translation>
+<translation id="8224281044825492187">Si una imatge no té una descripció útil, Chrome provarà d'oferir-te'n una. Google escaneja les imatges.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS es reiniciarà ara}=1{Chrome OS es reiniciarà d'aquí a 1 segon}other{Chrome OS es reiniciarà d'aquí a # segons}}</translation>
 <translation id="825412236959742607">Com que aquesta pàgina fa servir massa memòria, Chrome n'ha suprimit contingut.</translation>
 <translation id="8255190535488645436">Google Chrome està utilitzant la càmera i el micròfon.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb
index 69c8a749..2195531 100644
--- a/chrome/app/resources/google_chrome_strings_cs.xtb
+++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -103,9 +103,11 @@
 <translation id="3398288718845740432">Skrýt v nabídce Chrome</translation>
 <translation id="3451115285585441894">Přidává se do prohlížeče Chrome...</translation>
 <translation id="345171907106878721">Přidejte do Chromu svůj účet</translation>
+<translation id="3457651673823986489">Pokud obrázek nemá užitečný popis, Chrome se vám jej pokusí poskytnout. Google obrázky skenuje. Tuto funkci můžete kdykoliv vypnout v nastavení.</translation>
 <translation id="3479552764303398839">Teď ne</translation>
 <translation id="34857402635545079">Vymazat také data z Chromu (<ph name="URL" />)</translation>
 <translation id="3503306920980160878">Chrome potřebuje přístup k vaší poloze, aby ji mohl sdílet s tímto webem</translation>
+<translation id="3576528680708590453">Administrátor systému nakonfiguroval prohlížeč Google Chrome tak, aby pro přístup k adrese <ph name="TARGET_URL_HOSTNAME" /> otevřel alternativní prohlížeč.</translation>
 <translation id="3582972582564653026">Synchronizujte a upravte si Chrome na různých zařízeních</translation>
 <translation id="3622797965165704966">Používání Chromu se spravovaným účtem Google a sdílenými počítači je teď snazší.</translation>
 <translation id="3637702109597584617"><ph name="TERMS_OF_SERVICE_LINK" />Smluvní podmínky<ph name="END_TERMS_OF_SERVICE_LINK" /> systému Google Chrome OS</translation>
@@ -256,6 +258,7 @@
 <translation id="8129812357326543296">O aplikaci &amp;Google Chrome</translation>
 <translation id="8179874765710681175">Nainstalujte si Chrome do telefonu. Zašleme vám na telefon SMS.</translation>
 <translation id="8183957050892517584">Chrome vaše osobní údaje bezpečně uloží, abyste je nemuseli zadávat znovu.</translation>
+<translation id="8224281044825492187">Pokud obrázek nemá užitečný popis, Chrome se vám jej pokusí poskytnout. Google obrázky skenuje.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Systém Chrome OS se teď restartuje}=1{Systém Chrome OS se za 1 sekundu restartuje}few{Systém Chrome OS se za # sekundy restartuje}many{Systém Chrome OS se za # sekundy restartuje}other{Systém Chrome OS se za # sekund restartuje}}</translation>
 <translation id="825412236959742607">Tato stránka využívá příliš mnoho paměti, Chrome proto odstranil část obsahu.</translation>
 <translation id="8255190535488645436">Google Chrome používá vaši kameru a mikrofon.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb
index 23f46ea..f11c96ba 100644
--- a/chrome/app/resources/google_chrome_strings_es.xtb
+++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -103,9 +103,11 @@
 <translation id="3398288718845740432">Ocultar en el menú de Chrome</translation>
 <translation id="3451115285585441894">Añadiendo a Chrome...</translation>
 <translation id="345171907106878721">Añadirte a Chrome</translation>
+<translation id="3457651673823986489">Si una imagen no tiene una descripción útil, Chrome intentará proporcionarte una. Google se encarga de analizar las imágenes. Puedes desactivar esta opción cuando quieras desde la configuración.</translation>
 <translation id="3479552764303398839">Ahora no</translation>
 <translation id="34857402635545079">Borrar también los datos de Chrome (<ph name="URL" />)</translation>
 <translation id="3503306920980160878">Chrome necesita acceder a tu ubicación para compartirla con este sitio web</translation>
+<translation id="3576528680708590453">El administrador del sistema ha configurado Google Chrome para que abra otro navegador al acceder a <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="3582972582564653026">Sincroniza y personaliza Chrome en todos tus dispositivos</translation>
 <translation id="3622797965165704966">Ahora es más fácil utilizar Chrome con tu cuenta de Google y en ordenadores compartidos.</translation>
 <translation id="3637702109597584617"><ph name="TERMS_OF_SERVICE_LINK" />Condiciones de Servicio<ph name="END_TERMS_OF_SERVICE_LINK" /> de Google Chrome OS</translation>
@@ -256,6 +258,7 @@
 <translation id="8129812357326543296">Información de &amp;Google Chrome</translation>
 <translation id="8179874765710681175">Instala Chrome en tu teléfono. Te enviaremos un SMS a tu teléfono.</translation>
 <translation id="8183957050892517584">Chrome almacenará de forma segura tu información personal, de modo que no tendrás que volver a introducirla.</translation>
+<translation id="8224281044825492187">Si una imagen no tiene una descripción útil, Chrome intentará proporcionarte una. Google se encarga de analizar las imágenes.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS se reiniciará ahora}=1{Chrome OS se reiniciará en 1 segundo}other{Chrome OS se reiniciará en # segundos}}</translation>
 <translation id="825412236959742607">Esta página utiliza demasiada memoria, por lo que Chrome ha eliminado parte del contenido.</translation>
 <translation id="8255190535488645436">Google Chrome está utilizando la cámara y el micrófono.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb
index d80f28b..6bb20bca 100644
--- a/chrome/app/resources/google_chrome_strings_fi.xtb
+++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -99,9 +99,11 @@
 <translation id="3398288718845740432">Piilota Chrome-valikossa</translation>
 <translation id="3451115285585441894">Lisätään Chromeen...</translation>
 <translation id="345171907106878721">Lisää itsesi Chromeen</translation>
+<translation id="3457651673823986489">Jos kuvalla ei ole hyödyllistä kuvausta, Chrome yrittää luoda sellaisen. Google skannaa kuvat. Voit milloin tahansa poistaa tämän käytöstä asetuksissa.</translation>
 <translation id="3479552764303398839">Ei nyt</translation>
 <translation id="34857402635545079">Poista data myös Chromesta (<ph name="URL" />)</translation>
 <translation id="3503306920980160878">Chrome tarvitsee oikeuden käyttää sijaintiasi, jotta se voidaan jakaa tämän sivuston kanssa.</translation>
+<translation id="3576528680708590453">Järjestelmänvalvojasi on määrittänyt Chromen käynnistämään vaihtoehtoisen selaimen, kun <ph name="TARGET_URL_HOSTNAME" /> avataan.</translation>
 <translation id="3582972582564653026">Voit synkronoida Chromen ja tehdä siitä yksilöllisemmän kaikilla laitteilla.</translation>
 <translation id="3622797965165704966">Nyt voit helpommin käyttää Chromea Google-tililläsi ja jaetuilla tietokoneilla.</translation>
 <translation id="3637702109597584617">Google Chrome ‑käyttöjärjestelmän <ph name="TERMS_OF_SERVICE_LINK" />käyttöehdot<ph name="END_TERMS_OF_SERVICE_LINK" /></translation>
@@ -249,6 +251,7 @@
 <translation id="8129812357326543296">Tietoja &amp;Google Chromesta</translation>
 <translation id="8179874765710681175">Asenna Chrome puhelimeesi. Lähetämme tekstiviestin puhelimeen.</translation>
 <translation id="8183957050892517584">Chrome tallentaa tietosi turvalliseen paikkaan, jottei sinun tarvitse kirjoittaa tietoja uudelleen.</translation>
+<translation id="8224281044825492187">Jos kuvalla ei ole hyödyllistä kuvausta, Chrome yrittää luoda sellaisen. Google skannaa kuvat.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS käynnistetään uudelleen nyt}=1{Chrome OS käynnistetään uudelleen 1 sekunnin kuluttua}other{Chrome OS käynnistetään uudelleen # sekunnin kuluttua}}</translation>
 <translation id="825412236959742607">Tämä sivu käyttää liikaa muistia, joten Chrome poisti osan sisällöstä.</translation>
 <translation id="8255190535488645436">Google Chrome käyttää kameraasi ja mikrofoniasi.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb
index 6d14abe..d53b585 100644
--- a/chrome/app/resources/google_chrome_strings_fil.xtb
+++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -103,9 +103,11 @@
 <translation id="3398288718845740432">Itago sa Menu ng Chrome</translation>
 <translation id="3451115285585441894">Idinaragdag sa Chrome...</translation>
 <translation id="345171907106878721">Idagdag ang iyong sarili sa Chrome</translation>
+<translation id="3457651673823986489">Kung walang kapaki-pakinabang na paglalarawan ang isang larawan, susubukan ng Chrome na magbigay nito para sa iyo. Sina-scan ng Google ang mga larawan. Puwede mo itong i-off sa mga setting anumang oras.</translation>
 <translation id="3479552764303398839">Hindi ngayon</translation>
 <translation id="34857402635545079">I-clear din ang data sa Chrome (<ph name="URL" />)</translation>
 <translation id="3503306920980160878">Kailangan ng Chrome ng access sa iyong lokasyon upang ibahagi ang lokasyon mo sa site na ito</translation>
+<translation id="3576528680708590453">Na-configure ng iyong system administrator ang Google Chrome na magbukas ng alternatibong browser para i-access ang <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="3582972582564653026">I-sync at i-personalize ang Chrome sa lahat ng iyong device</translation>
 <translation id="3622797965165704966">Ngayon, mas madali nang gamitin ang Chrome sa iyong Google Account at sa mga nakabahaging computer.</translation>
 <translation id="3637702109597584617"><ph name="TERMS_OF_SERVICE_LINK" />Mga Tuntunin ng Serbisyo<ph name="END_TERMS_OF_SERVICE_LINK" /> ng Google Chrome OS</translation>
@@ -256,6 +258,7 @@
 <translation id="8129812357326543296">Tungkol sa &amp;Google Chrome</translation>
 <translation id="8179874765710681175">I-install ang Chrome sa iyong telepono. Magpapadala kami ng SMS sa telepono mo.</translation>
 <translation id="8183957050892517584">Secure na iiimbak ng Chrome ang iyong mga personal na detalye nang sa gayon ay hindi mo na kailangang i-type muli ang mga ito.</translation>
+<translation id="8224281044825492187">Kung walang kapaki-pakinabang na paglalarawan ang isang larawan, susubukan ng Chrome na magbigay nito para sa iyo. Sina-scan ng Google ang mga larawan.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Magre-restart na ang Chrome OS}=1{Magre-restart ang Chrome OS sa loob ng 1 segundo}one{Magre-restart ang Chrome OS sa loob ng # segundo}other{Magre-restart ang Chrome OS sa loob ng # na segundo}}</translation>
 <translation id="825412236959742607">Masyadong malaki ang ginagamit na memory ng page na ito kaya inalis ng Chrome ang ilang content.</translation>
 <translation id="8255190535488645436">Ginagamit ng Google Chrome ang iyong camera at mikropono.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb
index 7754c43d..03ecae1 100644
--- a/chrome/app/resources/google_chrome_strings_fr.xtb
+++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -102,9 +102,11 @@
 <translation id="3398288718845740432">Masquer dans le menu Chrome</translation>
 <translation id="3451115285585441894">Ajout à Google Chrome en cours…</translation>
 <translation id="345171907106878721">Ajouter un utilisateur à Chrome</translation>
+<translation id="3457651673823986489">Si une image n'est pas accompagnée d'une description utile, Chrome essaiera de vous en proposer une. Les images sont analysées par Google. Vous pouvez désactiver à tout moment cette option dans les paramètres.</translation>
 <translation id="3479552764303398839">Pas maintenant</translation>
 <translation id="34857402635545079">Effacer également les données issues de Chrome (<ph name="URL" />)</translation>
 <translation id="3503306920980160878">Chrome a besoin d'accéder à votre position pour la partager avec ce site</translation>
+<translation id="3576528680708590453">Votre administrateur système a configuré Google Chrome de sorte qu'un autre navigateur s'ouvre pour accéder à <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="3582972582564653026">Synchroniser et personnaliser Chrome sur vos appareils</translation>
 <translation id="3622797965165704966">Il est désormais plus facile d'utiliser Chrome avec votre compte Google et sur des ordinateurs partagés.</translation>
 <translation id="3637702109597584617"><ph name="TERMS_OF_SERVICE_LINK" />Conditions d'utilisation<ph name="END_TERMS_OF_SERVICE_LINK" /> de Google Chrome OS</translation>
@@ -256,6 +258,7 @@
 <translation id="8129812357326543296">À propos de &amp;Google Chrome</translation>
 <translation id="8179874765710681175">Installez Chrome sur votre téléphone. Vous y recevrez un SMS.</translation>
 <translation id="8183957050892517584">Chrome va stocker les informations personnelles vous concernant de manière sécurisée. Ainsi, vous n'aurez pas besoin de les saisir à nouveau.</translation>
+<translation id="8224281044825492187">Si une image n'est pas accompagnée d'une description utile, Chrome essaiera de vous en proposer une. Les images sont analysées par Google.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS va redémarrer maintenant}=1{Chrome OS va redémarrer dans 1 seconde}one{Chrome OS va redémarrer dans # seconde}other{Chrome OS va redémarrer dans # secondes}}</translation>
 <translation id="825412236959742607">Cette page utilise trop de mémoire, Chrome a donc supprimé du contenu.</translation>
 <translation id="8255190535488645436">Votre webcam et votre micro sont en cours d'utilisation dans Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb
index d8f5a2a4..99db0d9 100644
--- a/chrome/app/resources/google_chrome_strings_iw.xtb
+++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -99,9 +99,11 @@
 <translation id="3398288718845740432">‏הסתרה בתפריט Chrome</translation>
 <translation id="3451115285585441894">‏הוספה ל-‏Chrome...</translation>
 <translation id="345171907106878721">‏הוסף את עצמך ל-Chrome</translation>
+<translation id="3457651673823986489">‏אם אין לתמונה תיאור מועיל, Chrome ינסה לספק לך תיאור. התמונות נסרקות על-ידי Google. אפשר להשבית את האפשרות הזו בכל זמן דרך ההגדרות.</translation>
 <translation id="3479552764303398839">לא עכשיו</translation>
 <translation id="34857402635545079">‏ניקוי נתונים גם מ-Chrome (<ph name="URL" />)</translation>
 <translation id="3503306920980160878">‏Chrome זקוק לגישה למיקום שלך כדי לשתף אותו עם האתר הזה</translation>
+<translation id="3576528680708590453">‏לפי הגדרת מנהל המערכת, Google Chrome יפתח דפדפן חלופי כדי לגשת אל <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="3582972582564653026">‏סינכרון והתאמה אישית של Chrome בכל המכשירים שברשותך</translation>
 <translation id="3622797965165704966">‏קל יותר כעת להשתמש ב-Chrome באמצעות חשבון Google שלך ובמחשבים משותפים.</translation>
 <translation id="3637702109597584617">‏<ph name="TERMS_OF_SERVICE_LINK" />תנאים והגבלות<ph name="END_TERMS_OF_SERVICE_LINK" /> של Google Chrome OS</translation>
@@ -248,6 +250,7 @@
 <translation id="8129812357326543296">‏מידע על Google Chrome&amp;</translation>
 <translation id="8179874765710681175">‏יש להתקין את Chrome בטלפון שלך, לאחר מכן אליו הודעת SMS.</translation>
 <translation id="8183957050892517584">‏Chrome יאחסן את הפרטים האישיים שלך באופן מאובטח כדי שלא תידרש להקליד אותם שוב.</translation>
+<translation id="8224281044825492187">‏אם אין לתמונה תיאור מועיל, Chrome ינסה לספק לך תיאור. התמונות נסרקות על-ידי Google.</translation>
 <translation id="8226081633851087288">{0,plural, =0{‏Chrome OS תופעל מחדש עכשיו}=1{‏Chrome OS תופעל מחדש בעוד שנייה אחת}two{‏Chrome OS תופעל מחדש בעוד שתי שניות}many{‏Chrome OS תופעל מחדש בעוד # שניות}other{‏Chrome OS תופעל מחדש בעוד # שניות}}</translation>
 <translation id="825412236959742607">‏הדף הזה משתמש בנפח זיכרון גדול מידי, לכן מערכת Chrome הסירה חלק מהתוכן.</translation>
 <translation id="8255190535488645436">‏Google Chrome משתמש במצלמה ובמיקרופון שלך.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb
index f2a996fe..7dc54f4c 100644
--- a/chrome/app/resources/google_chrome_strings_ko.xtb
+++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -103,9 +103,11 @@
 <translation id="3398288718845740432">Chrome 메뉴에서 숨기기</translation>
 <translation id="3451115285585441894">Chrome에 추가하는 중...</translation>
 <translation id="345171907106878721">Chrome에 본인 추가</translation>
+<translation id="3457651673823986489">이미지에 유용한 설명이 없으면 Chrome이 자동으로 설명 제공을 시도합니다. Google에서 이미지를 스캔합니다. 이 기능은 언제든지 설정에서 사용 중지할 수 있습니다.</translation>
 <translation id="3479552764303398839">나중에</translation>
 <translation id="34857402635545079">Chrome(<ph name="URL" />)에서도 데이터 삭제</translation>
 <translation id="3503306920980160878">이 사이트와 위치를 공유하려면 Chrome에 내 위치 액세스 권한이 있어야 합니다</translation>
+<translation id="3576528680708590453">시스템 관리자가 <ph name="TARGET_URL_HOSTNAME" /> 액세스를 위해 다른 브라우저를 실행하도록 Chrome을 구성했습니다.</translation>
 <translation id="3582972582564653026">모든 기기에서 Chrome을 동기화하고 맞춤설정하세요.</translation>
 <translation id="3622797965165704966">이제 Google 계정으로 공유 컴퓨터에서 Chrome을 손쉽게 사용할 수 있습니다.</translation>
 <translation id="3637702109597584617">Chrome OS <ph name="TERMS_OF_SERVICE_LINK" />서비스 약관<ph name="END_TERMS_OF_SERVICE_LINK" /></translation>
@@ -256,6 +258,7 @@
 <translation id="8129812357326543296">Chrome 정보(&amp;G)</translation>
 <translation id="8179874765710681175">휴대전화에 Chrome을 설치하세요. 휴대전화로 SMS를 보내 드리겠습니다.</translation>
 <translation id="8183957050892517584">Chrome은 개인정보를 안전하게 저장하므로 정보를 다시 입력할 필요가 없습니다.</translation>
+<translation id="8224281044825492187">이미지에 유용한 설명이 없으면 Chrome이 자동으로 설명 제공을 시도합니다. Google에서 이미지를 스캔합니다.</translation>
 <translation id="8226081633851087288">{0,plural, =0{곧 Chrome OS 다시 시작}=1{1초 후에 Chrome OS 다시 시작}other{#초 후에 Chrome OS 다시 시작}}</translation>
 <translation id="825412236959742607">페이지에서 너무 많은 메모리를 사용하므로 Chrome에서 일부 콘텐츠를 삭제했습니다.</translation>
 <translation id="8255190535488645436">Chrome에서 카메라와 마이크를 사용 중입니다.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb
index 93bb059..6f600fd 100644
--- a/chrome/app/resources/google_chrome_strings_no.xtb
+++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -99,9 +99,11 @@
 <translation id="3398288718845740432">Skjul i Chrome-menyen</translation>
 <translation id="3451115285585441894">Legger til i Chrome …</translation>
 <translation id="345171907106878721">Legg til deg selv i Chrome</translation>
+<translation id="3457651673823986489">Hvis et bilde ikke har noen nyttig beskrivelse, prøver Chrome å finne en til deg. Bildene skannes av Google. Du kan slå av dette i innstillingene når som helst.</translation>
 <translation id="3479552764303398839">Ikke nå</translation>
 <translation id="34857402635545079">Slett dataene fra Chrome også (<ph name="URL" />)</translation>
 <translation id="3503306920980160878">Chrome trenger tilgang til posisjonen din for å kunne dele den med dette nettstedet</translation>
+<translation id="3576528680708590453">Systemadministratoren din har konfigurert at Google Chrome skal åpne <ph name="TARGET_URL_HOSTNAME" /> i en annen nettleser.</translation>
 <translation id="3582972582564653026">Synkroniser og gi Chrome et personlig preg på alle enhetene dine</translation>
 <translation id="3622797965165704966">Nå er det enklere å bruke Chrome med Google-kontoen din og på datamaskiner du deler med andre.</translation>
 <translation id="3637702109597584617"><ph name="TERMS_OF_SERVICE_LINK" />Vilkår for bruk<ph name="END_TERMS_OF_SERVICE_LINK" /> av Google Chrome OS</translation>
@@ -248,6 +250,7 @@
 <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="8224281044825492187">Hvis et bilde ikke har noen nyttig beskrivelse, prøver Chrome å finne en til deg. Bildene skannes av Google.</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>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb
index 7de403d32..0d7bf73 100644
--- a/chrome/app/resources/google_chrome_strings_sv.xtb
+++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -103,9 +103,11 @@
 <translation id="3398288718845740432">Dölj i Chrome-menyn</translation>
 <translation id="3451115285585441894">Lägger till i Chrome ...</translation>
 <translation id="345171907106878721">Lägg till dig själv i Chrome</translation>
+<translation id="3457651673823986489">Om en bild inte har någon användbar beskrivning försöker Chrome ange en åt dig. Bilden skannas av Google. Du kan när som helst inaktivera den här inställningen.</translation>
 <translation id="3479552764303398839">Inte nu</translation>
 <translation id="34857402635545079">Rensa även data från Chrome (<ph name="URL" />)</translation>
 <translation id="3503306920980160878">Du behöver ge Chrome åtkomst till din plats om den ska kunna delas med webbplatsen</translation>
+<translation id="3576528680708590453">Systemadministratören har konfigurerat Google Chrome så att <ph name="TARGET_URL_HOSTNAME" /> öppnas i en annan webbläsare.</translation>
 <translation id="3582972582564653026">Synkronisera och anpassa Chrome på alla enheter du använder</translation>
 <translation id="3622797965165704966">Nu är det enklare att använda Chrome med ditt Google-konto och på delade datorer.</translation>
 <translation id="3637702109597584617"><ph name="TERMS_OF_SERVICE_LINK" />Användarvillkor<ph name="END_TERMS_OF_SERVICE_LINK" /> för Google Chrome OS</translation>
@@ -256,6 +258,7 @@
 <translation id="8129812357326543296">Om &amp;Google Chrome</translation>
 <translation id="8179874765710681175">Installera Chrome på mobilen. Vi skickar ett sms till mobilen.</translation>
 <translation id="8183957050892517584">Chrome sparar dina personliga uppgifter på ett säkert sätt så att du inte behöver ange dem på nytt.</translation>
+<translation id="8224281044825492187">Om en bild inte har någon användbar beskrivning försöker Chrome ange en åt dig. Bilden skannas av Google.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS startas om nu}=1{Om en sekund startas Chrome OS om}other{Om # sekunder startas Chrome OS om}}</translation>
 <translation id="825412236959742607">Den här sidan använder för mycket minne, så en del innehåll har tagits bort.</translation>
 <translation id="8255190535488645436">Google Chrome använder din kamera och mikrofon.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb
index dd4deef..64dd55ef 100644
--- a/chrome/app/resources/google_chrome_strings_ta.xtb
+++ b/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -99,9 +99,11 @@
 <translation id="3398288718845740432">Chrome மெனுவில் மறை</translation>
 <translation id="3451115285585441894">Chrome இல் சேர்க்கிறது...</translation>
 <translation id="345171907106878721">உங்களை Chrome இல் சேர்க்கவும்</translation>
+<translation id="3457651673823986489">ஒரு படத்திற்குப் பயனுள்ள விளக்கம் இல்லையென்றால், Chrome உங்களுக்காக அதை வழங்க முயலும். படங்களை Google ஸ்கேன் செய்யும். எப்போது வேண்டுமானாலும் இதை அமைப்புகளில் முடக்கலாம்.</translation>
 <translation id="3479552764303398839">இப்பொழுது இல்லை</translation>
 <translation id="34857402635545079">Chromeமிலிருந்தும் தரவை அழி (<ph name="URL" />)</translation>
 <translation id="3503306920980160878">இந்தத் தளத்துடன் இருப்பிடத்தைப் பகிர, Chromeக்கு உங்கள் இருப்பிடத்திற்கான அணுகல் தேவை</translation>
+<translation id="3576528680708590453"><ph name="TARGET_URL_HOSTNAME" />ஐ அணுக Google Chrome அதை மாற்று உலாவியில் திறக்கும்படி உங்கள் சிஸ்டம் நிர்வாகி உள்ளமைத்துள்ளார்.</translation>
 <translation id="3582972582564653026">உங்கள் எல்லாச் சாதனங்களிலும் Chromeஐ ஒத்திசைக்கலாம், தனிப்பயனாக்கலாம்</translation>
 <translation id="3622797965165704966">இப்போது உங்கள் Google கணக்குடனும், பகிரப்பட்ட கணினிகளிலும் Chrome ஐப் பயன்படுத்துவது எளிதானது.</translation>
 <translation id="3637702109597584617">Google Chrome OS <ph name="TERMS_OF_SERVICE_LINK" />சேவை விதிமுறைகள்<ph name="END_TERMS_OF_SERVICE_LINK" /></translation>
@@ -248,6 +250,7 @@
 <translation id="8129812357326543296">&amp;Google Chrome அறிமுகம்</translation>
 <translation id="8179874765710681175">உங்கள் மொபைலில் Chromeஐ நிறுவவும். மொபைலுக்கு SMS ஒன்றை அனுப்புவோம்.</translation>
 <translation id="8183957050892517584">Chrome உங்கள் தனிப்பட்ட விவரங்களைப் பாதுகாப்பாகச் சேமிக்கும் என்பதால் அவற்றை மீண்டும் உள்ளிட வேண்டியதில்லை.</translation>
+<translation id="8224281044825492187">ஒரு படத்திற்குப் பயனுள்ள விளக்கம் இல்லையென்றால், Chrome உங்களுக்காக அதை வழங்க முயலும். படங்களை Google ஸ்கேன் செய்யும்.</translation>
 <translation id="8226081633851087288">{0,plural, =0{இப்போது Chrome OS மீண்டும் தொடங்கும்}=1{1 வினாடியில் Chrome OS மீண்டும் தொடங்கும்}other{# வினாடிகளில் Chrome OS மீண்டும் தொடங்கும்}}</translation>
 <translation id="825412236959742607">இந்தப் பக்கம் அதிகளவு நினைவகத்தைப் பயன்படுத்துவதால், Chrome சில உள்ளடக்கங்களை அகற்றியது.</translation>
 <translation id="8255190535488645436">Google Chrome உங்கள் கேமராவையும் மைக்ரோஃபோனையும் பயன்படுத்துகிறது.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb
index b95bf6b..6c25331d 100644
--- a/chrome/app/resources/google_chrome_strings_te.xtb
+++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -99,9 +99,11 @@
 <translation id="3398288718845740432">Chrome మెనూలో దాచండి</translation>
 <translation id="3451115285585441894">Chromeకు జోడిస్తోంది...</translation>
 <translation id="345171907106878721">Chromeకు మిమ్మల్ని జోడించుకోండి</translation>
+<translation id="3457651673823986489">చిత్రంలో ఉపయోగకరమైన వివరణ లేకుంటే, మీ కోసం వివరణను అందించడానికి Chrome ప్రయత్నిస్తుంది. చిత్రాలు Google ద్వారా స్కాన్ చేయబడతాయి. మీరు దీనిని ఎప్పుడైనా సెట్టింగ్‌లలో ఆఫ్ చేయవచ్చు.</translation>
 <translation id="3479552764303398839">ఇప్పుడు కాదు</translation>
 <translation id="34857402635545079">అలాగే (<ph name="URL" />)లో ఉన్న Chromeకి సంబంధించిన డేటాని తీసివేయి</translation>
 <translation id="3503306920980160878">ఈ సైట్‌తో మీ స్థానాన్ని షేర్ చేయడానికి Chromeకు మీ స్థాన యాక్సెస్ అవసరం</translation>
+<translation id="3576528680708590453"><ph name="TARGET_URL_HOSTNAME" />ని యాక్సెస్ చేయడం కోసం ఒక ప్రత్యామ్నాయ బ్రౌజర్‌ని తెరిచే విధంగా Google Chromeని మీ సిస్టమ్ నిర్వాహకులు కాన్ఫిగర్ చేసారు.</translation>
 <translation id="3582972582564653026">మీ పరికరాల అంతటా Chromeను సింక్ చేయండి మరియు వ్యక్తిగతీకరించండి</translation>
 <translation id="3622797965165704966">ఇప్పుడు మీ Google ఖాతాతో, షేర్ చేయ‌బ‌డిన కంప్యూటర్‌ల‌లో Chromeను సులభంగా ఉపయోగించవచ్చు.</translation>
 <translation id="3637702109597584617">Google Chrome OS <ph name="TERMS_OF_SERVICE_LINK" />సేవా నిబంధనలు<ph name="END_TERMS_OF_SERVICE_LINK" /></translation>
@@ -248,6 +250,7 @@
 <translation id="8129812357326543296">&amp;Google Chrome గురించి</translation>
 <translation id="8179874765710681175">మీ ఫోన్‌లో Chromeను ఇన్‌స్టాల్ చేయండి. మేము మీ ఫోన్‌కు SMS పంపుతాము.</translation>
 <translation id="8183957050892517584">Chrome మీ వ్యక్తిగత వివరాలను సురక్షితంగా నిల్వ చేస్తుంది కాబట్టి మీరు వాటిని మళ్లీ టైప్ చేయాల్సిన అవసరం లేదు.</translation>
+<translation id="8224281044825492187">చిత్రంలో ఉపయోగకరమైన వివరణ లేకుంటే, మీ కోసం వివరణను అందించడానికి Chrome ప్రయత్నిస్తుంది. చిత్రాలు Google ద్వారా స్కాన్ చేయబడతాయి.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS ఇప్పుడు మళ్లీ ప్రారంభించబడుతుంది}=1{Chrome OS 1 సెకనులో మళ్లీ ప్రారంభించబడుతుంది}other{Chrome OS # సెకన్లలో మళ్లీ ప్రారంభించబడుతుంది}}</translation>
 <translation id="825412236959742607">ఈ పేజీ చాలా మెమరీని ఉపయోగిస్తుంది, కాబట్టి Chrome కొంత కంటెంట్‌ను తీసివేసింది.</translation>
 <translation id="8255190535488645436">Google Chrome మీ కెమెరా మరియు మైక్రోఫోన్‌ని ఉపయోగిస్తోంది.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb
index 9638ada1..eb84f8e 100644
--- a/chrome/app/resources/google_chrome_strings_th.xtb
+++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -99,9 +99,11 @@
 <translation id="3398288718845740432">ซ่อนในเมนู Chrome</translation>
 <translation id="3451115285585441894">กำลังเพิ่มลงใน Chrome...</translation>
 <translation id="345171907106878721">เพิ่มตัวคุณเองใน Chrome</translation>
+<translation id="3457651673823986489">หากรูปภาพไม่มีคำอธิบายที่เป็นประโยชน์ Chrome จะพยายามใส่คำอธิบายให้คุณ รูปภาพจะได้รับการสแกนโดย Google คุณปิดการดำเนินการนี้ได้ทุกเมื่อในการตั้งค่า</translation>
 <translation id="3479552764303398839">ไม่ใช่ตอนนี้</translation>
 <translation id="34857402635545079">ล้างข้อมูลจาก Chrome (<ph name="URL" />) ด้วย</translation>
 <translation id="3503306920980160878">Chrome ต้องการสิทธิ์เข้าถึงตำแหน่งของคุณเพื่อแชร์ตำแหน่งกับเว็บไซต์นี้</translation>
+<translation id="3576528680708590453">ผู้ดูแลระบบของคุณกำหนดค่าให้ Google Chrome เปิดเบราว์เซอร์สำรองเพื่อเข้าถึง <ph name="TARGET_URL_HOSTNAME" /></translation>
 <translation id="3582972582564653026">ซิงค์และปรับเปลี่ยน Chrome ในอุปกรณ์ต่างๆ</translation>
 <translation id="3622797965165704966">ตอนนี้การใช้ Chrome กับบัญชี Google ของคุณและบนคอมพิวเตอร์ที่ใช้ร่วมกันทำได้ง่ายกว่าเดิม</translation>
 <translation id="3637702109597584617"><ph name="TERMS_OF_SERVICE_LINK" />ข้อกำหนดในการให้บริการ<ph name="END_TERMS_OF_SERVICE_LINK" />ของ Google Chrome OS</translation>
@@ -249,6 +251,7 @@
 <translation id="8129812357326543296">เกี่ยวกับ &amp;Google Chrome</translation>
 <translation id="8179874765710681175">ติดตั้ง Chrome ในโทรศัพท์ เราจะส่ง SMS ไปยังโทรศัพท์ของคุณ</translation>
 <translation id="8183957050892517584">Chrome จะเก็บรายละเอียดส่วนตัวของคุณอย่างปลอดภัย คุณจึงไม่จำเป็นต้องพิมพ์รายละเอียดเหล่านั้นอีกครั้ง</translation>
+<translation id="8224281044825492187">หากรูปภาพไม่มีคำอธิบายที่เป็นประโยชน์ Chrome จะพยายามใส่คำอธิบายให้คุณ รูปภาพจะได้รับการสแกนโดย Google</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS จะรีสตาร์ทตอนนี้}=1{Chrome OS จะรีสตาร์ทใน 1 วินาที}other{Chrome OS จะรีสตาร์ทใน # วินาที}}</translation>
 <translation id="825412236959742607">หน้านี้ใช้หน่วยความจำมากเกินไป Chrome จึงนำเนื้อหาบางส่วนออก</translation>
 <translation id="8255190535488645436">Google Chrome ใช้กล้องและไมโครโฟนของคุณอยู่</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb
index dd77b7d6..73d9fcf 100644
--- a/chrome/app/resources/google_chrome_strings_tr.xtb
+++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -100,9 +100,11 @@
 <translation id="3398288718845740432">Chrome Menüsünde Gizle</translation>
 <translation id="3451115285585441894">Chrome'a ekleniyor...</translation>
 <translation id="345171907106878721">Kendinizi Chrome'a ekleyin</translation>
+<translation id="3457651673823986489">Bir resmin işe yarar bir açıklaması yoksa, Chrome sizin için bir açıklama sağlamaya çalışır. Resimler Google tarafından taranır. Bu özelliği istediğiniz zaman ayarlardan kapatabilirsiniz.</translation>
 <translation id="3479552764303398839">Şimdi değil</translation>
 <translation id="34857402635545079">Chrome'daki verileri de temizle (<ph name="URL" />)</translation>
 <translation id="3503306920980160878">Konumunuzu bu siteyle paylaşabilmek için Chrome'un konum bilgilerinize erişmesi gerekiyor</translation>
+<translation id="3576528680708590453">Sistem yöneticiniz Google Chrome'u <ph name="TARGET_URL_HOSTNAME" /> adresine erişmek için alternatif bir tarayıcıyı açacak şekilde yapılandırmış.</translation>
 <translation id="3582972582564653026">Chrome'u cihazlarınız arasında senkronize edin ve kişiselleştirin</translation>
 <translation id="3622797965165704966">Chrome'u Google Hesabınızla ve paylaşılan bilgisayarlarda kullanmak artık daha kolay.</translation>
 <translation id="3637702109597584617">Google Chrome OS <ph name="TERMS_OF_SERVICE_LINK" />Hizmet Şartları<ph name="END_TERMS_OF_SERVICE_LINK" /></translation>
@@ -251,6 +253,7 @@
 <translation id="8129812357326543296">&amp;Google Chrome hakkında</translation>
 <translation id="8179874765710681175">Chrome'u telefonunuza yükleyin. Telefonunuza SMS göndereceğiz.</translation>
 <translation id="8183957050892517584">Chrome, kişisel bilgilerinizi güvenli şekilde depoladığından bu bilgileri tekrar yazmak zorunda kalmazsınız.</translation>
+<translation id="8224281044825492187">Bir resmin işe yarar bir açıklaması yoksa, Chrome sizin için bir açıklama sağlamaya çalışır. Resimler Google tarafından taranır.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS şimdi yeniden başlatılacak}=1{Chrome OS 1 saniye içinde yeniden başlatılacak}other{Chrome OS # saniye içinde yeniden başlatılacak}}</translation>
 <translation id="825412236959742607">Bu sayfa çok fazla bellek kullandığından Chrome bazı içerikleri kaldırdı.</translation>
 <translation id="8255190535488645436">Google Chrome kameranızı ve mikrofonunuzu kullanıyor.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb
index d9b52e2..7904e97c 100644
--- a/chrome/app/resources/google_chrome_strings_uk.xtb
+++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -99,9 +99,11 @@
 <translation id="3398288718845740432">Сховати в меню Chrome</translation>
 <translation id="3451115285585441894">Додавання в Chrome...</translation>
 <translation id="345171907106878721">Додати себе в Chrome</translation>
+<translation id="3457651673823986489">Якщо зображення не має корисного опису, Chrome спробує додати його. Google сканує зображення. Ви можете будь-коли вимкнути це в налаштуваннях.</translation>
 <translation id="3479552764303398839">Не зараз</translation>
 <translation id="34857402635545079">Також очистити дані Chrome (<ph name="URL" />)</translation>
 <translation id="3503306920980160878">Chrome потрібен доступ до геоданих, щоб повідомляти цьому сайту ваше місцезнаходження</translation>
+<translation id="3576528680708590453">Ваш системний адміністратор налаштував Chrome відкривати сторінку <ph name="TARGET_URL_HOSTNAME" /> в альтернативному веб-переглядачі.</translation>
 <translation id="3582972582564653026">Синхронізуйте та персоналізуйте роботу Chrome на всіх своїх пристроях</translation>
 <translation id="3622797965165704966">Користуватися Chrome у своєму обліковому записі Google на спільних комп’ютерах стало легше.</translation>
 <translation id="3637702109597584617"><ph name="TERMS_OF_SERVICE_LINK" />Умови використання<ph name="END_TERMS_OF_SERVICE_LINK" /> ОС Google Chrome</translation>
@@ -248,6 +250,7 @@
 <translation id="8129812357326543296">Про &amp;Google Chrome</translation>
 <translation id="8179874765710681175">Установіть Chrome на телефоні. Ми надішлемо SMS на ваш телефон.</translation>
 <translation id="8183957050892517584">Chrome надійно зберігатиме ваші особисті дані, тож вам не потрібно буде вводити їх знову.</translation>
+<translation id="8224281044825492187">Якщо зображення не має корисного опису, Chrome спробує додати його. Google сканує зображення.</translation>
 <translation id="8226081633851087288">{0,plural, =0{ОС Chrome перезапуститься зараз}=1{ОС Chrome перезапуститься через 1 секунду}one{ОС Chrome перезапуститься через # секунду}few{ОС Chrome перезапуститься через # секунди}many{ОС Chrome перезапуститься через # секунд}other{ОС Chrome перезапуститься через # секунди}}</translation>
 <translation id="825412236959742607">Ця сторінка використовує забагато пам’яті, тому веб-переглядач Chrome вилучив деякий вміст.</translation>
 <translation id="8255190535488645436">Google Chrome використовує вашу камеру та мікрофон.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb
index 13e2aea..edb1de2 100644
--- a/chrome/app/resources/google_chrome_strings_vi.xtb
+++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -101,9 +101,11 @@
 <translation id="3398288718845740432">Ẩn trong menu Chrome</translation>
 <translation id="3451115285585441894">Đang thêm vào Chrome...</translation>
 <translation id="345171907106878721">Thêm chính bạn vào Chrome</translation>
+<translation id="3457651673823986489">Chrome sẽ cố gắng mô tả cho bạn những hình ảnh không có nội dung mô tả hữu ích. Các hình ảnh đều do Google quét. Bạn có thể tắt dịch vụ này trong phần cài đặt bất kỳ lúc nào.</translation>
 <translation id="3479552764303398839">Không phải bây giờ</translation>
 <translation id="34857402635545079">Đồng thời xóa dữ liệu khỏi Chrome (<ph name="URL" />)</translation>
 <translation id="3503306920980160878">Chrome cần quyền truy cập vào vị trí của bạn để chia sẻ thông tin vị trí với trang web này</translation>
+<translation id="3576528680708590453">Quản trị viên hệ thống của bạn đã định cấu hình Google Chrome để mở một trình duyệt thay thế khi truy cập vào <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="3582972582564653026">Đồng bộ hóa và cá nhân hóa Chrome trên các thiết bị của bạn</translation>
 <translation id="3622797965165704966">Giờ đây, việc sử dụng Chrome bằng tài khoản Google của bạn và trên máy tính được chia sẻ trở nên dễ dàng hơn.</translation>
 <translation id="3637702109597584617"><ph name="TERMS_OF_SERVICE_LINK" />Điều khoản dịch vụ<ph name="END_TERMS_OF_SERVICE_LINK" /> của Google Chrome OS</translation>
@@ -253,6 +255,7 @@
 <translation id="8129812357326543296">Giới thiệu về &amp;Google Chrome</translation>
 <translation id="8179874765710681175">Cài đặt Chrome trên điện thoại của bạn. Chúng tôi sẽ gửi SMS tới điện thoại của bạn.</translation>
 <translation id="8183957050892517584">Chrome sẽ lưu trữ an toàn chi tiết cá nhân của bạn nên bạn không cần nhập lại thông tin này.</translation>
+<translation id="8224281044825492187">Chrome sẽ cố gắng mô tả cho bạn những hình ảnh không có nội dung mô tả hữu ích. Các hình ảnh đều do Google quét.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS sẽ khởi động lại ngay bây giờ}=1{Chrome OS sẽ khởi động lại sau 1 giây}other{Chrome OS sẽ khởi động lại sau # giây}}</translation>
 <translation id="825412236959742607">Trang này sử dụng quá nhiều bộ nhớ, nên Chrome đã xóa bớt nội dung.</translation>
 <translation id="8255190535488645436">Google Chrome đang sử dụng máy ảnh và micrô của bạn.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
index cd3701a2..8ee7da6 100644
--- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -99,9 +99,11 @@
 <translation id="3398288718845740432">在 Chrome 選單中隱藏</translation>
 <translation id="3451115285585441894">正在新增至 Chrome...</translation>
 <translation id="345171907106878721">新增為 Chrome 使用者</translation>
+<translation id="3457651673823986489">如果圖片缺少有用的說明,Chrome 會嘗試為你提供說明。Google 會對圖片進行掃描。你隨時可以在設定中關閉這項功能。</translation>
 <translation id="3479552764303398839">現在不要</translation>
 <translation id="34857402635545079">一併清除 Chrome 中的資料 (<ph name="URL" />)</translation>
 <translation id="3503306920980160878">Chrome 需要位置資訊存取權,才能與這個網站分享你的位置資訊</translation>
+<translation id="3576528680708590453">系統管理員已設定 Google Chrome 開啟替代瀏覽器來存取 <ph name="TARGET_URL_HOSTNAME" />。</translation>
 <translation id="3582972582564653026">進行同步處理即可在你的所有裝置上享有個人化的 Chrome 體驗</translation>
 <translation id="3622797965165704966">無論是登入 Google 帳戶使用 Chrome,還是以 Google 帳戶使用共用電腦,現在都變得更容易了。</translation>
 <translation id="3637702109597584617">Google Chrome 作業系統<ph name="TERMS_OF_SERVICE_LINK" />服務條款<ph name="END_TERMS_OF_SERVICE_LINK" /></translation>
@@ -250,6 +252,7 @@
 <translation id="8129812357326543296">關於 Google Chrome(&amp;G)</translation>
 <translation id="8179874765710681175">在手機上安裝 Chrome。我們會傳送簡訊到你的手機。</translation>
 <translation id="8183957050892517584">Chrome 會妥善保存您的個人詳細資料,讓您不必重複輸入相同的資料。</translation>
+<translation id="8224281044825492187">如果圖片缺少有用的說明,Chrome 會嘗試為你提供說明。Google 會對圖片進行掃描。</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome 作業系統將立即重新啟動}=1{Chrome 作業系統將於 1 秒後重新啟動}other{Chrome 作業系統將於 # 後重新啟動}}</translation>
 <translation id="825412236959742607">這個網頁使用了過多記憶體,因此 Chrome 移除了部分內容。</translation>
 <translation id="8255190535488645436">Google Chrome 正在使用你的攝影機和麥克風。</translation>
diff --git a/chrome/browser/android/vr/BUILD.gn b/chrome/browser/android/vr/BUILD.gn
index bafa714..b033f0e1 100644
--- a/chrome/browser/android/vr/BUILD.gn
+++ b/chrome/browser/android/vr/BUILD.gn
@@ -190,6 +190,14 @@
     "//base:base_java",
     "//chrome/android:chrome_java",
   ]
+
+  # TODO(crbug.com/938909): chromium_code.flags is not used as a proguard
+  # config when proguarding asynchronously. This results in AR crashing
+  # chrome when AR is an async DFM. Should implement a more scalable
+  # solution to including chromium_code.flags with all async DFMs.
+  if (async_ar) {
+    proguard_configs = [ "//base/android/proguard/chromium_code.flags" ]
+  }
 }
 
 if (enable_arcore) {
diff --git a/chrome/browser/autofill/autofill_credit_card_filling_infobar_delegate_mobile_unittest.cc b/chrome/browser/autofill/autofill_credit_card_filling_infobar_delegate_mobile_unittest.cc
index e392c63..26de7b9 100644
--- a/chrome/browser/autofill/autofill_credit_card_filling_infobar_delegate_mobile_unittest.cc
+++ b/chrome/browser/autofill/autofill_credit_card_filling_infobar_delegate_mobile_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/autofill_credit_card_filling_infobar_delegate_mobile.h"
+#include "components/autofill/core/browser/payments/autofill_credit_card_filling_infobar_delegate_mobile.h"
 
 #include <memory>
 
diff --git a/chrome/browser/autofill/autofill_save_card_infobar_delegate_mobile_unittest.cc b/chrome/browser/autofill/autofill_save_card_infobar_delegate_mobile_unittest.cc
index 7d812f83..0011e76 100644
--- a/chrome/browser/autofill/autofill_save_card_infobar_delegate_mobile_unittest.cc
+++ b/chrome/browser/autofill/autofill_save_card_infobar_delegate_mobile_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h"
+#include "components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.h"
 
 #include <memory>
 
diff --git a/chrome/browser/autofill/legacy_strike_database_factory.cc b/chrome/browser/autofill/legacy_strike_database_factory.cc
index 30a2439a..ce66f6b4 100644
--- a/chrome/browser/autofill/legacy_strike_database_factory.cc
+++ b/chrome/browser/autofill/legacy_strike_database_factory.cc
@@ -7,7 +7,7 @@
 #include "base/memory/singleton.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
-#include "components/autofill/core/browser/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/legacy_strike_database.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 
 namespace autofill {
diff --git a/chrome/browser/autofill/strike_database_factory.cc b/chrome/browser/autofill/strike_database_factory.cc
index 4972606..475de2a7 100644
--- a/chrome/browser/autofill/strike_database_factory.cc
+++ b/chrome/browser/autofill/strike_database_factory.cc
@@ -7,7 +7,7 @@
 #include "base/memory/singleton.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
-#include "components/autofill/core/browser/strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 
 namespace autofill {
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index c8f90de..b30f894 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -459,6 +459,7 @@
       <include name="IDR_POLICY_JS" file="resources\policy\policy.js" type="BINDATA" compress="gzip" />
       <if expr="not is_android">
         <include name="IDR_MANAGEMENT_HTML" file="resources\management\management.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+        <include name="IDR_MANAGEMENT_JS" file="resources\management\management.js" type="BINDATA" compress="gzip" />
         <include name="IDR_MANAGEMENT_UI_HTML" file="resources\management\management_ui.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
         <include name="IDR_MANAGEMENT_UI_JS" file="resources\management\management_ui.js" type="BINDATA" compress="gzip" preprocess="true" />
         <include name="IDR_MANAGEMENT_BROWSER_PROXY_HTML" file="resources\management\management_browser_proxy.html" allowexternalscript="true" type="BINDATA" compress="gzip" />
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index 54beb10..fbc75a1 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -63,9 +63,9 @@
 #include "chrome/common/buildflags.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
-#include "components/autofill/core/browser/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
-#include "components/autofill/core/browser/strike_database.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/bookmarks/browser/bookmark_model.h"
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
index d885b87..7b26235 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
@@ -57,10 +57,10 @@
 #include "components/autofill/core/browser/autofill_profile.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/credit_card.h"
-#include "components/autofill/core/browser/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/personal_data_manager_observer.h"
-#include "components/autofill/core/browser/strike_database.h"
 #include "components/autofill/core/browser/test_autofill_clock.h"
 #include "components/autofill/core/common/autofill_constants.h"
 #include "components/bookmarks/browser/bookmark_model.h"
diff --git a/chrome/browser/chrome_browser_main_win.cc b/chrome/browser/chrome_browser_main_win.cc
index c05c037..0cbc23c 100644
--- a/chrome/browser/chrome_browser_main_win.cc
+++ b/chrome/browser/chrome_browser_main_win.cc
@@ -338,8 +338,8 @@
   auto* module_database = ModuleDatabase::GetInstance();
 
   switch (event.event_type) {
-    case mojom::ModuleEventType::MODULE_ALREADY_LOADED: {
-      // MODULE_ALREADY_LOADED comes from the enumeration of loaded modules
+    case ModuleWatcher::ModuleEventType::kModuleAlreadyLoaded: {
+      // kModuleAlreadyLoaded comes from the enumeration of loaded modules
       // using CreateToolhelp32Snapshot().
       uint32_t time_date_stamp = 0;
       if (TryGetModuleTimeDateStamp(event.module_load_address,
@@ -361,7 +361,7 @@
       }
       return;
     }
-    case mojom::ModuleEventType::MODULE_LOADED: {
+    case ModuleWatcher::ModuleEventType::kModuleLoaded: {
       module_database->OnModuleLoad(
           content::PROCESS_TYPE_BROWSER, event.module_path, event.module_size,
           GetModuleTimeDateStamp(event.module_load_address));
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index bc8af9d..1abcdb45 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -125,6 +125,7 @@
 #include "chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h"
 #include "chrome/browser/signin/chrome_signin_url_loader_throttle.h"
 #include "chrome/browser/signin/header_modification_delegate_impl.h"
+#include "chrome/browser/site_isolation_policy.h"
 #include "chrome/browser/speech/chrome_speech_recognition_manager_delegate.h"
 #include "chrome/browser/speech/tts_controller_delegate_impl.h"
 #include "chrome/browser/speech/tts_message_filter.h"
@@ -1869,6 +1870,14 @@
   return false;
 }
 
+std::vector<std::string>
+ChromeContentBrowserClient::GetAdditionalSiteIsolationModes() {
+  if (SiteIsolationPolicy::IsIsolationForPasswordSitesEnabled())
+    return {"Isolate Password Sites"};
+  else
+    return {};
+}
+
 bool ChromeContentBrowserClient::IsFileAccessAllowed(
     const base::FilePath& path,
     const base::FilePath& absolute_path,
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index 62efefe..970609d 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -191,6 +191,7 @@
   std::vector<url::Origin> GetOriginsRequiringDedicatedProcess() override;
   bool ShouldEnableStrictSiteIsolation() override;
   bool ShouldDisableSiteIsolation() override;
+  std::vector<std::string> GetAdditionalSiteIsolationModes() override;
   bool IsFileAccessAllowed(const base::FilePath& path,
                            const base::FilePath& absolute_path,
                            const base::FilePath& profile_path) override;
diff --git a/chrome/browser/chromeos/dbus/dbus_helper.cc b/chrome/browser/chromeos/dbus/dbus_helper.cc
index c251cb4..8e2d94a 100644
--- a/chrome/browser/chromeos/dbus/dbus_helper.cc
+++ b/chrome/browser/chromeos/dbus/dbus_helper.cc
@@ -6,6 +6,7 @@
 
 #include "chrome/browser/chromeos/settings/device_settings_service.h"
 #include "chromeos/cryptohome/system_salt_getter.h"
+#include "chromeos/dbus/biod/biod_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/hammerd/hammerd_client.h"
 #include "chromeos/dbus/power_manager_client.h"
@@ -37,8 +38,10 @@
   // TODO(stevenjb): Modify PowerManagerClient and SystemClockClient to use
   // the same pattern as UpstartClient.
   if (bus) {
+    BiodClient::Initialize(bus);  // For device::Fingerprint.
     UpstartClient::Initialize(bus);
   } else {
+    BiodClient::InitializeFake();  // For device::Fingerprint.
     UpstartClient::InitializeFake();
   }
 
@@ -53,6 +56,7 @@
   UpstartClient::Shutdown();
   SystemClockClient::Shutdown();
   PowerManagerClient::Shutdown();
+  BiodClient::Shutdown();
 
   // See comment in InitializeDBus() for MultiProcessMash behavior.
   if (!::features::IsMultiProcessMash())
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
index 1e02c10..a10c1d60 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -582,7 +582,7 @@
         TestCase("dirContextMenuCrostini"),
         TestCase("dirContextMenuPlayFiles"),
         TestCase("dirContextMenuUsbs"),
-        // TestCase("dirContextMenuFsp"),
+        TestCase("dirContextMenuFsp"),
         TestCase("dirContextMenuDocumentsProvider").EnableDocumentsProvider(),
         TestCase("dirContextMenuShortcut")));
 
diff --git a/chrome/browser/chromeos/login/lock/screen_locker_browsertest.cc b/chrome/browser/chromeos/login/lock/screen_locker_browsertest.cc
index 1be438c..f1986bc 100644
--- a/chrome/browser/chromeos/login/lock/screen_locker_browsertest.cc
+++ b/chrome/browser/chromeos/login/lock/screen_locker_browsertest.cc
@@ -72,22 +72,18 @@
     zero_duration_mode_ =
         std::make_unique<ui::ScopedAnimationDurationScaleMode>(
             ui::ScopedAnimationDurationScaleMode::ZERO_DURATION);
-
-    fake_biod_client_ = new FakeBiodClient();
-    DBusThreadManager::GetSetterForTesting()->SetBiodClient(
-        base::WrapUnique(fake_biod_client_));
   }
 
   void EnrollFingerprint() {
     quick_unlock::EnableForTesting();
 
-    fake_biod_client_->StartEnrollSession(
+    FakeBiodClient::Get()->StartEnrollSession(
         "test-user", std::string(),
         base::BindRepeating(&ScreenLockerTest::OnStartSession,
                             base::Unretained(this)));
     base::RunLoop().RunUntilIdle();
 
-    fake_biod_client_->SendEnrollScanDone(
+    FakeBiodClient::Get()->SendEnrollScanDone(
         kFingerprint, biod::SCAN_RESULT_SUCCESS, true /* is_complete */,
         -1 /* percent_complete */);
     base::RunLoop().RunUntilIdle();
@@ -97,8 +93,8 @@
   }
 
   void AuthenticateWithFingerprint() {
-    fake_biod_client_->SendAuthScanDone(kFingerprint,
-                                        biod::SCAN_RESULT_SUCCESS);
+    FakeBiodClient::Get()->SendAuthScanDone(kFingerprint,
+                                            biod::SCAN_RESULT_SUCCESS);
     base::RunLoop().RunUntilIdle();
   }
 
@@ -106,8 +102,6 @@
   void OnStartSession(const dbus::ObjectPath& path) {}
 
   FakeSessionManagerClient* fake_session_manager_client_ = nullptr;
-  // Ownership is passed on to DBusThreadManager.
-  FakeBiodClient* fake_biod_client_ = nullptr;
 
   std::unique_ptr<ui::ScopedAnimationDurationScaleMode> zero_duration_mode_;
 
diff --git a/chrome/browser/chromeos/login/lock/screen_locker_unittest.cc b/chrome/browser/chromeos/login/lock/screen_locker_unittest.cc
index 7cf3274e..bc12e33 100644
--- a/chrome/browser/chromeos/login/lock/screen_locker_unittest.cc
+++ b/chrome/browser/chromeos/login/lock/screen_locker_unittest.cc
@@ -23,6 +23,7 @@
 #include "chrome/test/base/testing_profile_manager.h"
 #include "chromeos/audio/cras_audio_handler.h"
 #include "chromeos/cryptohome/system_salt_getter.h"
+#include "chromeos/dbus/biod/biod_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/login/login_state/login_state.h"
 #include "chromeos/system/fake_statistics_provider.h"
@@ -47,6 +48,7 @@
 
   void SetUp() override {
     DBusThreadManager::Initialize();
+    BiodClient::InitializeFake();
 
     // MojoSystemInfoDispatcher dependency:
     bluez::BluezDBusManager::GetSetterForTesting();
@@ -82,6 +84,8 @@
     media::AudioManager::Get()->Shutdown();
     session_controller_client_.reset();
     chromeos::LoginState::Shutdown();
+    BiodClient::Shutdown();
+    DBusThreadManager::Shutdown();
   }
 
  protected:
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc b/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
index 01a3fc2..377df41e 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
@@ -255,6 +255,11 @@
   ambient_light_values_ = std::make_unique<AmbientLightSampleBuffer>(
       params_.auto_brightness_als_horizon);
 
+  // TODO(jiameng): move this to device config once we complete experiments.
+  if (model_config.metrics_key == "atlas") {
+    params_.user_adjustment_effect = UserAdjustmentEffect::kContinueAuto;
+  }
+
   const int user_adjustment_effect_as_int = GetFieldTrialParamByFeatureAsInt(
       features::kAutoScreenBrightness, "user_adjustment_effect",
       static_cast<int>(params_.user_adjustment_effect));
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/adapter.h b/chrome/browser/chromeos/power/auto_screen_brightness/adapter.h
index 23d47be..a4086db 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/adapter.h
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/adapter.h
@@ -74,8 +74,8 @@
     // The log of average ambient value has to go up (resp. down) by
     // |brightening_log_lux_threshold| (resp. |darkening_log_lux_threshold|)
     // from the current value before brightness could be changed.
-    double brightening_log_lux_threshold = 0.4;
-    double darkening_log_lux_threshold = 0.5;
+    double brightening_log_lux_threshold = 1.0;
+    double darkening_log_lux_threshold = 1.0;
 
     ModelCurve model_curve = ModelCurve::kLatest;
 
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/adapter_unittest.cc b/chrome/browser/chromeos/power/auto_screen_brightness/adapter_unittest.cc
index 2a9c2b0..ba15a00 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/adapter_unittest.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/adapter_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/chromeos/power/auto_screen_brightness/adapter.h"
 
+#include <map>
+
 #include "ash/public/cpp/ash_pref_names.h"
 #include "base/memory/ptr_util.h"
 #include "base/task/task_scheduler/task_scheduler.h"
@@ -850,6 +852,43 @@
   EXPECT_EQ(test_observer_.num_changes(), 2);
 }
 
+// Default user adjustment effect for atlas is Continue.
+TEST_F(AdapterTest, UserAdjustmentEffectContinueDefaultForAtlas) {
+  const std::map<std::string, std::string> params = {
+      {"brightening_log_lux_threshold", "0.1"},
+      {"darkening_log_lux_threshold", "0.2"},
+      {"model_curve", "2"},
+  };
+
+  Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
+       global_curve_, personal_curve_, GetTestModelConfig("atlas"), params);
+
+  EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
+  EXPECT_TRUE(adapter_->GetGlobalCurveForTesting());
+  EXPECT_EQ(*adapter_->GetGlobalCurveForTesting(), *global_curve_);
+  EXPECT_TRUE(adapter_->GetPersonalCurveForTesting());
+  EXPECT_EQ(*adapter_->GetPersonalCurveForTesting(), *personal_curve_);
+
+  thread_bundle_.FastForwardBy(base::TimeDelta::FromSeconds(1));
+
+  // Brightness is changed after the 1st ALS reading comes in.
+  fake_als_reader_.ReportAmbientLightUpdate(10);
+  thread_bundle_.RunUntilIdle();
+  EXPECT_EQ(test_observer_.num_changes(), 1);
+
+  // User manual adjustment doesn't disable Adapter.
+  fake_brightness_monitor_.ReportUserBrightnessChangeRequested();
+  thread_bundle_.RunUntilIdle();
+  EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
+  EXPECT_TRUE(adapter_->IsAppliedForTesting());
+
+  // Brightness is changed again after another ALS reading comes in.
+  thread_bundle_.FastForwardBy(base::TimeDelta::FromSeconds(1));
+  fake_als_reader_.ReportAmbientLightUpdate(30);
+  thread_bundle_.RunUntilIdle();
+  EXPECT_EQ(test_observer_.num_changes(), 2);
+}
+
 }  // namespace auto_screen_brightness
 }  // namespace power
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.h b/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.h
index 060e1a3..7af1e93 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.h
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.h
@@ -191,7 +191,7 @@
   // Once user remains idle for |training_delay_|, we start training the model.
   // If this value is 0, we will not need to wait for user to remain inactive.
   // This can be overridden by experiment flag "training_delay_in_seconds".
-  base::TimeDelta training_delay_ = base::TimeDelta::FromSeconds(60);
+  base::TimeDelta training_delay_ = base::TimeDelta::FromSeconds(0);
 
   ScopedObserver<AlsReader, AlsReader::Observer> als_reader_observer_;
 
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl_unittest.cc b/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl_unittest.cc
index 56ba206..79e8988c 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl_unittest.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl_unittest.cc
@@ -503,7 +503,9 @@
 // within a small window shorter than |training_delay_|.
 TEST_F(ModellerImplTest, OnUserBrightnessChanged) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       GetTestModelConfig());
+       GetTestModelConfig(), true /* is_trainer_configured */,
+       true /* is_personal_curve_valid */,
+       {{"training_delay_in_seconds", base::NumberToString(60)}});
 
   test_observer_->CheckStatus(true /* is_model_initialized */,
                               modeller_->GetGlobalCurveForTesting(),
@@ -555,7 +557,9 @@
 // User activities resets timer used to start training.
 TEST_F(ModellerImplTest, MultipleUserActivities) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       GetTestModelConfig());
+       GetTestModelConfig(), true /* is_trainer_configured */,
+       true /* is_personal_curve_valid */,
+       {{"training_delay_in_seconds", base::NumberToString(60)}});
 
   test_observer_->CheckStatus(true /* is_model_initialized */,
                               modeller_->GetGlobalCurveForTesting(),
diff --git a/chrome/browser/conflicts/module_event_sink_impl_win.cc b/chrome/browser/conflicts/module_event_sink_impl_win.cc
index 4ad94bc..e36d33d0 100644
--- a/chrome/browser/conflicts/module_event_sink_impl_win.cc
+++ b/chrome/browser/conflicts/module_event_sink_impl_win.cc
@@ -101,11 +101,9 @@
 void HandleModuleEvent(ModuleDatabase* module_database,
                        base::Process process,
                        content::ProcessType process_type,
-                       mojom::ModuleEventType event_Type,
                        uint64_t load_address) {
-  // Mojo takes care of validating |event_type|, so only |load_address| needs to
-  // be checked. Load addresses must be aligned with the allocation granularity
-  // which is at least 64KB on any supported Windows OS.
+  // Load addresses must be aligned with the allocation granularity which is at
+  // least 64KB on any supported Windows OS.
   if (load_address == 0 || load_address % (64 * 1024) != 0)
     return;
 
@@ -161,13 +159,12 @@
                           std::move(request));
 }
 
-void ModuleEventSinkImpl::OnModuleEvent(mojom::ModuleEventType event_type,
-                                        uint64_t load_address) {
+void ModuleEventSinkImpl::OnModuleEvent(uint64_t load_address) {
   // Handle the event on a background sequence.
   base::PostTaskWithTraits(
       FROM_HERE,
       {base::TaskPriority::BEST_EFFORT,
        base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN, base::MayBlock()},
       base::BindOnce(&HandleModuleEvent, module_database_, process_.Duplicate(),
-                     process_type_, event_type, load_address));
+                     process_type_, load_address));
 }
diff --git a/chrome/browser/conflicts/module_event_sink_impl_win.h b/chrome/browser/conflicts/module_event_sink_impl_win.h
index 57adf06..d86a9c8 100644
--- a/chrome/browser/conflicts/module_event_sink_impl_win.h
+++ b/chrome/browser/conflicts/module_event_sink_impl_win.h
@@ -41,8 +41,7 @@
                      mojom::ModuleEventSinkRequest request);
 
   // mojom::ModuleEventSink implementation:
-  void OnModuleEvent(mojom::ModuleEventType event_type,
-                     uint64_t load_address) override;
+  void OnModuleEvent(uint64_t load_address) override;
 
  private:
   friend class ModuleEventSinkImplTest;
diff --git a/chrome/browser/conflicts/module_event_sink_impl_win_unittest.cc b/chrome/browser/conflicts/module_event_sink_impl_win_unittest.cc
index 890f559d..35706986 100644
--- a/chrome/browser/conflicts/module_event_sink_impl_win_unittest.cc
+++ b/chrome/browser/conflicts/module_event_sink_impl_win_unittest.cc
@@ -74,14 +74,12 @@
   EXPECT_EQ(0u, modules().size());
 
   // An invalid load event should not cause a module entry.
-  module_event_sink_impl_->OnModuleEvent(
-      mojom::ModuleEventType::MODULE_ALREADY_LOADED, kInvalidLoadAddress);
+  module_event_sink_impl_->OnModuleEvent(kInvalidLoadAddress);
   test_browser_thread_bundle_.RunUntilIdle();
   EXPECT_EQ(0u, modules().size());
 
   // A valid load event should cause a module entry.
-  module_event_sink_impl_->OnModuleEvent(mojom::ModuleEventType::MODULE_LOADED,
-                                         kValidLoadAddress);
+  module_event_sink_impl_->OnModuleEvent(kValidLoadAddress);
   test_browser_thread_bundle_.RunUntilIdle();
   EXPECT_EQ(1u, modules().size());
 }
diff --git a/chrome/browser/devtools/chrome_devtools_session.cc b/chrome/browser/devtools/chrome_devtools_session.cc
index 42b6cee6..80388aa3 100644
--- a/chrome/browser/devtools/chrome_devtools_session.cc
+++ b/chrome/browser/devtools/chrome_devtools_session.cc
@@ -11,7 +11,6 @@
 #include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/devtools_agent_host_client.h"
 #include "content/public/browser/devtools_manager_delegate.h"
-#include "content/public/common/content_switches.h"
 
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/devtools/protocol/window_manager_handler.h"
@@ -53,12 +52,6 @@
   client_->DispatchProtocolMessage(agent_host_, message->serialize(binary));
 }
 
-static bool EnableInternalDevToolsBinaryProtocol() {
-  static bool enabled = base::CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kEnableInternalDevToolsBinaryProtocol);
-  return enabled;
-}
-
 void ChromeDevToolsSession::HandleCommand(
     const std::string& method,
     const std::string& message,
@@ -70,14 +63,9 @@
 
   int call_id;
   std::string unused;
-  // We also check for --enable-internal-dev-tools-binary-protocol here,
-  // because if this flag is set, then content::DevToolsSession will
-  // send us binary even if the |client_| did not ask for it.
-  bool binary =
-      client_->UsesBinaryProtocol() || EnableInternalDevToolsBinaryProtocol();
   std::unique_ptr<protocol::DictionaryValue> value =
-      protocol::DictionaryValue::cast(
-          protocol::StringUtil::parseMessage(message, binary));
+      protocol::DictionaryValue::cast(protocol::StringUtil::parseMessage(
+          message, client_->UsesBinaryProtocol()));
   if (!dispatcher_->parseCommand(value.get(), &call_id, &unused))
     return;
   pending_commands_[call_id] = std::move(callback);
diff --git a/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc b/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc
index 1379f8ec..1d0e5f5 100644
--- a/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc
+++ b/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc
@@ -20,7 +20,7 @@
 #include "components/autofill/core/browser/autofill_manager.h"
 #include "components/autofill/core/browser/autofill_profile.h"
 #include "components/autofill/core/browser/form_data_importer.h"
-#include "components/autofill/core/browser/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/local_discovery/local_domain_resolver_unittest.cc b/chrome/browser/local_discovery/local_domain_resolver_unittest.cc
index 0f0f6b3..2a8a63d 100644
--- a/chrome/browser/local_discovery/local_domain_resolver_unittest.cc
+++ b/chrome/browser/local_discovery/local_domain_resolver_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/local_discovery/service_discovery_client_impl.h"
+#include "net/base/net_errors.h"
 #include "net/dns/mdns_client_impl.h"
 #include "net/dns/mock_mdns_socket_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -69,7 +70,7 @@
 class LocalDomainResolverTest : public testing::Test {
  public:
   void SetUp() override {
-    mdns_client_.StartListening(&socket_factory_);
+    EXPECT_EQ(net::OK, mdns_client_.StartListening(&socket_factory_));
   }
 
   std::string IPAddressToStringWithInvalid(const net::IPAddress& address) {
diff --git a/chrome/browser/local_discovery/service_discovery_client_mdns.cc b/chrome/browser/local_discovery/service_discovery_client_mdns.cc
index d8767b13..2b3a4f5b 100644
--- a/chrome/browser/local_discovery/service_discovery_client_mdns.cc
+++ b/chrome/browser/local_discovery/service_discovery_client_mdns.cc
@@ -21,6 +21,7 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/network_service_instance.h"
+#include "net/base/net_errors.h"
 #include "net/socket/datagram_server_socket.h"
 
 namespace net {
@@ -122,7 +123,7 @@
 const int kMaxRestartAttempts = 10;
 const int kRestartDelayOnNetworkChangeSeconds = 3;
 
-using MdnsInitCallback = base::Callback<void(bool)>;
+using MdnsInitCallback = base::Callback<void(int)>;
 
 class SocketFactory : public net::MDnsSocketFactory {
  public:
@@ -428,9 +429,9 @@
                      g_browser_process->net_log()));
 }
 
-void ServiceDiscoveryClientMdns::OnMdnsInitialized(bool success) {
+void ServiceDiscoveryClientMdns::OnMdnsInitialized(int net_error) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  if (!success) {
+  if (net_error != net::OK) {
     ScheduleStartNewClient();
     return;
   }
diff --git a/chrome/browser/local_discovery/service_discovery_client_mdns.h b/chrome/browser/local_discovery/service_discovery_client_mdns.h
index 2b1394e35..2f22d19d 100644
--- a/chrome/browser/local_discovery/service_discovery_client_mdns.h
+++ b/chrome/browser/local_discovery/service_discovery_client_mdns.h
@@ -48,7 +48,7 @@
   void ScheduleStartNewClient();
   void StartNewClient();
   void OnInterfaceListReady(const net::InterfaceIndexFamilyList& interfaces);
-  void OnMdnsInitialized(bool success);
+  void OnMdnsInitialized(int net_error);
   void ReportSuccess();
   void InvalidateWeakPtrs();
   void OnBeforeMdnsDestroy();
diff --git a/chrome/browser/local_discovery/service_discovery_client_unittest.cc b/chrome/browser/local_discovery/service_discovery_client_unittest.cc
index 064cc31d..324c25d 100644
--- a/chrome/browser/local_discovery/service_discovery_client_unittest.cc
+++ b/chrome/browser/local_discovery/service_discovery_client_unittest.cc
@@ -211,7 +211,7 @@
  public:
   ServiceDiscoveryTest()
       : service_discovery_client_(&mdns_client_) {
-    mdns_client_.StartListening(&socket_factory_);
+    EXPECT_EQ(net::OK, mdns_client_.StartListening(&socket_factory_));
   }
 
   ~ServiceDiscoveryTest() override {}
diff --git a/chrome/browser/local_discovery/test_service_discovery_client.cc b/chrome/browser/local_discovery/test_service_discovery_client.cc
index cdaa954..d5ed856 100644
--- a/chrome/browser/local_discovery/test_service_discovery_client.cc
+++ b/chrome/browser/local_discovery/test_service_discovery_client.cc
@@ -4,8 +4,10 @@
 
 #include "chrome/browser/local_discovery/test_service_discovery_client.h"
 
+#include "base/logging.h"
 #include "chrome/browser/local_discovery/service_discovery_client_impl.h"
 #include "content/public/browser/browser_thread.h"
+#include "net/base/net_errors.h"
 #include "net/dns/mdns_client_impl.h"
 
 namespace local_discovery {
@@ -22,7 +24,8 @@
   mdns_client_.reset(new net::MDnsClientImpl());
   service_discovery_client_impl_.reset(new ServiceDiscoveryClientImpl(
       mdns_client_.get()));
-  mdns_client_->StartListening(&mock_socket_factory_);
+  int result = mdns_client_->StartListening(&mock_socket_factory_);
+  DCHECK_EQ(net::OK, result);
 
   EXPECT_CALL(mock_socket_factory_, OnSendTo(testing::_))
       .Times(testing::AnyNumber())
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 fde8d960..27b1d27 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
 <translation id="1120938014254001895">Fes lliscar dos dits cap amunt</translation>
 <translation id="1124771028211010580">L'estil de pantalla actual és paral·lel.</translation>
+<translation id="1126928665165112660">Sense cursiva</translation>
 <translation id="113582498867142724"><ph name="TAG" /> col·lecció amb <ph name="NUM" /> elements</translation>
 <translation id="1155043339247954670">No hi ha cap element de llista més.</translation>
 <translation id="1157782847298808853">Ajuda del teclat</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">Canyella</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> de <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">retorn de caràcters i de paraules</translation>
+<translation id="1334570596456017464">Subíndex</translation>
 <translation id="1339428534620983148">Columna anterior de la taula</translation>
 <translation id="1342835525016946179">article</translation>
 <translation id="1346059596910821859">Consell</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">Mostra la llista de capçaleres.</translation>
 <translation id="1912556590115083156">vlnk</translation>
 <translation id="1913761808037590218">#ed</translation>
+<translation id="1914424852593176649">Mida <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678">Acord <ph name="DOT" /></translation>
 <translation id="1923956950274750765">Orquídia mitjà</translation>
 <translation id="1954623340234317532">Control de la setmana de l'any</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">Capçalera de la fila:</translation>
 <translation id="2002895034995108595">Restableix el mapa de teclat actual</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{claudàtor d'obertura}other{# claudàtors d'obertura}}</translation>
+<translation id="2009187674653301682">No és un superíndex</translation>
 <translation id="2010555995361223825">Menús de ChromeVox</translation>
 <translation id="2045490512405922022">sense marcar</translation>
 <translation id="20601713649439366">No hi ha cap expressió matemàtica anterior.</translation>
@@ -167,6 +171,7 @@
 <translation id="2278490101488436824">Fes lliscar tres dits cap a l'esquerra</translation>
 <translation id="2281234842553884450">Control lliscant anterior</translation>
 <translation id="2311237334957139798">Ves al gest anterior en granularitat</translation>
+<translation id="2314393392395134769">No és un subíndex</translation>
 <translation id="2318372665160196757">Principal</translation>
 <translation id="2329324941084714723">Tauler de pestanya</translation>
 <translation id="2344193891939537199">Control de data i hora</translation>
@@ -298,10 +303,12 @@
 <translation id="3163593631834463955">La capçalera de la columna és buida.</translation>
 <translation id="316542773973815724">Navegació</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{espai}other{# espais}}</translation>
+<translation id="3179119189286472195">No és un enllaç</translation>
 <translation id="320961988183078793">s'ha introduït <ph name="TYPE" /></translation>
 <translation id="321072937702597574">Orquídia</translation>
 <translation id="3218691001991391708">enganxa <ph name="TEXT" />.</translation>
 <translation id="3223701887221307104"><ph name="NAME" />, pestanya</translation>
+<translation id="3223779237381380437">Sense ratllat</translation>
 <translation id="3226035351387556942">chk</translation>
 <translation id="3229375994964697375">Enllaç visitat</translation>
 <translation id="3232388865800379423">Un botó emergent</translation>
@@ -515,6 +522,7 @@
 <translation id="4763296182459741068">Ajustat a la part inferior</translation>
 <translation id="4763480195061959176">vídeo</translation>
 <translation id="4764692524839457597">opció predeterminada</translation>
+<translation id="4772771694153161212">Sense subratllat</translation>
 <translation id="479989351350248267">cerca</translation>
 <translation id="4804818685124855865">Desconnecta</translation>
 <translation id="481165870889056555">Presenta el títol de la pàgina actual</translation>
@@ -530,6 +538,7 @@
 <translation id="4846428657345567687">Et donem la benvinguda a ChromeVox</translation>
 <translation id="4848993367330139335">cronòmetre</translation>
 <translation id="4850023505158945298">Element similar anterior.</translation>
+<translation id="4862744964787595316">Sense negreta</translation>
 <translation id="4866956062845190338">rdmnuitm</translation>
 <translation id="4867316986324544967">Activa el registre TTS</translation>
 <translation id="4877261390094455813">Introduïu una consulta de cerca.</translation>
@@ -628,7 +637,7 @@
 <translation id="5518443085409638729">Situa el cursor entre caràcters en editar un text (com a Mac OS X)</translation>
 <translation id="552195134157544755">Botó d'opció</translation>
 <translation id="5534303576632885660">capçalera</translation>
-<translation id="5539820223028224601">Gris pàlid</translation>
+<translation id="5539820223028224601">Gris pàl·lid</translation>
 <translation id="5546092960038624944">No hi ha cap capçalera anterior del nivell 5.</translation>
 <translation id="556042886152191864">Botó</translation>
 <translation id="5561345396546889625">Llista següent</translation>
@@ -842,6 +851,7 @@
 <translation id="712735679809149106">retorn de paraules</translation>
 <translation id="7137397390322864165">Salmó</translation>
 <translation id="713824876195128146">Cita de bloc següent</translation>
+<translation id="7140168702531682811">Superíndex</translation>
 <translation id="7143034430156387447">Alterna entre braille de sis i vuit punts</translation>
 <translation id="7143207342074048698">S'està connectant</translation>
 <translation id="7153618581592392745">Lavanda</translation>
@@ -1138,6 +1148,7 @@
 <translation id="8883850400338911892">edurl 8punts</translation>
 <translation id="8896347895970027998">Activa o desactiva ChromeVox.</translation>
 <translation id="8896479570570613387">Porpra mitjà</translation>
+<translation id="8897030325301866860">Tipus de lletra <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">Retorn de la puntuació del cicle.</translation>
 <translation id="8900148057318340779">Tecla de prefix</translation>
 <translation id="8908714597367957477">colhdr</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 a756be1..b6be0f2 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "adam", "á": "dlouhé a", "b": "božena", "c": "cyril", "č": "čeněk", "d": "david", "ď": "ďáblice", "e": "emil", "ě": "e s háčkem", "é": "dlouhé e", "f": "františek", "g": "gustav", "h": "helena", "ch": "chrudim", "i": "ivan", "í": "dlouhé měkké i", "j": "josef", "k": "karel", "l": "ludvík", "m": "marie", "n": "neruda", "ň": "nina", "o": "otakar", "ó": "dlouhé o", "p": "petr", "q": "quido", "r": "rudolf", "ř": "řehoř", "s": "svatopluk", "š": "šimon", "t": "tomáš", "ť": "těšnov", "u": "urban", "ů": "u s kroužkem", "ú": "u s čárkou", "v": "václav", "w": "dvojité v", "x": "xaver", "y": "ypsilon", "ý": "dlouhé tvrdé y", "z": "zuzana", "ž": "žofie"}</translation>
 <translation id="1120938014254001895">Přejeďte dvěma prsty nahoru</translation>
 <translation id="1124771028211010580">Aktuální styl zobrazení je vedle sebe.</translation>
+<translation id="1126928665165112660">Není kurzíva</translation>
 <translation id="113582498867142724">Sbírka <ph name="TAG" /> s <ph name="NUM" /> položkami</translation>
 <translation id="1155043339247954670">Žádná další položka seznamu.</translation>
 <translation id="1157782847298808853">Nápověda klávesnice</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">Šedobéžová</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> z <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">vyslovovat znaky a slova</translation>
+<translation id="1334570596456017464">Dolní index</translation>
 <translation id="1339428534620983148">Předchozí sloupec tabulky</translation>
 <translation id="1342835525016946179">čl</translation>
 <translation id="1346059596910821859">Tip</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">Zobrazit seznam nadpisů</translation>
 <translation id="1912556590115083156">navšt odkaz</translation>
 <translation id="1913761808037590218">upr číslo</translation>
+<translation id="1914424852593176649">Velikost <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678">Současné stisknutí tlačítek <ph name="DOT" /></translation>
 <translation id="1923956950274750765">Středně orchidejová</translation>
 <translation id="1954623340234317532">Ovládací prvek – týden v roce</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">Záhlaví řádku:</translation>
 <translation id="2002895034995108595">Resetovat aktuální mapu kláves</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{levá hranatá závorka}few{# levé hranaté závorky}many{# left brackets}other{# levých hranatých závorek}}</translation>
+<translation id="2009187674653301682">Není horní index</translation>
 <translation id="2010555995361223825">Nabídky ChromeVox</translation>
 <translation id="2045490512405922022">nezaškrtnuto</translation>
 <translation id="20601713649439366">Žádný předchozí matematický výraz není.</translation>
@@ -167,6 +171,7 @@
 <translation id="2278490101488436824">Přejeďte třemi prsty doleva</translation>
 <translation id="2281234842553884450">Předchozí posuvník</translation>
 <translation id="2311237334957139798">Přejít na předchozí při úrovni podrobnosti</translation>
+<translation id="2314393392395134769">Není dolní index</translation>
 <translation id="2318372665160196757">Hlavní</translation>
 <translation id="2329324941084714723">Panel karty</translation>
 <translation id="2344193891939537199">Ovládací prvek času a data</translation>
@@ -298,10 +303,12 @@
 <translation id="3163593631834463955">Prázdné záhlaví sloupce</translation>
 <translation id="316542773973815724">Navigace</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{mezera}few{# mezery}many{# spaces}other{# mezer}}</translation>
+<translation id="3179119189286472195">Není odkaz</translation>
 <translation id="320961988183078793">zadá: <ph name="TYPE" /></translation>
 <translation id="321072937702597574">Orchidejová</translation>
 <translation id="3218691001991391708">vložit <ph name="TEXT" />.</translation>
 <translation id="3223701887221307104"><ph name="NAME" />, karta</translation>
+<translation id="3223779237381380437">Není přeškrtnuté</translation>
 <translation id="3226035351387556942">zaškrt pol</translation>
 <translation id="3229375994964697375">Navštívený odkaz</translation>
 <translation id="3232388865800379423">Tlačítko s vyskakovacím oknem</translation>
@@ -515,6 +522,7 @@
 <translation id="4763296182459741068">Skok na konec</translation>
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">výchozí</translation>
+<translation id="4772771694153161212">Bez podtržení</translation>
 <translation id="479989351350248267">search</translation>
 <translation id="4804818685124855865">Odpojit</translation>
 <translation id="481165870889056555">Oznámit název aktuální stránky</translation>
@@ -530,6 +538,7 @@
 <translation id="4846428657345567687">Vítejte v nástroji ChromeVox!</translation>
 <translation id="4848993367330139335">časovač</translation>
 <translation id="4850023505158945298">Předchozí podobný prvek.</translation>
+<translation id="4862744964787595316">Není tučné</translation>
 <translation id="4866956062845190338">přep pol nabíd</translation>
 <translation id="4867316986324544967">Povolit protokolování TTS</translation>
 <translation id="4877261390094455813">Zadejte vyhledávací dotaz.</translation>
@@ -842,6 +851,7 @@
 <translation id="712735679809149106">vyslovovat slova</translation>
 <translation id="7137397390322864165">Lososová</translation>
 <translation id="713824876195128146">Další blok citace</translation>
+<translation id="7140168702531682811">Horní index</translation>
 <translation id="7143034430156387447">Přepnout mezi šestibodovým a osmibodovým Braillovým písmem</translation>
 <translation id="7143207342074048698">Připojování</translation>
 <translation id="7153618581592392745">Levandulová</translation>
@@ -1138,6 +1148,7 @@
 <translation id="8883850400338911892">upr url 8b</translation>
 <translation id="8896347895970027998">Aktivace a deaktivace rozšíření ChromeVox.</translation>
 <translation id="8896479570570613387">Středně nachová</translation>
+<translation id="8897030325301866860">Písmo <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">Vyslovování interpunkce</translation>
 <translation id="8900148057318340779">Modifikační klávesa</translation>
 <translation id="8908714597367957477">záhl sloupce</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 9375593..c20e4e5 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
 <translation id="1120938014254001895">Desliza dos dedos hacia arriba</translation>
 <translation id="1124771028211010580">El estilo de presentación actual es en paralelo.</translation>
+<translation id="1126928665165112660">Sin cursiva</translation>
 <translation id="113582498867142724">Colección de <ph name="TAG" /> con <ph name="NUM" /> elementos</translation>
 <translation id="1155043339247954670">No hay ningún elemento de la lista posterior.</translation>
 <translation id="1157782847298808853">Ayuda del teclado</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">Bronce</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> de <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">decir palabras y caracteres</translation>
+<translation id="1334570596456017464">Subíndice</translation>
 <translation id="1339428534620983148">Columna anterior de la tabla</translation>
 <translation id="1342835525016946179">artículo</translation>
 <translation id="1346059596910821859">Propina</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">Muestra la lista de encabezados</translation>
 <translation id="1912556590115083156">vlnk</translation>
 <translation id="1913761808037590218">#ed</translation>
+<translation id="1914424852593176649">Tamaño <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678">Acorde <ph name="DOT" /></translation>
 <translation id="1923956950274750765">Orquídea medio</translation>
 <translation id="1954623340234317532">Control de semana del año</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">Encabezado de fila:</translation>
 <translation id="2002895034995108595">Restablecer mapa de teclado actual</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{corchete de apertura}other{# corchetes de apertura}}</translation>
+<translation id="2009187674653301682">Sin superíndice</translation>
 <translation id="2010555995361223825">Menús de ChromeVox</translation>
 <translation id="2045490512405922022">sin seleccionar</translation>
 <translation id="20601713649439366">No hay expresiones matemáticas anteriores.</translation>
@@ -168,6 +172,7 @@
 <translation id="2278490101488436824">Desliza tres dedos hacia la izquierda</translation>
 <translation id="2281234842553884450">Control deslizante anterior</translation>
 <translation id="2311237334957139798">Cambiar a granularidad anterior</translation>
+<translation id="2314393392395134769">Sin subíndice</translation>
 <translation id="2318372665160196757">Principal</translation>
 <translation id="2329324941084714723">Panel de pestaña</translation>
 <translation id="2344193891939537199">Control de fecha y hora</translation>
@@ -299,10 +304,12 @@
 <translation id="3163593631834463955">Encabezado de columna vacío</translation>
 <translation id="316542773973815724">Navegación</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{espacio}other{# espacios}}</translation>
+<translation id="3179119189286472195">Sin enlace</translation>
 <translation id="320961988183078793">se ha introducido <ph name="TYPE" />.</translation>
 <translation id="321072937702597574">Orquídea</translation>
 <translation id="3218691001991391708">pegar <ph name="TEXT" />.</translation>
 <translation id="3223701887221307104"><ph name="NAME" />, pestaña</translation>
+<translation id="3223779237381380437">Sin tachado</translation>
 <translation id="3226035351387556942">chk</translation>
 <translation id="3229375994964697375">Vínculo visitado</translation>
 <translation id="3232388865800379423">Un botón emergente</translation>
@@ -516,6 +523,7 @@
 <translation id="4763296182459741068">Continuar a la parte inferior</translation>
 <translation id="4763480195061959176">vídeo</translation>
 <translation id="4764692524839457597">opción predeterminada</translation>
+<translation id="4772771694153161212">Sin subrayado</translation>
 <translation id="479989351350248267">buscar</translation>
 <translation id="4804818685124855865">Desvincular</translation>
 <translation id="481165870889056555">Indica el título de la página actual</translation>
@@ -531,6 +539,7 @@
 <translation id="4846428657345567687">Te damos la bienvenida a ChromeVox.</translation>
 <translation id="4848993367330139335">tmr</translation>
 <translation id="4850023505158945298">Elemento anterior similar.</translation>
+<translation id="4862744964787595316">Sin negrita</translation>
 <translation id="4866956062845190338">rdmnuitm</translation>
 <translation id="4867316986324544967">Habilita registro de síntesis de voz</translation>
 <translation id="4877261390094455813">Introduce una consulta de búsqueda.</translation>
@@ -843,6 +852,7 @@
 <translation id="712735679809149106">decir palabras</translation>
 <translation id="7137397390322864165">Salmón</translation>
 <translation id="713824876195128146">Siguiente cita de bloque</translation>
+<translation id="7140168702531682811">Superíndice</translation>
 <translation id="7143034430156387447">Cambiar entre braille de 6 y 8 puntos</translation>
 <translation id="7143207342074048698">Conectando</translation>
 <translation id="7153618581592392745">Lavanda</translation>
@@ -1139,6 +1149,7 @@
 <translation id="8883850400338911892">edurl 8pun</translation>
 <translation id="8896347895970027998">Activar o desactivar ChromeVox.</translation>
 <translation id="8896479570570613387">Púrpura medio</translation>
+<translation id="8897030325301866860">Fuente <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">Di ciclo de puntuación</translation>
 <translation id="8900148057318340779">Tecla de prefijo</translation>
 <translation id="8908714597367957477">colhdr</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
index 249303f..2e08642 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "aarne", "b": "bertta", "c": "celcius", "d": "daavid", "e": "eemeli", "f": "faarao", "g": "gideon", "h": "heikki", "i": "iivari", "j": "jussi","k": "kalle", "l": "lauri", "m": "matti", "n": "niilo", "o": "otto","p": "paavo", "q": "kuu", "r": "risto", "s": "sakari", "t": "tyyne", "u": "urho", "v": "vihtori", "w": "wiski","x": "äksä", "y": "yrjö", "z": "tseta", "å": "åke", "ä": "äiti", "ö": "öljy"}</translation>
 <translation id="1120938014254001895">Pyyhkäise ylös kahdella sormella</translation>
 <translation id="1124771028211010580">Nykyinen näyttötyyli on rinnakkainen.</translation>
+<translation id="1126928665165112660">Ei kursiivia</translation>
 <translation id="113582498867142724"><ph name="TAG" />-kokoelma, jossa <ph name="NUM" /> kohdetta</translation>
 <translation id="1155043339247954670">Ei seuraavia luettelokohteita.</translation>
 <translation id="1157782847298808853">Näppäimistöohje</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">Kellanruskea</translation>
 <translation id="1331702245475014624"><ph name="INDEX" />/<ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">merkkien ja sanojen puhuminen</translation>
+<translation id="1334570596456017464">Alaindeksi</translation>
 <translation id="1339428534620983148">Taulukon edellinen sarake</translation>
 <translation id="1342835525016946179">artikkeli</translation>
 <translation id="1346059596910821859">Vinkki</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">Näytä otsikoiden luettelo</translation>
 <translation id="1912556590115083156">vlnk</translation>
 <translation id="1913761808037590218">#ed</translation>
+<translation id="1914424852593176649">Koko <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678"><ph name="DOT" /> sointu</translation>
 <translation id="1923956950274750765">Keskitumma violetti</translation>
 <translation id="1954623340234317532">Vuoden viikon hallinta</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">Rivin otsikko:</translation>
 <translation id="2002895034995108595">Nollaa nykyinen näppäinkartta</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{vasen hakasulje}other{# vasenta hakasuljetta}}</translation>
+<translation id="2009187674653301682">Ei yläindeksiä</translation>
 <translation id="2010555995361223825">ChromeVox-valikot</translation>
 <translation id="2045490512405922022">ei tarkistettu</translation>
 <translation id="20601713649439366">Ei edeltävää matemaattista lauseketta.</translation>
@@ -168,6 +172,7 @@
 <translation id="2278490101488436824">Pyyhkäise vasemmalle kolmella sormella</translation>
 <translation id="2281234842553884450">Edellinen liukusäädin</translation>
 <translation id="2311237334957139798">Palaa edelliseen tarkkuustasoon</translation>
+<translation id="2314393392395134769">Ei alaindeksiä</translation>
 <translation id="2318372665160196757">Ensisijainen</translation>
 <translation id="2329324941084714723">Välilehtipaneeli</translation>
 <translation id="2344193891939537199">Päivämäärän ja ajan valinta</translation>
@@ -299,10 +304,12 @@
 <translation id="3163593631834463955">Tyhjä sarakkeen otsikko</translation>
 <translation id="316542773973815724">Liikkuminen</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{välilyönti}other{# välilyöntiä}}</translation>
+<translation id="3179119189286472195">Ei linkki</translation>
 <translation id="320961988183078793">lisäsit seuraavaa sisältöä: <ph name="TYPE" /></translation>
 <translation id="321072937702597574">Orkidea</translation>
 <translation id="3218691001991391708">liitä <ph name="TEXT" />.</translation>
 <translation id="3223701887221307104"><ph name="NAME" />, välilehti</translation>
+<translation id="3223779237381380437">Ei yliviivausta</translation>
 <translation id="3226035351387556942">chk</translation>
 <translation id="3229375994964697375">Käyty linkki</translation>
 <translation id="3232388865800379423">Ponnahduspainike</translation>
@@ -516,6 +523,7 @@
 <translation id="4763296182459741068">Sijoitettu alareunaan</translation>
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">oletus</translation>
+<translation id="4772771694153161212">Ei alleviivausta</translation>
 <translation id="479989351350248267">haku</translation>
 <translation id="4804818685124855865">Katkaise yhteys</translation>
 <translation id="481165870889056555">Ilmoita nykyisen sivun otsikko</translation>
@@ -531,6 +539,7 @@
 <translation id="4846428657345567687">Tervetuloa käyttämään ChromeVoxia!</translation>
 <translation id="4848993367330139335">ajast.</translation>
 <translation id="4850023505158945298">Edellinen samankaltainen elementti.</translation>
+<translation id="4862744964787595316">Ei lihavointia</translation>
 <translation id="4866956062845190338">rdmnuitm</translation>
 <translation id="4867316986324544967">Ota TTS-kirjaaminen käyttöön</translation>
 <translation id="4877261390094455813">Anna hakutermi.</translation>
@@ -843,6 +852,7 @@
 <translation id="712735679809149106">sanojen puhuminen</translation>
 <translation id="7137397390322864165">Lohenpunainen</translation>
 <translation id="713824876195128146">Seuraava estoviittaus</translation>
+<translation id="7140168702531682811">Yläindeksi</translation>
 <translation id="7143034430156387447">Vaihda 6 ja 8 pisteen pistekirjoituksen välillä</translation>
 <translation id="7143207342074048698">Yhdistetään</translation>
 <translation id="7153618581592392745">Laventeli</translation>
@@ -1139,6 +1149,7 @@
 <translation id="8883850400338911892">urlmuok 8pist</translation>
 <translation id="8896347895970027998">Ota ChromeVox käyttöön tai poista se käytöstä.</translation>
 <translation id="8896479570570613387">Keskitumma violetti</translation>
+<translation id="8897030325301866860">Kirjasin <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">Ota välimerkkien puhuminen käyttöön tai pois käytöstä</translation>
 <translation id="8900148057318340779">Etuliitenäppäin</translation>
 <translation id="8908714597367957477">colhdr</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
index b5ec1b6..fb5e7b6 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
 <translation id="1120938014254001895">Mag-swipe pataas gamit ang dalawang daliri</translation>
 <translation id="1124771028211010580">Tabi-tabi ang kasalukuyang istilo ng display.</translation>
+<translation id="1126928665165112660">Hindi naka-italic</translation>
 <translation id="113582498867142724">Koleksyon ng <ph name="TAG" /> na may <ph name="NUM" /> (na) item</translation>
 <translation id="1155043339247954670">Walang susunod na item sa listahan.</translation>
 <translation id="1157782847298808853">Tulong sa Keyboard</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">Tan</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> ng <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">echo ng character at salita</translation>
+<translation id="1334570596456017464">Subscript</translation>
 <translation id="1339428534620983148">Nakaraang column ng talahanayan</translation>
 <translation id="1342835525016946179">article</translation>
 <translation id="1346059596910821859">Tip</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">Ipakita ang listahan ng mga heading</translation>
 <translation id="1912556590115083156">vlnk</translation>
 <translation id="1913761808037590218">#ed</translation>
+<translation id="1914424852593176649">Laki <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678"><ph name="DOT" /> chord</translation>
 <translation id="1923956950274750765">Medium Orchid</translation>
 <translation id="1954623340234317532">Kontrol sa linggo ng taon</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">Header ng row:</translation>
 <translation id="2002895034995108595">I-reset ang kasalukuyang keymap</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{kaliwang bracket}one{# kaliwang bracket}other{# na kaliwang bracket}}</translation>
+<translation id="2009187674653301682">Hindi superscript</translation>
 <translation id="2010555995361223825">Mga Menu ng ChromeVox</translation>
 <translation id="2045490512405922022">hindi nilagyan ng check</translation>
 <translation id="20601713649439366">Walang nakaraang math expression.</translation>
@@ -168,6 +172,7 @@
 <translation id="2278490101488436824">Mag-swipe pakaliwa gamit ang tatlong daliri</translation>
 <translation id="2281234842553884450">Nakaraang slider</translation>
 <translation id="2311237334957139798">Lumipat sa nakaraang granularity</translation>
+<translation id="2314393392395134769">Hindi subscript</translation>
 <translation id="2318372665160196757">Pangunahin</translation>
 <translation id="2329324941084714723">Panel ng tab</translation>
 <translation id="2344193891939537199">Kontrol sa petsa at oras</translation>
@@ -299,10 +304,12 @@
 <translation id="3163593631834463955">Walang laman na header ng column</translation>
 <translation id="316542773973815724">Nabigasyon</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{espasyo}one{# espasyo}other{# na espasyo}}</translation>
+<translation id="3179119189286472195">Hindi link</translation>
 <translation id="320961988183078793">naglagay ng <ph name="TYPE" /></translation>
 <translation id="321072937702597574">Orchid</translation>
 <translation id="3218691001991391708">i-paste ang <ph name="TEXT" />.</translation>
 <translation id="3223701887221307104"><ph name="NAME" />, tab</translation>
+<translation id="3223779237381380437">Hindi naka-line through</translation>
 <translation id="3226035351387556942">chk</translation>
 <translation id="3229375994964697375">Nabisita nang link</translation>
 <translation id="3232388865800379423">Isang pop up na button</translation>
@@ -516,6 +523,7 @@
 <translation id="4763296182459741068">Naka-wrap sa ibaba</translation>
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">default</translation>
+<translation id="4772771694153161212">Hindi nakasalungguhit</translation>
 <translation id="479989351350248267">search</translation>
 <translation id="4804818685124855865">I-disconnect</translation>
 <translation id="481165870889056555">Ianunsyo ang pamagat ng kasalukuyang page</translation>
@@ -531,6 +539,7 @@
 <translation id="4846428657345567687">Welcome sa ChromeVox!</translation>
 <translation id="4848993367330139335">tmr</translation>
 <translation id="4850023505158945298">Nakaraang katulad na elemento.</translation>
+<translation id="4862744964787595316">Hindi naka-bold</translation>
 <translation id="4866956062845190338">rdmnuitm</translation>
 <translation id="4867316986324544967">I-enable ang pagtatalang TTS</translation>
 <translation id="4877261390094455813">Maglagay ng query sa paghahanap.</translation>
@@ -843,6 +852,7 @@
 <translation id="712735679809149106">echo ng salita</translation>
 <translation id="7137397390322864165">Salmon</translation>
 <translation id="713824876195128146">Susunod na block quote</translation>
+<translation id="7140168702531682811">Superscript</translation>
 <translation id="7143034430156387447">Mag-toggle sa pagitan ng 6 at 8 dot braille</translation>
 <translation id="7143207342074048698">Kumokonekta</translation>
 <translation id="7153618581592392745">Lavender</translation>
@@ -1139,6 +1149,7 @@
 <translation id="8883850400338911892">urled 8dot</translation>
 <translation id="8896347895970027998">I-toggle sa aktibo o hindi aktibo ang ChromeVox.</translation>
 <translation id="8896479570570613387">Medium Purple</translation>
+<translation id="8897030325301866860">Font <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">Echo ng cycle punctuation</translation>
 <translation id="8900148057318340779">Prefix key</translation>
 <translation id="8908714597367957477">colhdr</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 113ddf7..c3255a7 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
 <translation id="1120938014254001895">Balayer l'écran vers le haut avec deux doigts</translation>
 <translation id="1124771028211010580">Le style d'affichage actuel est "côte à côte".</translation>
+<translation id="1126928665165112660">Pas en italique</translation>
 <translation id="113582498867142724">Collection de <ph name="TAG" /> avec <ph name="NUM" /> éléments</translation>
 <translation id="1155043339247954670">Aucun élément de liste suivant</translation>
 <translation id="1157782847298808853">Aide du clavier</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">Brun clair</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> sur <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">écho des caractères et des mots</translation>
+<translation id="1334570596456017464">Indice</translation>
 <translation id="1339428534620983148">Colonne précédente du tableau</translation>
 <translation id="1342835525016946179">article</translation>
 <translation id="1346059596910821859">Pourboire</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">Afficher la liste des en-têtes</translation>
 <translation id="1912556590115083156">vlnk</translation>
 <translation id="1913761808037590218">#ed</translation>
+<translation id="1914424852593176649">Taille <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678">Accord <ph name="DOT" /></translation>
 <translation id="1923956950274750765">Orchidée moyen</translation>
 <translation id="1954623340234317532">Commande relative à la semaine de l'année</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">En-tête de ligne :</translation>
 <translation id="2002895034995108595">Réinitialiser le mappage du clavier actuel</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{crochet gauche}one{# crochet gauche}other{# crochets gauches}}</translation>
+<translation id="2009187674653301682">Pas en exposant</translation>
 <translation id="2010555995361223825">Menus ChromeVox</translation>
 <translation id="2045490512405922022">non cochée</translation>
 <translation id="20601713649439366">Aucune expression mathématique précédente</translation>
@@ -168,6 +172,7 @@
 <translation id="2278490101488436824">Balayer l'écran vers la gauche avec trois doigts</translation>
 <translation id="2281234842553884450">Curseur précédent</translation>
 <translation id="2311237334957139798">Revenir au niveau de précision précédent</translation>
+<translation id="2314393392395134769">Pas en indice</translation>
 <translation id="2318372665160196757">Principal</translation>
 <translation id="2329324941084714723">Panneau tab</translation>
 <translation id="2344193891939537199">Commande relative à la date et à l'heure</translation>
@@ -299,10 +304,12 @@
 <translation id="3163593631834463955">En-tête de colonne vide</translation>
 <translation id="316542773973815724">Navigation</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{espace}one{# espace}other{# espaces}}</translation>
+<translation id="3179119189286472195">Pas un lien</translation>
 <translation id="320961988183078793"><ph name="TYPE" /> saisi</translation>
 <translation id="321072937702597574">Orchidée</translation>
 <translation id="3218691001991391708">coller "<ph name="TEXT" />".</translation>
 <translation id="3223701887221307104"><ph name="NAME" />, onglet</translation>
+<translation id="3223779237381380437">Texte non barré</translation>
 <translation id="3226035351387556942">chk</translation>
 <translation id="3229375994964697375">Lien consulté</translation>
 <translation id="3232388865800379423">Un bouton de fenêtre pop-up</translation>
@@ -516,6 +523,7 @@
 <translation id="4763296182459741068">Accéder au bas</translation>
 <translation id="4763480195061959176">vidéo</translation>
 <translation id="4764692524839457597">par défaut</translation>
+<translation id="4772771694153161212">Non souligné</translation>
 <translation id="479989351350248267">rechercher</translation>
 <translation id="4804818685124855865">Se déconnecter</translation>
 <translation id="481165870889056555">Énoncer le titre de la page actuelle</translation>
@@ -531,6 +539,7 @@
 <translation id="4846428657345567687">Bienvenue dans ChromeVox !</translation>
 <translation id="4848993367330139335">horloge</translation>
 <translation id="4850023505158945298">Élément similaire précédent</translation>
+<translation id="4862744964787595316">Pas en gras</translation>
 <translation id="4866956062845190338">rdmnuitm</translation>
 <translation id="4867316986324544967">Activer l'enregistrement de la synthèse vocale dans le journal</translation>
 <translation id="4877261390094455813">Saisissez une requête de recherche.</translation>
@@ -843,6 +852,7 @@
 <translation id="712735679809149106">écho des mots</translation>
 <translation id="7137397390322864165">Saumon</translation>
 <translation id="713824876195128146">Bloc de citation suivant</translation>
+<translation id="7140168702531682811">Exposant</translation>
 <translation id="7143034430156387447">Alterner entre les méthodes braille à six et huit points</translation>
 <translation id="7143207342074048698">Connexion en cours</translation>
 <translation id="7153618581592392745">Lavande</translation>
@@ -1139,6 +1149,7 @@
 <translation id="8883850400338911892">modURL 8pt</translation>
 <translation id="8896347895970027998">Activer/Désactiver ChromeVox</translation>
 <translation id="8896479570570613387">Violet moyen</translation>
+<translation id="8897030325301866860">Police <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">Écho de la ponctuation par cycle</translation>
 <translation id="8900148057318340779">Touche Préfixe</translation>
 <translation id="8908714597367957477">colhdr</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
index c7ccb11..f93679de 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"א": "אלף", "ב": "בועז", "ג": "גימל", "ד": "דוד", "ה": "הגר", "ו": "וו", "ז": "זאב", "ח": "חוה", "ט": "טיח", "י": "יונה","כ": "כרמל", "ל": "לאה", "מ": "משה", "נ": "נשר", "ס": "סמך","ע": "עין", "פ": "פסל", "צ": "ציפור", "ק": "קורח", "ר": "רות", "ש": "שמיר", "ת": "תלם"}</translation>
 <translation id="1120938014254001895">החלקה מעלה עם שתי אצבעות</translation>
 <translation id="1124771028211010580">התצוגה הנוכחית היא זה לצד זה.</translation>
+<translation id="1126928665165112660">לא נטוי</translation>
 <translation id="113582498867142724">אוסף <ph name="TAG" /> עם <ph name="NUM" /> פריטים</translation>
 <translation id="1155043339247954670">אין עוד פריט ברשימה.</translation>
 <translation id="1157782847298808853">עזרה למקלדת</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">חום צהבהב</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> מתוך <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">הד תו ומילה</translation>
+<translation id="1334570596456017464">כתב תחתי</translation>
 <translation id="1339428534620983148">העמודה הקודמת בטבלה</translation>
 <translation id="1342835525016946179">article</translation>
 <translation id="1346059596910821859">טיפ</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">הצג את רשימת הכותרות</translation>
 <translation id="1912556590115083156">vlnk</translation>
 <translation id="1913761808037590218">#ed</translation>
+<translation id="1914424852593176649">גודל <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678">צירוף המקשים <ph name="DOT" /></translation>
 <translation id="1923956950274750765">סחלב בינוני</translation>
 <translation id="1954623340234317532">בקרת שבוע בשנה</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">כותרת שורה:</translation>
 <translation id="2002895034995108595">אפס את מפת המפתחות הנוכחית</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{סוגר מרובע שמאלי}two{# סימני סוגר מרובע שמאלי}many{# סימני סוגר מרובע שמאלי}other{# סימני סוגר מרובע שמאלי}}</translation>
+<translation id="2009187674653301682">לא כתב עילי</translation>
 <translation id="2010555995361223825">‏תפריטים של ChromeVox</translation>
 <translation id="2045490512405922022">לא מסומן</translation>
 <translation id="20601713649439366">אין ביטוי מתמטי קודם.</translation>
@@ -168,6 +172,7 @@
 <translation id="2278490101488436824">החלקה שמאלה עם שלוש אצבעות</translation>
 <translation id="2281234842553884450">המחוון הקודם</translation>
 <translation id="2311237334957139798">חזרה לפריט הקודם ברמת הפירוט הספציפית</translation>
+<translation id="2314393392395134769">לא כתב תחתי</translation>
 <translation id="2318372665160196757">ראשי</translation>
 <translation id="2329324941084714723">חלונית כרטיסיות</translation>
 <translation id="2344193891939537199">בקרת תאריך ושעה</translation>
@@ -299,10 +304,12 @@
 <translation id="3163593631834463955">כותרת עמודה ריקה</translation>
 <translation id="316542773973815724">ניווט</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{רווח}two{# רווחים}many{# רווחים}other{# רווחים}}</translation>
+<translation id="3179119189286472195">אינו קישור</translation>
 <translation id="320961988183078793">הוזן <ph name="TYPE" /></translation>
 <translation id="321072937702597574">סחלב</translation>
 <translation id="3218691001991391708">הדבקה של <ph name="TEXT" />.</translation>
 <translation id="3223701887221307104"><ph name="NAME" />, כרטיסייה</translation>
+<translation id="3223779237381380437">ללא קו חוצה</translation>
 <translation id="3226035351387556942">chk</translation>
 <translation id="3229375994964697375">קישור שהפעלת</translation>
 <translation id="3232388865800379423">לחצן קופץ</translation>
@@ -516,6 +523,7 @@
 <translation id="4763296182459741068">גלישה לחלק התחתון</translation>
 <translation id="4763480195061959176">סרטוני וידאו</translation>
 <translation id="4764692524839457597">ברירת מחדל</translation>
+<translation id="4772771694153161212">ללא קו תחתון</translation>
 <translation id="479989351350248267">Search</translation>
 <translation id="4804818685124855865">נתק</translation>
 <translation id="481165870889056555">הכרזה על הכותרת של הדף הנוכחי</translation>
@@ -531,6 +539,7 @@
 <translation id="4846428657345567687">‏זהו ChromeVox החדש!</translation>
 <translation id="4848993367330139335">tmr</translation>
 <translation id="4850023505158945298">הרכיב הדומה הקודם.</translation>
+<translation id="4862744964787595316">לא מודגש</translation>
 <translation id="4866956062845190338">rdmnuitm</translation>
 <translation id="4867316986324544967">‏אפשר רישום TTS</translation>
 <translation id="4877261390094455813">הזן שאילתת חיפוש.</translation>
@@ -843,6 +852,7 @@
 <translation id="712735679809149106">הד מילה</translation>
 <translation id="7137397390322864165">סלמון</translation>
 <translation id="713824876195128146">‏blockquote הבא</translation>
+<translation id="7140168702531682811">כתב עילי</translation>
 <translation id="7143034430156387447">מעבר בין ברייל 6 נקודות ו-8 נקודות</translation>
 <translation id="7143207342074048698">מתחבר</translation>
 <translation id="7153618581592392745">לבנדר</translation>
@@ -1139,6 +1149,7 @@
 <translation id="8883850400338911892">כתובת אתר 8 נק'</translation>
 <translation id="8896347895970027998">‏הפעל או כבה את ChromeVox.</translation>
 <translation id="8896479570570613387">סגול בינוני</translation>
+<translation id="8897030325301866860">גופן <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">הד סימני ניקוד מחזוריים</translation>
 <translation id="8900148057318340779">מקש קידומת</translation>
 <translation id="8908714597367957477">colhdr</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
index 191c3465..c2385558 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "fox", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
 <translation id="1120938014254001895">손가락 두 개를 사용하여 위로 스와이프</translation>
 <translation id="1124771028211010580">현재 디스플레이 스타일은 병렬식입니다.</translation>
+<translation id="1126928665165112660">기울임꼴 아님</translation>
 <translation id="113582498867142724"><ph name="NUM" />개 항목을 포함한 <ph name="TAG" /> 컬렉션</translation>
 <translation id="1155043339247954670">다음 목록 항목이 없습니다.</translation>
 <translation id="1157782847298808853">키보드 도움말</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">탠</translation>
 <translation id="1331702245475014624"><ph name="INDEX" />/<ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">문자 및 단어 에코</translation>
+<translation id="1334570596456017464">아래 첨자</translation>
 <translation id="1339428534620983148">이전 열</translation>
 <translation id="1342835525016946179">article</translation>
 <translation id="1346059596910821859">팁</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">제목 목록 표시</translation>
 <translation id="1912556590115083156">vlnk</translation>
 <translation id="1913761808037590218">#ed</translation>
+<translation id="1914424852593176649">크기: <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678"><ph name="DOT" />코드</translation>
 <translation id="1923956950274750765">미디엄 오키드</translation>
 <translation id="1954623340234317532">해당 연도의 주 컨트롤</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">행 헤더:</translation>
 <translation id="2002895034995108595">현재 키맵 재설정</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{왼쪽 꺾음 괄호}other{왼쪽 꺾음 괄호 #개}}</translation>
+<translation id="2009187674653301682">위 첨자 아님</translation>
 <translation id="2010555995361223825">ChromeVox 메뉴</translation>
 <translation id="2045490512405922022">선택 안함</translation>
 <translation id="20601713649439366">이전 수식이 없습니다.</translation>
@@ -168,6 +172,7 @@
 <translation id="2278490101488436824">손가락 세 개를 사용하여 왼쪽으로 스와이프</translation>
 <translation id="2281234842553884450">이전 슬라이더</translation>
 <translation id="2311237334957139798">이전 세부 수준으로 이동</translation>
+<translation id="2314393392395134769">아래 첨자 아님</translation>
 <translation id="2318372665160196757">기본</translation>
 <translation id="2329324941084714723">탭 패널</translation>
 <translation id="2344193891939537199">날짜 시간 컨트롤</translation>
@@ -299,10 +304,12 @@
 <translation id="3163593631834463955">열 헤더가 비어 있음</translation>
 <translation id="316542773973815724">탐색</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{공백}other{공백 #개}}</translation>
+<translation id="3179119189286472195">링크 아님</translation>
 <translation id="320961988183078793"><ph name="TYPE" /> 입력함</translation>
 <translation id="321072937702597574">오키드</translation>
 <translation id="3218691001991391708"><ph name="TEXT" /> 붙여넣기</translation>
 <translation id="3223701887221307104"><ph name="NAME" />, 탭</translation>
+<translation id="3223779237381380437">선이 그어져 있지 않음</translation>
 <translation id="3226035351387556942">chk</translation>
 <translation id="3229375994964697375">방문한 링크입니다.</translation>
 <translation id="3232388865800379423">팝업 버튼</translation>
@@ -516,6 +523,7 @@
 <translation id="4763296182459741068">페이지 하단으로 행 이동</translation>
 <translation id="4763480195061959176">동영상</translation>
 <translation id="4764692524839457597">기본값</translation>
+<translation id="4772771694153161212">밑줄 아님</translation>
 <translation id="479989351350248267">검색</translation>
 <translation id="4804818685124855865">연결 해제</translation>
 <translation id="481165870889056555">현재 페이지의 제목 알림</translation>
@@ -531,6 +539,7 @@
 <translation id="4846428657345567687">ChromeVox에 오신 것을 환영합니다.</translation>
 <translation id="4848993367330139335">tmr</translation>
 <translation id="4850023505158945298">이전 유사한 요소</translation>
+<translation id="4862744964787595316">굵은 글씨 아님</translation>
 <translation id="4866956062845190338">rdmnuitm</translation>
 <translation id="4867316986324544967">TTS 로깅 사용</translation>
 <translation id="4877261390094455813">검색어를 입력하세요.</translation>
@@ -843,6 +852,7 @@
 <translation id="712735679809149106">단어 에코</translation>
 <translation id="7137397390322864165">살몬</translation>
 <translation id="713824876195128146">다음 블록 인용</translation>
+<translation id="7140168702531682811">위 첨자</translation>
 <translation id="7143034430156387447">6점 점자와 8점 점자 간 전환</translation>
 <translation id="7143207342074048698">연결 중</translation>
 <translation id="7153618581592392745">라벤더색</translation>
@@ -1139,6 +1149,7 @@
 <translation id="8883850400338911892">url 수정 입력란 8점</translation>
 <translation id="8896347895970027998">ChromeVox를 활성화 또는 비활성화로 전환</translation>
 <translation id="8896479570570613387">미디엄 퍼플</translation>
+<translation id="8897030325301866860"><ph name="FONT_FAMILY" /> 글꼴</translation>
 <translation id="8898516272131543774">순환 구두점 에코</translation>
 <translation id="8900148057318340779">Prefix 키</translation>
 <translation id="8908714597367957477">colhdr</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 ab66e84c..228a81043 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu", "æ": "ærlig", "ø": "østen", "å": "Åse"}</translation>
 <translation id="1120938014254001895">Sveip to fingre opp</translation>
 <translation id="1124771028211010580">Nåværende visningsstil er side om side.</translation>
+<translation id="1126928665165112660">Ikke kursivert</translation>
 <translation id="113582498867142724">Samling av <ph name="TAG" /> med <ph name="NUM" /> elementer</translation>
 <translation id="1155043339247954670">Det finnes ikke flere listeelementer.</translation>
 <translation id="1157782847298808853">Tastaturhjelp</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">Gyllenbrun</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> av <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">tegn- og ordekko</translation>
+<translation id="1334570596456017464">Senket skrift</translation>
 <translation id="1339428534620983148">Forrige tabellkolonne</translation>
 <translation id="1342835525016946179">article</translation>
 <translation id="1346059596910821859">Tips</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">Vis overskriftsliste</translation>
 <translation id="1912556590115083156">vlnk</translation>
 <translation id="1913761808037590218">#ed</translation>
+<translation id="1914424852593176649">Størrelse <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678">akkord-<ph name="DOT" /></translation>
 <translation id="1923956950274750765">Middels orkide</translation>
 <translation id="1954623340234317532">Kontroll av ukenummer</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">Radoverskrift:</translation>
 <translation id="2002895034995108595">Tilbakestill gjeldende tastaturoppsett</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{venstre hakeparentes}other{# venstre hakeparenteser}}</translation>
+<translation id="2009187674653301682">Ikke hevet skrift</translation>
 <translation id="2010555995361223825">ChromeVox-menyer</translation>
 <translation id="2045490512405922022">ikke avmerket</translation>
 <translation id="20601713649439366">Det finnes ingen tidligere matteuttrykk.</translation>
@@ -168,6 +172,7 @@
 <translation id="2278490101488436824">Sveip tre fingre til venstre</translation>
 <translation id="2281234842553884450">Forrige glidebryter</translation>
 <translation id="2311237334957139798">Gå til forrige detaljnivå</translation>
+<translation id="2314393392395134769">Ikke senket skrift</translation>
 <translation id="2318372665160196757">Hovedelement</translation>
 <translation id="2329324941084714723">Fanepanel</translation>
 <translation id="2344193891939537199">Kontroll av dato/tidspunkt</translation>
@@ -299,10 +304,12 @@
 <translation id="3163593631834463955">Tom kolonneoverskrift</translation>
 <translation id="316542773973815724">Navigering</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{mellomrom}other{# mellomrom}}</translation>
+<translation id="3179119189286472195">Ikke link</translation>
 <translation id="320961988183078793">angitt <ph name="TYPE" /></translation>
 <translation id="321072937702597574">Orkide</translation>
 <translation id="3218691001991391708">lim inn <ph name="TEXT" />.</translation>
 <translation id="3223701887221307104"><ph name="NAME" />-fane</translation>
+<translation id="3223779237381380437">Ikke gjennomstreking</translation>
 <translation id="3226035351387556942">chk</translation>
 <translation id="3229375994964697375">Besøkt link.</translation>
 <translation id="3232388865800379423">En forgrunnsknapp</translation>
@@ -516,6 +523,7 @@
 <translation id="4763296182459741068">Legges sammen nederst</translation>
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">standard</translation>
+<translation id="4772771694153161212">Ikke understreking</translation>
 <translation id="479989351350248267">søk</translation>
 <translation id="4804818685124855865">Koble fra</translation>
 <translation id="481165870889056555">Kunngjør tittelen på den nåværende siden</translation>
@@ -531,6 +539,7 @@
 <translation id="4846428657345567687">Velkommen til ChromeVox!</translation>
 <translation id="4848993367330139335">tmr</translation>
 <translation id="4850023505158945298">Forrige lignende element.</translation>
+<translation id="4862744964787595316">Ikke fet</translation>
 <translation id="4866956062845190338">rdmnuitm</translation>
 <translation id="4867316986324544967">Slå på TTS-loggføring</translation>
 <translation id="4877261390094455813">Angi et søkeord.</translation>
@@ -843,6 +852,7 @@
 <translation id="712735679809149106">ordekko</translation>
 <translation id="7137397390322864165">Lakserosa</translation>
 <translation id="713824876195128146">Neste blokksitat-element</translation>
+<translation id="7140168702531682811">Hevet skrift</translation>
 <translation id="7143034430156387447">Bytt mellom 6- og 8-punkts punktskrift</translation>
 <translation id="7143207342074048698">Kobler til</translation>
 <translation id="7153618581592392745">Lavendel</translation>
@@ -1139,6 +1149,7 @@
 <translation id="8883850400338911892">endre URL 8 p</translation>
 <translation id="8896347895970027998">Velg om ChromeVox skal være på eller av.</translation>
 <translation id="8896479570570613387">Mellomlilla</translation>
+<translation id="8897030325301866860">Skrifttype <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">Slå av eller på tegnsettingsekko</translation>
 <translation id="8900148057318340779">Prefikstast</translation>
 <translation id="8908714597367957477">colhdr</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 16645f4..75cc308 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "Adam", "b": "Bertil", "c": "Cesar", "d": "David", "e": "Erik", "f": "Filip", "g": "Gustav", "h": "Helge", "i": "Ivar", "j": "Johan","k": "Kalle", "l": "Ludvig", "m": "Martin", "n": "Niklas", "o": "Olof","p": "Petter", "q": "Quintus", "r": "Rudolf", "s": "Sigurd", "t": "Tore", "u": "Urban", "v": "Viktor", "w": "Wilhelm","x": "Xerxes", "y": "Yngve", "z": "Zäta", "å": "Åke", "ä": "Ärlig", "ö": "Östen"}</translation>
 <translation id="1120938014254001895">Svep uppåt med två fingrar</translation>
 <translation id="1124771028211010580">Aktuellt visningsformat är sida vid sida.</translation>
+<translation id="1126928665165112660">Inte kursiv</translation>
 <translation id="113582498867142724"><ph name="TAG" />-samling med <ph name="NUM" /> objekt</translation>
 <translation id="1155043339247954670">Det finns inga fler poster i listan.</translation>
 <translation id="1157782847298808853">Tangentbordshjälp</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">Mellanbrun</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> av <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">eko för tecken och ord</translation>
+<translation id="1334570596456017464">Nedsänkt</translation>
 <translation id="1339428534620983148">Föregående tabellkolumn</translation>
 <translation id="1342835525016946179">artikel</translation>
 <translation id="1346059596910821859">Tips</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">Visa rubriklistan</translation>
 <translation id="1912556590115083156">besökt länk</translation>
 <translation id="1913761808037590218">sifferfält</translation>
+<translation id="1914424852593176649">Storlek <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678">Ackordet <ph name="DOT" /></translation>
 <translation id="1923956950274750765">Mellanmörkt orkidélila</translation>
 <translation id="1954623340234317532">Inmatning av vecka</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">Radrubrik:</translation>
 <translation id="2002895034995108595">Återställ aktuell tangentuppsättning</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{vänster hakparentes}other{# vänster-hakparenteser}}</translation>
+<translation id="2009187674653301682">Inte upphöjd</translation>
 <translation id="2010555995361223825">ChromeVox-menyer</translation>
 <translation id="2045490512405922022">inte markerad</translation>
 <translation id="20601713649439366">Det finns inget föregående matematiskt uttryck.</translation>
@@ -168,6 +172,7 @@
 <translation id="2278490101488436824">Svep åt vänster med tre fingrar</translation>
 <translation id="2281234842553884450">Föregående skjutreglage</translation>
 <translation id="2311237334957139798">Flytta till föregående på detaljnivå</translation>
+<translation id="2314393392395134769">Inte nedsänkt</translation>
 <translation id="2318372665160196757">Huvud</translation>
 <translation id="2329324941084714723">Flikpanel</translation>
 <translation id="2344193891939537199">Inmatning av datum och tid</translation>
@@ -299,10 +304,12 @@
 <translation id="3163593631834463955">Tom kolumnrubrik</translation>
 <translation id="316542773973815724">Navigering</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{blanksteg}other{# blanksteg}}</translation>
+<translation id="3179119189286472195">Ingen länk</translation>
 <translation id="320961988183078793"><ph name="TYPE" /> har angetts</translation>
 <translation id="321072937702597574">Orkidélila</translation>
 <translation id="3218691001991391708">klistra in <ph name="TEXT" />.</translation>
 <translation id="3223701887221307104"><ph name="NAME" />, flik</translation>
+<translation id="3223779237381380437">Inte genomstruken</translation>
 <translation id="3226035351387556942">kryssruta</translation>
 <translation id="3229375994964697375">Besökt länk</translation>
 <translation id="3232388865800379423">En popup-knapp</translation>
@@ -516,6 +523,7 @@
 <translation id="4763296182459741068">Till slutet</translation>
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">standard</translation>
+<translation id="4772771694153161212">Inte understruken</translation>
 <translation id="479989351350248267">sök</translation>
 <translation id="4804818685124855865">Koppla från</translation>
 <translation id="481165870889056555">Läs upp den aktuella sidans titel</translation>
@@ -531,6 +539,7 @@
 <translation id="4846428657345567687">Välkommen till ChromeVox!</translation>
 <translation id="4848993367330139335">timer</translation>
 <translation id="4850023505158945298">Föregående element av liknande typ.</translation>
+<translation id="4862744964787595316">Inte fetstilt</translation>
 <translation id="4866956062845190338">menyalternativ med alternativknapp</translation>
 <translation id="4867316986324544967">Aktivera loggning av text-till-tal</translation>
 <translation id="4877261390094455813">Ange en sökfråga.</translation>
@@ -843,6 +852,7 @@
 <translation id="712735679809149106">eko för ord</translation>
 <translation id="7137397390322864165">Laxrosa</translation>
 <translation id="713824876195128146">Nästa citatblock</translation>
+<translation id="7140168702531682811">Upphöjd</translation>
 <translation id="7143034430156387447">Växla mellan punktskrift med sex och åtta punkter</translation>
 <translation id="7143207342074048698">Ansluter</translation>
 <translation id="7153618581592392745">Lavendelfärgad</translation>
@@ -1139,6 +1149,7 @@
 <translation id="8883850400338911892">urlred 8punkt</translation>
 <translation id="8896347895970027998">Växla mellan att aktivera och inaktivera ChromeVox.</translation>
 <translation id="8896479570570613387">Mellanmörklila</translation>
+<translation id="8897030325301866860">Teckensnitt <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">eko för skiljetecken</translation>
 <translation id="8900148057318340779">Prefixtangent</translation>
 <translation id="8908714597367957477">kolumnrubrik</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
index 2832e17..77d1d21 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
 <translation id="1120938014254001895">இரண்டு விரல்களை மேலே ஸ்வைப் செய்யவும்</translation>
 <translation id="1124771028211010580">தற்போதைய காட்சி நடை: அருகருகே.</translation>
+<translation id="1126928665165112660">சாய்வு அல்ல</translation>
 <translation id="113582498867142724"><ph name="NUM" /> உருப்படிகளின் <ph name="TAG" /> தொகுப்பு</translation>
 <translation id="1155043339247954670">அடுத்த பட்டியல் உருப்படி இல்லை.</translation>
 <translation id="1157782847298808853">விசைப்பலகை உதவி</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">டான்</translation>
 <translation id="1331702245475014624"><ph name="TOTAL" /> / <ph name="INDEX" /></translation>
 <translation id="1334095593597963605">எழுத்து மற்றும் சொல் எதிரொலி</translation>
+<translation id="1334570596456017464">சப்ஸ்கிரிப்ட்</translation>
 <translation id="1339428534620983148">முந்தைய அட்டவணை நெடுவரிசை</translation>
 <translation id="1342835525016946179">article</translation>
 <translation id="1346059596910821859">உதவிக்குறிப்பு</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">தலைப்புகள் பட்டியலைக் காட்டு</translation>
 <translation id="1912556590115083156">vlnk</translation>
 <translation id="1913761808037590218">#ed</translation>
+<translation id="1914424852593176649">அளவு <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678"><ph name="DOT" /> விசைச் சேர்க்கை</translation>
 <translation id="1923956950274750765">மீடியம் ஆர்ச்சிட்</translation>
 <translation id="1954623340234317532">ஆண்டு கட்டுப்பாட்டிற்கான வாரம்</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">வரிசை மேற்தலைப்பு:</translation>
 <translation id="2002895034995108595">நடப்பு விசைவரைபடத்தை மீட்டமை</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{இடது அடைப்புக்குறி}other{# இடது அடைப்புக்குறிகள்}}</translation>
+<translation id="2009187674653301682">சூப்பர்ஸ்கிரிப்ட் அல்ல</translation>
 <translation id="2010555995361223825">ChromeVox மெனுக்கள்</translation>
 <translation id="2045490512405922022">தேர்வுசெய்யப்படவில்லை</translation>
 <translation id="20601713649439366">முந்தைய கணிதக் கோவை இல்லை.</translation>
@@ -168,6 +172,7 @@
 <translation id="2278490101488436824">மூன்று விரல்களை இடதுபுறமாக ஸ்வைப் செய்யவும்</translation>
 <translation id="2281234842553884450">முந்தைய ஸ்லைடர்</translation>
 <translation id="2311237334957139798">விவர நிலையில் முந்தையதற்கு நகரும்</translation>
+<translation id="2314393392395134769">சப்ஸ்கிரிப்ட் அல்ல</translation>
 <translation id="2318372665160196757">முதன்மை</translation>
 <translation id="2329324941084714723">தாவல் பலகம்</translation>
 <translation id="2344193891939537199">நாள் நேரக் கட்டுப்பாடு</translation>
@@ -299,10 +304,12 @@
 <translation id="3163593631834463955">காலியான நெடுவரிசை மேற்தலைப்பு</translation>
 <translation id="316542773973815724">வழிச்செலுத்தல்</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{இடைவெளி}other{# இடைவெளிகள்}}</translation>
+<translation id="3179119189286472195">இணைப்பு அல்ல</translation>
 <translation id="320961988183078793"><ph name="TYPE" /> ஐ உள்ளிட்டுள்ளீர்கள்</translation>
 <translation id="321072937702597574">ஆர்கிட்</translation>
 <translation id="3218691001991391708"><ph name="TEXT" />ஐ ஒட்டும்.</translation>
 <translation id="3223701887221307104"><ph name="NAME" />, தாவல்</translation>
+<translation id="3223779237381380437">அடிக்கப்பட்ட எழுத்து அல்ல</translation>
 <translation id="3226035351387556942">chk</translation>
 <translation id="3229375994964697375">பார்வையிட்ட இணைப்பு</translation>
 <translation id="3232388865800379423">பாப் அப் பொத்தான்</translation>
@@ -516,6 +523,7 @@
 <translation id="4763296182459741068">கீழ்பகுதிக்கு மடிக்கப்படும்</translation>
 <translation id="4763480195061959176">வீடியோ</translation>
 <translation id="4764692524839457597">இயல்பு</translation>
+<translation id="4772771694153161212">அடிக்கோடு இல்லை</translation>
 <translation id="479989351350248267">தேடல்</translation>
 <translation id="4804818685124855865">தொடர்பைத் துண்டி</translation>
 <translation id="481165870889056555">தற்போதைய பக்கத்தின் தலைப்பை அறிவிக்கவும்</translation>
@@ -531,6 +539,7 @@
 <translation id="4846428657345567687">ChromeVoxக்கு வரவேற்கிறோம்!</translation>
 <translation id="4848993367330139335">tmr</translation>
 <translation id="4850023505158945298">இதேபோன்ற முந்தைய உறுப்பு.</translation>
+<translation id="4862744964787595316">தடிமன் அல்ல</translation>
 <translation id="4866956062845190338">rdmnuitm</translation>
 <translation id="4867316986324544967">TTS பதிவுசெய்தலை இயக்கு</translation>
 <translation id="4877261390094455813">தேடல் வினவலை உள்ளிடவும்.</translation>
@@ -843,6 +852,7 @@
 <translation id="712735679809149106">சொல் எதிரொலி</translation>
 <translation id="7137397390322864165">சால்மன்</translation>
 <translation id="713824876195128146">அடுத்த மேற்கோள் குறி</translation>
+<translation id="7140168702531682811">உச்செழுத்து</translation>
 <translation id="7143034430156387447">6 மற்றும் 8 புள்ளி பிரெய்லிக்கு இடையே மாறும்</translation>
 <translation id="7143207342074048698">இணைத்தல்</translation>
 <translation id="7153618581592392745">லாவெண்டர் நிறம்</translation>
@@ -1139,6 +1149,7 @@
 <translation id="8883850400338911892">urled 8dot</translation>
 <translation id="8896347895970027998">ChromeVox ஐ செயலில் அல்லது செயலற்ற நிலைக்கு மாற்றுக.</translation>
 <translation id="8896479570570613387">மீடியம் பர்பிள்</translation>
+<translation id="8897030325301866860">எழுத்துரு: <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">தொடர் நிறுத்தற்குறி எதிரொலி</translation>
 <translation id="8900148057318340779">முன்னொட்டு விசை</translation>
 <translation id="8908714597367957477">colhdr</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
index 8877e382..88f92d52 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "ఆల్ఫా", "b": "బ్రావో", "c": "చార్లీ", "d": "డెల్టా", "e": "ఎకో", "f": "ఫాక్స్‌ట్రాట్", "g": "గోల్ఫ్", "h": "హోటల్", "i": "ఇండియా", "j": "జూలియట్","k": "కిలో", "l": "లీమా", "m": "మైక్", "n": "నవంబర్", "o": "ఆస్కార్","p": "పాపా", "q": "క్యూబెక్", "r": "రోమియో", "s": "సియెర్రా", "t": "ట్యాంగో", "u": "యూనిఫారమ్", "v": "విక్టర్", "w": "విస్కీ","x": "ఎక్స్‌రే", "y": "యాంకీ", "z": "జూలూ"}</translation>
 <translation id="1120938014254001895">రెండు వేళ్లతో పైకి స్వైప్ చేయండి</translation>
 <translation id="1124771028211010580">ప్రస్తుత ప్రదర్శన శైలి ప్రక్కప్రక్కనకు ఉంది.</translation>
+<translation id="1126928665165112660">ఇటాలిక్ కాదు</translation>
 <translation id="113582498867142724"><ph name="NUM" /> అంశాలు గల <ph name="TAG" /> సేకరణ</translation>
 <translation id="1155043339247954670">తరువాత జాబితా అంశం లేదు.</translation>
 <translation id="1157782847298808853">కీబోర్డ్ సహాయం</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">లేత సింధూర రంగు</translation>
 <translation id="1331702245475014624"><ph name="TOTAL" />లో <ph name="INDEX" /></translation>
 <translation id="1334095593597963605">అక్షరం మరియు పదం అనుకరణ</translation>
+<translation id="1334570596456017464">సబ్‌స్క్రిప్ట్</translation>
 <translation id="1339428534620983148">మునుపటి పట్టిక నిలువు వరుస</translation>
 <translation id="1342835525016946179">కథనం</translation>
 <translation id="1346059596910821859">చిట్కా</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">శీర్షికల జాబితాను చూపండి</translation>
 <translation id="1912556590115083156">vlnk</translation>
 <translation id="1913761808037590218">#ed</translation>
+<translation id="1914424852593176649"><ph name="FONT_SIZE" /> పరిమాణం</translation>
 <translation id="1914635379910604678"><ph name="DOT" /> కీల కలయిక</translation>
 <translation id="1923956950274750765">మధ్యస్థ ఊదా రంగు</translation>
 <translation id="1954623340234317532">సంవత్సరంలో వారం నియంత్రణ</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">అడ్డు వరుస శీర్షిక:</translation>
 <translation id="2002895034995108595">ప్రస్తుత కీమ్యాప్‌ను రీసెట్ చేయి</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{ఎడమ కుండలీకరణ గుర్తు}other{# ఎడమ కుండలీకరణ గుర్తులు}}</translation>
+<translation id="2009187674653301682">సూపర్‌స్క్రిప్ట్ కాదు</translation>
 <translation id="2010555995361223825">ChromeVox మెనులు</translation>
 <translation id="2045490512405922022">ఎంచుకోబడలేదు</translation>
 <translation id="20601713649439366">మునుపటి గణిత వ్యక్తీకరణ లేదు.</translation>
@@ -168,6 +172,7 @@
 <translation id="2278490101488436824">మూడు వేళ్లతో ఎడమవైపునకు స్వైప్ చేయండి</translation>
 <translation id="2281234842553884450">మునుపటి స్లయిడర్</translation>
 <translation id="2311237334957139798">వివరాల స్థాయి వద్ద మునుపటి దానికి తరలించండి</translation>
+<translation id="2314393392395134769">సబ్‌స్క్రిప్ట్ కాదు</translation>
 <translation id="2318372665160196757">ప్రధానం</translation>
 <translation id="2329324941084714723">ట్యాబ్ ప్యానెల్</translation>
 <translation id="2344193891939537199">తేదీ సమయ నియంత్రణ</translation>
@@ -299,10 +304,12 @@
 <translation id="3163593631834463955">ఖాళీ నిలువు వరుస శీర్షిక</translation>
 <translation id="316542773973815724">నావిగేషన్</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{ఖాళీ}other{# ఖాళీలు}}</translation>
+<translation id="3179119189286472195">లింక్ కాదు</translation>
 <translation id="320961988183078793"><ph name="TYPE" />లోకి ప్రవేశించారు</translation>
 <translation id="321072937702597574">ముదరు ఊదా రంగు</translation>
 <translation id="3218691001991391708"><ph name="TEXT" />ని అతికించండి.</translation>
 <translation id="3223701887221307104"><ph name="NAME" />, ట్యాబ్</translation>
+<translation id="3223779237381380437">కొట్టివేత వద్ద</translation>
 <translation id="3226035351387556942">chk</translation>
 <translation id="3229375994964697375">సందర్శించిన లింక్</translation>
 <translation id="3232388865800379423">పాప్ అప్ బటన్</translation>
@@ -516,6 +523,7 @@
 <translation id="4763296182459741068">దిగువకు సర్దుబాటు చేయబడింది</translation>
 <translation id="4763480195061959176">వీడియో</translation>
 <translation id="4764692524839457597">డిఫాల్ట్</translation>
+<translation id="4772771694153161212">క్రిందిగీత వద్దు</translation>
 <translation id="479989351350248267">search</translation>
 <translation id="4804818685124855865">డిస్‌కనెక్ట్ చెయ్యి</translation>
 <translation id="481165870889056555">ప్రస్తుత పేజీ యొక్క శీర్షికను తెలియజేయండి</translation>
@@ -531,6 +539,7 @@
 <translation id="4846428657345567687">ChromeVoxకి స్వాగతం!</translation>
 <translation id="4848993367330139335">tmr</translation>
 <translation id="4850023505158945298">మునుపటి సారూప్య మూలకం.</translation>
+<translation id="4862744964787595316">బోల్డ్ కాదు</translation>
 <translation id="4866956062845190338">rdmnuitm</translation>
 <translation id="4867316986324544967">TTSను లాగ్ చేయ‌డం ప్రారంభించండి</translation>
 <translation id="4877261390094455813">శోధన ప్రశ్నను నమోదు చేయండి.</translation>
@@ -843,6 +852,7 @@
 <translation id="712735679809149106">పదం అనుకరణ</translation>
 <translation id="7137397390322864165">గులాబీ నారింజ రంగు</translation>
 <translation id="713824876195128146">తరువాత బ్లాక్ కోట్</translation>
+<translation id="7140168702531682811">సూపర్‌స్క్రిప్ట్</translation>
 <translation id="7143034430156387447">6 మరియు 8 చుక్కల బ్రెయిలీ మధ్య మారండి</translation>
 <translation id="7143207342074048698">కనెక్ట్ అవుతోంది</translation>
 <translation id="7153618581592392745">లావెండర్ రంగు</translation>
@@ -1139,6 +1149,7 @@
 <translation id="8883850400338911892">urled 8dot</translation>
 <translation id="8896347895970027998">ChromeVoxను యాక్టివ్ లేదా ఇన్‌యాక్టివ్ చేయ‌డానికి టోగుల్ చేయండి.</translation>
 <translation id="8896479570570613387">మధ్యస్థ ఊదారంగు</translation>
+<translation id="8897030325301866860">ఫాంట్ <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">సైకిల్ విరామచిహ్న అనుకరణ</translation>
 <translation id="8900148057318340779">ఆదిప్రత్యయ కీ</translation>
 <translation id="8908714597367957477">colhdr</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
index aaa636b..3e4c455 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "อัลฟ่า", "b": "บราโว่", "c": "ชาร์ลี", "d": "เดลต้า", "e": "เอคโค่", "f": "ฟอกซ์ทรอต", "g": "กอล์ฟ", "h": "โฮเท็ล", "i": "อินเดีย", "j": "จูเลียต","k": "กิโล", "l": "ลิมา", "m": "ไมค์", "n": "โนเวมเบอร์", "o": "ออสการ์","p": "ปาป้า", "q": "ควิเบค", "r": "โรมิโอ", "s": "เซียร์ร่า", "t": "แทงโก้", "u": "ยูนิฟอร์ม", "v": "วิคเตอร์", "w": "วิสกี้","x": "เอ็กซเรย์", "y": "แยงกี้", "z": "ซูลู"}</translation>
 <translation id="1120938014254001895">เลื่อน 2 นิ้วขึ้น</translation>
 <translation id="1124771028211010580">รูปแบบการแสดงผลปัจจุบันคือการแสดงคู่กัน</translation>
+<translation id="1126928665165112660">ไม่เป็นตัวเอียง</translation>
 <translation id="113582498867142724">คอลเล็กชัน <ph name="TAG" /> ที่มี <ph name="NUM" /> รายการ</translation>
 <translation id="1155043339247954670">ไม่มีรายการถัดไป</translation>
 <translation id="1157782847298808853">ความช่วยเหลือเกี่ยวกับแป้นพิมพ์</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">สีแทน</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> จาก <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">พูดอักขระและคำ</translation>
+<translation id="1334570596456017464">ตัวห้อย</translation>
 <translation id="1339428534620983148">คอลัมน์ตารางก่อนหน้า</translation>
 <translation id="1342835525016946179">บทความ</translation>
 <translation id="1346059596910821859">เคล็ดลับ</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">แสดงรายการส่วนหัว</translation>
 <translation id="1912556590115083156">vlnk</translation>
 <translation id="1913761808037590218">#ed</translation>
+<translation id="1914424852593176649">ขนาด <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678"><ph name="DOT" /> คอร์ด</translation>
 <translation id="1923956950274750765">สีม่วงกล้วยไม้ปานกลาง</translation>
 <translation id="1954623340234317532">การควบคุมสัปดาห์ของปี</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">ส่วนหัวของแถว:</translation>
 <translation id="2002895034995108595">รีเซ็ตรูปแบบแป้นปัจจุบัน</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{วงเล็บซ้าย}other{# วงเล็บซ้าย}}</translation>
+<translation id="2009187674653301682">ไม่เป็นตัวยก</translation>
 <translation id="2010555995361223825">เมนู ChromeVox</translation>
 <translation id="2045490512405922022">ไม่ได้เลือก</translation>
 <translation id="20601713649439366">ไม่มีสูตรคณิตศาสตร์ก่อนหน้า</translation>
@@ -167,6 +171,7 @@
 <translation id="2278490101488436824">เลื่อน 3 นิ้วไปทางซ้าย</translation>
 <translation id="2281234842553884450">แถบเลื่อนก่อนหน้า</translation>
 <translation id="2311237334957139798">เลื่อนไปที่ระดับก่อนหน้า</translation>
+<translation id="2314393392395134769">ไม่เป็นตัวห้อย</translation>
 <translation id="2318372665160196757">หลัก</translation>
 <translation id="2329324941084714723">แผงแท็บ</translation>
 <translation id="2344193891939537199">การควบคุมวันที่และเวลา</translation>
@@ -298,10 +303,12 @@
 <translation id="3163593631834463955">ส่วนหัวของคอลัมน์ว่างเปล่า</translation>
 <translation id="316542773973815724">การนำทาง</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{ช่องว่าง}other{# ช่องว่าง}}</translation>
+<translation id="3179119189286472195">ไม่ใช่ลิงก์</translation>
 <translation id="320961988183078793">ป้อน <ph name="TYPE" /> แล้ว</translation>
 <translation id="321072937702597574">สีม่วงกล้วยไม้</translation>
 <translation id="3218691001991391708">วาง <ph name="TEXT" /></translation>
 <translation id="3223701887221307104">แท็บ <ph name="NAME" /></translation>
+<translation id="3223779237381380437">ไม่ได้ขีดฆ่า</translation>
 <translation id="3226035351387556942">chk</translation>
 <translation id="3229375994964697375">ลิงก์ที่เคยเข้าชม</translation>
 <translation id="3232388865800379423">ปุ่มป๊อปอัป</translation>
@@ -515,6 +522,7 @@
 <translation id="4763296182459741068">ข้ามไปด้านล่าง</translation>
 <translation id="4763480195061959176">วิดีโอ</translation>
 <translation id="4764692524839457597">ค่าเริ่มต้น</translation>
+<translation id="4772771694153161212">ไม่ขีดเส้นใต้</translation>
 <translation id="479989351350248267">ค้นหา</translation>
 <translation id="4804818685124855865">ตัดการเชื่อมต่อ</translation>
 <translation id="481165870889056555">แจ้งชื่อของหน้าเว็บปัจจุบัน</translation>
@@ -530,6 +538,7 @@
 <translation id="4846428657345567687">ยินดีต้อนรับสู่ ChromeVox</translation>
 <translation id="4848993367330139335">เครื่องตั้งเวลา</translation>
 <translation id="4850023505158945298">เอลิเมนต์ที่คล้ายกันก่อนหน้า</translation>
+<translation id="4862744964787595316">ไม่เป็นตัวหนา</translation>
 <translation id="4866956062845190338">rdmnuitm</translation>
 <translation id="4867316986324544967">เปิดใช้การสลับ TTS</translation>
 <translation id="4877261390094455813">ป้อนคำค้นหา</translation>
@@ -842,6 +851,7 @@
 <translation id="712735679809149106">พูดคำ</translation>
 <translation id="7137397390322864165">สีส้มแซลมอน</translation>
 <translation id="713824876195128146">ข้อความอ้างอิงถัดไป</translation>
+<translation id="7140168702531682811">ตัวยก</translation>
 <translation id="7143034430156387447">สลับไปมาระหว่างอักษรเบรลล์ 6 และ 8 จุด</translation>
 <translation id="7143207342074048698">กำลังเชื่อมต่อ</translation>
 <translation id="7153618581592392745">ลาเวนเดอร์</translation>
@@ -1138,6 +1148,7 @@
 <translation id="8883850400338911892">urlแก้ไขช่อง 8 จุด</translation>
 <translation id="8896347895970027998">สลับระหว่างการเปิด/ปิดใช้งาน ChromeVox</translation>
 <translation id="8896479570570613387">สีม่วงปานกลาง</translation>
+<translation id="8897030325301866860">แบบอักษร <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">พูดรอบเครื่องหมายวรรคตอน</translation>
 <translation id="8900148057318340779">คีย์ส่วนหน้า</translation>
 <translation id="8908714597367957477">colhdr</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
index 0f46bd99..6fb5436 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "adana", "b": "bolu", "c": "ceyhan", "ç": "çanakkale", "d": "denizli", "e": "edirne", "f": "fatsa", "g": "giresun", "ğ": "yumuşak ge", "h": "hatay", "ı": "ısparta", "i": "izmir", "j": "jandarma", "k": "kayseri", "l": "lüleburgaz", "m": "muş", "n": "niğde", "o": "ordu","p": "polatlı", "r": "rize", "s": "sinop", "ş": "şırnak", "t": "tokat", "u": "uşak", "ü": "ünye", "v": "van", "y": "yozgat", "z": "zonguldak"}</translation>
 <translation id="1120938014254001895">İki parmağınızı yukarı kaydırın</translation>
 <translation id="1124771028211010580">Mevcut görüntüleme stili yan yanadır.</translation>
+<translation id="1126928665165112660">İtalik değil</translation>
 <translation id="113582498867142724"><ph name="NUM" /> öğeye sahip <ph name="TAG" /> koleksiyonu</translation>
 <translation id="1155043339247954670">Sonraki liste öğesi yok.</translation>
 <translation id="1157782847298808853">Klavye Yardımı</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">Ten Rengi</translation>
 <translation id="1331702245475014624">toplam: <ph name="TOTAL" />, öğe: <ph name="INDEX" /></translation>
 <translation id="1334095593597963605">karakter ve kelime yansıtma</translation>
+<translation id="1334570596456017464">Alt simge</translation>
 <translation id="1339428534620983148">Önceki tablo sütunu</translation>
 <translation id="1342835525016946179">article</translation>
 <translation id="1346059596910821859">İpucu</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">Başlıklar listesini göster</translation>
 <translation id="1912556590115083156">vlnk</translation>
 <translation id="1913761808037590218">#ed</translation>
+<translation id="1914424852593176649">Boyut <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678"><ph name="DOT" /> grubu</translation>
 <translation id="1923956950274750765">Orta Ton Orkide</translation>
 <translation id="1954623340234317532">Yılın haftası denetimi</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">Satır üst bilgisi:</translation>
 <translation id="2002895034995108595">Geçerli tuş eşleşmesini sıfırla</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{sol köşeli ayraç}other{# sol köşeli ayraç}}</translation>
+<translation id="2009187674653301682">Üst simge değil</translation>
 <translation id="2010555995361223825">ChromeVox Menüleri</translation>
 <translation id="2045490512405922022">seçili değil</translation>
 <translation id="20601713649439366">Önceki matematik ifadesi yok.</translation>
@@ -167,6 +171,7 @@
 <translation id="2278490101488436824">Üç parmağınızı sola kaydırın</translation>
 <translation id="2281234842553884450">Önceki kaydırma çubuğu</translation>
 <translation id="2311237334957139798">Ayrıntı düzeyinde önceki öğeye gidin</translation>
+<translation id="2314393392395134769">Alt simge değil</translation>
 <translation id="2318372665160196757">Ana</translation>
 <translation id="2329324941084714723">Sekme paneli</translation>
 <translation id="2344193891939537199">Tarih/saat denetimi</translation>
@@ -298,10 +303,12 @@
 <translation id="3163593631834463955">Boş sütun üst bilgisi</translation>
 <translation id="316542773973815724">Gezinme</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{boşluk}other{# boşluk}}</translation>
+<translation id="3179119189286472195">Bağlantı verilmemiş</translation>
 <translation id="320961988183078793"><ph name="TYPE" /> girildi</translation>
 <translation id="321072937702597574">Orkide</translation>
 <translation id="3218691001991391708"><ph name="TEXT" />metnini yapıştır.</translation>
 <translation id="3223701887221307104"><ph name="NAME" />, sekme</translation>
+<translation id="3223779237381380437">Üstü çizili değil</translation>
 <translation id="3226035351387556942">chk</translation>
 <translation id="3229375994964697375">Ziyaret edilmiş bağlantı</translation>
 <translation id="3232388865800379423">Pop-up düğme</translation>
@@ -515,6 +522,7 @@
 <translation id="4763296182459741068">Alta döner</translation>
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">varsayılan</translation>
+<translation id="4772771694153161212">Altı çizili değil</translation>
 <translation id="479989351350248267">ara</translation>
 <translation id="4804818685124855865">Bağlantıyı kes</translation>
 <translation id="481165870889056555">Mevcut sayfanın başlığını söyle</translation>
@@ -530,6 +538,7 @@
 <translation id="4846428657345567687">ChromeVox'a Hoş Geldiniz!</translation>
 <translation id="4848993367330139335">tmr</translation>
 <translation id="4850023505158945298">Önceki benzer öğe.</translation>
+<translation id="4862744964787595316">Kalın değil</translation>
 <translation id="4866956062845190338">rdmnuitm</translation>
 <translation id="4867316986324544967">TTS günlük kaydını etkinleştir</translation>
 <translation id="4877261390094455813">Arama sorgusunu girin.</translation>
@@ -842,6 +851,7 @@
 <translation id="712735679809149106">kelime yansıtma</translation>
 <translation id="7137397390322864165">Somon</translation>
 <translation id="713824876195128146">Sonraki blok alıntı</translation>
+<translation id="7140168702531682811">Üst simge</translation>
 <translation id="7143034430156387447">6 ve 8 noktalı braille arasında geçiş yapar</translation>
 <translation id="7143207342074048698">Bağlanıyor</translation>
 <translation id="7153618581592392745">Lavanta</translation>
@@ -1138,6 +1148,7 @@
 <translation id="8883850400338911892">8nkt urldz</translation>
 <translation id="8896347895970027998">ChromeVox'u etkinleştirin veya devre dışı bırakın.</translation>
 <translation id="8896479570570613387">Orta Ton Mor</translation>
+<translation id="8897030325301866860">Yazı tipi <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">Noktalama yansıtmayı döngüsel yap</translation>
 <translation id="8900148057318340779">Ön ek tuşu</translation>
 <translation id="8908714597367957477">colhdr</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 7f4a220..56966a4 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"а": "а-зОт", "б": "бОн-да-рів-на", "в": "віт-ро-гон", "г": "га-ра-кі-рі", "ґ": "ґо-ґо-дзи", "д": "до-ли-на", "е": "ерг", "є": "єд-ність-то-си-ла", "ж": "жа-б'є-се-ло", "з": "зо-ло-ту-ха", "и": "то-не-во-но", "і": "І-ван", "ї": "їж-хто-го-ло-ден", "й": "йди-хо-лод-ком", "к": "ко-лі-но", "л": "лі-со-ру-би", "м": "мо-роз", "н": "но-га", "о": "о-ко-лот", "п": "при-мо-роз-ки", "р": "ри-бонь-ка", "с": "са-ха-ра", "т": "тон", "у": "у-па-док", "ф": "фі-лан-тро-пи", "х": "хо-ло-до-чок", "ц": "цьо-ця-дор-ця", "ч": "чор-но-го-ра", "ш": "шо-ло-ви-ло", "щ": "що-ро-ку-мо-роз", "ь": "то-м'я-кий-тон" "ю": "ю-рій-ко-роль", "я": "я-ро-шен-ко"}</translation>
 <translation id="1120938014254001895">Проведіть двома пальцями вгору</translation>
 <translation id="1124771028211010580">Поточний стиль дисплея – паралельний перегляд.</translation>
+<translation id="1126928665165112660">Без курсиву</translation>
 <translation id="113582498867142724">Збірка <ph name="TAG" /> з такою кількістю елементів: <ph name="NUM" /></translation>
 <translation id="1155043339247954670">Немає наступного пункту списку.</translation>
 <translation id="1157782847298808853">Довідка клавіатури</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">Жовто-брунатний</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> з <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">озвучення символів і слів</translation>
+<translation id="1334570596456017464">Підрядковий текст</translation>
 <translation id="1339428534620983148">Попередній стовпець таблиці</translation>
 <translation id="1342835525016946179">стаття</translation>
 <translation id="1346059596910821859">Чайові</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">Показати список заголовків</translation>
 <translation id="1912556590115083156">натиснуте посилання</translation>
 <translation id="1913761808037590218">номер</translation>
+<translation id="1914424852593176649">Розмір: <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678">акорд <ph name="DOT" /></translation>
 <translation id="1923956950274750765">Помірний колір орхідеї</translation>
 <translation id="1954623340234317532">Елемент керування для вибору тижня в році</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">Заголовок рядка:</translation>
 <translation id="2002895034995108595">Скинути поточну розкладку клавіатури</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{ліва квадратна дужка}one{# ліва квадратна дужка}few{# ліві квадратні дужки}many{# лівих квадратних дужок}other{# left brackets}}</translation>
+<translation id="2009187674653301682">Не надрядковий текст</translation>
 <translation id="2010555995361223825">Меню ChromeVox</translation>
 <translation id="2045490512405922022">без прапорця</translation>
 <translation id="20601713649439366">Немає попереднього математичного виразу.</translation>
@@ -167,6 +171,7 @@
 <translation id="2278490101488436824">Проведіть трьома пальцями ліворуч</translation>
 <translation id="2281234842553884450">Попередній повзунок</translation>
 <translation id="2311237334957139798">Перейти до попереднього рівня деталізації</translation>
+<translation id="2314393392395134769">Не підрядковий текст</translation>
 <translation id="2318372665160196757">Головний</translation>
 <translation id="2329324941084714723">Панель вкладок</translation>
 <translation id="2344193891939537199">Елемент керування для вибору дати та часу</translation>
@@ -298,10 +303,12 @@
 <translation id="3163593631834463955">Порожній заголовок стовпця</translation>
 <translation id="316542773973815724">Навігація</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{пробіл}one{# пробіл}few{# пробіли}many{# пробілів}other{# spaces}}</translation>
+<translation id="3179119189286472195">Не посилання</translation>
 <translation id="320961988183078793">введено: <ph name="TYPE" /></translation>
 <translation id="321072937702597574">Орхідея</translation>
 <translation id="3218691001991391708">вставити <ph name="TEXT" />.</translation>
 <translation id="3223701887221307104"><ph name="NAME" />, вкладка</translation>
+<translation id="3223779237381380437">Без закреслення</translation>
 <translation id="3226035351387556942">прапорець</translation>
 <translation id="3229375994964697375">Натиснуте посилання</translation>
 <translation id="3232388865800379423">Кнопка спливаючої підказки</translation>
@@ -515,6 +522,7 @@
 <translation id="4763296182459741068">Перенесення вниз</translation>
 <translation id="4763480195061959176">відео</translation>
 <translation id="4764692524839457597">за умовчанням</translation>
+<translation id="4772771694153161212">Без підкреслення</translation>
 <translation id="479989351350248267">пошук</translation>
 <translation id="4804818685124855865">Від'єднатися</translation>
 <translation id="481165870889056555">Повідомити назву поточної сторінки</translation>
@@ -530,6 +538,7 @@
 <translation id="4846428657345567687">Вітаємо в ChromeVox!</translation>
 <translation id="4848993367330139335">таймер</translation>
 <translation id="4850023505158945298">Попередній схожий елемент.</translation>
+<translation id="4862744964787595316">Без виділення жирним</translation>
 <translation id="4866956062845190338">перемикач пунктів меню</translation>
 <translation id="4867316986324544967">Увімкнути реєстрацію TTS</translation>
 <translation id="4877261390094455813">Введіть пошуковий запит.</translation>
@@ -842,6 +851,7 @@
 <translation id="712735679809149106">озвучення слів</translation>
 <translation id="7137397390322864165">Лососевий</translation>
 <translation id="713824876195128146">Цитування наступного блока</translation>
+<translation id="7140168702531682811">Надрядковий текст</translation>
 <translation id="7143034430156387447">Переключитися між 6- та 8-крапковим шрифтом Брайля</translation>
 <translation id="7143207342074048698">Під’єднання</translation>
 <translation id="7153618581592392745">Лавандовий</translation>
@@ -1138,6 +1148,7 @@
 <translation id="8883850400338911892">8-крапкове посилання</translation>
 <translation id="8896347895970027998">Зробити розширення ChromeVox активним чи неактивним.</translation>
 <translation id="8896479570570613387">Помірно-пурпуровий</translation>
+<translation id="8897030325301866860">Шрифт <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">Ще раз озвучити розділові знаки</translation>
 <translation id="8900148057318340779">Клавіша-префікс</translation>
 <translation id="8908714597367957477">заголовок стовпця</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
index f5091e8..e4a2068 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
 <translation id="1120938014254001895">Vuốt lên trên bằng hai ngón tay</translation>
 <translation id="1124771028211010580">Kiểu hiển thị hiện tại là song song.</translation>
+<translation id="1126928665165112660">Không in nghiêng</translation>
 <translation id="113582498867142724">Bộ sưu tập <ph name="TAG" /> có <ph name="NUM" /> mục</translation>
 <translation id="1155043339247954670">Không có mục danh sách tiếp theo nào.</translation>
 <translation id="1157782847298808853">Trợ giúp bàn phím</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">Màu nâu vàng</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> / <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">nói ký tự và từ</translation>
+<translation id="1334570596456017464">Chỉ số dưới</translation>
 <translation id="1339428534620983148">Cột trước của bảng</translation>
 <translation id="1342835525016946179">bài viết</translation>
 <translation id="1346059596910821859">Mẹo</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">Hiển thị danh sách tiêu đề</translation>
 <translation id="1912556590115083156">vlnk</translation>
 <translation id="1913761808037590218">#ed</translation>
+<translation id="1914424852593176649">Cỡ chữ <ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678">Tổ hợp phím <ph name="DOT" /></translation>
 <translation id="1923956950274750765">Màu phong lan hài hòa</translation>
 <translation id="1954623340234317532">Kiểm soát tuần trong năm</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">Tiêu đề hàng:</translation>
 <translation id="2002895034995108595">Đặt lại sơ đồ bàn phím hiện tại</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{dấu mở ngoặc vuông}other{# dấu mở ngoặc vuông}}</translation>
+<translation id="2009187674653301682">Không phải chỉ số trên</translation>
 <translation id="2010555995361223825">Menu ChromeVox</translation>
 <translation id="2045490512405922022">chưa chọn</translation>
 <translation id="20601713649439366">Không có biểu thức toán học trước nào.</translation>
@@ -168,6 +172,7 @@
 <translation id="2278490101488436824">Vuốt sang trái bằng ba ngón tay</translation>
 <translation id="2281234842553884450">Thanh trượt trước</translation>
 <translation id="2311237334957139798">Chuyển về độ chi tiết trước đó</translation>
+<translation id="2314393392395134769">Không phải chỉ số dưới</translation>
 <translation id="2318372665160196757">Chính</translation>
 <translation id="2329324941084714723">Bảng điều khiển tab</translation>
 <translation id="2344193891939537199">Kiểm soát ngày giờ</translation>
@@ -299,10 +304,12 @@
 <translation id="3163593631834463955">Tiêu đề cột trống</translation>
 <translation id="316542773973815724">Điều hướng</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{dấu cách}other{# dấu cách}}</translation>
+<translation id="3179119189286472195">Không phải phần tử liên kết</translation>
 <translation id="320961988183078793">đã vào <ph name="TYPE" /></translation>
 <translation id="321072937702597574">Màu phong lan</translation>
 <translation id="3218691001991391708">dán <ph name="TEXT" />.</translation>
 <translation id="3223701887221307104"><ph name="NAME" />, tab</translation>
+<translation id="3223779237381380437">Không bị gạch ngang</translation>
 <translation id="3226035351387556942">chk</translation>
 <translation id="3229375994964697375">Liên kết đã truy cập</translation>
 <translation id="3232388865800379423">Nút bật lên</translation>
@@ -516,6 +523,7 @@
 <translation id="4763296182459741068">Đã bao gồm cả cuối trang</translation>
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">mặc định</translation>
+<translation id="4772771694153161212">Không gạch chân</translation>
 <translation id="479989351350248267">search</translation>
 <translation id="4804818685124855865">Ngắt kết nối</translation>
 <translation id="481165870889056555">Thông báo tiêu đề của trang hiện tại</translation>
@@ -531,6 +539,7 @@
 <translation id="4846428657345567687">Chào mừng bạn đến với ChromeVox!</translation>
 <translation id="4848993367330139335">tmr</translation>
 <translation id="4850023505158945298">Phần tử tương tự trước.</translation>
+<translation id="4862744964787595316">Không in đậm</translation>
 <translation id="4866956062845190338">rdmnuitm</translation>
 <translation id="4867316986324544967">Bật ghi nhật ký TTS</translation>
 <translation id="4877261390094455813">Nhập truy vấn tìm kiếm.</translation>
@@ -843,6 +852,7 @@
 <translation id="712735679809149106">nói từ</translation>
 <translation id="7137397390322864165">Màu hồng cam</translation>
 <translation id="713824876195128146">Khối trích dẫn tiếp theo</translation>
+<translation id="7140168702531682811">Chỉ số trên</translation>
 <translation id="7143034430156387447">Chuyển đổi giữa chữ nổi 6 và 8 chấm</translation>
 <translation id="7143207342074048698">Đang kết nối</translation>
 <translation id="7153618581592392745">Tím oải hương</translation>
@@ -1139,6 +1149,7 @@
 <translation id="8883850400338911892">sửa url trường 8 chấm</translation>
 <translation id="8896347895970027998">Chuyển đổi ChromeVox giữa trạng thái hoạt động hoặc không hoạt động.</translation>
 <translation id="8896479570570613387">Màu tím hài hòa</translation>
+<translation id="8897030325301866860">Phông chữ <ph name="FONT_FAMILY" /></translation>
 <translation id="8898516272131543774">Nói dấu câu theo chu trình</translation>
 <translation id="8900148057318340779">Phím tiền tố</translation>
 <translation id="8908714597367957477">colhdr</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
index 8c978211..131d6dc7 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
@@ -23,6 +23,7 @@
 <translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
 <translation id="1120938014254001895">以雙指向上滑動</translation>
 <translation id="1124771028211010580">目前的顯示樣式為並排。</translation>
+<translation id="1126928665165112660">不是斜體文字</translation>
 <translation id="113582498867142724">「<ph name="TAG" />」集 (共 <ph name="NUM" /> 個項目)</translation>
 <translation id="1155043339247954670">沒有下一個清單項目。</translation>
 <translation id="1157782847298808853">鍵盤說明</translation>
@@ -55,6 +56,7 @@
 <translation id="1325946044405407859">日曬色</translation>
 <translation id="1331702245475014624">第 <ph name="INDEX" /> 個,共 <ph name="TOTAL" /> 個</translation>
 <translation id="1334095593597963605">字元和字詞語音回應</translation>
+<translation id="1334570596456017464">下標</translation>
 <translation id="1339428534620983148">上一個表格欄</translation>
 <translation id="1342835525016946179">文章</translation>
 <translation id="1346059596910821859">訣竅</translation>
@@ -130,6 +132,7 @@
 <translation id="1905379170753160525">顯示標題清單</translation>
 <translation id="1912556590115083156">vlnk</translation>
 <translation id="1913761808037590218">#ed</translation>
+<translation id="1914424852593176649">大小:<ph name="FONT_SIZE" /></translation>
 <translation id="1914635379910604678"><ph name="DOT" /> 組合鍵</translation>
 <translation id="1923956950274750765">中蘭紫</translation>
 <translation id="1954623340234317532">週次控制項</translation>
@@ -139,6 +142,7 @@
 <translation id="1990932729021763163">列標題:</translation>
 <translation id="2002895034995108595">重設目前的按鍵對應配置</translation>
 <translation id="2007545860310005685">{COUNT,plural, =1{左中括弧}other{# 個左中括弧}}</translation>
+<translation id="2009187674653301682">不是上標</translation>
 <translation id="2010555995361223825">ChromeVox 選單</translation>
 <translation id="2045490512405922022">未勾選</translation>
 <translation id="20601713649439366">沒有上一個數學運算式。</translation>
@@ -168,6 +172,7 @@
 <translation id="2278490101488436824">以三指向左滑動</translation>
 <translation id="2281234842553884450">上一個滑桿</translation>
 <translation id="2311237334957139798">移至較低的精細度等級</translation>
+<translation id="2314393392395134769">不是下標</translation>
 <translation id="2318372665160196757">主要元素</translation>
 <translation id="2329324941084714723">分頁面板</translation>
 <translation id="2344193891939537199">日期時間控制項</translation>
@@ -299,10 +304,12 @@
 <translation id="3163593631834463955">欄標題沒有內容</translation>
 <translation id="316542773973815724">導覽</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{空格}other{# 個空格}}</translation>
+<translation id="3179119189286472195">不是連結</translation>
 <translation id="320961988183078793">已進入<ph name="TYPE" /></translation>
 <translation id="321072937702597574">蘭紫</translation>
 <translation id="3218691001991391708">貼上<ph name="TEXT" />。</translation>
 <translation id="3223701887221307104"><ph name="NAME" />,分頁</translation>
+<translation id="3223779237381380437">沒有加上刪除線的文字</translation>
 <translation id="3226035351387556942">chk</translation>
 <translation id="3229375994964697375">造訪過的連結</translation>
 <translation id="3232388865800379423">彈出式按鈕</translation>
@@ -516,6 +523,7 @@
 <translation id="4763296182459741068">自動換行至底部</translation>
 <translation id="4763480195061959176">影片</translation>
 <translation id="4764692524839457597">預設</translation>
+<translation id="4772771694153161212">沒有加上底線的文字</translation>
 <translation id="479989351350248267">search</translation>
 <translation id="4804818685124855865">中斷連線</translation>
 <translation id="481165870889056555">朗讀目前網頁的標題</translation>
@@ -531,6 +539,7 @@
 <translation id="4846428657345567687">歡迎使用 ChromeVox!</translation>
 <translation id="4848993367330139335">計時器</translation>
 <translation id="4850023505158945298">上一個相似的元素。</translation>
+<translation id="4862744964787595316">不是粗體文字</translation>
 <translation id="4866956062845190338">rdmnuitm</translation>
 <translation id="4867316986324544967">啟用 TTS 記錄功能</translation>
 <translation id="4877261390094455813">輸入搜尋查詢。</translation>
@@ -843,6 +852,7 @@
 <translation id="712735679809149106">字詞語音回應</translation>
 <translation id="7137397390322864165">鮭紅</translation>
 <translation id="713824876195128146">下一個區塊引述</translation>
+<translation id="7140168702531682811">上標</translation>
 <translation id="7143034430156387447">在 6 點與 8 點點字之間切換</translation>
 <translation id="7143207342074048698">連線中</translation>
 <translation id="7153618581592392745">淡紫色</translation>
@@ -1139,6 +1149,7 @@
 <translation id="8883850400338911892">網址編輯 8 點欄位</translation>
 <translation id="8896347895970027998">啟用或停用 ChromeVox。</translation>
 <translation id="8896479570570613387">中紫紅</translation>
+<translation id="8897030325301866860"><ph name="FONT_FAMILY" /> 字型</translation>
 <translation id="8898516272131543774">循環標點符號語音回應</translation>
 <translation id="8900148057318340779">前置鍵</translation>
 <translation id="8908714597367957477">colhdr</translation>
diff --git a/chrome/browser/resources/chromeos/input_method/google_xkb_manifest.json b/chrome/browser/resources/chromeos/input_method/google_xkb_manifest.json
index 61de0db0..e59dd858 100644
--- a/chrome/browser/resources/chromeos/input_method/google_xkb_manifest.json
+++ b/chrome/browser/resources/chromeos/input_method/google_xkb_manifest.json
@@ -1939,5 +1939,6 @@
       "input_view": "inputview.html#id=m17n:ru_phone_yazhert&language=ru&passwordLayout=us-ltr&name=keyboard_russian_phonetic_yazhert"
     }
   ],
-  "manifest_version": 2
+  "manifest_version": 2,
+  "content_security_policy": "script-src 'self' 'wasm-eval'; object-src 'self'"
 }
diff --git a/chrome/browser/resources/chromeos/zip_archiver/html/passphrase.html b/chrome/browser/resources/chromeos/zip_archiver/html/passphrase.html
index 656b3dc7..2a8c05f 100644
--- a/chrome/browser/resources/chromeos/zip_archiver/html/passphrase.html
+++ b/chrome/browser/resources/chromeos/zip_archiver/html/passphrase.html
@@ -1,7 +1,8 @@
 <!doctype html>
 <html i18n-values="dir:textdirection;.style.fontFamily:fontfamily;lang:language">
   <head>
-    <script src="chrome://resources/js/polymer_config.js"></script>
+    <script src="chrome://resources/polymer/v1_0/html-imports/html-imports.min.js"></script>
+
     <script src="chrome://resources/js/util.js"></script>
     <script src="chrome://resources/js/load_time_data.js"></script>
     <script src="chrome://resources/js/i18n_template_no_process.js"></script>
diff --git a/chrome/browser/resources/chromeos/zip_archiver/js/main.js b/chrome/browser/resources/chromeos/zip_archiver/js/main.js
index 3556bd2c..0365cbe 100644
--- a/chrome/browser/resources/chromeos/zip_archiver/js/main.js
+++ b/chrome/browser/resources/chromeos/zip_archiver/js/main.js
@@ -6,7 +6,12 @@
   chrome.runtime.getBackgroundPage(function(backgroundPage) {
     backgroundPage.unpacker.app.stringDataLoadedPromise.then(function(strings) {
       loadTimeData.data = strings;
-      i18nTemplate.process(document, loadTimeData);
+      window.HTMLImports.whenReady(() => {
+        i18nTemplate.process(document, loadTimeData);
+        i18nTemplate.process(
+            document.querySelector('passphrase-dialog').shadowRoot,
+            loadTimeData);
+      });
     });
     backgroundPage.unpacker.app.cleanupOldStorageInfo();
   });
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js
index e864c86..36efa22d 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.js
+++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -81,6 +81,7 @@
   HIDE_BODY_OVERFLOW: 'hidden',      // Prevents scrolling while the edit custom
                                      // link dialog is open.
   // Applies float animations to the Most Visited notification
+  FLOAT_DOWN: 'float-down',
   FLOAT_UP: 'float-up',
   // Applies drag focus style to the fakebox
   FAKEBOX_DRAG_FOCUS: 'fakebox-drag-focused',
@@ -238,6 +239,14 @@
 
 
 /**
+ * The period of time (ms) before transitions can be applied to a toast
+ * notification after modifying the "display" property.
+ * @type {number}
+ */
+const DISPLAY_TIMEOUT = 20;
+
+
+/**
  * The last blacklisted tile rid if any, which by definition should not be
  * filler.
  * @type {?number}
@@ -274,23 +283,25 @@
  */
 let useDarkChips = false;
 
+
 /**
- * Returns a timeout that can be executed early.
- * @param {!Function} timeout The timeout function.
+ * Returns a timeout that can be executed early. Calls back true if this was
+ * an early execution, false otherwise.
+ * @param {!Function} timeout The timeout function. Requires a boolean param.
  * @param {number} delay The timeout delay.
- * @param {Object} previousContainer The pre-existing notification container.
  * @return {Object}
  */
-function createExecutableTimeout(timeout, delay, previousContainer) {
-  let timeoutId = window.setTimeout(timeout, delay);
+function createExecutableTimeout(timeout, delay) {
+  let timeoutId = window.setTimeout(() => {
+    timeout(/*executedEarly=*/ false);
+  }, delay);
   return {
-    previousContainer: previousContainer,
     clear: () => {
       window.clearTimeout(timeoutId);
     },
     trigger: () => {
       window.clearTimeout(timeoutId);
-      return timeout();
+      return timeout(/*executedEarly=*/ true);
     }
   };
 }
@@ -739,7 +750,9 @@
  */
 function hideNotification() {
   if (configData.isGooglePage) {
-    floatDownNotification($(IDS.NOTIFICATION), $(IDS.NOTIFICATION_CONTAINER));
+    floatDownNotification(
+        $(IDS.NOTIFICATION), $(IDS.NOTIFICATION_CONTAINER),
+        /*showPromo=*/ true);
   } else {
     var notification = $(IDS.NOTIFICATION);
     notification.classList.add(CLASSES.HIDE_NOTIFICATION);
@@ -780,33 +793,39 @@
  * @param {!Element} notificationContainer The notification container element.
  */
 function floatUpNotification(notification, notificationContainer) {
-  // Hide middle-slot promo if one is present.
-  if ($(IDS.PROMO) !== null) {
-    $(IDS.PROMO).classList.add(CLASSES.HIDE_NOTIFICATION);
-  }
-
-  // Hide pre-existing notification if it was different type. Clear timeout and
-  // replace it with the new timeout and new message if it was the same type.
+  // Hide any pre-existing notification.
   if (delayedHideNotification) {
-    if (delayedHideNotification.previousContainer === notificationContainer) {
-      delayedHideNotification.clear();
-    } else {
-      delayedHideNotification.trigger();
-    }
+    delayedHideNotification.trigger();
     delayedHideNotification = null;
   }
 
+  // Hide middle-slot promo if one is present.
+  let promo = $(IDS.PROMO);
+  if (promo) {
+    promo.classList.add(CLASSES.FLOAT_DOWN);
+    // Prevent keyboard focus once the promo is hidden.
+    promo.addEventListener('transitionend', (event) => {
+      if (event.propertyName === 'bottom' &&
+          promo.classList.contains(CLASSES.FLOAT_DOWN)) {
+        promo.classList.add(CLASSES.HIDE_NOTIFICATION);
+      }
+    }, {once: true});
+  }
+
   notification.classList.remove(CLASSES.HIDE_NOTIFICATION);
-  // Timeout is required for the "float up" transition to work. Modifying the
-  // "display" property prevents transitions from activating.
+  // Timeout is required for the "float" transition to work. Modifying the
+  // "display" property prevents transitions from activating for a brief period
+  // of time.
   window.setTimeout(() => {
     notificationContainer.classList.add(CLASSES.FLOAT_UP);
-  }, 20);
+  }, DISPLAY_TIMEOUT);
 
   // Automatically hide the notification after a period of time.
-  delayedHideNotification = createExecutableTimeout(() => {
-    floatDownNotification(notification, notificationContainer);
-  }, NOTIFICATION_TIMEOUT, notificationContainer);
+  delayedHideNotification = createExecutableTimeout((executedEarly) => {
+    // Early execution occurs if another notification should be shown. In this
+    // case, we do not want to re-show the promo yet.
+    floatDownNotification(notification, notificationContainer, !executedEarly);
+  }, NOTIFICATION_TIMEOUT);
 }
 
 
@@ -815,36 +834,48 @@
  * hide the notification.
  * @param {!Element} notification The notification element.
  * @param {!Element} notificationContainer The notification container element.
+ * @param {boolean} showPromo Do show the promo if present.
  */
-function floatDownNotification(notification, notificationContainer) {
+function floatDownNotification(notification, notificationContainer, showPromo) {
   if (!notificationContainer.classList.contains(CLASSES.FLOAT_UP)) {
     return;
   }
 
-  // Show middle-slot promo if one is present.
-  if ($(IDS.PROMO) !== null) {
-    $(IDS.PROMO).classList.remove(CLASSES.HIDE_NOTIFICATION);
-  }
-
   // Clear the timeout to hide the notification.
   if (delayedHideNotification) {
     delayedHideNotification.clear();
     delayedHideNotification = null;
   }
 
-  // Reset notification visibility once the animation is complete.
-  notificationContainer.classList.remove(CLASSES.FLOAT_UP);
-  let afterHide = (event) => {
-    if (event.propertyName === 'bottom') {
-      notification.classList.add(CLASSES.HIDE_NOTIFICATION);
-      notification.classList.remove(CLASSES.HAS_LINK);
-      notificationContainer.removeEventListener('transitionend', afterHide);
+  if (showPromo) {
+    // Show middle-slot promo if one is present.
+    let promo = $(IDS.PROMO);
+    if (promo) {
+      promo.classList.remove(CLASSES.HIDE_NOTIFICATION);
+      // Timeout is required for the "float" transition to work. Modifying the
+      // "display" property prevents transitions from activating for a brief
+      // period of time.
+      window.setTimeout(() => {
+        promo.classList.remove(CLASSES.FLOAT_DOWN);
+      }, DISPLAY_TIMEOUT);
     }
+  }
+
+  // Reset notification visibility once the animation is complete.
+  notificationContainer.addEventListener('transitionend', (event) => {
     // Blur the hidden items.
     $(IDS.UNDO_LINK).blur();
     $(IDS.RESTORE_ALL_LINK).blur();
-  };
-  notificationContainer.addEventListener('transitionend', afterHide);
+    if (notification.classList.contains(CLASSES.HAS_LINK)) {
+      notification.classlist.remove(CLASSES.HAS_LINK);
+      $(IDS.ERROR_NOTIFICATION_LINK).blur();
+    }
+    // Hide the notification
+    if (!notification.classList.contains(CLASSES.FLOAT_UP)) {
+      notification.classList.add(CLASSES.HIDE_NOTIFICATION);
+    }
+  }, {once: true});
+  notificationContainer.classList.remove(CLASSES.FLOAT_UP);
 }
 
 
diff --git a/chrome/browser/resources/management/management.html b/chrome/browser/resources/management/management.html
index 6cc5c99..bec6e5cb 100644
--- a/chrome/browser/resources/management/management.html
+++ b/chrome/browser/resources/management/management.html
@@ -4,10 +4,10 @@
 <head>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, user-scalable=no">
-  <title>$i18n{title}</title>
 
   <link rel="stylesheet" href="chrome://resources/css/md_colors.css">
   <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
+  <link rel="import" href="chrome://resources/html/cr.html">
   <style>
     html {
       --toolbar-height: 56px;
@@ -32,4 +32,6 @@
 <body>
   <management-ui></management-ui>
 </body>
+
+<script src="management.js"></script>
 </html>
diff --git a/chrome/browser/resources/management/management.js b/chrome/browser/resources/management/management.js
new file mode 100644
index 0000000..d3b3ea01
--- /dev/null
+++ b/chrome/browser/resources/management/management.js
@@ -0,0 +1,10 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+cr.define('management', function() {
+  document.title = loadTimeData.getString('title');
+  cr.addWebUIListener(
+      'browser-reporting-info-updated',
+      () => document.title = loadTimeData.getString('title'));
+});
diff --git a/chrome/browser/resources/management/management_browser_proxy.js b/chrome/browser/resources/management/management_browser_proxy.js
index 25396e2..29fa20c 100644
--- a/chrome/browser/resources/management/management_browser_proxy.js
+++ b/chrome/browser/resources/management/management_browser_proxy.js
@@ -55,6 +55,9 @@
 cr.define('management', function() {
   /** @interface */
   class ManagementBrowserProxy {
+    /** @return {string} */
+    getExtensionReportingTitle() {}
+
     /** @return {!Promise<!Array<!management.Extension>>} */
     getExtensions() {}
 
@@ -72,6 +75,14 @@
     getDeviceReportingInfo() {}
     // </if>
 
+    // <if expr="not chromeos">
+    /** @return {string} */
+    getManagementNotice() {}
+    // </if>
+
+    /** @return {string} */
+    getPageTitle() {}
+
     /**
      * @return {!Promise<!Array<!management.BrowserReportingResponse>>} The list
      *     of browser reporting info messages.
@@ -82,6 +93,11 @@
   /** @implements {management.ManagementBrowserProxy} */
   class ManagementBrowserProxyImpl {
     /** @override */
+    getExtensionReportingTitle() {
+      return loadTimeData.getString('extensionsInstalled');
+    }
+
+    /** @override */
     getExtensions() {
       return cr.sendWithPromise('getExtensions');
     }
@@ -98,6 +114,18 @@
     }
     // </if>
 
+    // <if expr="not chromeos">
+    /** @override */
+    getManagementNotice() {
+      return loadTimeData.getString('managementNotice');
+    }
+    // </if>
+
+    /** @override */
+    getPageTitle() {
+      return loadTimeData.getString('title');
+    }
+
     /** @override */
     initBrowserReportingInfo() {
       return cr.sendWithPromise('initBrowserReportingInfo');
diff --git a/chrome/browser/resources/management/management_ui.html b/chrome/browser/resources/management/management_ui.html
index e3ec1d4..f80437b 100644
--- a/chrome/browser/resources/management/management_ui.html
+++ b/chrome/browser/resources/management/management_ui.html
@@ -146,13 +146,13 @@
       }
     </style>
 
-    <cr-toolbar page-name="$i18n{title}" show-search="[[showSearchInToolbar_]]">
+    <cr-toolbar page-name="[[title_]]" show-search="[[showSearchInToolbar_]]">
     </cr-toolbar>
     <main id="mainContent">
       <div class="sections-container">
 <if expr="not chromeos">
         <section class="card three-line single-column">
-          <p inner-h-t-m-l="[[i18nAdvanced('browserManagementNotice')]]"></p>
+          <p inner-h-t-m-l="[[managementNoticeHtml_]]"></p>
         </section>
 </if>
 <if expr="chromeos">
@@ -199,9 +199,7 @@
             if="[[showExtensionReportingInfo_(extensions_)]]">
           <h2>$i18n{extensionReporting}</h2>
           <section class="card three-line single-column">
-            <div class="subtitle">
-              $i18n{extensionsInstalled}
-            </div>
+            <div class="subtitle">[[extensionReportingSubtitle_]]</div>
             <div class="extensions-list">
               <div class="list-item header">
                 <div class="extension-name">$i18n{extensionName}</div>
diff --git a/chrome/browser/resources/management/management_ui.js b/chrome/browser/resources/management/management_ui.js
index 2cffd606..1d429da 100644
--- a/chrome/browser/resources/management/management_ui.js
+++ b/chrome/browser/resources/management/management_ui.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-
+cr.exportPath('management');
 /**
  * @typedef {{
  *    messageIds: !Array<string>,
@@ -54,6 +54,17 @@
       type: Boolean,
       value: false,
     },
+
+    /** @private */
+    title_: String,
+
+    // <if expr="not chromeos">
+    /** @private */
+    managementNoticeHtml_: String,
+    // </if>
+
+    /** @private */
+    extensionReportingSubtitle_: String,
   },
 
   /** @private {?management.ManagementBrowserProxy} */
@@ -63,14 +74,17 @@
   attached() {
     document.documentElement.classList.remove('loading');
     this.browserProxy_ = management.ManagementBrowserProxyImpl.getInstance();
+    this.updateManagedFields_();
     this.initBrowserReportingInfo_();
 
     this.addWebUIListener(
         'browser-reporting-info-updated',
         reportingInfo => this.onBrowserReportingInfoReceived_(reportingInfo));
 
-    this.addWebUIListener(
-        'update-load-time-data', data => loadTimeData.overrideValues(data));
+    this.addWebUIListener('update-load-time-data', data => {
+      loadTimeData.overrideValues(data);
+      this.updateManagedFields_();
+    });
 
     this.getExtensions_();
     // <if expr="chromeos">
@@ -208,4 +222,14 @@
         return 'cr:security';
     }
   },
+
+  /** @private */
+  updateManagedFields_() {
+    this.title_ = this.browserProxy_.getPageTitle();
+    // <if expr="not chromeos">
+    this.managementNoticeHtml_ = this.browserProxy_.getManagementNotice();
+    // </if>
+    this.extensionReportingSubtitle_ =
+        this.browserProxy_.getExtensionReportingTitle();
+  },
 });
diff --git a/chrome/browser/resources/md_extensions/activity_log/activity_log_stream.html b/chrome/browser/resources/md_extensions/activity_log/activity_log_stream.html
index b969b6b0..f2fb6d5e 100644
--- a/chrome/browser/resources/md_extensions/activity_log/activity_log_stream.html
+++ b/chrome/browser/resources/md_extensions/activity_log/activity_log_stream.html
@@ -64,8 +64,7 @@
         <span id="activity-time">$i18n{activityLogTimeColumn}</span>
       </div>
       <template is="dom-repeat" items="[[activityStream_]]">
-        <activity-log-stream-item id="[[item.id]]" data="[[item]]">
-        </activity-log-stream-item>
+        <activity-log-stream-item data="[[item]]"></activity-log-stream-item>
       </template>
     </div>
   </template>
diff --git a/chrome/browser/resources/md_extensions/activity_log/activity_log_stream.js b/chrome/browser/resources/md_extensions/activity_log/activity_log_stream.js
index f2c01d4..9f013408a 100644
--- a/chrome/browser/resources/md_extensions/activity_log/activity_log_stream.js
+++ b/chrome/browser/resources/md_extensions/activity_log/activity_log_stream.js
@@ -24,7 +24,7 @@
     const isContentScript = activityType ===
         chrome.activityLogPrivate.ExtensionActivityType.CONTENT_SCRIPT;
 
-    const args = isContentScript ? null : activity.args;
+    const args = isContentScript ? JSON.stringify([]) : activity.args;
 
     let streamItemNames = [activity.apiCall];
 
@@ -37,6 +37,7 @@
 
     return streamItemNames.map(name => ({
                                  args,
+                                 argUrl: activity.argUrl,
                                  activityType,
                                  name,
                                  pageUrl: activity.pageUrl,
diff --git a/chrome/browser/resources/md_extensions/activity_log/activity_log_stream_item.html b/chrome/browser/resources/md_extensions/activity_log/activity_log_stream_item.html
index 7fc0df69..5d6aaf1 100644
--- a/chrome/browser/resources/md_extensions/activity_log/activity_log_stream_item.html
+++ b/chrome/browser/resources/md_extensions/activity_log/activity_log_stream_item.html
@@ -37,7 +37,7 @@
       }
 
       #activity-type {
-        flex: 0 var(--activity-type-width);
+        min-width: var(--activity-type-width);
       }
 
       #activity-name {
@@ -49,30 +49,49 @@
       }
 
       #activity-time {
-        flex: 0 var(--activity-time-width);
+        min-width: var(--activity-time-width);
         text-align: end;
       }
 
+      iron-collapse {
+        max-width: var(--activity-log-call-and-time-width);
+      }
+
       #expanded-data {
         display: flex;
         flex-direction: column;
+        margin-inline-start: 16px;
       }
 
-      .page-url-link {
+      #page-url-link {
         margin-bottom: 10px;
-        margin-inline-end: 20px;
-        margin-inline-start: 16px;
-        max-width: var(--activity-log-call-and-time-width);
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
       }
 
-      .data-args {
+      #args-list {
+        display: flex;
+        flex-direction: column;
         margin-bottom: 10px;
-        margin-inline-end: 20px;
-        margin-inline-start: 16px;
-        max-width: var(--activity-log-call-and-time-width);
+      }
+
+      #args-list-heading {
+        font-weight: 500;
+      }
+
+      .list-item {
+        display: flex;
+        margin-top: 10px;
+      }
+
+      .index {
+        min-width: 3em; /* Allow 3 digits of space */
+      }
+
+      .arg {
+        margin-inline-start: 8px;
+        overflow: hidden;
         overflow-wrap: break-word;
       }
     </style>
@@ -90,11 +109,18 @@
     </div>
     <iron-collapse opened="[[isExpanded_]]">
       <div id="expanded-data" hidden$="[[!isExpandable_]]">
-        <a class="page-url-link" href="[[data.pageUrl]]"
+        <a id="page-url-link" href="[[data.pageUrl]]"
             hidden$="[[!hasPageUrl_(data.pageUrl)]]"
             title="[[data.pageUrl]]">[[data.pageUrl]]</a>
-        <span class="data-args"
-            hidden$="[[!hasArgs_(data.args)]]">[[data.args]]</span>
+        <div id="args-list" hidden$="[[!hasArgs_(argsList_)]]">
+          <span id="args-list-heading">$i18n{activityArgumentsHeading}</span>
+          <template is="dom-repeat" items="[[argsList_]]">
+            <div class="list-item">
+              <span class="index">[[item.index]]</span>
+              <span class="arg">[[item.arg]]</span>
+            </div>
+          </template>
+        </div>
       </div>
     </iron-collapse>
   </template>
diff --git a/chrome/browser/resources/md_extensions/activity_log/activity_log_stream_item.js b/chrome/browser/resources/md_extensions/activity_log/activity_log_stream_item.js
index 70a50ec..9c1ac6e 100644
--- a/chrome/browser/resources/md_extensions/activity_log/activity_log_stream_item.js
+++ b/chrome/browser/resources/md_extensions/activity_log/activity_log_stream_item.js
@@ -11,11 +11,40 @@
    *   timestamp: number,
    *   activityType: !chrome.activityLogPrivate.ExtensionActivityFilter,
    *   pageUrl: string,
-   *   args: ?String
+   *   argUrl: string,
+   *   args: string
    * }}
    */
   let StreamItem;
 
+  /**
+   * A struct used to describe each argument for an activity (each item in
+   * the parsed version of |data.args|). Contains the argument's value itself
+   * and its index.
+   * @typedef {{
+   *   arg: string,
+   *   index: number
+   * }}
+   */
+  let StreamArgItem;
+
+  /**
+   * Placeholder for arg_url that can occur in |StreamItem.args|. Sometimes we
+   * see this as '\u003Carg_url>' (opening arrow is unicode converted) but
+   * string comparison with the non-unicode value still returns true so we
+   * don't need to convert.
+   * @type {string}
+   */
+  const ARG_URL_PLACEHOLDER = '<arg_url>';
+
+  /**
+   * Regex pattern for |ARG_URL_PLACEHOLDER| for String.replace. A regex of the
+   * exact string with a global search flag is needed to replace all
+   * occurrences.
+   * @type {!RegExp}
+   */
+  const ARG_URL_PLACEHOLDER_REGEX = /"<arg_url>"/g;
+
   const ActivityLogStreamItem = Polymer({
     is: 'activity-log-stream-item',
 
@@ -27,6 +56,12 @@
        */
       data: Object,
 
+      /** @private {!Array<!extensions.StreamArgItem>} */
+      argsList_: {
+        type: Array,
+        computed: 'computeArgsList_(data.args)',
+      },
+
       /** @private */
       isExpandable_: {
         type: Boolean,
@@ -72,7 +107,29 @@
      * @return {boolean}
      */
     hasArgs_: function() {
-      return !!this.data.args && this.data.args != 'null';
+      return this.argsList_.length > 0;
+    },
+
+    /**
+     * @private
+     * @return {!Array<!extensions.StreamArgItem>}
+     */
+    computeArgsList_: function() {
+      const parsedArgs = JSON.parse(this.data.args);
+      if (!Array.isArray(parsedArgs)) {
+        return [];
+      }
+
+      // Replace occurrences AFTER parsing then stringifying as the JSON
+      // serializer on the C++ side escapes certain characters such as '<' and
+      // parsing un-escapes these characters.
+      // See EscapeSpecialCodePoint in base/json/string_escape.cc.
+      return parsedArgs.map(
+          (arg, i) => ({
+            arg: JSON.stringify(arg).replace(
+                ARG_URL_PLACEHOLDER_REGEX, `"${this.data.argUrl}"`),
+            index: i + 1,
+          }));
     },
 
     /**
@@ -94,5 +151,7 @@
   return {
     ActivityLogStreamItem: ActivityLogStreamItem,
     StreamItem: StreamItem,
+    StreamArgItem: StreamArgItem,
+    ARG_URL_PLACEHOLDER: ARG_URL_PLACEHOLDER,
   };
 });
diff --git a/chrome/browser/resources/settings/site_settings/site_details.js b/chrome/browser/resources/settings/site_settings/site_details.js
index db96fad2..e1f93e1 100644
--- a/chrome/browser/resources/settings/site_settings/site_details.js
+++ b/chrome/browser/resources/settings/site_settings/site_details.js
@@ -228,7 +228,8 @@
   onClearStorage_: function(e) {
     // Since usage is only shown when "Site Settings" is enabled, don't
     // clear it when it's not shown.
-    if (this.enableSiteSettings_ && this.storedData_ != '') {
+    if (this.enableSiteSettings_ &&
+        this.hasUsage_(this.storedData_, this.numCookies_)) {
       this.$.usageApi.clearUsage(this.toUrl(this.origin_).href);
     }
 
@@ -244,6 +245,7 @@
   onUsageDeleted_: function(event) {
     if (event.detail.origin == this.toUrl(this.origin_).href) {
       this.storedData_ = '';
+      this.numCookies_ = '';
     }
   },
 
diff --git a/chrome/browser/resources/welcome/onboarding_welcome/BUILD.gn b/chrome/browser/resources/welcome/onboarding_welcome/BUILD.gn
index 8ff98f9..f70ea59 100644
--- a/chrome/browser/resources/welcome/onboarding_welcome/BUILD.gn
+++ b/chrome/browser/resources/welcome/onboarding_welcome/BUILD.gn
@@ -16,28 +16,12 @@
 
 js_type_check("welcome_files") {
   deps = [
-    ":email_interstitial",
     ":landing_view",
     ":signin_view",
     ":welcome_app",
   ]
 }
 
-js_library("email_interstitial") {
-  deps = [
-    ":email_interstitial_proxy",
-    ":welcome_browser_proxy",
-    "./email/:email_app_proxy",
-  ]
-}
-
-js_library("email_interstitial_proxy") {
-  deps = [
-    "//ui/webui/resources/js:cr",
-  ]
-  externs_list = [ "$externs_path/metrics_private.js" ]
-}
-
 js_library("landing_view") {
   deps = [
     ":landing_view_proxy",
diff --git a/chrome/browser/resources/welcome/onboarding_welcome/email_interstitial.html b/chrome/browser/resources/welcome/onboarding_welcome/email_interstitial.html
deleted file mode 100644
index 1f4ea5f8..0000000
--- a/chrome/browser/resources/welcome/onboarding_welcome/email_interstitial.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!doctype html>
-<html dir="$i18n{textdirection}" lang="$i18n{language}">
-  <head>
-    <meta charset="utf-8">
-    <title>$i18n{headerText}</title>
-
-    <link rel="import" href="chrome://resources/html/polymer.html">
-
-    <link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html">
-    <link rel="import" href="chrome://resources/html/assert.html">
-    <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
-    <link rel="import" href="email/email_app_proxy.html">
-    <link rel="import" href="email_interstitial_proxy.html">
-    <link rel="import" href="shared/action_link_style_css.html">
-    <link rel="import" href="shared/onboarding_background.html">
-    <link rel="import" href="shared/splash_pages_shared_css.html">
-    <link rel="import" href="welcome_browser_proxy.html">
-
-    <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
-    <style>
-      body {
-        margin: 0;
-      }
-    </style>
-
-    <dom-module id="email-interstitial">
-      <template>
-        <style include="paper-button-style action-link-style splash-pages-shared-css">
-          :host {
-            align-items: center;
-            display: flex;
-            height: 100vh;
-            justify-content: center;
-          }
-
-          h1 {
-            margin-top: 0;
-            outline: none;
-          }
-        </style>
-        <onboarding-background></onboarding-background>
-        <div id="container">
-          <h1 tabindex="-1">$i18n{emailInterstitialTitle}</h1>
-          <paper-button class="action-button" on-click="onContinueClick_">
-            $i18n{emailInterstitialContinue}
-          </paper-button>
-          <button class="action-link" on-click="onNoThanksClick_">
-            $i18n{noThanks}
-          </button>
-        </div>
-      </template>
-      <script src="email_interstitial.js"></script>
-    </dom-module>
-  </head>
-  <body>
-    <email-interstitial></email-interstitial>
-  </body>
-</html>
diff --git a/chrome/browser/resources/welcome/onboarding_welcome/email_interstitial.js b/chrome/browser/resources/welcome/onboarding_welcome/email_interstitial.js
deleted file mode 100644
index 3a92ce0..0000000
--- a/chrome/browser/resources/welcome/onboarding_welcome/email_interstitial.js
+++ /dev/null
@@ -1,76 +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.
-
-/**
- * @fileoverview When user gets to chrome://welcome/email-interstitial, it will
- * also have a ?provider=... url param. This value is an ID that should match
- * one of the provider in the email list retrieved from the backend. If the user
- * chooses the continue button, they should be directed to the landing page of
- * that email provider.
- */
-Polymer({
-  is: 'email-interstitial',
-
-  /** @private */
-  welcomeBrowserProxy_: null,
-
-  /** @private {?nux.EmailInterstitialProxy} */
-  emailInterstitialProxy_: null,
-
-  /** @private {boolean} */
-  finalized_: false,
-
-  /** @override */
-  ready: function() {
-    this.welcomeBrowserProxy_ = welcome.WelcomeBrowserProxyImpl.getInstance();
-    this.emailInterstitialProxy_ = nux.EmailInterstitialProxyImpl.getInstance();
-    this.emailInterstitialProxy_.recordPageShown();
-
-    window.addEventListener('beforeunload', () => {
-      // Both buttons on this page will navigate to a new URL.
-      if (this.finalized_) {
-        return;
-      }
-      this.finalized_ = true;
-      this.emailInterstitialProxy_.recordNavigatedAway();
-    });
-  },
-
-  /** @override */
-  attached: function() {
-    // Focus heading for accessibility.
-    this.$$('h1').focus();
-  },
-
-  /** @private */
-  onContinueClick_: function() {
-    // Prevent duplicate metrics if a user clicks "Continue" multiple times.
-    if (this.finalized_) {
-      return;
-    }
-    this.finalized_ = true;
-    this.emailInterstitialProxy_.recordNext();
-    const providerId =
-        (new URL(window.location.href)).searchParams.get('provider');
-    nux.EmailAppProxyImpl.getInstance().getAppList().then(list => {
-      for (let i = 0; i < list.length; i++) {
-        if (list[i].id == providerId) {
-          this.welcomeBrowserProxy_.goToURL(list[i].url);
-          return;
-        }
-      }
-
-      // It shouldn't be possible to go to a URL with a non-existent provider
-      // id.
-      assertNotReached();
-    });
-  },
-
-  /** @private */
-  onNoThanksClick_: function() {
-    this.finalized_ = true;
-    this.emailInterstitialProxy_.recordSkip();
-    this.welcomeBrowserProxy_.goToNewTabPage();
-  }
-});
diff --git a/chrome/browser/resources/welcome/onboarding_welcome/email_interstitial_proxy.html b/chrome/browser/resources/welcome/onboarding_welcome/email_interstitial_proxy.html
deleted file mode 100644
index 5147b5e..0000000
--- a/chrome/browser/resources/welcome/onboarding_welcome/email_interstitial_proxy.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<link rel="import" href="chrome://resources/html/cr.html">
-<script src="email_interstitial_proxy.js"></script>
diff --git a/chrome/browser/resources/welcome/onboarding_welcome/email_interstitial_proxy.js b/chrome/browser/resources/welcome/onboarding_welcome/email_interstitial_proxy.js
deleted file mode 100644
index 786a1d1..0000000
--- a/chrome/browser/resources/welcome/onboarding_welcome/email_interstitial_proxy.js
+++ /dev/null
@@ -1,75 +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.
-
-cr.define('nux', function() {
-  const NUX_EMAIL_INTERSTITIAL_INTERACTION_METRIC_NAME =
-      'FirstRun.NewUserExperience.EmailInterstitialInteraction';
-
-  /**
-   * NuxEmailInterstitialInteractions enum.
-   * These values are persisted to logs and should not be renumbered or re-used.
-   * See tools/metrics/histograms/enums.xml.
-   * @enum {number}
-   */
-  const NuxEmailInterstitialInteractions = {
-    PageShown: 0,
-    NavigatedAway: 1,
-    Skip: 2,
-    Next: 3,
-  };
-
-  const NUX_EMAIL_INTERSTITIAL_INTERACTIONS_COUNT =
-      Object.keys(NuxEmailInterstitialInteractions).length;
-
-  /** @interface */
-  class EmailInterstitialProxy {
-    recordPageShown() {}
-
-    recordNavigatedAway() {}
-
-    recordSkip() {}
-
-    recordNext() {}
-  }
-
-  /** @implements {nux.EmailInterstitialProxy} */
-  class EmailInterstitialProxyImpl {
-    /** @override */
-    recordPageShown() {
-      this.recordInteraction_(NuxEmailInterstitialInteractions.PageShown);
-    }
-
-    /** @override */
-    recordNavigatedAway() {
-      this.recordInteraction_(NuxEmailInterstitialInteractions.NavigatedAway);
-    }
-
-    /** @override */
-    recordSkip() {
-      this.recordInteraction_(NuxEmailInterstitialInteractions.Skip);
-    }
-
-    /** @override */
-    recordNext() {
-      this.recordInteraction_(NuxEmailInterstitialInteractions.Next);
-    }
-
-    /**
-     * @param {number} interaction
-     * @private
-     */
-    recordInteraction_(interaction) {
-      chrome.metricsPrivate.recordEnumerationValue(
-          NUX_EMAIL_INTERSTITIAL_INTERACTION_METRIC_NAME, interaction,
-          NUX_EMAIL_INTERSTITIAL_INTERACTIONS_COUNT);
-    }
-  }
-
-  cr.addSingletonGetter(EmailInterstitialProxyImpl);
-
-  return {
-    EmailInterstitialProxy: EmailInterstitialProxy,
-    EmailInterstitialProxyImpl: EmailInterstitialProxyImpl,
-  };
-});
diff --git a/chrome/browser/resources/welcome/onboarding_welcome/onboarding_welcome_resources.grd b/chrome/browser/resources/welcome/onboarding_welcome/onboarding_welcome_resources.grd
index cb3f03f..b1837e2 100644
--- a/chrome/browser/resources/welcome/onboarding_welcome/onboarding_welcome_resources.grd
+++ b/chrome/browser/resources/welcome/onboarding_welcome/onboarding_welcome_resources.grd
@@ -149,26 +149,6 @@
                type="BINDATA" />
     </includes>
     <structures>
-      <structure name="IDR_WELCOME_ONBOARDING_WELCOME_EMAIL_INTERSTITIAL_HTML"
-                 file="email_interstitial.html"
-                 type="chrome_html"
-                 compress="gzip"
-                 preprocess="true"/>
-      <structure name="IDR_WELCOME_ONBOARDING_WELCOME_EMAIL_INTERSTITIAL_JS"
-                 file="email_interstitial.js"
-                 type="chrome_html"
-                 compress="gzip"
-                 preprocess="true"/>
-      <structure name="IDR_WELCOME_ONBOARDING_WELCOME_EMAIL_INTERSTITIAL_PROXY_HTML"
-                 file="email_interstitial_proxy.html"
-                 type="chrome_html"
-                 compress="gzip"
-                 preprocess="true"/>
-      <structure name="IDR_WELCOME_ONBOARDING_WELCOME_EMAIL_INTERSTITIAL_PROXY_JS"
-                 file="email_interstitial_proxy.js"
-                 type="chrome_html"
-                 compress="gzip"
-                 preprocess="true"/>
       <structure name="IDR_WELCOME_ONBOARDING_WELCOME_LANDING_VIEW_HTML"
                  file="landing_view.html"
                  type="chrome_html"
diff --git a/chrome/browser/resources/welcome/onboarding_welcome/signin_view.js b/chrome/browser/resources/welcome/onboarding_welcome/signin_view.js
index e875ef7..6d8532f 100644
--- a/chrome/browser/resources/welcome/onboarding_welcome/signin_view.js
+++ b/chrome/browser/resources/welcome/onboarding_welcome/signin_view.js
@@ -8,10 +8,6 @@
   behaviors: [welcome.NavigationBehavior],
 
   /** @private {boolean} */
-  shouldShowEmailInterstitial_:
-      loadTimeData.getBoolean('showEmailInterstitial'),
-
-  /** @private {boolean} */
   finalized_: false,
 
   /** @private {?welcome.WelcomeBrowserProxy} */
@@ -48,38 +44,17 @@
     this.signinViewProxy_.recordNavigatedAway();
   },
 
-  /**
-   * @return {?string}
-   * @private
-   */
-  getTargetUrl_: function() {
-    const savedProvider =
-        nux.EmailAppProxyImpl.getInstance().getSavedProvider();
-    if (savedProvider != undefined && this.shouldShowEmailInterstitial_) {
-      return `chrome://welcome/email-interstitial?provider=${savedProvider}`;
-    } else {
-      return null;
-    }
-  },
-
-  /**
-   * When the user clicks sign-in, check whether or not they previously
-   * selected an email provider they prefer to use. If so, direct them back to
-   * the email-interstitial page, otherwise let it direct to NTP.
-   * @private
-   */
+  /** private */
   onSignInClick_: function() {
     this.finalized_ = true;
     this.signinViewProxy_.recordSignIn();
-    this.welcomeBrowserProxy_.handleActivateSignIn(this.getTargetUrl_());
+    this.welcomeBrowserProxy_.handleActivateSignIn(null);
   },
 
   /** @private */
   onNoThanksClick_: function() {
     this.finalized_ = true;
     this.signinViewProxy_.recordSkip();
-    // It's safe to assume sign-view is always going to be the last step, so
-    // go to the target url directly. If there's no target, it lands on NTP.
-    this.welcomeBrowserProxy_.handleUserDecline(this.getTargetUrl_());
+    this.welcomeBrowserProxy_.handleUserDecline();
   }
 });
diff --git a/chrome/browser/resources/welcome/onboarding_welcome/welcome_browser_proxy.js b/chrome/browser/resources/welcome/onboarding_welcome/welcome_browser_proxy.js
index f08e952..8e97cb9 100644
--- a/chrome/browser/resources/welcome/onboarding_welcome/welcome_browser_proxy.js
+++ b/chrome/browser/resources/welcome/onboarding_welcome/welcome_browser_proxy.js
@@ -14,11 +14,7 @@
     /** @param {?string} redirectUrl the URL to go to, after signing in. */
     handleActivateSignIn(redirectUrl) {}
 
-    /**
-     * @param {?string} redirectUrl the URL to go to after backend records the
-     *     user declining signin.
-     */
-    handleUserDecline(redirectUrl) {}
+    handleUserDecline() {}
 
     /** @param {boolean=} replace */
     goToNewTabPage(replace) {}
@@ -35,8 +31,8 @@
     }
 
     /** @override */
-    handleUserDecline(redirectUrl) {
-      chrome.send('handleUserDecline', redirectUrl ? [redirectUrl] : []);
+    handleUserDecline() {
+      chrome.send('handleUserDecline');
     }
 
     /** @override */
diff --git a/chrome/browser/ui/android/infobars/autofill_credit_card_filling_infobar.cc b/chrome/browser/ui/android/infobars/autofill_credit_card_filling_infobar.cc
index b642755b..b761bf7f 100644
--- a/chrome/browser/ui/android/infobars/autofill_credit_card_filling_infobar.cc
+++ b/chrome/browser/ui/android/infobars/autofill_credit_card_filling_infobar.cc
@@ -10,7 +10,7 @@
 #include "base/android/jni_string.h"
 #include "chrome/browser/android/resource_mapper.h"
 #include "chrome/browser/infobars/infobar_service.h"
-#include "components/autofill/core/browser/autofill_credit_card_filling_infobar_delegate_mobile.h"
+#include "components/autofill/core/browser/payments/autofill_credit_card_filling_infobar_delegate_mobile.h"
 #include "jni/AutofillCreditCardFillingInfoBar_jni.h"
 #include "ui/gfx/android/java_bitmap.h"
 #include "ui/gfx/image/image.h"
diff --git a/chrome/browser/ui/android/infobars/autofill_save_card_infobar.cc b/chrome/browser/ui/android/infobars/autofill_save_card_infobar.cc
index ecb0a70e..18e211a 100644
--- a/chrome/browser/ui/android/infobars/autofill_save_card_infobar.cc
+++ b/chrome/browser/ui/android/infobars/autofill_save_card_infobar.cc
@@ -11,9 +11,9 @@
 #include "chrome/browser/android/android_theme_resources.h"
 #include "chrome/browser/android/resource_mapper.h"
 #include "chrome/browser/infobars/infobar_service.h"
-#include "components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h"
-#include "components/autofill/core/browser/autofill_save_card_infobar_mobile.h"
-#include "components/autofill/core/browser/legal_message_line.h"
+#include "components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.h"
+#include "components/autofill/core/browser/payments/autofill_save_card_infobar_mobile.h"
+#include "components/autofill/core/browser/payments/legal_message_line.h"
 #include "jni/AutofillSaveCardInfoBar_jni.h"
 #include "ui/gfx/android/java_bitmap.h"
 #include "ui/gfx/image/image.h"
diff --git a/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc b/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc
index a7053c2d..10d98c1 100644
--- a/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc
+++ b/chrome/browser/ui/autofill/card_unmask_prompt_view_browsertest.cc
@@ -19,7 +19,7 @@
 #include "chrome/browser/ui/test/test_browser_dialog.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
-#include "components/autofill/core/browser/card_unmask_delegate.h"
+#include "components/autofill/core/browser/payments/card_unmask_delegate.h"
 #include "components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.h"
 #include "components/autofill/core/browser/ui/card_unmask_prompt_view.h"
 #include "components/user_prefs/user_prefs.h"
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc
index f0bb0c9..6608f22a 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.cc
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -74,9 +74,9 @@
 #include "chrome/browser/ui/android/autofill/card_expiration_date_fix_flow_view_android.h"
 #include "chrome/browser/ui/android/autofill/card_name_fix_flow_view_android.h"
 #include "chrome/browser/ui/android/infobars/autofill_credit_card_filling_infobar.h"
-#include "components/autofill/core/browser/autofill_credit_card_filling_infobar_delegate_mobile.h"
-#include "components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h"
-#include "components/autofill/core/browser/autofill_save_card_infobar_mobile.h"
+#include "components/autofill/core/browser/payments/autofill_credit_card_filling_infobar_delegate_mobile.h"
+#include "components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.h"
+#include "components/autofill/core/browser/payments/autofill_save_card_infobar_mobile.h"
 #include "components/autofill/core/browser/ui/card_expiration_date_fix_flow_view_delegate_mobile.h"
 #include "components/autofill/core/browser/ui/card_name_fix_flow_view_delegate_mobile.h"
 #include "components/infobars/core/infobar.h"
diff --git a/chrome/browser/ui/autofill/local_card_migration_bubble_controller_impl.cc b/chrome/browser/ui/autofill/local_card_migration_bubble_controller_impl.cc
index 62cd4af..46730f63 100644
--- a/chrome/browser/ui/autofill/local_card_migration_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/local_card_migration_bubble_controller_impl.cc
@@ -15,8 +15,8 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/location_bar/location_bar.h"
 #include "components/autofill/core/browser/autofill_metrics.h"
-#include "components/autofill/core/browser/local_card_migration_strike_database.h"
-#include "components/autofill/core/browser/strike_database.h"
+#include "components/autofill/core/browser/payments/local_card_migration_strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/navigation_handle.h"
diff --git a/chrome/browser/ui/autofill/local_card_migration_dialog_controller_impl.cc b/chrome/browser/ui/autofill/local_card_migration_dialog_controller_impl.cc
index 8aa2697dd..75f4255 100644
--- a/chrome/browser/ui/autofill/local_card_migration_dialog_controller_impl.cc
+++ b/chrome/browser/ui/autofill/local_card_migration_dialog_controller_impl.cc
@@ -24,10 +24,10 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/location_bar/location_bar.h"
 #include "components/autofill/core/browser/autofill_metrics.h"
-#include "components/autofill/core/browser/local_card_migration_manager.h"
-#include "components/autofill/core/browser/local_card_migration_strike_database.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/local_card_migration_strike_database.h"
 #include "components/autofill/core/browser/payments/payments_service_url.h"
-#include "components/autofill/core/browser/strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 #include "components/autofill/core/browser/validation.h"
 #include "components/autofill/core/common/autofill_clock.h"
 #include "components/autofill/core/common/autofill_features.h"
diff --git a/chrome/browser/ui/autofill/manage_migration_ui_controller.cc b/chrome/browser/ui/autofill/manage_migration_ui_controller.cc
index d3ae32c3..c655a27 100644
--- a/chrome/browser/ui/autofill/manage_migration_ui_controller.cc
+++ b/chrome/browser/ui/autofill/manage_migration_ui_controller.cc
@@ -6,7 +6,7 @@
 
 #include "chrome/browser/ui/autofill/local_card_migration_bubble.h"
 #include "chrome/browser/ui/autofill/local_card_migration_dialog.h"
-#include "components/autofill/core/browser/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 
 namespace autofill {
 
diff --git a/chrome/browser/ui/libgtkui/gtk_ui.cc b/chrome/browser/ui/libgtkui/gtk_ui.cc
index 4fd5da36..e1c55b8 100644
--- a/chrome/browser/ui/libgtkui/gtk_ui.cc
+++ b/chrome/browser/ui/libgtkui/gtk_ui.cc
@@ -302,9 +302,9 @@
   return params;
 }
 
-views::LinuxUI::NonClientWindowFrameAction GetDefaultMiddleClickAction() {
+views::LinuxUI::WindowFrameAction GetDefaultMiddleClickAction() {
   if (GtkVersionCheck(3, 14))
-    return views::LinuxUI::WINDOW_FRAME_ACTION_NONE;
+    return views::LinuxUI::WindowFrameAction::kNone;
   std::unique_ptr<base::Environment> env(base::Environment::Create());
   switch (base::nix::GetDesktopEnvironment(env.get())) {
     case base::nix::DESKTOP_ENVIRONMENT_KDE4:
@@ -313,21 +313,22 @@
       // middle mouse button to create tab groups. We don't support that in
       // Chrome, but at least avoid lowering windows in response to middle
       // clicks to avoid surprising users who expect the KDE behavior.
-      return views::LinuxUI::WINDOW_FRAME_ACTION_NONE;
+      return views::LinuxUI::WindowFrameAction::kNone;
     default:
-      return views::LinuxUI::WINDOW_FRAME_ACTION_LOWER;
+      return views::LinuxUI::WindowFrameAction::kLower;
   }
 }
 
 }  // namespace
 
 GtkUi::GtkUi() {
-  window_frame_actions_[WINDOW_FRAME_ACTION_SOURCE_DOUBLE_CLICK] =
-      views::LinuxUI::WINDOW_FRAME_ACTION_TOGGLE_MAXIMIZE;
-  window_frame_actions_[WINDOW_FRAME_ACTION_SOURCE_MIDDLE_CLICK] =
-      GetDefaultMiddleClickAction();
-  window_frame_actions_[WINDOW_FRAME_ACTION_SOURCE_RIGHT_CLICK] =
-      views::LinuxUI::WINDOW_FRAME_ACTION_MENU;
+  using Action = views::LinuxUI::WindowFrameAction;
+  using ActionSource = views::LinuxUI::WindowFrameActionSource;
+  window_frame_actions_ = {
+      {ActionSource::kDoubleClick, Action::kToggleMaximize},
+      {ActionSource::kMiddleClick, GetDefaultMiddleClickAction()},
+      {ActionSource::kRightClick, Action::kMenu}};
+
   // Force Gtk to use Xwayland if it would have used wayland.  libgtkui assumes
   // the use of X11 (eg. X11InputMethodContextImplGtk) and will crash under
   // other backends.
@@ -665,9 +666,8 @@
   }
 }
 
-void GtkUi::SetNonClientWindowFrameAction(
-    NonClientWindowFrameActionSourceType source,
-    NonClientWindowFrameAction action) {
+void GtkUi::SetWindowFrameAction(WindowFrameActionSource source,
+                                 WindowFrameAction action) {
   window_frame_actions_[source] = action;
 }
 
@@ -701,8 +701,8 @@
   return SelectFileDialogImpl::Create(listener, std::move(policy));
 }
 
-views::LinuxUI::NonClientWindowFrameAction GtkUi::GetNonClientWindowFrameAction(
-    NonClientWindowFrameActionSourceType source) {
+views::LinuxUI::WindowFrameAction GtkUi::GetWindowFrameAction(
+    WindowFrameActionSource source) {
   return window_frame_actions_[source];
 }
 
diff --git a/chrome/browser/ui/libgtkui/gtk_ui.h b/chrome/browser/ui/libgtkui/gtk_ui.h
index 2c98c19..6bdb8bc7 100644
--- a/chrome/browser/ui/libgtkui/gtk_ui.h
+++ b/chrome/browser/ui/libgtkui/gtk_ui.h
@@ -43,9 +43,8 @@
   void SetWindowButtonOrdering(
       const std::vector<views::FrameButton>& leading_buttons,
       const std::vector<views::FrameButton>& trailing_buttons);
-  void SetNonClientWindowFrameAction(
-      NonClientWindowFrameActionSourceType source,
-      NonClientWindowFrameAction action);
+  void SetWindowFrameAction(WindowFrameActionSource source,
+                            WindowFrameAction action);
 
   // Called when gtk style changes
   void ResetStyle();
@@ -101,8 +100,8 @@
       views::WindowButtonOrderObserver* observer) override;
   void RemoveWindowButtonOrderObserver(
       views::WindowButtonOrderObserver* observer) override;
-  NonClientWindowFrameAction GetNonClientWindowFrameAction(
-      NonClientWindowFrameActionSourceType source) override;
+  WindowFrameAction GetWindowFrameAction(
+      WindowFrameActionSource source) override;
   void NotifyWindowManagerStartupComplete() override;
   void UpdateDeviceScaleFactor() override;
   float GetDeviceScaleFactor() const override;
@@ -196,8 +195,8 @@
       device_scale_factor_observer_list_;
 
   // The action to take when middle, double, or right clicking the titlebar.
-  NonClientWindowFrameAction
-      window_frame_actions_[WINDOW_FRAME_ACTION_SOURCE_LAST];
+  base::flat_map<WindowFrameActionSource, WindowFrameAction>
+      window_frame_actions_;
 
   // Used to override the native theme for a window. If no override is provided
   // or the callback returns nullptr, GtkUi will default to a NativeThemeGtk
diff --git a/chrome/browser/ui/libgtkui/settings_provider_gsettings.cc b/chrome/browser/ui/libgtkui/settings_provider_gsettings.cc
index d892976..379e641 100644
--- a/chrome/browser/ui/libgtkui/settings_provider_gsettings.cc
+++ b/chrome/browser/ui/libgtkui/settings_provider_gsettings.cc
@@ -112,25 +112,25 @@
 
 void SettingsProviderGSettings::ParseAndStoreMiddleClickValue(
     const std::string& click_action) {
-  GtkUi::NonClientWindowFrameAction action;
+  GtkUi::WindowFrameAction action;
 
   if (click_action == "none") {
-    action = views::LinuxUI::WINDOW_FRAME_ACTION_NONE;
+    action = views::LinuxUI::WindowFrameAction::kNone;
   } else if (click_action == "lower") {
-    action = views::LinuxUI::WINDOW_FRAME_ACTION_LOWER;
+    action = views::LinuxUI::WindowFrameAction::kLower;
   } else if (click_action == "minimize") {
-    action = views::LinuxUI::WINDOW_FRAME_ACTION_MINIMIZE;
+    action = views::LinuxUI::WindowFrameAction::kMinimize;
   } else if (click_action == "toggle-maximize") {
-    action = views::LinuxUI::WINDOW_FRAME_ACTION_TOGGLE_MAXIMIZE;
+    action = views::LinuxUI::WindowFrameAction::kToggleMaximize;
   } else {
     // While we want to have the default state be lower if there isn't a
     // value, we want to default to no action if the user has explicitly
     // chose an action that we don't implement.
-    action = views::LinuxUI::WINDOW_FRAME_ACTION_NONE;
+    action = views::LinuxUI::WindowFrameAction::kNone;
   }
 
-  delegate_->SetNonClientWindowFrameAction(
-      views::LinuxUI::WINDOW_FRAME_ACTION_SOURCE_MIDDLE_CLICK, action);
+  delegate_->SetWindowFrameAction(
+      views::LinuxUI::WindowFrameActionSource::kMiddleClick, action);
 }
 
 }  // namespace libgtkui
diff --git a/chrome/browser/ui/libgtkui/settings_provider_gtk.cc b/chrome/browser/ui/libgtkui/settings_provider_gtk.cc
index 3b95bc9..ea8f8c9 100644
--- a/chrome/browser/ui/libgtkui/settings_provider_gtk.cc
+++ b/chrome/browser/ui/libgtkui/settings_provider_gtk.cc
@@ -36,17 +36,17 @@
 }
 
 void ParseActionString(const std::string& value,
-                       GtkUi::NonClientWindowFrameAction* action) {
+                       GtkUi::WindowFrameAction* action) {
   if (value == "none")
-    *action = views::LinuxUI::WINDOW_FRAME_ACTION_NONE;
+    *action = views::LinuxUI::WindowFrameAction::kNone;
   else if (value == "lower")
-    *action = views::LinuxUI::WINDOW_FRAME_ACTION_LOWER;
+    *action = views::LinuxUI::WindowFrameAction::kLower;
   else if (value == "minimize")
-    *action = views::LinuxUI::WINDOW_FRAME_ACTION_MINIMIZE;
+    *action = views::LinuxUI::WindowFrameAction::kMinimize;
   else if (value == "toggle-maximize")
-    *action = views::LinuxUI::WINDOW_FRAME_ACTION_TOGGLE_MAXIMIZE;
+    *action = views::LinuxUI::WindowFrameAction::kToggleMaximize;
   else if (value == "menu")
-    *action = views::LinuxUI::WINDOW_FRAME_ACTION_MENU;
+    *action = views::LinuxUI::WindowFrameAction::kMenu;
 }
 
 }  // namespace
@@ -54,8 +54,8 @@
 SettingsProviderGtk::FrameActionSettingWatcher::FrameActionSettingWatcher(
     SettingsProviderGtk* settings_provider,
     const std::string& setting_name,
-    views::LinuxUI::NonClientWindowFrameActionSourceType action_type,
-    views::LinuxUI::NonClientWindowFrameAction default_action)
+    views::LinuxUI::WindowFrameActionSource action_type,
+    views::LinuxUI::WindowFrameAction default_action)
     : settings_provider_(settings_provider),
       setting_name_(setting_name),
       action_type_(action_type),
@@ -78,10 +78,9 @@
     GParamSpec* param) {
   std::string value =
       GetGtkSettingsStringProperty(settings, setting_name_.c_str());
-  GtkUi::NonClientWindowFrameAction action = default_action_;
+  GtkUi::WindowFrameAction action = default_action_;
   ParseActionString(value, &action);
-  settings_provider_->delegate_->SetNonClientWindowFrameAction(action_type_,
-                                                               action);
+  settings_provider_->delegate_->SetWindowFrameAction(action_type_, action);
 }
 
 SettingsProviderGtk::SettingsProviderGtk(GtkUi* delegate)
@@ -98,18 +97,18 @@
     frame_action_setting_watchers_.push_back(
         std::make_unique<FrameActionSettingWatcher>(
             this, "gtk-titlebar-middle-click",
-            views::LinuxUI::WINDOW_FRAME_ACTION_SOURCE_MIDDLE_CLICK,
-            views::LinuxUI::WINDOW_FRAME_ACTION_NONE));
+            views::LinuxUI::WindowFrameActionSource::kMiddleClick,
+            views::LinuxUI::WindowFrameAction::kNone));
     frame_action_setting_watchers_.push_back(
         std::make_unique<FrameActionSettingWatcher>(
             this, "gtk-titlebar-double-click",
-            views::LinuxUI::WINDOW_FRAME_ACTION_SOURCE_DOUBLE_CLICK,
-            views::LinuxUI::WINDOW_FRAME_ACTION_TOGGLE_MAXIMIZE));
+            views::LinuxUI::WindowFrameActionSource::kDoubleClick,
+            views::LinuxUI::WindowFrameAction::kToggleMaximize));
     frame_action_setting_watchers_.push_back(
         std::make_unique<FrameActionSettingWatcher>(
             this, "gtk-titlebar-right-click",
-            views::LinuxUI::WINDOW_FRAME_ACTION_SOURCE_RIGHT_CLICK,
-            views::LinuxUI::WINDOW_FRAME_ACTION_MENU));
+            views::LinuxUI::WindowFrameActionSource::kRightClick,
+            views::LinuxUI::WindowFrameAction::kMenu));
   } else if (GtkVersionCheck(3, 10, 3)) {
     signal_id_decoration_layout_ =
         g_signal_connect_after(settings, "notify::gtk-theme-name",
diff --git a/chrome/browser/ui/libgtkui/settings_provider_gtk.h b/chrome/browser/ui/libgtkui/settings_provider_gtk.h
index 3f26e54..58863b6 100644
--- a/chrome/browser/ui/libgtkui/settings_provider_gtk.h
+++ b/chrome/browser/ui/libgtkui/settings_provider_gtk.h
@@ -30,8 +30,8 @@
     FrameActionSettingWatcher(
         SettingsProviderGtk* settings_provider,
         const std::string& setting_name,
-        views::LinuxUI::NonClientWindowFrameActionSourceType action_type,
-        views::LinuxUI::NonClientWindowFrameAction default_action);
+        views::LinuxUI::WindowFrameActionSource action_type,
+        views::LinuxUI::WindowFrameAction default_action);
     ~FrameActionSettingWatcher();
 
     CHROMEG_CALLBACK_1(FrameActionSettingWatcher,
@@ -43,8 +43,8 @@
    private:
     SettingsProviderGtk* settings_provider_;
     std::string setting_name_;
-    views::LinuxUI::NonClientWindowFrameActionSourceType action_type_;
-    views::LinuxUI::NonClientWindowFrameAction default_action_;
+    views::LinuxUI::WindowFrameActionSource action_type_;
+    views::LinuxUI::WindowFrameAction default_action_;
     unsigned long signal_id_;
 
     DISALLOW_COPY_AND_ASSIGN(FrameActionSettingWatcher);
diff --git a/chrome/browser/ui/views/autofill/local_card_migration_browsertest.cc b/chrome/browser/ui/views/autofill/local_card_migration_browsertest.cc
index d9767ad..e364636 100644
--- a/chrome/browser/ui/views/autofill/local_card_migration_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/local_card_migration_browsertest.cc
@@ -37,9 +37,9 @@
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/autofill/content/browser/content_autofill_driver.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
-#include "components/autofill/core/browser/credit_card_save_manager.h"
 #include "components/autofill/core/browser/form_data_importer.h"
-#include "components/autofill/core/browser/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/credit_card_save_manager.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/test_event_waiter.h"
 #include "components/autofill/core/common/autofill_features.h"
diff --git a/chrome/browser/ui/views/autofill/local_card_migration_dialog_view.cc b/chrome/browser/ui/views/autofill/local_card_migration_dialog_view.cc
index 3e45a1a..077277e 100644
--- a/chrome/browser/ui/views/autofill/local_card_migration_dialog_view.cc
+++ b/chrome/browser/ui/views/autofill/local_card_migration_dialog_view.cc
@@ -20,7 +20,7 @@
 #include "chrome/browser/ui/views/autofill/view_util.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/chrome_typography.h"
-#include "components/autofill/core/browser/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 #include "components/constrained_window/constrained_window_views.h"
 #include "components/grit/components_scaled_resources.h"
 #include "components/strings/grit/components_strings.h"
diff --git a/chrome/browser/ui/views/autofill/local_card_migration_error_dialog_view.cc b/chrome/browser/ui/views/autofill/local_card_migration_error_dialog_view.cc
index 4fc656c..350082b 100644
--- a/chrome/browser/ui/views/autofill/local_card_migration_error_dialog_view.cc
+++ b/chrome/browser/ui/views/autofill/local_card_migration_error_dialog_view.cc
@@ -10,7 +10,7 @@
 #include "chrome/browser/ui/autofill/popup_constants.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/chrome_typography.h"
-#include "components/autofill/core/browser/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 #include "components/constrained_window/constrained_window_views.h"
 #include "components/grit/components_scaled_resources.h"
 #include "components/strings/grit/components_strings.h"
diff --git a/chrome/browser/ui/views/autofill/migratable_card_view.cc b/chrome/browser/ui/views/autofill/migratable_card_view.cc
index abe3f94..fcffb25 100644
--- a/chrome/browser/ui/views/autofill/migratable_card_view.cc
+++ b/chrome/browser/ui/views/autofill/migratable_card_view.cc
@@ -10,7 +10,7 @@
 #include "chrome/browser/ui/views/autofill/local_card_migration_dialog_view.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/chrome_typography.h"
-#include "components/autofill/core/browser/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 #include "components/grit/components_scaled_resources.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/vector_icons/vector_icons.h"
diff --git a/chrome/browser/ui/views/autofill/migratable_card_view.h b/chrome/browser/ui/views/autofill/migratable_card_view.h
index 492d60d5..e21aabd 100644
--- a/chrome/browser/ui/views/autofill/migratable_card_view.h
+++ b/chrome/browser/ui/views/autofill/migratable_card_view.h
@@ -6,7 +6,7 @@
 #define CHROME_BROWSER_UI_VIEWS_AUTOFILL_MIGRATABLE_CARD_VIEW_H_
 
 #include "base/macros.h"
-#include "components/autofill/core/browser/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/view.h"
 
diff --git a/chrome/browser/ui/views/autofill/save_card_bubble_views.cc b/chrome/browser/ui/views/autofill/save_card_bubble_views.cc
index 55e1869..7b81e5a 100644
--- a/chrome/browser/ui/views/autofill/save_card_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/save_card_bubble_views.cc
@@ -15,7 +15,7 @@
 #include "chrome/browser/ui/views/chrome_typography.h"
 #include "components/autofill/core/browser/autofill_metrics.h"
 #include "components/autofill/core/browser/credit_card.h"
-#include "components/autofill/core/browser/legal_message_line.h"
+#include "components/autofill/core/browser/payments/legal_message_line.h"
 #include "components/autofill/core/browser/ui/save_card_bubble_controller.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/strings/grit/components_strings.h"
diff --git a/chrome/browser/ui/views/autofill/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/save_card_bubble_views_browsertest.cc
index 7f1c06c..676065a 100644
--- a/chrome/browser/ui/views/autofill/save_card_bubble_views_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/save_card_bubble_views_browsertest.cc
@@ -34,8 +34,8 @@
 #include "components/autofill/content/browser/content_autofill_driver.h"
 #include "components/autofill/core/browser/autofill_experiments.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
-#include "components/autofill/core/browser/credit_card_save_manager.h"
 #include "components/autofill/core/browser/form_data_importer.h"
+#include "components/autofill/core/browser/payments/credit_card_save_manager.h"
 #include "components/autofill/core/browser/payments/payments_client.h"
 #include "components/autofill/core/browser/test_autofill_clock.h"
 #include "components/autofill/core/browser/test_event_waiter.h"
diff --git a/chrome/browser/ui/views/autofill/save_card_offer_bubble_views.cc b/chrome/browser/ui/views/autofill/save_card_offer_bubble_views.cc
index 70b195c..f166fd6 100644
--- a/chrome/browser/ui/views/autofill/save_card_offer_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/save_card_offer_bubble_views.cc
@@ -18,7 +18,7 @@
 #include "components/autofill/core/browser/autofill_experiments.h"
 #include "components/autofill/core/browser/autofill_metrics.h"
 #include "components/autofill/core/browser/credit_card.h"
-#include "components/autofill/core/browser/legal_message_line.h"
+#include "components/autofill/core/browser/payments/legal_message_line.h"
 #include "components/autofill/core/browser/ui/save_card_bubble_controller.h"
 #include "components/autofill/core/browser/validation.h"
 #include "components/autofill/core/common/autofill_clock.h"
diff --git a/chrome/browser/ui/views/autofill/view_util.h b/chrome/browser/ui/views/autofill/view_util.h
index 097dbe8..ab5c8a6 100644
--- a/chrome/browser/ui/views/autofill/view_util.h
+++ b/chrome/browser/ui/views/autofill/view_util.h
@@ -6,7 +6,7 @@
 #define CHROME_BROWSER_UI_VIEWS_AUTOFILL_VIEW_UTIL_H_
 
 #include "base/strings/string16.h"
-#include "components/autofill/core/browser/legal_message_line.h"
+#include "components/autofill/core/browser/payments/legal_message_line.h"
 #include "content/public/browser/web_contents.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/color_palette.h"
diff --git a/chrome/browser/ui/views/payments/cvc_unmask_view_controller.h b/chrome/browser/ui/views/payments/cvc_unmask_view_controller.h
index 77f418dd..09b41cc 100644
--- a/chrome/browser/ui/views/payments/cvc_unmask_view_controller.h
+++ b/chrome/browser/ui/views/payments/cvc_unmask_view_controller.h
@@ -14,7 +14,7 @@
 #include "chrome/browser/ui/views/payments/payment_request_sheet_controller.h"
 #include "components/autofill/core/browser/payments/full_card_request.h"
 #include "components/autofill/core/browser/payments/payments_client.h"
-#include "components/autofill/core/browser/risk_data_loader.h"
+#include "components/autofill/core/browser/payments/risk_data_loader.h"
 #include "ui/views/controls/combobox/combobox_listener.h"
 #include "ui/views/controls/textfield/textfield_controller.h"
 
diff --git a/chrome/browser/ui/webui/extensions/extensions_ui.cc b/chrome/browser/ui/webui/extensions/extensions_ui.cc
index 5708b886..51723d0 100644
--- a/chrome/browser/ui/webui/extensions/extensions_ui.cc
+++ b/chrome/browser/ui/webui/extensions/extensions_ui.cc
@@ -200,6 +200,7 @@
     {"stopActivityStream", IDS_MD_EXTENSIONS_STOP_ACTIVITY_STREAM},
     {"emptyStreamStarted", IDS_MD_EXTENSIONS_EMPTY_STREAM_STARTED},
     {"emptyStreamStopped", IDS_MD_EXTENSIONS_EMPTY_STREAM_STOPPED},
+    {"activityArgumentsHeading", IDS_MD_EXTENSIONS_ACTIVITY_ARGUMENTS_HEADING},
     {"appIcon", IDS_MD_EXTENSIONS_APP_ICON},
     {"extensionIcon", IDS_MD_EXTENSIONS_EXTENSION_ICON},
     {"extensionA11yAssociation", IDS_MD_EXTENSIONS_EXTENSION_A11Y_ASSOCIATION},
diff --git a/chrome/browser/ui/webui/management_ui.cc b/chrome/browser/ui/webui/management_ui.cc
index 5485434a..a35921d 100644
--- a/chrome/browser/ui/webui/management_ui.cc
+++ b/chrome/browser/ui/webui/management_ui.cc
@@ -126,6 +126,7 @@
 #endif  // defined(OS_CHROMEOS)
   source->SetJsonPath("strings.js");
   // Add required resources.
+  source->AddResourcePath("management.js", IDR_MANAGEMENT_JS);
   source->AddResourcePath("management_browser_proxy.html",
                           IDR_MANAGEMENT_BROWSER_PROXY_HTML);
   source->AddResourcePath("management_browser_proxy.js",
@@ -149,12 +150,9 @@
 
 ManagementUI::ManagementUI(content::WebUI* web_ui) : WebUIController(web_ui) {
   content::WebUIDataSource* source = CreateManagementUIHtmlSource();
-  Profile* profile = Profile::FromWebUI(web_ui);
-  auto management_ui_handler = std::make_unique<ManagementUIHandler>();
-  management_ui_handler->InitializeManagementContextualStrings(profile, source);
-  web_ui->AddMessageHandler(std::move(management_ui_handler));
+  ManagementUIHandler::Initialize(web_ui, source);
   DarkModeHandler::Initialize(web_ui, source);
-  content::WebUIDataSource::Add(profile, source);
+  content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source);
 }
 
 ManagementUI::~ManagementUI() {}
diff --git a/chrome/browser/ui/webui/management_ui_browsertest.cc b/chrome/browser/ui/webui/management_ui_browsertest.cc
new file mode 100644
index 0000000..e3e1174
--- /dev/null
+++ b/chrome/browser/ui/webui/management_ui_browsertest.cc
@@ -0,0 +1,158 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/json/json_reader.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/policy/chrome_browser_policy_connector.h"
+#include "chrome/browser/policy/profile_policy_connector.h"
+#include "chrome/browser/policy/profile_policy_connector_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/webui/management_ui.h"
+#include "chrome/browser/ui/webui/management_ui_handler.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "components/policy/core/browser/browser_policy_connector.h"
+#include "components/policy/core/common/mock_configuration_policy_provider.h"
+#include "components/strings/grit/components_strings.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/test/browser_test_utils.h"
+#include "ui/base/l10n/l10n_util.h"
+
+class ManagementUITest : public InProcessBrowserTest {
+ public:
+  ManagementUITest() = default;
+  ~ManagementUITest() override = default;
+
+  void SetUpInProcessBrowserTestFixture() override {
+    EXPECT_CALL(provider_, IsInitializationComplete(testing::_))
+        .WillRepeatedly(testing::Return(true));
+    policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_);
+  }
+
+  void VerifyTexts(base::Value* actual_values,
+                   std::map<std::string, base::string16>& expected_values) {
+    base::ListValue* values_as_list = NULL;
+
+    actual_values->GetAsList(&values_as_list);
+    for (size_t i = 0; i < values_as_list->GetSize(); ++i) {
+      base::Value* result = NULL;
+      EXPECT_TRUE(values_as_list->Get(i, &result));
+      auto* name = result->FindStringKey("name");
+      auto* value = result->FindKey("value");
+      DCHECK(name);
+      auto expected_value = base::Value(expected_values[*name]);
+      DCHECK(value);
+      ASSERT_TRUE(value->Equals(&expected_value));
+    }
+  }
+
+  policy::MockConfigurationPolicyProvider* provider() { return &provider_; }
+
+  policy::ProfilePolicyConnector* profile_policy_connector() {
+    return policy::ProfilePolicyConnectorFactory::GetForBrowserContext(
+        browser()->profile());
+  }
+
+ private:
+  policy::MockConfigurationPolicyProvider provider_;
+
+  DISALLOW_COPY_AND_ASSIGN(ManagementUITest);
+};
+
+#if !defined(OS_CHROMEOS)
+IN_PROC_BROWSER_TEST_F(ManagementUITest, ManagementStateChange) {
+  profile_policy_connector()->OverrideIsManagedForTesting(false);
+  ui_test_utils::NavigateToURL(browser(), GURL("chrome://management"));
+
+  // The browser is not managed.
+  const std::string javascript =
+      "const unmanaged_result = [];"
+      "unmanaged_result.push({"
+      " name: 'browserManagementNotice',"
+      " value: management.ManagementBrowserProxyImpl"
+      "   .getInstance().getManagementNotice()"
+      "});"
+      "unmanaged_result.push({"
+      " name: 'extensionReportingTitle',"
+      " value: management.ManagementBrowserProxyImpl"
+      "   .getInstance().getExtensionReportingTitle()"
+      "});"
+      "unmanaged_result.push({"
+      " name: 'pageTitle',"
+      " value: management.ManagementBrowserProxyImpl"
+      "   .getInstance().getPageTitle()"
+      "});"
+      "domAutomationController.send(JSON.stringify(unmanaged_result));";
+
+  content::WebContents* contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  std::string unmanaged_json;
+  ASSERT_TRUE(content::ExecuteScriptAndExtractString(contents, javascript,
+                                                     &unmanaged_json));
+
+  std::unique_ptr<base::Value> unmanaged_value_ptr =
+      base::JSONReader::ReadDeprecated(unmanaged_json);
+  std::map<std::string, base::string16> expected_unmanaged_values{
+      {"browserManagementNotice",
+       l10n_util::GetStringFUTF16(
+           IDS_MANAGEMENT_NOT_MANAGED_NOTICE,
+           base::UTF8ToUTF16(chrome::kManagedUiLearnMoreUrl))},
+      {"extensionReportingTitle",
+       l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED)},
+      {"pageTitle",
+       l10n_util::GetStringUTF16(IDS_MANAGEMENT_NOT_MANAGED_TITLE)},
+  };
+
+  VerifyTexts(unmanaged_value_ptr.get(), expected_unmanaged_values);
+
+  // The browser is managed.
+  profile_policy_connector()->OverrideIsManagedForTesting(true);
+
+  policy::PolicyMap policy_map;
+  policy_map.Set("test-policy", policy::POLICY_LEVEL_MANDATORY,
+                 policy::POLICY_SCOPE_MACHINE, policy::POLICY_SOURCE_PLATFORM,
+                 std::make_unique<base::Value>("hello world"), nullptr);
+  provider()->UpdateExtensionPolicy(policy_map,
+                                    kOnPremReportingExtensionBetaId);
+
+  contents = browser()->tab_strip_model()->GetActiveWebContents();
+  std::string managed_json;
+  const std::string javascript_2 =
+      "const managed_result = [];"
+      "managed_result.push({"
+      " name: 'browserManagementNotice',"
+      " value: management.ManagementBrowserProxyImpl"
+      "   .getInstance().getManagementNotice()"
+      "});"
+      "managed_result.push({"
+      " name: 'extensionReportingTitle',"
+      " value: management.ManagementBrowserProxyImpl"
+      "   .getInstance().getExtensionReportingTitle()"
+      "});"
+      "managed_result.push({"
+      " name: 'pageTitle',"
+      " value: management.ManagementBrowserProxyImpl"
+      "   .getInstance().getPageTitle()"
+      "});"
+      "domAutomationController.send(JSON.stringify(managed_result));";
+
+  ASSERT_TRUE(content::ExecuteScriptAndExtractString(contents, javascript_2,
+                                                     &managed_json));
+
+  std::unique_ptr<base::Value> managed_value_ptr =
+      base::JSONReader::ReadDeprecated(managed_json);
+  std::map<std::string, base::string16> expected_managed_values{
+      {"browserManagementNotice",
+       l10n_util::GetStringFUTF16(
+           IDS_MANAGEMENT_BROWSER_NOTICE,
+           base::UTF8ToUTF16(chrome::kManagedUiLearnMoreUrl))},
+      {"extensionReportingTitle",
+       l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED)},
+      {"pageTitle", l10n_util::GetStringUTF16(IDS_MANAGEMENT_TITLE)},
+  };
+
+  VerifyTexts(managed_value_ptr.get(), expected_managed_values);
+}
+#endif  // !defined(OS_CHROMEOS)
diff --git a/chrome/browser/ui/webui/management_ui_handler.cc b/chrome/browser/ui/webui/management_ui_handler.cc
index 230209e4..3565d325 100644
--- a/chrome/browser/ui/webui/management_ui_handler.cc
+++ b/chrome/browser/ui/webui/management_ui_handler.cc
@@ -133,8 +133,11 @@
 
 std::string GetAccountDomain(Profile* profile) {
   auto username = profile->GetProfileUserName();
-  return username.empty() ? std::string()
-                          : gaia::ExtractDomainName(std::move(username));
+  size_t email_separator_pos = username.find('@');
+  auto is_email = email_separator_pos != username.npos &&
+                  email_separator_pos < username.length() - 1;
+  return is_email ? gaia::ExtractDomainName(std::move(username))
+                  : std::string();
 }
 
 #if !defined(OS_CHROMEOS)
@@ -149,7 +152,7 @@
         "extensionsInstalled",
         l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
 
-    update->SetString("browserManagementNotice",
+    update->SetString("managementNotice",
                       l10n_util::GetStringFUTF16(
                           managed ? IDS_MANAGEMENT_BROWSER_NOTICE
                                   : IDS_MANAGEMENT_NOT_MANAGED_NOTICE,
@@ -165,7 +168,7 @@
                                    base::UTF8ToUTF16(management_domain)));
 
     update->SetString(
-        "browserManagementNotice",
+        "managementNotice",
         managed ? l10n_util::GetStringFUTF16(
                       IDS_MANAGEMENT_MANAGEMENT_BY_NOTICE,
                       base::UTF8ToUTF16(management_domain),
@@ -347,23 +350,30 @@
 }
 
 ManagementUIHandler::~ManagementUIHandler() {
-#if BUILDFLAG(ENABLE_EXTENSIONS)
-  RemoveObservers();
-#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
+  DisallowJavascript();
 }
 
-void ManagementUIHandler::InitializeManagementContextualStrings(
-    Profile* profile,
-    content::WebUIDataSource* web_data_source) {
+void ManagementUIHandler::Initialize(content::WebUI* web_ui,
+                                     content::WebUIDataSource* source) {
+  InitializeInternal(web_ui, source, Profile::FromWebUI(web_ui));
+}
+// static
+void ManagementUIHandler::InitializeInternal(content::WebUI* web_ui,
+                                             content::WebUIDataSource* source,
+                                             Profile* profile) {
+  auto handler = std::make_unique<ManagementUIHandler>();
+
 #if defined(OS_CHROMEOS)
-  managed_ = IsProfileManaged(profile);
+  handler->managed_ = IsProfileManaged(profile);
 #else
-  managed_ = IsProfileManaged(profile) || IsBrowserManaged();
+  handler->managed_ = IsProfileManaged(profile) || IsBrowserManaged();
 #endif  // defined(OS_CHROMEOS)
 
-  web_data_source->AddLocalizedStrings(
-      *GetDataManagementContextualSourceUpdate(profile));
-  web_ui_data_source_name_ = web_data_source->GetSource();
+  source->AddLocalizedStrings(
+      *handler->GetDataManagementContextualSourceUpdate(profile));
+  handler->web_ui_data_source_name_ = source->GetSource();
+
+  web_ui->AddMessageHandler(std::move(handler));
 }
 
 void ManagementUIHandler::RegisterMessages() {
@@ -392,6 +402,10 @@
 }
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
+void ManagementUIHandler::OnJavascriptAllowed() {
+  AddObservers();
+}
+
 void ManagementUIHandler::OnJavascriptDisallowed() {
   RemoveObservers();
 }
@@ -493,7 +507,7 @@
   }
 }
 
-const policy::PolicyService* ManagementUIHandler::GetPolicyService() const {
+policy::PolicyService* ManagementUIHandler::GetPolicyService() const {
   return policy::ProfilePolicyConnectorFactory::GetForBrowserContext(
              Profile::FromWebUI(web_ui()))
       ->policy_service();
@@ -650,7 +664,6 @@
   AllowJavascript();
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   AddExtensionReportingInfo(&report_sources);
-  AddObservers();
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
   ResolveJavascriptCallback(args->GetList()[0] /* callback_id */,
                             report_sources);
@@ -703,23 +716,9 @@
 }
 
 void ManagementUIHandler::OnPolicyUpdated(
-    const policy::PolicyNamespace& ns,
+    const policy::PolicyNamespace& /*ns*/,
     const policy::PolicyMap& /*previous*/,
     const policy::PolicyMap& /*current*/) {
-  const policy::PolicyNamespace
-      on_prem_reporting_extension_stable_policy_namespace =
-          policy::PolicyNamespace(policy::POLICY_DOMAIN_EXTENSIONS,
-                                  kOnPremReportingExtensionStableId);
-  const policy::PolicyNamespace
-      on_prem_reporting_extension_beta_policy_namespace =
-          policy::PolicyNamespace(policy::POLICY_DOMAIN_EXTENSIONS,
-                                  kOnPremReportingExtensionBetaId);
-
-  if (ns == on_prem_reporting_extension_stable_policy_namespace ||
-      ns == on_prem_reporting_extension_beta_policy_namespace) {
-    return;
-  }
-
   OnManagedStateChanged();
   NotifyBrowserReportingInfoUpdated();
 }
@@ -734,9 +733,7 @@
 
   extensions::ExtensionRegistry::Get(profile)->AddObserver(this);
 
-  policy::PolicyService* policy_service =
-      policy::ProfilePolicyConnectorFactory::GetForBrowserContext(profile)
-          ->policy_service();
+  auto* policy_service = GetPolicyService();
   policy_service->AddObserver(policy::POLICY_DOMAIN_EXTENSIONS, this);
 
   pref_registrar_.Init(profile->GetPrefs());
diff --git a/chrome/browser/ui/webui/management_ui_handler.h b/chrome/browser/ui/webui/management_ui_handler.h
index 1f5aa7f..83f23025 100644
--- a/chrome/browser/ui/webui/management_ui_handler.h
+++ b/chrome/browser/ui/webui/management_ui_handler.h
@@ -9,6 +9,7 @@
 #include <set>
 #include <string>
 
+#include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/strings/string16.h"
 #include "chrome/common/url_constants.h"
@@ -80,7 +81,6 @@
 class Profile;
 
 // The JavaScript message handler for the chrome://management page.
-// TODO(ydago): Increase test coverage of this class
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 class ManagementUIHandler : public content::WebUIMessageHandler,
                             public extensions::ExtensionRegistryObserver,
@@ -92,27 +92,33 @@
   ManagementUIHandler();
   ~ManagementUIHandler() override;
 
-  void InitializeManagementContextualStrings(
-      Profile* profile,
-      content::WebUIDataSource* web_data_source);
+  static void Initialize(content::WebUI* web_ui,
+                         content::WebUIDataSource* source);
+
   // content::WebUIMessageHandler implementation.
   void RegisterMessages() override;
 
+  void SetManagedForTesting(bool managed) { managed_ = managed; }
+
 #if BUILDFLAG(ENABLE_EXTENSIONS)
+  void OnJavascriptAllowed() override;
   void OnJavascriptDisallowed() override;
 
  protected:
+  // Protected for testing.
+  std::unique_ptr<base::DictionaryValue>
+  GetDataManagementContextualSourceUpdate(Profile* profile) const;
+  static void InitializeInternal(content::WebUI* web_ui,
+                                 content::WebUIDataSource* source,
+                                 Profile* profile);
   void AddExtensionReportingInfo(base::Value* report_sources);
 
-  virtual const policy::PolicyService* GetPolicyService() const;
+  virtual policy::PolicyService* GetPolicyService() const;
   virtual const extensions::Extension* GetEnabledExtension(
       const std::string& extensionId) const;
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
  private:
-  std::unique_ptr<base::DictionaryValue>
-  GetDataManagementContextualSourceUpdate(Profile* profile) const;
-
   base::string16 GetEnterpriseManagementStatusString();
 
   void HandleGetDeviceManagementStatus(const base::ListValue* args);
diff --git a/chrome/browser/ui/webui/management_ui_handler_unittest.cc b/chrome/browser/ui/webui/management_ui_handler_unittest.cc
index 4bc787f7..36a2abb 100644
--- a/chrome/browser/ui/webui/management_ui_handler_unittest.cc
+++ b/chrome/browser/ui/webui/management_ui_handler_unittest.cc
@@ -6,20 +6,34 @@
 #include <set>
 #include <string>
 
+#include "base/strings/utf_string_conversions.h"
+
 #include "chrome/browser/ui/webui/management_ui_handler.h"
+#include "chrome/test/base/testing_profile.h"
 
 #include "components/policy/core/common/mock_policy_service.h"
 #include "components/policy/core/common/policy_map.h"
 #include "components/policy/core/common/policy_namespace.h"
 #include "components/policy/core/common/policy_service.h"
+#include "components/strings/grit/components_strings.h"
+#include "content/public/test/test_browser_thread_bundle.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_builder.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#include "ui/base/l10n/l10n_util.h"
+
 using testing::_;
+using testing::Return;
 using testing::ReturnRef;
 
+struct ContextualManagementSourceUpdate {
+  base::string16* extensions_installed;
+  base::string16* browser_management_notice;
+  base::string16* title;
+};
+
 class TestManagementUIHandler : public ManagementUIHandler {
  public:
   TestManagementUIHandler() = default;
@@ -31,13 +45,18 @@
     cloud_reporting_extension_exists_ = enable;
   }
 
+  std::unique_ptr<base::DictionaryValue> GetDataSourceUpdate(
+      Profile* profile) const {
+    return GetDataManagementContextualSourceUpdate(profile);
+  }
+
   base::Value GetExtensionReportingInfo() {
     base::Value report_sources(base::Value::Type::LIST);
     AddExtensionReportingInfo(&report_sources);
     return report_sources;
   }
 
-  const policy::PolicyService* GetPolicyService() const override {
+  policy::PolicyService* GetPolicyService() const override {
     return policy_service_;
   }
 
@@ -66,12 +85,130 @@
                  std::make_unique<base::Value>(true), nullptr);
   }
 
+  void ExtractContextualSourceUpdate(
+      base::DictionaryValue* data,
+      const ContextualManagementSourceUpdate& extracted) {
+    data->GetString("extensionsInstalled", extracted.extensions_installed);
+    data->GetString("managementNotice", extracted.browser_management_notice);
+    data->GetString("title", extracted.title);
+  }
+
  protected:
   TestManagementUIHandler handler_;
+  content::TestBrowserThreadBundle thread_bundle_;
   policy::MockPolicyService policy_service_;
   policy::PolicyMap empty_policy_map_;
 };
 
+#if !defined(OS_CHROMEOS)
+TEST_F(ManagementUIHandlerTests,
+       ManagementContextualSourceUpdateUnmanagedNoDomain) {
+  auto profile = TestingProfile::Builder().Build();
+
+  base::string16 extensions_installed;
+  base::string16 browser_management_notice;
+  base::string16 title;
+  ContextualManagementSourceUpdate extracted{
+      &extensions_installed, &browser_management_notice, &title};
+
+  handler_.SetManagedForTesting(false);
+  auto data = handler_.GetDataSourceUpdate(profile.get());
+  ExtractContextualSourceUpdate(data.get(), extracted);
+
+  EXPECT_EQ(data->DictSize(), 3u);
+  EXPECT_EQ(extensions_installed,
+            l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
+  EXPECT_EQ(browser_management_notice,
+            l10n_util::GetStringFUTF16(
+                IDS_MANAGEMENT_NOT_MANAGED_NOTICE,
+                base::UTF8ToUTF16(chrome::kManagedUiLearnMoreUrl)));
+  EXPECT_EQ(title, l10n_util::GetStringUTF16(IDS_MANAGEMENT_NOT_MANAGED_TITLE));
+}
+
+TEST_F(ManagementUIHandlerTests,
+       ManagementContextualSourceUpdateManageNoDomain) {
+  auto profile = TestingProfile::Builder().Build();
+
+  base::string16 extensions_installed;
+  base::string16 browser_management_notice;
+  base::string16 title;
+  ContextualManagementSourceUpdate extracted{
+      &extensions_installed, &browser_management_notice, &title};
+
+  handler_.SetManagedForTesting(true);
+  auto data = handler_.GetDataSourceUpdate(profile.get());
+  ExtractContextualSourceUpdate(data.get(), extracted);
+
+  EXPECT_EQ(data->DictSize(), 3u);
+  EXPECT_EQ(extensions_installed,
+            l10n_util::GetStringUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED));
+  EXPECT_EQ(browser_management_notice,
+            l10n_util::GetStringFUTF16(
+                IDS_MANAGEMENT_BROWSER_NOTICE,
+                base::UTF8ToUTF16(chrome::kManagedUiLearnMoreUrl)));
+  EXPECT_EQ(title, l10n_util::GetStringUTF16(IDS_MANAGEMENT_TITLE));
+}
+
+TEST_F(ManagementUIHandlerTests,
+       ManagementContextualSourceUpdateUnmanagedKnownDomain) {
+  TestingProfile::Builder builder;
+  builder.SetProfileName("managed@manager.com");
+  auto profile = builder.Build();
+
+  base::string16 extensions_installed;
+  base::string16 browser_management_notice;
+  base::string16 title;
+  ContextualManagementSourceUpdate extracted{
+      &extensions_installed, &browser_management_notice, &title};
+
+  handler_.SetManagedForTesting(false);
+
+  auto data = handler_.GetDataSourceUpdate(profile.get());
+  ExtractContextualSourceUpdate(data.get(), extracted);
+
+  EXPECT_EQ(data->DictSize(), 3u);
+  EXPECT_EQ(extensions_installed,
+            l10n_util::GetStringFUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED_BY,
+                                       base::UTF8ToUTF16("manager.com")));
+  EXPECT_EQ(browser_management_notice,
+            l10n_util::GetStringFUTF16(
+                IDS_MANAGEMENT_NOT_MANAGED_NOTICE,
+                base::UTF8ToUTF16(chrome::kManagedUiLearnMoreUrl)));
+  EXPECT_EQ(title, l10n_util::GetStringUTF16(IDS_MANAGEMENT_NOT_MANAGED_TITLE));
+}
+
+TEST_F(ManagementUIHandlerTests,
+       ManagementContextualSourceUpdateManagedKnownDomain) {
+  TestingProfile::Builder builder;
+  builder.SetProfileName("managed@manager.com");
+  auto profile = builder.Build();
+
+  base::string16 extensions_installed;
+  base::string16 browser_management_notice;
+  base::string16 title;
+  ContextualManagementSourceUpdate extracted{
+      &extensions_installed, &browser_management_notice, &title};
+
+  handler_.SetManagedForTesting(true);
+  auto data = handler_.GetDataSourceUpdate(profile.get());
+  ExtractContextualSourceUpdate(data.get(), extracted);
+
+  EXPECT_EQ(data->DictSize(), 3u);
+  EXPECT_EQ(extensions_installed,
+            l10n_util::GetStringFUTF16(IDS_MANAGEMENT_EXTENSIONS_INSTALLED_BY,
+                                       base::UTF8ToUTF16("manager.com")));
+  EXPECT_EQ(
+      browser_management_notice,
+      l10n_util::GetStringFUTF16(
+          IDS_MANAGEMENT_MANAGEMENT_BY_NOTICE, base::UTF8ToUTF16("manager.com"),
+          base::UTF8ToUTF16(chrome::kManagedUiLearnMoreUrl)));
+  EXPECT_EQ(title,
+            l10n_util::GetStringFUTF16(IDS_MANAGEMENT_TITLE_BY,
+                                       base::UTF8ToUTF16("manager.com")));
+}
+
+#endif  // !defined(OS_CHROMEOS)
+
 TEST_F(ManagementUIHandlerTests, ExtensionReportingInfoNoPolicySetNoMessage) {
   handler_.EnableCloudReportingExtension(false);
   auto reporting_info = handler_.GetExtensionReportingInfo();
diff --git a/chrome/browser/ui/webui/welcome/nux/constants.cc b/chrome/browser/ui/webui/welcome/nux/constants.cc
index 06f0a13b2..5ed970a 100644
--- a/chrome/browser/ui/webui/welcome/nux/constants.cc
+++ b/chrome/browser/ui/webui/welcome/nux/constants.cc
@@ -19,7 +19,5 @@
     "nux-google-apps,nux-email,nux-set-as-default,signin-view"};
 const base::FeatureParam<std::string> kNuxOnboardingReturningUserModules{
     &kNuxOnboardingFeature, "returning-user-modules", "nux-set-as-default"};
-const base::FeatureParam<bool> kNuxOnboardingShowEmailInterstitial{
-    &kNuxOnboardingFeature, "show-email-interstitial", false};
 
 }  // namespace nux
diff --git a/chrome/browser/ui/webui/welcome/nux_helper.cc b/chrome/browser/ui/webui/welcome/nux_helper.cc
index bc9e8f5..603f113 100644
--- a/chrome/browser/ui/webui/welcome/nux_helper.cc
+++ b/chrome/browser/ui/webui/welcome/nux_helper.cc
@@ -38,9 +38,6 @@
     kNuxOnboardingForceEnabledReturningUserModules = {
         &kNuxOnboardingForceEnabled, "returning-user-modules",
         "nux-set-as-default"};
-// TODO(hcarmona): remove this flag and all code behind it.
-const base::FeatureParam<bool> kNuxOnboardingForceEnabledShowEmailInterstitial =
-    {&kNuxOnboardingForceEnabled, "show-email-interstitial", true};
 
 // Must match study name in configs.
 const char kNuxOnboardingStudyName[] = "NaviOnboarding";
@@ -105,14 +102,10 @@
                       kNuxOnboardingForceEnabledNewUserModules.Get());
     modules.SetString("returning-user",
                       kNuxOnboardingForceEnabledReturningUserModules.Get());
-    modules.SetBoolean("show-email-interstitial",
-                       kNuxOnboardingForceEnabledShowEmailInterstitial.Get());
   } else {  // This means |nux::kNuxOnboardingFeature| is enabled.
     modules.SetString("new-user", kNuxOnboardingNewUserModules.Get());
     modules.SetString("returning-user",
                       kNuxOnboardingReturningUserModules.Get());
-    modules.SetBoolean("show-email-interstitial",
-                       kNuxOnboardingShowEmailInterstitial.Get());
   }
 
   return modules;
diff --git a/chrome/browser/ui/webui/welcome/welcome_handler.cc b/chrome/browser/ui/webui/welcome/welcome_handler.cc
index 6a20288..e0d62ec0 100644
--- a/chrome/browser/ui/webui/welcome/welcome_handler.cc
+++ b/chrome/browser/ui/webui/welcome/welcome_handler.cc
@@ -20,7 +20,6 @@
 #include "ui/base/page_transition_types.h"
 
 const char kWelcomeReturningUserUrl[] = "chrome://welcome/returning-user";
-const char kWelcomeEmailInterstitial[] = "chrome://welcome/email-interstitial";
 
 WelcomeHandler::WelcomeHandler(content::WebUI* web_ui)
     : profile_(Profile::FromWebUI(web_ui)),
@@ -53,9 +52,7 @@
 bool WelcomeHandler::isValidRedirectUrl() {
   GURL current_url = web_ui()->GetWebContents()->GetVisibleURL();
 
-  return current_url == kWelcomeReturningUserUrl ||
-         current_url.spec().find(kWelcomeEmailInterstitial) !=
-             std::string::npos;
+  return current_url == kWelcomeReturningUserUrl;
 }
 
 // Override from LoginUIService::Observer.
@@ -108,16 +105,7 @@
                 ? WelcomeResult::ATTEMPTED_DECLINED
                 : WelcomeResult::DECLINED;
 
-  if (args->GetSize() == 1U) {
-    std::string url_string;
-    CHECK(args->GetString(0, &url_string));
-    GURL redirect_url = GURL(url_string);
-    DCHECK(redirect_url.is_valid());
-
-    GoToURL(redirect_url);
-  } else {
-    GoToNewTabPage();
-  }
+  GoToNewTabPage();
 }
 
 // Override from WebUIMessageHandler.
diff --git a/chrome/browser/ui/webui/welcome/welcome_ui.cc b/chrome/browser/ui/webui/welcome/welcome_ui.cc
index a63df6d..4d26cf73 100644
--- a/chrome/browser/ui/webui/welcome/welcome_ui.cc
+++ b/chrome/browser/ui/webui/welcome/welcome_ui.cc
@@ -116,12 +116,6 @@
       {"landingDescription", IDS_ONBOARDING_WELCOME_LANDING_DESCRIPTION},
       {"landingNewUser", IDS_ONBOARDING_WELCOME_LANDING_NEW_USER},
       {"landingExistingUser", IDS_ONBOARDING_WELCOME_LANDING_EXISTING_USER},
-
-      // Email interstitial strings.
-      {"emailInterstitialTitle",
-       IDS_ONBOARDING_WELCOME_EMAIL_INTERSTITIAL_TITLE},
-      {"emailInterstitialContinue",
-       IDS_ONBOARDING_WELCOME_EMAIL_INTERSTITIAL_CONTINUE},
   };
   AddLocalizedStringsBulk(html_source, kLocalizedStrings,
                           base::size(kLocalizedStrings));
@@ -181,11 +175,6 @@
     html_source->SetDefaultResource(
         IDR_WELCOME_ONBOARDING_WELCOME_WELCOME_HTML);
 
-    // chrome://welcome/email-interstitial
-    html_source->AddResourcePath(
-        "email-interstitial",
-        IDR_WELCOME_ONBOARDING_WELCOME_EMAIL_INTERSTITIAL_HTML);
-
 #if defined(OS_WIN)
     html_source->AddBoolean(
         "is_win10", base::win::GetVersion() >= base::win::VERSION_WIN10);
@@ -215,10 +204,6 @@
                            nux::GetNuxOnboardingModules(profile)
                                .FindKey("returning-user")
                                ->GetString());
-    html_source->AddBoolean("showEmailInterstitial",
-                            nux::GetNuxOnboardingModules(profile)
-                                .FindKey("show-email-interstitial")
-                                ->GetBool());
     html_source->SetRequestFilter(base::BindRepeating(
         &HandleRequestCallback, weak_ptr_factory_.GetWeakPtr()));
   } else if (kIsBranded && is_dice) {
diff --git a/chrome/common/conflicts/module_event_sink_win.mojom b/chrome/common/conflicts/module_event_sink_win.mojom
index 58fcb89e8..ec29a822 100644
--- a/chrome/common/conflicts/module_event_sink_win.mojom
+++ b/chrome/common/conflicts/module_event_sink_win.mojom
@@ -4,18 +4,10 @@
 
 module mojom;
 
-// The types of module events that can occur.
-enum ModuleEventType {
-  // A module was already loaded, but its presence is being observed.
-  MODULE_ALREADY_LOADED,
-  // A module is in the process of being loaded.
-  MODULE_LOADED,
-};
-
 // Interface for a remote consumer of module events.
 interface ModuleEventSink {
   // Notifies the module database of a module event in a remote process. The
   // module is identified only by its load address, which is sufficient for
   // any process to safely look up the module.
-  OnModuleEvent(ModuleEventType event_type, uint64 load_address);
+  OnModuleEvent(uint64 load_address);
 };
diff --git a/chrome/common/conflicts/module_watcher_win.cc b/chrome/common/conflicts/module_watcher_win.cc
index 814030b..bdcfb79 100644
--- a/chrome/common/conflicts/module_watcher_win.cc
+++ b/chrome/common/conflicts/module_watcher_win.cc
@@ -118,7 +118,7 @@
 }
 
 template <typename NotificationDataType>
-void OnModuleEvent(mojom::ModuleEventType event_type,
+void OnModuleEvent(ModuleWatcher::ModuleEventType event_type,
                    const NotificationDataType& notification_data,
                    const ModuleWatcher::OnModuleEventCallback& callback) {
   ModuleWatcher::ModuleEvent event(
@@ -219,7 +219,7 @@
   MODULEENTRY32 module = {sizeof(module)};
   for (BOOL result = ::Module32First(snap.Get(), &module); result != FALSE;
        result = ::Module32Next(snap.Get(), &module)) {
-    ModuleEvent event(mojom::ModuleEventType::MODULE_ALREADY_LOADED,
+    ModuleEvent event(ModuleEventType::kModuleAlreadyLoaded,
                       base::FilePath(module.szExePath), module.modBaseAddr,
                       module.modBaseSize);
     task_runner->PostTask(FROM_HERE, base::BindOnce(callback, event));
@@ -246,8 +246,8 @@
 
   switch (notification_reason) {
     case LDR_DLL_NOTIFICATION_REASON_LOADED:
-      OnModuleEvent(mojom::ModuleEventType::MODULE_LOADED,
-                    notification_data->Loaded, callback);
+      OnModuleEvent(ModuleEventType::kModuleLoaded, notification_data->Loaded,
+                    callback);
       break;
 
     case LDR_DLL_NOTIFICATION_REASON_UNLOADED:
diff --git a/chrome/common/conflicts/module_watcher_win.h b/chrome/common/conflicts/module_watcher_win.h
index 7ede51c9a..a4af43b 100644
--- a/chrome/common/conflicts/module_watcher_win.h
+++ b/chrome/common/conflicts/module_watcher_win.h
@@ -11,7 +11,6 @@
 #include "base/files/file_path.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/common/conflicts/module_event_sink_win.mojom.h"
 
 class ModuleWatcherTest;
 
@@ -25,11 +24,19 @@
 // created.
 class ModuleWatcher {
  public:
+  // The types of module events that can occur.
+  enum class ModuleEventType {
+    // A module was already loaded, but its presence is being observed.
+    kModuleAlreadyLoaded,
+    // A module is in the process of being loaded.
+    kModuleLoaded,
+  };
+
   // Houses information about a module event, and some module metadata.
   struct ModuleEvent {
     ModuleEvent() = default;
     ModuleEvent(const ModuleEvent& other) = default;
-    ModuleEvent(mojom::ModuleEventType event_type,
+    ModuleEvent(ModuleEventType event_type,
                 const base::FilePath& module_path,
                 void* module_load_address,
                 size_t module_size)
@@ -39,7 +46,7 @@
           module_size(module_size) {}
 
     // The type of module event.
-    mojom::ModuleEventType event_type;
+    ModuleEventType event_type;
     // The full path to the module on disk.
     base::FilePath module_path;
     // The load address of the module. Careful consideration must be made before
diff --git a/chrome/common/conflicts/module_watcher_win_unittest.cc b/chrome/common/conflicts/module_watcher_win_unittest.cc
index 84d6f3f..9efcb783 100644
--- a/chrome/common/conflicts/module_watcher_win_unittest.cc
+++ b/chrome/common/conflicts/module_watcher_win_unittest.cc
@@ -23,10 +23,10 @@
   void OnModuleEvent(const ModuleWatcher::ModuleEvent& event) {
     ++module_event_count_;
     switch (event.event_type) {
-      case mojom::ModuleEventType::MODULE_ALREADY_LOADED:
+      case ModuleWatcher::ModuleEventType::kModuleAlreadyLoaded:
         ++module_already_loaded_event_count_;
         break;
-      case mojom::ModuleEventType::MODULE_LOADED:
+      case ModuleWatcher::ModuleEventType::kModuleLoaded:
         ++module_loaded_event_count_;
         break;
     }
diff --git a/chrome/common/conflicts/remote_module_watcher_win.cc b/chrome/common/conflicts/remote_module_watcher_win.cc
index ce00b786..66e0d9a 100644
--- a/chrome/common/conflicts/remote_module_watcher_win.cc
+++ b/chrome/common/conflicts/remote_module_watcher_win.cc
@@ -66,5 +66,5 @@
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   module_event_sink_->OnModuleEvent(
-      event.event_type, reinterpret_cast<uintptr_t>(event.module_load_address));
+      reinterpret_cast<uintptr_t>(event.module_load_address));
 }
diff --git a/chrome/common/conflicts/remote_module_watcher_win_unittest.cc b/chrome/common/conflicts/remote_module_watcher_win_unittest.cc
index a47fb68..41b6db18 100644
--- a/chrome/common/conflicts/remote_module_watcher_win_unittest.cc
+++ b/chrome/common/conflicts/remote_module_watcher_win_unittest.cc
@@ -48,10 +48,7 @@
   }
 
   // mojom::ModuleEventSink:
-  void OnModuleEvent(mojom::ModuleEventType event_type,
-                     uint64_t load_address) override {
-    module_event_count_++;
-  }
+  void OnModuleEvent(uint64_t load_address) override { module_event_count_++; }
 
   // Returns a connector that may be used to connect to a ModuleEventSink implementation.
   service_manager::Connector* GetConnector() {
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_am.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_am.xtb
index db4b3b79..b8fce98 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_am.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_am.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="am">
-<translation id="1296843352074373664">የGoogle ተጠቃሚ</translation>
 <translation id="1383286653814676580">የGoogle ምስክርነት አቅራቢ መግቢያ ገጽን ለማሄድ ስራ ላይ ይውላል።</translation>
-<translation id="1644179990571656190">አዲስ የተመዘገበ የGoogle ተጠቃሚን መፍጠር አልተቻለም። ይህ ስርዓት አንድ የተመዘገበ የGoogle ተጠቃሚ ብቻ እንዲፈጠር ነው የሚፈቅደው።</translation>
-<translation id="1813213595719100133">በዚህ ጎራ ላይ በGoogle መለያዎች በመለያ መግባት አይፈቀድም። ሌላ መለያ ይሞክሩ።</translation>
-<translation id="195232392645680541">የGoogle መለያዎን ተጠቅመው ይግቡ።</translation>
 <translation id="2595469428674600431">ይቅርታ፣ የእርስዎ የWindows ይለፍ ቃል ሊረጋገጥ አልቻለም። እባክዎ እንደገና ይሞክሩ።</translation>
-<translation id="2620296592151848576">የእርስዎ ይለፍ ቃል በGoogle ላይ ተቀይሯል። የWindows መለያዎን ከGoogle መለያዎ ጋር ለማሳመር እባክዎ የአሁኑ የWindows ይለፍ ቃልዎን ያስገቡ።</translation>
-<translation id="3697479376287066058">በዚህ ኮምፒውተር ላይ ሌላ መለያ ቀደም ብሎ በዚህ የGoogle መለያ ተመዝግቧል። በተለየ የGoogle መለያ እባክዎ ይግቡ።</translation>
 <translation id="4057329986137569701">አንድ ውስጣዊ ስህተት ተከስቷል።</translation>
-<translation id="4128734677223009352">ወደ Google መለያዎ መግባት አልተሳካም። ኮምፒውተሩ የበይነመረብ ግንኙነት እንዳለው ያረጋግጡ፣ ከዚያ እንደገና ይሞክሩ።</translation>
-<translation id="4175879131870609567">ይህን የተናጠል ኮምፒዩተር የቆለፈው ተጠቃሚ ብቻ ነው በአሁኑ ጊዜ በመለያ ወደ ስርዓቱ እንዲገባ የሚፈቀድለት።</translation>
-<translation id="6613125771987245372">በዚህ የGoogle መለያ መግባት አይፈቀድም። የተለየ መለያ ይሞክሩ።</translation>
 <translation id="7357241217513796177">የአውታረ መረብ ግንኙነት እንዳለዎት ያረጋግጡና እንደገና ይሞክሩ።</translation>
-<translation id="7447167742844823007">የGoogle መለያዎን በመጠቀም ይግቡ</translation>
 <translation id="7463006580194749499">ሰው አክል</translation>
-<translation id="782439148700312319">ይህን ኮምፒውተር ለድርጅት አስተዳደር ማስመዝገብ አልተቻለም።  እባክዎ በተለየ የGoogle መለያ ይግቡ።</translation>
 <translation id="8440458902131551808">የእርስዎ መለያ ተቆልፏል። እባክዎ የሥርዓት አስተዳዳሪን ያነጋግሩ።</translation>
 <translation id="8474372283141585908">የGoogle ምስክርነት አቅራቢ</translation>
 <translation id="866458870819756755">ተጠቃሚ ሊፈጠር አልቻለም።</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ar.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ar.xtb
index 758578652..4af8715 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ar.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ar.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ar">
-<translation id="1296843352074373664">‏مستخدم Google</translation>
 <translation id="1383286653814676580">‏يُستخدم لتشغيل صفحة تسجيل الدخول لمقدِّم بيانات الاعتماد في Google.</translation>
-<translation id="1644179990571656190">‏تعذر إنشاء مستخدم Google مُسجل وجديد يسمح فقط هذا النظام بإنشاء مستخدم Google مُسجل واحد.</translation>
-<translation id="1813213595719100133">‏لا يُسمَح بتسجيل الدخول باستخدام حساب Google على هذا النطاق. يُرجى تجربة حساب آخر.</translation>
-<translation id="195232392645680541">‏سجِّل الدخول باستخدام حسابك على Google.</translation>
 <translation id="2595469428674600431">‏عذرًا، ولكن لا يمكن التحقُّق من كلمة مرور Windows. يُرجى إعادة المحاولة.</translation>
-<translation id="2620296592151848576">‏تم تغيير كلمة مرورك على Google. يُرجى إدخال كلمة مرور Windows الحالية من أجل مزامنة حسابك على Windows مع حسابك على Google.</translation>
-<translation id="3697479376287066058">‏تم تسجيل حساب آخر على هذا الكمبيوتر من قبل باستخدام حساب Google هذا. يُرجى تسجيل الدخول باستخدام حساب Google آخر.</translation>
 <translation id="4057329986137569701">حدث خطأ داخلي.</translation>
-<translation id="4128734677223009352">‏تعذّر تسجيل الدخول إلى حسابك على Google. يُرجى التأكُّد من اتصال جهاز الكمبيوتر بالإنترنت ثم إعادة المحاولة.</translation>
-<translation id="4175879131870609567">يتم حاليًا السماح للمستخدم الذي قفل محطة العمل هذه بتسجيل الدخول إلى النظام فقط.</translation>
-<translation id="6613125771987245372">‏لا يُسمَح بتسجيل الدخول باستخدام حساب Google هذا. يُرجى استخدام حساب آخر.</translation>
 <translation id="7357241217513796177">يُرجى التأكُّد من اتصالك بالشبكة وإعادة المحاولة.</translation>
-<translation id="7447167742844823007">‏تسجيل الدخول باستخدام حسابك على Google</translation>
 <translation id="7463006580194749499">إضافة شخص</translation>
-<translation id="782439148700312319">‏تعذّر تسجيل جهاز الكمبيوتر هذا لإدارة المؤسسة.  يُرجى تسجيل الدخول باستخدام حساب Google آخر.</translation>
 <translation id="8440458902131551808">تم قفل حسابك. يُرجى التواصل مع مشرف نظام.</translation>
 <translation id="8474372283141585908">‏مقدِّم بيانات الاعتماد في Google</translation>
 <translation id="866458870819756755">تعذَّر إنشاء مستخدم.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_bg.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_bg.xtb
index a9fb419..a9447be8 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_bg.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_bg.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="bg">
-<translation id="1296843352074373664">Потребител на Google</translation>
 <translation id="1383286653814676580">Служи за стартиране на страницата за вход за доставчика на идентификационни данни за Google.</translation>
-<translation id="1644179990571656190">Създаването на нов регистриран потребител на Google не бе успешно. Тази система позволява да бъде създаден само един такъв потребител.</translation>
-<translation id="1813213595719100133">Влизането с профили в Google в този домейн не е разрешено. Опитайте с друг профил.</translation>
-<translation id="195232392645680541">Влезте с профила си в Google.</translation>
 <translation id="2595469428674600431">За съжаление, паролата ви за Windows не можа да бъде потвърдена. Моля, опитайте отново.</translation>
-<translation id="2620296592151848576">Паролата ви за Google е променена. Моля, въведете текущата си парола за Windows, за да синхронизирате акаунта си в Windows с профила си в Google.</translation>
-<translation id="3697479376287066058">Друг профил на този компютър вече е регистриран с този профил в Google. Моля, влезте с друг профил в Google.</translation>
 <translation id="4057329986137569701">Възникна вътрешна грешка.</translation>
-<translation id="4128734677223009352">Влизането в профила ви в Google не бе успешно. Уверете се, че компютърът е свързан с интернет, и опитайте отново.</translation>
-<translation id="4175879131870609567">Понастоящем влизането в системата е разрешено само за потребителя, заключил тази работна станция.</translation>
-<translation id="6613125771987245372">Влизането с този профил в Google не е разрешено. Опитайте с друг.</translation>
 <translation id="7357241217513796177">Проверете дали имате връзка с мрежата и опитайте отново.</translation>
-<translation id="7447167742844823007">Влезте с профила си в Google</translation>
 <translation id="7463006580194749499">Добавяне на човек</translation>
-<translation id="782439148700312319">Този компютър не може да бъде регистриран за корпоративно управление.  Моля, влезте с друг профил в Google.</translation>
 <translation id="8440458902131551808">Профилът ви е заключен. Моля, свържете се със системния администратор.</translation>
 <translation id="8474372283141585908">Доставчик на идентификационни данни за Google</translation>
 <translation id="866458870819756755">Създаването на потребител не бе успешно.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_bn.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_bn.xtb
index a408259..607faf40 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_bn.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_bn.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="bn">
-<translation id="1296843352074373664">Google ব্যবহারকারী</translation>
 <translation id="1383286653814676580">Google ক্রেডেনশিয়াল প্রোভাইডার সাইন-ইন পৃষ্ঠা চালানোর জন্য ব্যবহার করা হয়।</translation>
-<translation id="1644179990571656190">Google ব্যবহারকারী হিসেবে নতুন করে কাউকে রেজিস্টার করা যায়নি। এই সিস্টেমে Google ব্যবহারকারী হিসেবে শুধুমাত্র একজনকে রেজিস্টারের অনুমতি দেওয়া হয়।</translation>
-<translation id="1813213595719100133">এই ডোমেনে Google অ্যাকাউন্ট দিয়ে সাইন-ইন করার অনুমতি নেই। অন্য অ্যাকাউন্ট ব্যবহার করে দেখুন।</translation>
-<translation id="195232392645680541">আপনার Google অ্যাকাউন্ট ব্যবহার করে সাইন-ইন করুন।</translation>
 <translation id="2595469428674600431">আপনার Windows-এর পাসওয়ার্ড যাচাই করা যায়নি। আবার চেষ্টা করুন।</translation>
-<translation id="2620296592151848576">Google-এ আপনার পাসওয়ার্ড পরিবর্তন করা হয়েছে। আপনার Windows অ্যাকাউন্টের সাথে Google অ্যাকাউন্ট সিঙ্ক করতে আপনার বর্তমান Windows পাসওয়ার্ডটি লিখুন।</translation>
-<translation id="3697479376287066058">এই কম্পিউটারে অন্য একটি অ্যাকাউন্ট থেকে এই Google অ্যাকাউন্টের মাধ্যমে আগেই রেজিস্টার করা হয়েছে। অন্য একটি Google অ্যাকাউন্ট দিয়ে সাইন-ইন করুন।</translation>
 <translation id="4057329986137569701">একটি অভ্যন্তরীণ সমস্যা হয়েছে।</translation>
-<translation id="4128734677223009352">আপনার Google অ্যাকাউন্টে সাইন-ইন করা যায়নি। কম্পিউটারে ইন্টারনেট কানেকশন আছে কিনা তা দেখে নিয়ে আবার চেষ্টা করুন।</translation>
-<translation id="4175879131870609567">যে ব্যবহারকারী এই ওয়ার্কস্টেশনটি লক করেছেন শুধুমাত্র তিনিই এই সিস্টেমে সাইন-ইন করতে পারবেন।</translation>
-<translation id="6613125771987245372">এই Google অ্যাকাউন্ট ব্যবহার করে সাইন-ইন করা যাবে না। অন্য একটি অ্যাকাউন্ট ব্যবহার করে দেখুন।</translation>
 <translation id="7357241217513796177">নেটওয়ার্ক কানেকশন আছে কিনা দেখে নিয়ে আবার চেষ্টা করুন।</translation>
-<translation id="7447167742844823007">আপনার Google অ্যাকাউন্ট ব্যবহার করে সাইন-ইন করুন।</translation>
 <translation id="7463006580194749499">একজন ব্যক্তিকে যোগ করুন</translation>
-<translation id="782439148700312319">এন্টারপ্রাইজ ম্যানেজমেন্টের জন্য এই কম্পিউটারটিকে নথিভুক্ত করা যায়নি।  অন্য একটি Google অ্যাকাউন্ট দিয়ে সাইন-ইন করুন।</translation>
 <translation id="8440458902131551808">আপনার অ্যাকাউন্ট লক হয়ে গেছে। সিস্টেম অ্যাডমিনিস্ট্রেটরের সাথে যোগাযোগ করুন।</translation>
 <translation id="8474372283141585908">Google ক্রেডেনশিয়াল প্রোভাইডার</translation>
 <translation id="866458870819756755">ব্যবহারকারী তৈরি করা যায়নি।</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ca.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ca.xtb
index 7ce7c64..d3ba838c 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ca.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ca.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ca">
-<translation id="1296843352074373664">Usuari de Google</translation>
 <translation id="1383286653814676580">S'utilitza per executar la pàgina d'inici de sessió del proveïdor de credencials de Google.</translation>
-<translation id="1813213595719100133">No es permet iniciar la sessió amb Comptes de Google en aquest domini. Prova-ho amb un altre compte.</translation>
-<translation id="195232392645680541">Inicia la sessió amb el teu Compte de Google.</translation>
 <translation id="2595469428674600431">No s'ha pogut verificar la contrasenya de Windows. Torna-ho a provar.</translation>
-<translation id="2620296592151848576">S'ha canviat la contrasenya a Google. Introdueix la contrasenya actual de Windows per sincronitzar el compte de Windows amb el Compte de Google.</translation>
-<translation id="3697479376287066058">Un altre compte d'aquest ordinador s'ha registrat amb aquest Compte de Google. Inicia la sessió amb un altre Compte de Google.</translation>
 <translation id="4057329986137569701">S'ha produït un error intern.</translation>
-<translation id="4128734677223009352">No s'ha pogut iniciar la sessió al Compte de Google. Assegura't que l'ordinador tingui connexió a Internet i torna-ho a provar.</translation>
-<translation id="4175879131870609567">Actualment només l'usuari que ha bloquejat aquesta estació de treball té permís per iniciar la sessió al sistema.</translation>
-<translation id="6613125771987245372">No es permet iniciar la sessió amb aquest Compte de Google. Prova-ho amb un altre compte.</translation>
 <translation id="7357241217513796177">Assegura't que tinguis connexió a la xarxa i torna-ho a provar.</translation>
-<translation id="7447167742844823007">Inicia la sessió amb el teu Compte de Google</translation>
 <translation id="7463006580194749499">Afegeix una persona</translation>
-<translation id="782439148700312319">No es pot inscriure aquest ordinador en la gestió empresarial.  Inicia la sessió amb un altre Compte de Google.</translation>
 <translation id="8440458902131551808">S'ha bloquejat el compte. Contacta amb l'administrador del sistema.</translation>
 <translation id="8474372283141585908">Proveïdor de credencials de Google</translation>
 <translation id="866458870819756755">No s'ha pogut crear cap usuari.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_cs.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_cs.xtb
index aea6069..095cfdd 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_cs.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_cs.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="cs">
-<translation id="1296843352074373664">Uživatel Googlu</translation>
 <translation id="1383286653814676580">Používá se ke spuštění přihlašovací stránky poskytovatele identifikačních údajů Google.</translation>
-<translation id="1813213595719100133">Přihlášení pomocí účtů Google v této doméně není povoleno. Zkuste jiný účet.</translation>
-<translation id="195232392645680541">Přihlaste se pomocí účtu Google.</translation>
 <translation id="2595469428674600431">Litujeme, heslo systému Windows se nepodařilo ověřit. Zkuste to znovu.</translation>
-<translation id="2620296592151848576">Vaše heslo se na Googlu změnilo. Chcete-li účet Windows synchronizovat s účtem Google, zadejte své aktuální heslo pro Windows.</translation>
-<translation id="3697479376287066058">S tímto účtem Google je již na tomto počítači zaregistrován jiný účet. Přihlaste se pomocí jiného účtu Google.</translation>
 <translation id="4057329986137569701">Došlo k interní chybě.</translation>
-<translation id="4128734677223009352">Přihlášení k účtu Google se nezdařilo. Zkontrolujte, zda je počítač připojen k internetu, a potom to zkuste znovu.</translation>
-<translation id="4175879131870609567">Do systému se aktuálně může přihlásit jen uživatel, který tuto pracovní stanici uzamknul.</translation>
-<translation id="6613125771987245372">Přihlášení pomocí tohoto účtu Google není povoleno. Zkuste jiný účet.</translation>
 <translation id="7357241217513796177">Zkontrolujte, zda jste připojeni k síti a zkuste to znovu.</translation>
-<translation id="7447167742844823007">Přihlaste se pomocí účtu Google</translation>
 <translation id="7463006580194749499">Přidat osobu</translation>
-<translation id="782439148700312319">Tento počítač nelze zaregistrovat do podnikové správy.  Přihlaste se pomocí jiného účtu Google.</translation>
 <translation id="8440458902131551808">Váš účet byl uzamčen. Kontaktujte administrátora systému.</translation>
 <translation id="8474372283141585908">Poskytovatel identifikačních údajů Google</translation>
 <translation id="866458870819756755">Uživatele se nepodařilo vytvořit.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_da.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_da.xtb
index dc30341..f6dca669 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_da.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_da.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="da">
-<translation id="1296843352074373664">Google-bruger</translation>
 <translation id="1383286653814676580">Bruges til at køre Google Loginhåndterings loginside.</translation>
-<translation id="1644179990571656190">Det var ikke muligt at oprette en ny registreret Google-bruger. Systemet giver kun mulighed for at oprette én registreret Google-bruger.</translation>
-<translation id="1813213595719100133">Det er ikke tilladt at logge ind på dette domæne med en Google-konto. Prøv med en anden konto.</translation>
-<translation id="195232392645680541">Log ind med din Google-konto.</translation>
 <translation id="2595469428674600431">Din Windows-adgangskode kunne desværre ikke bekræftes. Prøv igen.</translation>
-<translation id="2620296592151848576">Din adgangskode er ændret på Google. Angiv din nuværende Windows-adgangskode for at synkronisere din Windows-konto med din Google-konto.</translation>
-<translation id="3697479376287066058">En anden konto på denne computer er allerede tilmeldt med denne Google-konto. Log ind med en anden Google-konto.</translation>
 <translation id="4057329986137569701">Der opstod en intern fejl.</translation>
-<translation id="4128734677223009352">Der kunne ikke logges ind på din Google-konto. Sørg for, at computeren har internetforbindelse, og prøv igen.</translation>
-<translation id="4175879131870609567">Det er i øjeblikket kun den bruger, der låste denne computer, som kan logge ind i systemet.</translation>
-<translation id="6613125771987245372">Det er ikke tilladt at logge ind med denne Google-konto. Prøv med en anden konto.</translation>
 <translation id="7357241217513796177">Sørg for, at du har forbindelse til et netværk, og prøv igen.</translation>
-<translation id="7447167742844823007">Log ind med din Google-konto.</translation>
 <translation id="7463006580194749499">Tilføj person</translation>
-<translation id="782439148700312319">Denne computer kan ikke tilmeldes virksomhedsadministration.  Log ind med en anden Google-konto.</translation>
 <translation id="8440458902131551808">Din konto er blevet låst. Kontakt en systemadministrator.</translation>
 <translation id="8474372283141585908">Google Loginhåndtering</translation>
 <translation id="866458870819756755">En bruger kunne ikke oprettes.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_de.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_de.xtb
index 2f289b2..46f30347 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_de.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_de.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="de">
-<translation id="1296843352074373664">Google-Nutzer</translation>
 <translation id="1383286653814676580">Wird für die Anmeldeseite des Google-Anmeldeinformationsanbieters genutzt.</translation>
-<translation id="1644179990571656190">Fehler beim Erstellen des neuen registrierten Google-Nutzers. In diesem System ist nur die Erstellung eines registrierten Google-Nutzers zulässig.</translation>
-<translation id="1813213595719100133">Die Anmeldung mit einem Google-Konto ist bei dieser Domain nicht zulässig. Versuchen Sie es mit einem anderen Konto.</translation>
-<translation id="195232392645680541">Melden Sie sich mit Ihrem Google-Konto an.</translation>
 <translation id="2595469428674600431">Ihr Windows-Passwort konnte nicht überprüft werden. Versuchen Sie es noch einmal.</translation>
-<translation id="2620296592151848576">Ihr Passwort bei Google wurde geändert. Geben Sie Ihr aktuelles Windows-Passwort ein, um Ihr Windows-Konto mit Ihrem Google-Konto zu synchronisieren.</translation>
-<translation id="3697479376287066058">Mit diesem Google-Konto ist bereits ein weiteres Konto auf diesem Computer registriert. Bitte melden Sie sich mit einem anderen Google-Konto an.</translation>
 <translation id="4057329986137569701">Ein interner Fehler ist aufgetreten.</translation>
-<translation id="4128734677223009352">Die Anmeldung in Ihrem Google-Konto ist fehlgeschlagen. Kontrollieren Sie, ob der Computer mit dem Internet verbunden ist, und versuchen Sie es noch einmal.</translation>
-<translation id="4175879131870609567">Nur der Nutzer, der den Computer gesperrt hat, kann sich derzeit im System anmelden.</translation>
-<translation id="6613125771987245372">Die Anmeldung mit diesem Google-Konto ist nicht zulässig. Bitte verwenden Sie ein anderes Konto.</translation>
 <translation id="7357241217513796177">Sorgen Sie dafür, dass Sie eine Netzwerkverbindung haben, und versuchen Sie es dann noch einmal.</translation>
-<translation id="7447167742844823007">Mit dem Google-Konto anmelden</translation>
 <translation id="7463006580194749499">Person hinzufügen</translation>
-<translation id="782439148700312319">Dieser Computer kann nicht für die Unternehmensverwaltung registriert werden.  Bitte melden Sie sich mit einem anderen Google-Konto an.</translation>
 <translation id="8440458902131551808">Ihr Konto wurde gesperrt. Bitte wenden Sie sich an einen Systemadministrator.</translation>
 <translation id="8474372283141585908">Google-Anmeldeinformationsanbieter</translation>
 <translation id="866458870819756755">Ein Nutzer konnte nicht erstellt werden.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_el.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_el.xtb
index 9375b9a..6ace14a 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_el.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_el.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="el">
-<translation id="1296843352074373664">Χρήστης Google</translation>
 <translation id="1383286653814676580">Χρησιμοποιείται για την εκτέλεση της σελίδας σύνδεσης του Google Credential Provider.</translation>
-<translation id="1644179990571656190">Απέτυχε η δημιουργία νέου εγγεγραμμένου χρήστη Google. Αυτό το σύστημα επιτρέπει τη δημιουργία μόνο ενός εγγεγραμμένου χρήστη Google.</translation>
-<translation id="1813213595719100133">Δεν επιτρέπεται η σύνδεση σε αυτόν τον τομέα με Λογαριασμούς Google. Δοκιμάστε έναν άλλον λογαριασμό.</translation>
-<translation id="195232392645680541">Συνδεθείτε χρησιμοποιώντας τον Λογαριασμό σας Google.</translation>
 <translation id="2595469428674600431">Δυστυχώς, δεν ήταν δυνατή η επαλήθευση του κωδικού πρόσβασης των Windows. Δοκιμάστε ξανά.</translation>
-<translation id="2620296592151848576">Ο κωδικός πρόσβασής σας άλλαξε στο Google. Εισαγάγετε τον τρέχοντα κωδικό πρόσβασης των Windows προκειμένου να συγχρονίσετε τον λογαριασμό σας Windows με τον Λογαριασμό σας Google.</translation>
-<translation id="3697479376287066058">Ένας άλλος λογαριασμός σε αυτόν τον υπολογιστή έχει ήδη εγγραφεί με αυτόν τον Λογαριασμό Google. Συνδεθείτε με άλλον Λογαριασμό Google.</translation>
 <translation id="4057329986137569701">Προέκυψε εσωτερικό σφάλμα.</translation>
-<translation id="4128734677223009352">Η σύνδεση στον Λογαριασμό σας Google απέτυχε. Βεβαιωθείτε ότι ο υπολογιστής είναι συνδεδεμένος στο διαδίκτυο και έπειτα προσπαθήστε ξανά.</translation>
-<translation id="4175879131870609567">Προς το παρόν, μόνο ο χρήστης που κλείδωσε αυτόν τον σταθμό εργασίας επιτρέπεται να συνδεθεί στο σύστημα.</translation>
-<translation id="6613125771987245372">Δεν επιτρέπεται η σύνδεση με αυτόν τον Λογαριασμό Google. Δοκιμάστε κάποιον άλλον λογαριασμό.</translation>
 <translation id="7357241217513796177">Βεβαιωθείτε ότι έχετε μια σύνδεση δικτύου και δοκιμάστε ξανά.</translation>
-<translation id="7447167742844823007">Συνδεθείτε χρησιμοποιώντας τον Λογαριασμό σας Google</translation>
 <translation id="7463006580194749499">Προσθήκη χρήστη</translation>
-<translation id="782439148700312319">Δεν ήταν δυνατή η εγγραφή αυτού του υπολογιστή για διαχείριση επιχειρήσεων.  Συνδεθείτε με άλλον Λογαριασμό Google.</translation>
 <translation id="8440458902131551808">Ο λογαριασμός σας έχει κλειδωθεί. Επικοινωνήστε με έναν διαχειριστή συστήματος.</translation>
 <translation id="8474372283141585908">Google Credential Provider</translation>
 <translation id="866458870819756755">Δεν ήταν δυνατή η δημιουργία χρήστη.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb
index 35cc46a0..ac5ccef 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="en-GB">
-<translation id="1296843352074373664">Google user</translation>
 <translation id="1383286653814676580">Used to run Google Credential Provider sign-in page.</translation>
-<translation id="1644179990571656190">Failed to create new registered Google user. This system only allows one registered Google user to be created.</translation>
-<translation id="1813213595719100133">Signing in with Google Accounts on this domain is not allowed. Try a different account.</translation>
-<translation id="195232392645680541">Sign in using your Google account.</translation>
 <translation id="2595469428674600431">Sorry, your Windows password couldn't be verified. Please try again.</translation>
-<translation id="2620296592151848576">Your password has changed on Google. Please enter your current Windows password in order to sync your Windows Account with your Google Account.</translation>
-<translation id="3697479376287066058">Another account on this computer has already registered with this Google Account. Please sign in with a different Google Account.</translation>
 <translation id="4057329986137569701">An internal error occurred.</translation>
-<translation id="4128734677223009352">Signing in to your Google account failed. Make sure that the computer has an Internet connection, then try again.</translation>
-<translation id="4175879131870609567">Only the user that locked this workstation is currently allowed to sign in to the system.</translation>
-<translation id="6613125771987245372">Signing in with this Google account is not allowed. Try a different account.</translation>
 <translation id="7357241217513796177">Make sure that you have a network connection and try again.</translation>
-<translation id="7447167742844823007">Sign in using your Google Account</translation>
 <translation id="7463006580194749499">Add person</translation>
-<translation id="782439148700312319">Unable to enrol this computer for enterprise management.  Please sign in with a different Google account.</translation>
 <translation id="8440458902131551808">Your account has been locked. Please contact a system administrator.</translation>
 <translation id="8474372283141585908">Google Credential Provider</translation>
 <translation id="866458870819756755">A user could not be created.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_es-419.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_es-419.xtb
index 41f15e9..7a554c0d 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_es-419.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_es-419.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="es-419">
-<translation id="1296843352074373664">Usuario de Google</translation>
 <translation id="1383286653814676580">Se usa para ejecutar la página de acceso del proveedor de credenciales de Google.</translation>
-<translation id="1644179990571656190">No se pudo crear un nuevo usuario registrado de Google. Este sistema solo permite crear un usuario registrado de Google.</translation>
-<translation id="1813213595719100133">No puedes acceder a este dominio con una Cuenta de Google. Prueba con una cuenta diferente.</translation>
-<translation id="195232392645680541">Accede con tu Cuenta de Google.</translation>
 <translation id="2595469428674600431">No es posible verificar tu contraseña de Windows. Vuelve a intentarlo.</translation>
-<translation id="2620296592151848576">Se cambió tu contraseña en Google. Ingresa tu contraseña de Windows actual para sincronizar tu cuenta de Windows con tu Cuenta de Google.</translation>
-<translation id="3697479376287066058">Ya se registró esta Cuenta de Google en esta computadora. Accede con una cuenta diferente.</translation>
 <translation id="4057329986137569701">Ocurrió un error interno.</translation>
-<translation id="4128734677223009352">No pudiste acceder a tu Cuenta de Google. Asegúrate de que la computadora tenga una conexión a Internet y vuelve a intentarlo.</translation>
-<translation id="4175879131870609567">Solo el usuario que bloqueó esta estación de trabajo puede acceder al sistema.</translation>
-<translation id="6613125771987245372">No se permite acceder con esta Cuenta de Google. Intenta usar una cuenta diferente.</translation>
 <translation id="7357241217513796177">Asegúrate de tener una conexión de red y vuelve a intentarlo.</translation>
-<translation id="7447167742844823007">Acceder con tu Cuenta de Google</translation>
 <translation id="7463006580194749499">Agregar a una persona</translation>
-<translation id="782439148700312319">No se pudo inscribir esta computadora para la administración empresarial.  Accede con una cuenta diferente.</translation>
 <translation id="8440458902131551808">Se bloqueó tu cuenta. Comunícate con el administrador del sistema.</translation>
 <translation id="8474372283141585908">Proveedor de credenciales de Google</translation>
 <translation id="866458870819756755">No se pudo crear el usuario.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_es.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_es.xtb
index b62957b..69fe702 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_es.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_es.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="es">
-<translation id="1296843352074373664">Usuario de Google</translation>
 <translation id="1383286653814676580">Se usa para ejecutar la página de inicio de sesión de Google Credential Provider.</translation>
-<translation id="1813213595719100133">No se permite iniciar sesión con cuentas de Google en este dominio. Prueba con otra cuenta.</translation>
-<translation id="195232392645680541">Inicia sesión con tu cuenta de Google.</translation>
 <translation id="2595469428674600431">No se ha podido verificar tu contraseña de Windows. Vuelve a intentarlo.</translation>
-<translation id="2620296592151848576">Se ha modificado tu contraseña en Google. Introduce tu contraseña de Windows actual para sincronizar tu cuenta de Windows con la de Google.</translation>
-<translation id="3697479376287066058">Ya se ha registrado otra cuenta del ordenador con esta cuenta de Google. Inicia sesión con una cuenta de Google diferente.</translation>
 <translation id="4057329986137569701">Se ha producido un error interno.</translation>
-<translation id="4128734677223009352">Se ha producido un error al iniciar sesión con tu cuenta de Google. Asegúrate de que el ordenador está conectado a Internet e inténtalo de nuevo.</translation>
-<translation id="4175879131870609567">En estos momentos solo el usuario que ha bloqueado esta estación de trabajo puede iniciar sesión en el sistema.</translation>
-<translation id="6613125771987245372">No se permite iniciar sesión con esta cuenta de Google, así que inténtalo con otra.</translation>
 <translation id="7357241217513796177">Comprueba que tengas una conexión de red y vuelve a intentarlo.</translation>
-<translation id="7447167742844823007">Iniciar sesión con tu cuenta de Google</translation>
 <translation id="7463006580194749499">Añadir perfil</translation>
-<translation id="782439148700312319">No se ha podido registrar este ordenador para ser administrado por la empresa.  Inicia sesión con otra cuenta de Google.</translation>
 <translation id="8440458902131551808">Tu cuenta se ha bloqueado. Ponte en contacto con un administrador del sistema.</translation>
 <translation id="8474372283141585908">Google Credential Provider</translation>
 <translation id="866458870819756755">No se ha podido crear el usuario.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_et.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_et.xtb
index ff5eb50e..935ac15 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_et.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_et.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="et">
-<translation id="1296843352074373664">Google’i kasutaja</translation>
 <translation id="1383286653814676580">Kasutatakse Google'i mandaadipakkuja sisselogimislehe käitamiseks.</translation>
-<translation id="1644179990571656190">Uue registreeritud Google'i kasutaja loomine ebaõnnestus. See süsteem lubab luua ainult ühe registreeritud Google'i kasutaja.</translation>
-<translation id="1813213595719100133">Google'i kontodega sisselogimine pole sellel domeenil lubatud. Proovige teist kontot.</translation>
-<translation id="195232392645680541">Logige sisse oma Google'i kontoga.</translation>
 <translation id="2595469428674600431">Teie Windowsi parooli ei õnnestunud kinnitada. Proovige uuesti.</translation>
-<translation id="2620296592151848576">Teie Google'i parool on muutunud. Sisestage oma praegune Windowsi parool, et sünkroonida Windowsi konto Google'i kontoga.</translation>
-<translation id="3697479376287066058">Selle Google'i kontoga on selles arvutis juba registreeritud muu konto. Logige sisse muu Google'i kontoga.</translation>
 <translation id="4057329986137569701">Ilmnes sisemine viga.</translation>
-<translation id="4128734677223009352">Sisselogimine teie Google'i kontole ebaõnnestus. Veenduge, et teie arvutil oleks Interneti-ühendus, ja proovige uuesti.</translation>
-<translation id="4175879131870609567">Praegu saab süsteemi sisse logida ainult kasutaja, kes tööjaama lukustas.</translation>
-<translation id="6613125771987245372">Sisselogimine selle Google'i kontoga pole lubatud. Proovige muud kontot.</translation>
 <translation id="7357241217513796177">Kontrollige võrguühendust ja proovige uuesti.</translation>
-<translation id="7447167742844823007">Logige sisse oma Google'i kontoga</translation>
 <translation id="7463006580194749499">Lisa inimene</translation>
-<translation id="782439148700312319">Seda arvutit ei saa ettevõtte halduses registreerida.  Logige sisse muu Google'i kontoga.</translation>
 <translation id="8440458902131551808">Teie konto on lukustatud. Võtke ühendust süsteemiadministraatoriga.</translation>
 <translation id="8474372283141585908">Google'i mandaadipakkuja</translation>
 <translation id="866458870819756755">Kasutajat ei saanud luua.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_fa.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_fa.xtb
index 3c26f64..19d77f92 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_fa.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_fa.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fa">
-<translation id="1296843352074373664">‏کاربر Google</translation>
 <translation id="1383286653814676580">‏برای اجرای صفحه ورود به سیستم «ارائه‌دهنده اطلاعات کاربری Google» استفاده می‌شود.</translation>
-<translation id="1644179990571656190">‏کاربر Google ثبت‌شده جدید ایجاد نشد. این سیستم فقط به یک کاربر Google ثبت‌شده اجازه می‌دهد ایجاد شود.</translation>
-<translation id="1813213595719100133">‏ورود به سیستم با حساب Google در این دامنه مجاز نیست. حساب دیگری را امتحان کنید.</translation>
-<translation id="195232392645680541">‏با استفاده از حساب Google خود به سیستم وارد شوید.</translation>
 <translation id="2595469428674600431">‏متأسفیم، گذرواژه Windows تأیید نشد. لطفاً دوباره امتحان کنید.</translation>
-<translation id="2620296592151848576">‏گذرواژه‌تان در Google تغییر کرده است. لطفاً برای همگام‌سازی حساب Windows با حساب Google خود، گذرواژه فعلی Windows را وارد کنید.</translation>
-<translation id="3697479376287066058">‏با این حساب Google قبلاً حساب دیگری در این رایانه ثبت‌نام شده است. لطفاً با حساب Google  دیگری به سیستم وارد شوید.</translation>
 <translation id="4057329986137569701">خطای داخلی روی داد.</translation>
-<translation id="4128734677223009352">‏ورود به سیستم حساب Google انجام نشد. مطمئن شوید رایانه اتصال اینترنت داشته باشد و سپس دوباره امتحان کنید.</translation>
-<translation id="4175879131870609567">فقط کاربری که این ایستگاه کاری را قفل کرده است، درحال‌حاضر مجاز است به سیستم وارد شود.</translation>
-<translation id="6613125771987245372">‏ورود به سیستم با حساب Google مجاز نیست. حساب دیگری را امتحان کنید.</translation>
 <translation id="7357241217513796177">مطمئن شوید اتصال شبکه دارید و دوباره امتحان کنید.</translation>
-<translation id="7447167742844823007">‏با استفاده از حساب Google خود به سیستم وارد شوید</translation>
 <translation id="7463006580194749499">افزودن شخص</translation>
-<translation id="782439148700312319">‏این رایانه برای مدیریت سازمانی ثبت‌نام نشد.  لطفاً با حساب Google دیگری به سیستم وارد شوید.</translation>
 <translation id="8440458902131551808">حساب شما قفل شده است. لطفاً با یکی از سرپرستان سیستم تماس بگیرید.</translation>
 <translation id="8474372283141585908">‏ارائه‌دهنده اطلاعات کاربری Google</translation>
 <translation id="866458870819756755">کاربر ایجاد نشد.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_fi.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_fi.xtb
index 787be77..313b839 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_fi.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_fi.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fi">
-<translation id="1296843352074373664">Google-käyttäjä</translation>
 <translation id="1383286653814676580">Käytetään Googlen tunnistuspalvelun kirjautumissivun käynnistämiseen.</translation>
-<translation id="1813213595719100133">Tämän verkkotunnuksen Google-tileillä kirjautumista ei sallita. Käytä toista tiliä.</translation>
-<translation id="195232392645680541">Kirjaudu sisään Google-tililläsi.</translation>
 <translation id="2595469428674600431">Windows-salasanasi vahvistaminen epäonnistui. Yritä uudelleen.</translation>
-<translation id="2620296592151848576">Salasanasi on vaihdettu Googlessa. Synkronoi Windows- ja Google-tilisi syöttämällä nykyinen Windows-salasanasi.</translation>
-<translation id="3697479376287066058">Toinen tällä tietokoneella oleva tili on jo rekisteröitynyt tällä Google-tilillä. Kirjaudu sisään toisella Google-tilillä.</translation>
 <translation id="4057329986137569701">Tapahtui sisäinen virhe.</translation>
-<translation id="4128734677223009352">Google-tilillesi kirjautuminen epäonnistui. Varmista, että tietokoneen internetyhteys toimii, ja yritä uudelleen.</translation>
-<translation id="4175879131870609567">Vain työaseman lukinnut käyttäjä voi tällä hetkellä kirjautua sisään järjestelmään.</translation>
-<translation id="6613125771987245372">Tällä Google-tilillä ei voi kirjautua sisään. Kokeile toista tiliä.</translation>
 <translation id="7357241217513796177">Varmista, että käytössäsi on verkkoyhteys, ja yritä uudelleen.</translation>
-<translation id="7447167742844823007">Kirjaudu sisään Google-tililläsi</translation>
 <translation id="7463006580194749499">Lisää käyttäjä</translation>
-<translation id="782439148700312319">Tätä tietokonetta ei voi rekisteröidä yrityshallintaan.  Kirjaudu sisään toisella Google-tilillä.</translation>
 <translation id="8440458902131551808">Tilisi on lukittu. Ota yhteyttä järjestelmänvalvojaan.</translation>
 <translation id="8474372283141585908">Googlen tunnistuspalvelu</translation>
 <translation id="866458870819756755">Käyttäjän luominen epäonnistui.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_fil.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_fil.xtb
index fc1be2ac8..7a3009e 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_fil.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_fil.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fil">
-<translation id="1296843352074373664">Google user</translation>
 <translation id="1383286653814676580">Ginagamit para paganahin ang page sa pag-sign in ng Google Credential Provider.</translation>
-<translation id="1813213595719100133">Hindi pinapayagan ang pag-sign in gamit ang Mga Google Account sa domain na ito. Sumubok ng ibang account.</translation>
-<translation id="195232392645680541">Mag-sign in gamit ang iyong Google Account.</translation>
 <translation id="2595469428674600431">Paumanhin, hindi na-verify ang iyong password sa Winows. Pakisubukang muli.</translation>
-<translation id="2620296592151848576">Binago ang iyong password sa Google. Pakilagay ang iyong kasalukuyang password sa Windows para ma-sync ang Windows Account mo sa iyong Google Account.</translation>
-<translation id="3697479376287066058">May account sa computer na ito na nakarehistro na gamit ang Google Account na ito. Mag-sign in gamit ang ibang Google Account.</translation>
 <translation id="4057329986137569701">Nagkaroon ng internal na error.</translation>
-<translation id="4128734677223009352">Hindi naging matagumpay ang pag-sign in sa iyong Google Account. Tiyaking may koneksyon sa internet ang computer, pagkatapos ay subukan ulit.</translation>
-<translation id="4175879131870609567">Ang user lang na nag-lock ng workstation na ito ang kasalukuyang pinapayagang mag-sign in sa system.</translation>
-<translation id="6613125771987245372">Hindi pinapahintulutan ang pag-sign in gamit ang Google Account na ito. Sumubok ng ibang account.</translation>
 <translation id="7357241217513796177">Tiyaking mayroon kang koneksyon sa network at subukang muli.</translation>
-<translation id="7447167742844823007">Mag-sign in gamit ang iyong Google Account</translation>
 <translation id="7463006580194749499">Magdagdag ng tao</translation>
-<translation id="782439148700312319">Hindi ma-enroll ang computer na ito para sa pamamahala ng enterprise.  Mag-sign in gamit ang ibang Google Account.</translation>
 <translation id="8440458902131551808">Na-lock ang iyong account. Makipag-ugnayan sa isang administrator ng system.</translation>
 <translation id="8474372283141585908">Google Credential Provider</translation>
 <translation id="866458870819756755">Hindi makagawa ng user.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_fr.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_fr.xtb
index 0a2436d..8bea800 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_fr.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_fr.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fr">
-<translation id="1296843352074373664">Utilisateur Google</translation>
 <translation id="1383286653814676580">Utilisé pour exécuter la page de connexion du fournisseur d'informations d'identification Google.</translation>
-<translation id="1813213595719100133">La connexion avec un compte Google n'est pas autorisée sur ce domaine. Utilisez un autre compte.</translation>
-<translation id="195232392645680541">Connectez-vous avec votre compte Google.</translation>
 <translation id="2595469428674600431">Impossible de valider votre mot de passe Windows. Veuillez réessayer.</translation>
-<translation id="2620296592151848576">Votre mot de passe a été modifié sur Google. Veuillez saisir votre mot de passe Windows actuel afin de synchroniser votre compte Windows avec votre compte Google.</translation>
-<translation id="3697479376287066058">Un autre compte sur cet ordinateur est déjà enregistré avec ce compte Google. Veuillez vous connecter avec un autre compte Google.</translation>
 <translation id="4057329986137569701">Une erreur interne s'est produite.</translation>
-<translation id="4128734677223009352">Échec de la connexion à votre compte Google. Assurez-vous que l'ordinateur est connecté à Internet, puis réessayez.</translation>
-<translation id="4175879131870609567">Pour le moment, seul l'utilisateur ayant verrouillé ce poste de travail peut se connecter au système.</translation>
-<translation id="6613125771987245372">La connexion avec ce compte Google n'est pas autorisée. Essayez avec un autre compte.</translation>
 <translation id="7357241217513796177">Vérifiez que vous disposez bien d'une connexion réseau, puis réessayez.</translation>
-<translation id="7447167742844823007">Connectez-vous avec votre compte Google</translation>
 <translation id="7463006580194749499">Ajouter une personne</translation>
-<translation id="782439148700312319">Impossible d'enregistrer cet ordinateur pour bénéficier de la gestion d'entreprise.  Veuillez vous connecter avec un autre compte Google.</translation>
 <translation id="8440458902131551808">Votre compte a été verrouillé. Veuillez contacter un administrateur système.</translation>
 <translation id="8474372283141585908">Fournisseur d'informations d'identification Google</translation>
 <translation id="866458870819756755">Impossible de créer le compte utilisateur.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_gu.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_gu.xtb
index b2480347..a125eea 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_gu.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_gu.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="gu">
-<translation id="1296843352074373664">Google વપરાશકર્તા</translation>
 <translation id="1383286653814676580">Google લૉગ ઇન વિગત પ્રદાતા સાઇન ઇન પેજ ચલાવવા માટે ઉપયોગમાં લેવામાં આવે છે.</translation>
-<translation id="1644179990571656190">નવા રજિસ્ટ કરેલ Google વપરાશકર્તા બનાવવામાં નિષ્ફળ થયા. આ સિસ્ટમ ફક્ત એક રજિસ્ટર થયેલા Google વપરાશકર્તા બનાવવાની મંજૂરી આપે છે.</translation>
-<translation id="1813213595719100133">આ ડોમેન પર આ Google એકાઉન્ટ વડે સાઇન ઇન કરવાની મંજૂરી નથી. કોઈ અલગ એકાઉન્ટ અજમાવી જુઓ.</translation>
-<translation id="195232392645680541">તમારા Google એકાઉન્ટનો ઉપયોગ કરીને સાઇન ઇન કરો.</translation>
 <translation id="2595469428674600431">માફ કરશો, તમારો Windows પાસવર્ડ ચકાસી શકાયો નથી. કૃપા કરીને ફરી પ્રયાસ કરો.</translation>
-<translation id="2620296592151848576">Google પર તમારો પાસવર્ડ બદલાઈ ગયો છે. તમારા Google એકાઉન્ટને તમારા Windows એકાઉન્ટ પર સિંક કરવા માટે કૃપા કરીને તમારો વર્તમાન Windows પાસવર્ડ દાખલ કરો.</translation>
-<translation id="3697479376287066058">આ કમ્પ્યુટર પરનું બીજું એકાઉન્ટ પહેલેથી જ આ Google એકાઉન્ટ સાથે રજિસ્ટર થયેલું છે. કૃપા કરીને કોઈ અલગ Google એકાઉન્ટ સાથે સાઇન ઇન કરો.</translation>
 <translation id="4057329986137569701">કોઈ આંતરિક ભૂલ આવી.</translation>
-<translation id="4128734677223009352">તમારા Google એકાઉન્ટમાં સાઇન ઇન કરવામાં નિષ્ફળ થયાં. કમ્પ્યુટરમાં ઇન્ટરનેટ કનેક્શન હોવાની ખાતરી કરો, પછી ફરી પ્રયાસ કરો.</translation>
-<translation id="4175879131870609567">જે વપરાશકર્તાએ વર્કસ્ટેશન લૉક કર્યું હશે, માત્ર તેને જ હાલમાં સિસ્ટમમાં સાઇન ઇન કરવાની મંજૂરી છે.</translation>
-<translation id="6613125771987245372">આ Google એકાઉન્ટ વડે સાઇન ઇન કરવાની મંજૂરી નથી. અલગ એકાઉન્ટ અજમાવો.</translation>
 <translation id="7357241217513796177">તમારી પાસે નેટવર્ક કનેક્શન છે તેની ખાતરી કરો અને ફરીથી પ્રયાસ કરો.</translation>
-<translation id="7447167742844823007">તમારા Google એકાઉન્ટનો ઉપયોગ કરીને સાઇન ઇન કરો.</translation>
 <translation id="7463006580194749499">વ્યક્તિ ઉમેરો</translation>
-<translation id="782439148700312319">આ કમ્પ્યુટરની એન્ટરપ્રાઇઝ મેનેજમેન્ટ માટે નોંધણી કરવામાં નિષ્ફળ રહ્યાં.  કૃપા કરીને કોઈ અલગ Google એકાઉન્ટ વડે સાઇન ઇન કરો.</translation>
 <translation id="8440458902131551808">તમારું એકાઉન્ટ લૉક કરવામાં આવ્યું છે. કૃપા કરીને સિસ્ટમ વ્યવસ્થાપકનો સંપર્ક કરો.</translation>
 <translation id="8474372283141585908">Google લૉગ ઇન વિગત પ્રદાતા</translation>
 <translation id="866458870819756755">વપરાશકર્તા બનાવી શકાયો નથી.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_hi.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_hi.xtb
index 05817f1..4783bfa 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_hi.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_hi.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="hi">
-<translation id="1296843352074373664">Google उपयोगकर्ता</translation>
 <translation id="1383286653814676580">'Google क्रेडेंशियल देने वाला' साइन इन पेज चलाने के लिए इस्तेमाल किया जाता है.</translation>
-<translation id="1813213595719100133">इस डोमेन पर इस Google खाते से साइन इन नहीं किया जा सकता. कृपया किसी दूसरे खाते को आज़माकर देखें.</translation>
-<translation id="195232392645680541">अपने Google खाते से साइन इन करें.</translation>
 <translation id="2595469428674600431">माफ़ करें, आपके Windows पासवर्ड की पुष्टि नहीं की जा सकी. कृपया फिर से कोशिश करें.</translation>
-<translation id="2620296592151848576">Google पर आपका पासवर्ड बदला गया है. अपने Windows खाते को अपने Google खाते से सिंक करने के लिए, कृपया अपना Windows पासवर्ड डालें.</translation>
-<translation id="3697479376287066058">इस कंप्यूटर पर कोई दूसरा खाता पहले से ही इस Google खाते के साथ रजिस्टर्ड हैं. कृपया किसी दूसरे Google खाते से साइन इन करें.</translation>
 <translation id="4057329986137569701">कोई आंतरिक गड़बड़ी हुई.</translation>
-<translation id="4128734677223009352">आपके Google खाते में साइन इन नहीं हो पाया. पक्का कर लें कि कंप्यूटर इंटरनेट कनेक्शन से जुड़ा हुआ है, उसके बाद फिर से कोशिश करें.</translation>
-<translation id="4175879131870609567">सिर्फ़ वही उपयोगकर्ता सिस्टम में साइन इन कर सकता है जिसने इस वर्कस्टेशन को लॉक किया है.</translation>
-<translation id="6613125771987245372">इस Google खाते से साइन इन नहीं किया जा सकता. कोई दूसरा खाता आज़माएं.</translation>
 <translation id="7357241217513796177">पक्का करें कि आपके पास नेटवर्क कनेक्शन है और फिर से कोशिश करें.</translation>
-<translation id="7447167742844823007">अपने Google खाते से साइन इन करें.</translation>
 <translation id="7463006580194749499">व्‍यक्ति जोड़ें</translation>
-<translation id="782439148700312319">यह कंप्यूटर एंटरप्राइज़ प्रबंधन के लिए दर्ज नहीं हो पा रहा है.  कृपया किसी दूसरे Google खाते से साइन इन करें.</translation>
 <translation id="8440458902131551808">आपका खाता लॉक कर दिया गया है. कृपया किसी सिस्टम एडमिन से संपर्क करें.</translation>
 <translation id="8474372283141585908">Google क्रेडेंशियल देने वाला</translation>
 <translation id="866458870819756755">उपयोगकर्ता बनाया नहीं जा सका.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_hr.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_hr.xtb
index 657529c..2d3a5b0 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_hr.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_hr.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="hr">
-<translation id="1296843352074373664">Googleov korisnik</translation>
 <translation id="1383286653814676580">Upotrebljava se za pokretanje stranice za prijavu na Google davatelj vjerodajnica.</translation>
-<translation id="1644179990571656190">Izrada novog registriranog Googleovog korisnika nije uspjela. Ovaj sustav dopušta izradu samo jednog registriranog Googleovog korisnika.</translation>
-<translation id="1813213595719100133">Na ovoj domeni nije dopuštena prijava pomoću Google računa. Pokušajte s nekim drugim računom.</translation>
-<translation id="195232392645680541">Prijavite se Google računom.</translation>
 <translation id="2595469428674600431">Žao nam je, nije bilo moguće potvrditi vašu zaporku za Windows. Pokušajte ponovo.</translation>
-<translation id="2620296592151848576">Promijenjena je vaša zaporka na Googleu. Unesite svoju trenutačnu zaporku za Windows kako biste sinkronizirali svoj Windows račun s Google računom.</translation>
-<translation id="3697479376287066058">Neki drugi račun na ovom računalu već je registriran pomoću ovog Google računa. Prijavite se nekim drugim Google računom.</translation>
 <translation id="4057329986137569701">Došlo je do interne pogreške.</translation>
-<translation id="4128734677223009352">Prijava na Google račun nije uspjela. Provjerite je li računalo povezano s internetom i pokušajte ponovo.</translation>
-<translation id="4175879131870609567">U sustav se trenutačno može prijaviti samo korisnik koji je zaključao radnu stanicu.</translation>
-<translation id="6613125771987245372">Prijava pomoću tog Google računa nije dopuštena. Pokušajte s nekim drugim računom.</translation>
 <translation id="7357241217513796177">Provjerite mrežnu vezu i pokušajte ponovo.</translation>
-<translation id="7447167742844823007">Prijavite se Google računom</translation>
 <translation id="7463006580194749499">Dodaj osobu</translation>
-<translation id="782439148700312319">To računalo nije moguće prijaviti za poslovno upravljanje.  Prijavite se nekim drugim Google računom.</translation>
 <translation id="8440458902131551808">Vaš je račun zaključan. Obratite se administratoru sustava.</translation>
 <translation id="8474372283141585908">Google davatelj vjerodajnica</translation>
 <translation id="866458870819756755">Izrada korisnika nije uspjela</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_hu.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_hu.xtb
index 92c5066e..01be118 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_hu.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_hu.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="hu">
-<translation id="1296843352074373664">Google-felhasználó</translation>
 <translation id="1383286653814676580">A Google Credential Provider bejelentkezési oldalának megnyitására szolgál.</translation>
-<translation id="1644179990571656190">Nem sikerült létrehozni új regisztrált Google-felhasználót. A rendszer csak egy regisztrált Google-felhasználó létrehozását engedélyezi.</translation>
-<translation id="1813213595719100133">Ezen a domainen nem engedélyezett a Google-fiókkal való bejelentkezés. Próbálkozzon másik fiókkal.</translation>
-<translation id="195232392645680541">Jelentkezzen be Google-fiókjával.</translation>
 <translation id="2595469428674600431">Sajnos nem sikerült ellenőrizni Windows-jelszavát. Próbálja újra.</translation>
-<translation id="2620296592151848576">Megváltozott a jelszava a Google rendszerében. Adja meg jelenlegi Windows-jelszavát, hogy szinkronizálja Windows-fiókját és Google-fiókját.</translation>
-<translation id="3697479376287066058">Már regisztráltak egy másik fiókot a számítógépen ezzel a Google-fiókkal. Jelentkezzen be másik Google-fiókkal.</translation>
 <translation id="4057329986137569701">Belső hiba történt.</translation>
-<translation id="4128734677223009352">Nem sikerült bejelentkezni a Google-fiókjába. Ellenőrizze a számítógép internetkapcsolatát, majd próbálja újra.</translation>
-<translation id="4175879131870609567">Jelenleg csak az a felhasználó jelentkezhet be a rendszerbe, aki lezárta ezt a munkaállomást.</translation>
-<translation id="6613125771987245372">Nem lehetséges a bejelentkezés ezzel a Google-fiókkal. Próbálkozzon másik fiókkal.</translation>
 <translation id="7357241217513796177">Győződjön meg róla, hogy rendelkezik hálózati kapcsolattal, majd próbálja újra.</translation>
-<translation id="7447167742844823007">Bejelentkezés Google-fiókkal</translation>
 <translation id="7463006580194749499">Személy hozzáadása</translation>
-<translation id="782439148700312319">Ezt a számítógépet nem lehet regisztrálni vállalati kezelés céljából.  Jelentkezzen be másik Google-fiókkal.</translation>
 <translation id="8440458902131551808">A fiókot zároltuk. Vegye fel a kapcsolatot a rendszergazdával.</translation>
 <translation id="8474372283141585908">Google Credential Provider</translation>
 <translation id="866458870819756755">Nem sikerült létrehozni a felhasználót.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_id.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_id.xtb
index dbeec0c..6d0f0f3 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_id.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_id.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="id">
-<translation id="1296843352074373664">Pengguna Google</translation>
 <translation id="1383286653814676580">Digunakan untuk menjalankan halaman login Penyedia Kredensial Google.</translation>
-<translation id="1644179990571656190">Gagal membuat pengguna Google terdaftar yang baru. Sistem ini hanya mengizinkan pembuatan satu pengguna Google terdaftar.</translation>
-<translation id="1813213595719100133">Login menggunakan Akun Google di domain ini tidak diizinkan. Coba akun yang lain.</translation>
-<translation id="195232392645680541">Login menggunakan Akun Google Anda.</translation>
 <translation id="2595469428674600431">Maaf, sandi Windows Anda tidak dapat diverifikasi. Harap coba lagi.</translation>
-<translation id="2620296592151848576">Sandi Anda telah berubah di Google. Harap masukkan sandi Windows saat ini untuk menyinkronkan Akun Windows dengan Akun Google Anda.</translation>
-<translation id="3697479376287066058">Akun lain di komputer ini telah didaftarkan menggunakan Akun Google ini. Harap login menggunakan Akun Google yang lain.</translation>
 <translation id="4057329986137569701">Terjadi error internal.</translation>
-<translation id="4128734677223009352">Gagal login ke Akun Google Anda. Pastikan komputer memiliki sambungan internet, lalu coba lagi.</translation>
-<translation id="4175879131870609567">Hanya pengguna yang mengunci komputer kerja ini yang saat ini diizinkan login ke sistem.</translation>
-<translation id="6613125771987245372">Login dengan Akun Google ini tidak diizinkan. Harap coba akun lain.</translation>
 <translation id="7357241217513796177">Pastikan Anda memiliki sambungan jaringan, lalu coba lagi.</translation>
-<translation id="7447167742844823007">Login menggunakan Akun Google Anda</translation>
 <translation id="7463006580194749499">Tambahkan pengguna</translation>
-<translation id="782439148700312319">Tidak dapat mendaftarkan komputer ini untuk pengelolaan perusahaan.  Harap login menggunakan Akun Google yang lain.</translation>
 <translation id="8440458902131551808">Akun Anda telah dikunci. Harap hubungi administrator sistem.</translation>
 <translation id="8474372283141585908">Penyedia Kredensial Google</translation>
 <translation id="866458870819756755">Tidak dapat membuat pengguna.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_it.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_it.xtb
index a45de95d..edf3542 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_it.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_it.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="it">
-<translation id="1296843352074373664">Utente Google</translation>
 <translation id="1383286653814676580">Consente di eseguire la pagina di accesso Provider di credenziali Google.</translation>
-<translation id="1644179990571656190">Impossibile creare un nuovo utente Google registrato. Questo sistema consente la creazione di un solo utente Google registrato.</translation>
-<translation id="1813213595719100133">L'accesso con questo Account Google non è consentito. Prova con un altro account.</translation>
-<translation id="195232392645680541">Accedi con il tuo Account Google.</translation>
 <translation id="2595469428674600431">Impossibile verificare la tua password Windows. Riprova.</translation>
-<translation id="2620296592151848576">La tua password è stata modificata su Google. Inserisci la tua attuale password Windows per sincronizzare l'account Windows con l'Account Google.</translation>
-<translation id="3697479376287066058">Su questo computer è già stato registrato un altro account con questo Account Google. Accedi con un altro Account Google.</translation>
 <translation id="4057329986137569701">Errore interno.</translation>
-<translation id="4128734677223009352">Accesso all'Account Google non riuscito. Assicurati che il computer abbia una connessione a Internet e riprova.</translation>
-<translation id="4175879131870609567">Al momento soltanto l'utente che ha bloccato questa workstation può accedere al sistema.</translation>
-<translation id="6613125771987245372">L'accesso con questo Account Google non è consentito. Prova con un altro account.</translation>
 <translation id="7357241217513796177">Assicurati di disporre di connessione di rete e riprova.</translation>
-<translation id="7447167742844823007">Accedi con il tuo Account Google</translation>
 <translation id="7463006580194749499">Aggiungi persona</translation>
-<translation id="782439148700312319">Impossibile registrare questo computer per la gestione aziendale.  Accedi con un altro Account Google.</translation>
 <translation id="8440458902131551808">Questo account è stato bloccato. Contatta un amministratore di sistema.</translation>
 <translation id="8474372283141585908">Provider di credenziali Google</translation>
 <translation id="866458870819756755">Impossibile creare un utente.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_iw.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_iw.xtb
index 0f82763..0b63ec5 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_iw.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_iw.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="iw">
-<translation id="1296843352074373664">‏משתמש Google</translation>
 <translation id="1383286653814676580">‏הריץ בעבר את דף הכניסה אל 'ספק פרטי הכניסה של Google'.</translation>
-<translation id="1813213595719100133">‏לא ניתן להיכנס אל הדומיין הזה באמצעות חשבונות Google. יש לנסות חשבון אחר.</translation>
-<translation id="195232392645680541">‏כניסה באמצעות חשבון Google.</translation>
 <translation id="2595469428674600431">‏מצטערים, לא ניתן לאמת את הסיסמה שלך ל-Windows. יש לנסות שוב.</translation>
-<translation id="2620296592151848576">‏הסיסמה שלך השתנתה ב-Google. יש להזין את הסיסמה הנוכחית שלך ל-Windows כדי לסנכרן את חשבון Windows שלך עם חשבון Google.</translation>
-<translation id="3697479376287066058">‏במחשב הזה כבר נרשם חשבון אחר עם חשבון Google הזה. יש להיכנס עם חשבון Google אחר.</translation>
 <translation id="4057329986137569701">אירעה שגיאה פנימית.</translation>
-<translation id="4128734677223009352">‏הכניסה לחשבון Google נכשלה. צריך לוודא שהמחשב מחובר לאינטרנט ולנסות שוב.</translation>
-<translation id="4175879131870609567">בשלב זה, רק למשתמש שנעל את תחנת העבודה הזו יש הרשאת כניסה למערכת.</translation>
-<translation id="6613125771987245372">‏אין הרשאה להיכנס באמצעות חשבון Google הזה. צריך לנסות חשבון אחר.</translation>
 <translation id="7357241217513796177">צריך לבדוק אם יש חיבור לרשת ואז אפשר לנסות שוב.</translation>
-<translation id="7447167742844823007">‏כניסה באמצעות חשבון Google</translation>
 <translation id="7463006580194749499">הוספת משתמש</translation>
-<translation id="782439148700312319">‏לא ניתן לרשום את המחשב הזה לניהול ארגונים.  יש להיכנס באמצעות חשבון Google שונה.</translation>
 <translation id="8440458902131551808">החשבון שלך ננעל. יש לפנות אל אחד ממנהלי המערכת.</translation>
 <translation id="8474372283141585908">‏ספק פרטי הכניסה של Google</translation>
 <translation id="866458870819756755">לא ניתן היה ליצור משתמש.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ja.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ja.xtb
index 0d7fbb17..9bec7b03 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ja.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ja.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ja">
-<translation id="1296843352074373664">Google ユーザー</translation>
 <translation id="1383286653814676580">Google 認証プロバイダのログインページを実行するために使用します。</translation>
-<translation id="1644179990571656190">新しい登録済み Google ユーザーを作成できませんでした。このシステムで作成できる登録済み Google ユーザーは 1 人のみです。</translation>
-<translation id="1813213595719100133">このドメインでは、Google アカウントでのログインは許可されていません。別のアカウントをご利用ください。</translation>
-<translation id="195232392645680541">Google アカウントでログインします。</translation>
 <translation id="2595469428674600431">Windows のパスワードを確認できませんでした。もう一度お試しください。</translation>
-<translation id="2620296592151848576">Google でパスワードが変更されました。Windows アカウントと Google アカウントを同期するには、現在の Windows のパスワードを入力してください。</translation>
-<translation id="3697479376287066058">このパソコンの別のアカウントがすでにこの Google アカウントで登録されています。別の Google アカウントでログインしてください。</translation>
 <translation id="4057329986137569701">内部エラーが発生しました。</translation>
-<translation id="4128734677223009352">Google アカウントにログインできませんでした。パソコンがインターネットに接続していることを確認してから、もう一度お試しください。</translation>
-<translation id="4175879131870609567">現在、システムにログインできるのは、このワークステーションをロックしたユーザーのみです。</translation>
-<translation id="6613125771987245372">この Google アカウントでのログインは許可されていません。別のアカウントでお試しください。</translation>
 <translation id="7357241217513796177">ネットワークに接続していることを確認してから、もう一度お試しください。</translation>
-<translation id="7447167742844823007">Google アカウントでログイン</translation>
 <translation id="7463006580194749499">ユーザーを追加</translation>
-<translation id="782439148700312319">このパソコンをエンタープライズ管理の対象として登録できません。別の Google アカウントでログインしてください。</translation>
 <translation id="8440458902131551808">アカウントはロックされています。システム管理者にお問い合わせください。</translation>
 <translation id="8474372283141585908">Google 認証プロバイダ</translation>
 <translation id="866458870819756755">ユーザーを作成できませんでした。</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_kn.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_kn.xtb
index a8e4237f3..0deb47a3 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_kn.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_kn.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="kn">
-<translation id="1296843352074373664">Google ಬಳಕೆದಾರ</translation>
 <translation id="1383286653814676580">Google ರುಜುವಾತು ಪೂರೈಕೆದಾರರ ಸೈನ್ ಇನ್ ಪುಟವನ್ನು ಚಲಾಯಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ.</translation>
-<translation id="1644179990571656190">ಹೊಸ ನೋಂದಾಯಿತ Google ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲು ವಿಫಲವಾಗಿದೆ. ಈ ಸಿಸ್ಟಂ ಒಬ್ಬ ನೋಂದಾಯಿತ Google ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲು ಮಾತ್ರವೇ ಅನುಮತಿಸುತ್ತದೆ.</translation>
-<translation id="1813213595719100133">ಈ ಡೊಮೇನ್‌ನಲ್ಲಿ Google ಖಾತೆಗಳ ಮೂಲಕ ಸೈನ್ ಇನ್ ಮಾಡುವುದನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ. ಬೇರೊಂದು ಖಾತೆಯ ಮೂಲಕ ಪ್ರಯತ್ನಿಸಿ.</translation>
-<translation id="195232392645680541">ನಿಮ್ಮ Google ಖಾತೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
 <translation id="2595469428674600431">ಕ್ಷಮಿಸಿ, ನಿಮ್ಮ Windows ಪಾಸ್‌ವರ್ಡ್‌ ಅನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
-<translation id="2620296592151848576">Google ನಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಬದಲಾಗಿದೆ. ನಿಮ್ಮ Windows ಖಾತೆಯನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯೊಂದಿಗೆ ಸಿಂಕ್ ಮಾಡಲು ನಿಮ್ಮ ಸದ್ಯದ Windows ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿ.</translation>
-<translation id="3697479376287066058">ಈ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿನ ಇನ್ನೊಂದು ಖಾತೆಯು ಈಗಾಗಲೇ Google ಖಾತೆಯೊಂದಿಗೆ ನೋಂದಣಿಯಾಗಿದೆ. ಬೇರೊಂದು Google ಖಾತೆಯ ಮೂಲಕ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
 <translation id="4057329986137569701">ಆಂತರಿಕ ದೋಷ ಸಂಭವಿಸಿದೆ.</translation>
-<translation id="4128734677223009352">ನಿಮ್ಮ Google ಖಾತೆಗೆ ಸೈನ್ ಇನ್ ಮಾಡುವಿಕೆಯು ವಿಫಲಗೊಂಡಿದೆ. ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವಿದೆಯೇ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ, ತದನಂತರ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
-<translation id="4175879131870609567">ಈ ಕಾರ್ಯಸ್ಥಳವನ್ನು ಲಾಕ್ ಮಾಡಿರುವ ಬಳಕೆದಾರರಿಗೆ ಮಾತ್ರವೇ ಪ್ರಸ್ತುತವಾಗಿ ಸಿಸ್ಟಂಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಅವಕಾಶ ನೀಡಲಾಗಿದೆ.</translation>
-<translation id="6613125771987245372">ಈ Google ಖಾತೆಯ ಮೂಲಕ ಸೈನ್ ಇನ್ ಮಾಡಲು ಅನುಮತಿಸಲಾಗಿಲ್ಲ. ಬೇರೊಂದು ಖಾತೆಯನ್ನು ಪ್ರಯತ್ನಿಸಿ ನೋಡಿ.</translation>
 <translation id="7357241217513796177">ನೀವು ನೆಟ್‌‌ವರ್ಕ್ ಸಂಪರ್ಕವನ್ನು ಹೊಂದಿರುವಿರಾ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ ಹಾಗೂ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
-<translation id="7447167742844823007">ನಿಮ್ಮ Google ಖಾತೆಯನ್ನು ಬಳಸಿ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation>
 <translation id="7463006580194749499">ವ್ಯಕ್ತಿಯನ್ನು ಸೇರಿಸು</translation>
-<translation id="782439148700312319">ಎಂಟರ್‌ಪ್ರೈಸ್ ನಿರ್ವಹಣೆಗಾಗಿ ಈ ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ನೋಂದಾಯಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.  ಬೇರೊಂದು Google ಖಾತೆಯ ಮೂಲಕ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
 <translation id="8440458902131551808">ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಲಾಕ್ ಮಾಡಲಾಗಿದೆ. ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation>
 <translation id="8474372283141585908">Google ರುಜುವಾತು ಪೂರೈಕೆದಾರ</translation>
 <translation id="866458870819756755">ಬಳಕೆದಾರರೊಬ್ಬರನ್ನು ರಚಿಸಲಾಗಲಿಲ್ಲ.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ko.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ko.xtb
index 5ae4edf2..28d6705 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ko.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ko.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ko">
-<translation id="1296843352074373664">Google 사용자</translation>
 <translation id="1383286653814676580">Google 사용자 인증 정보 제공업체 로그인 페이지에 사용됩니다.</translation>
-<translation id="1813213595719100133">이 도메인에서는 Google 계정으로 로그인할 수 없습니다. 다른 계정을 사용하세요.</translation>
-<translation id="195232392645680541">Google 계정으로 로그인하세요.</translation>
 <translation id="2595469428674600431">죄송합니다. Windows 비밀번호를 확인할 수 없습니다. 다시 시도해 주세요.</translation>
-<translation id="2620296592151848576">Google에서 비밀번호가 변경되었습니다. Windows 계정과 Google 계정을 동기화하려면 현재 Windows 비밀번호를 입력해 주세요.</translation>
-<translation id="3697479376287066058">이 컴퓨터의 다른 계정이 이미 이 Google 계정으로 등록되었습니다. 다른 Google 계정으로 로그인하세요.</translation>
 <translation id="4057329986137569701">내부 오류가 발생했습니다.</translation>
-<translation id="4128734677223009352">Google 계정에 로그인하지 못했습니다. 컴퓨터가 인터넷에 연결되어 있는지 확인한 후 다시 시도해 보세요.</translation>
-<translation id="4175879131870609567">현재 이 워크스테이션을 잠근 사용자만 시스템에 로그인할 수 있습니다.</translation>
-<translation id="6613125771987245372">이 Google 계정으로는 로그인할 수 없습니다. 다른 계정을 사용해 보세요.</translation>
 <translation id="7357241217513796177">네트워크 연결을 확인한 후 다시 시도해 주세요.</translation>
-<translation id="7447167742844823007">Google 계정으로 로그인하세요.</translation>
 <translation id="7463006580194749499">사용자 추가</translation>
-<translation id="782439148700312319">이 컴퓨터를 기업 관리에 등록할 수 없습니다.  다른 Google 계정으로 로그인하세요.</translation>
 <translation id="8440458902131551808">계정이 잠겼습니다. 시스템 관리자에게 문의하시기 바랍니다.</translation>
 <translation id="8474372283141585908">Google 사용자 인증 정보 제공업체</translation>
 <translation id="866458870819756755">사용자를 만들 수 없습니다.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_lt.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_lt.xtb
index 66c9965..0cc250f 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_lt.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_lt.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="lt">
-<translation id="1296843352074373664">„Google“ naudotojas</translation>
 <translation id="1383286653814676580">Naudojama „Google“ prisijungimo duomenų teikėjo prisijungimo puslapiui vykdyti.</translation>
-<translation id="1644179990571656190">Nepavyko sukurti naujo registruoto „Google“ naudotojo. Ši sistema leidžia sukurti tik vieną registruotą „Google“ naudotoją.</translation>
-<translation id="1813213595719100133">Šiame domene nebegalima prisijungti naudojant „Google“ paskyrą. Bandykite naudoti kitą paskyrą.</translation>
-<translation id="195232392645680541">Prisijunkite naudodami „Google“ paskyrą.</translation>
 <translation id="2595469428674600431">Deja, nepavyko patvirtinti „Windows“ slaptažodžio. Bandykite dar kartą.</translation>
-<translation id="2620296592151848576">Jūsų slaptažodis pakeistas sistemoje „Google“. Kad galėtumėte sinchronizuoti „Windows“ paskyrą su „Google“ paskyra, įveskite dabartinį „Windows“ slaptažodį.</translation>
-<translation id="3697479376287066058">Kita paskyra šiame kompiuteryje jau užregistruota naudojant šią „Google“ paskyrą. Prisijunkite naudodami kitą „Google“ paskyrą.</translation>
 <translation id="4057329986137569701">Įvyko vidinė klaida.</translation>
-<translation id="4128734677223009352">Nepavyko prisijungti prie „Google“ paskyros. Įsitikinkite, kad kompiuteris prijungtas prie interneto, tada bandykite dar kartą.</translation>
-<translation id="4175879131870609567">Šiuo metu prie sistemos gali prisijungti tik šią darbo vietą užrakinęs naudotojas.</translation>
-<translation id="6613125771987245372">Negalima prisijungti naudojant šią „Google“ paskyrą. Pabandykite naudoti kitą paskyrą.</translation>
 <translation id="7357241217513796177">Įsitikinkite, kad yra tinklo ryšys, ir bandykite dar kartą.</translation>
-<translation id="7447167742844823007">Prisijunkite naudodami „Google“ paskyrą</translation>
 <translation id="7463006580194749499">Pridėti asmenį</translation>
-<translation id="782439148700312319">Nepavyksta užregistruoti šio kompiuterio kaip tvarkomo įmonėje.  Prisijunkite naudodami kitą „Google“ paskyrą.</translation>
 <translation id="8440458902131551808">Paskyra buvo užrakinta. Susisiekite su sistemos administratoriumi.</translation>
 <translation id="8474372283141585908">„Google“ prisijungimo duomenų teikėjas</translation>
 <translation id="866458870819756755">Nepavyko sukurti naudotojo.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_lv.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_lv.xtb
index 148f812..709d42d6 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_lv.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_lv.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="lv">
-<translation id="1296843352074373664">Google lietotājs</translation>
 <translation id="1383286653814676580">Tiek izmantots Google akreditācijas datu nodrošinātāja pierakstīšanās lapā.</translation>
-<translation id="1644179990571656190">Neizdevās izveidot jaunu reģistrētu Google lietotāju. Šī sistēma atļauj izveidot tikai vienu reģistrētu Google lietotāju.</translation>
-<translation id="1813213595719100133">Pierakstīšanās šajā domēnā ar Google kontiem nav atļauta. Mēģiniet lietot citu kontu.</translation>
-<translation id="195232392645680541">Pierakstieties savā Google kontā.</translation>
 <translation id="2595469428674600431">Diemžēl nevarēja verificēt jūsu Windows paroli. Lūdzu, mēģiniet vēlreiz.</translation>
-<translation id="2620296592151848576">Jūsu parole Google tīklā ir mainīta. Lūdzu, ievadiet pašreizējo Windows paroli, lai sinhronizētu Windows kontu ar Google kontu.</translation>
-<translation id="3697479376287066058">Šajā datorā jau ir reģistrēts cits konts, izmantojot šo Google kontu. Lūdzu, pierakstieties ar citu Google kontu.</translation>
 <translation id="4057329986137569701">Radās iekšēja kļūda.</translation>
-<translation id="4128734677223009352">Neizdevās pierakstīties Google kontā. Pārbaudiet, vai datoram ir interneta savienojums, un pēc tam mēģiniet vēlreiz.</translation>
-<translation id="4175879131870609567">Tikai lietotājam, kurš bloķēja šo darbstaciju, šobrīd ir atļauts pierakstīties sistēmā.</translation>
-<translation id="6613125771987245372">Nav atļauts pierakstīties šajā Google kontā. Izmantojiet citu kontu.</translation>
 <translation id="7357241217513796177">Pārbaudiet, vai ir izveidots tīkla savienojums, un mēģiniet vēlreiz.</translation>
-<translation id="7447167742844823007">Pierakstīties ar jūsu Google kontu</translation>
 <translation id="7463006580194749499">Pievienot personu</translation>
-<translation id="782439148700312319">Nevar reģistrēt šo datoru uzņēmuma pārvaldībai.  Lūdzu, pierakstieties ar citu Google kontu.</translation>
 <translation id="8440458902131551808">Jūsu konts ir bloķēts. Lūdzu, sazinieties ar sistēmas administratoru.</translation>
 <translation id="8474372283141585908">Google akreditācijas datu nodrošinātājs</translation>
 <translation id="866458870819756755">Nevarēja izveidot lietotāju.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ml.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ml.xtb
index d625840..7365f72 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ml.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ml.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ml">
-<translation id="1296843352074373664">Google ഉപയോക്താവ്</translation>
 <translation id="1383286653814676580">Google ക്രെഡൻഷ്യൽ പ്രൊവൈഡർ സൈൻ ഇൻ പേജ് റൺ ചെയ്യാൻ ഉപയോഗിച്ചു.</translation>
-<translation id="1644179990571656190">രജിസ്‌റ്റർ ചെയ്‌ത പുതിയ Google ഉപയോക്താവിനെ സൃഷ്‌ടിക്കാനായില്ല. രജിസ്‌റ്റർ ചെയ്‌ത ഒരു Google ഉപയോക്താവിനെ സൃഷ്‌ടിക്കാൻ മാത്രമേ ഈ സിസ്‌റ്റം അനുവദിക്കൂ.</translation>
-<translation id="1813213595719100133">Google അക്കൗണ്ട് ഉപയോഗിച്ചുള്ള സൈന്‍ ഇന്‍ ചെയ്യല്‍ ഈ ഡൊമെയ്‌നിൽ അനുവദനീയമല്ല. മറ്റൊരു അക്കൗണ്ട് ഉപയോഗിച്ച് ശ്രമിക്കുക.</translation>
-<translation id="195232392645680541">നിങ്ങളുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="2595469428674600431">ക്ഷമിക്കണം, നിങ്ങളുടെ Windows പാസ്‌വേഡ് പരിശോധിച്ചുറപ്പിക്കാനായില്ല. വീണ്ടും ശ്രമിക്കുക.</translation>
-<translation id="2620296592151848576">Google-ലെ നിങ്ങളുടെ പാസ്‌വേഡ് മാറ്റി. Windows അക്കൗണ്ടുമായി Google അക്കൗണ്ട് സമന്വയിപ്പിക്കാൻ, നിങ്ങളുടെ നിലവിലെ Windows പാസ്‌വേഡ് നൽകുക.</translation>
-<translation id="3697479376287066058">ഈ കമ്പ്യൂട്ടറിലെ മറ്റൊരു അക്കൗണ്ട്, ഈ Google അക്കൗണ്ട് ഉപയോഗിച്ച് മുമ്പേ രജിസ്‌റ്റർ ചെയ്‌തു. മറ്റൊരു അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="4057329986137569701">ഒരു ആന്തരിക പിശക് സംഭവിച്ചു.</translation>
-<translation id="4128734677223009352">Google അക്കൗണ്ടിലേക്ക് സൈന്‍ ഇന്‍ ചെയ്യാനായില്ല. കമ്പ്യൂട്ടറില്‍ ഇന്‍റർനെറ്റ് കണക്ഷനുണ്ടെന്ന് ഉറപ്പാക്കിയ ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation>
-<translation id="4175879131870609567">ഈ വർക്ക്‌സ്‌റ്റേഷൻ ലോക്ക് ചെയ്‌ത ഉപയോക്താവിനെ മാത്രമേ നിലവിൽ സിസ്റ്റത്തിലേക്ക് സൈൻ ഇൻ ചെയ്യാൻ അനുവദിച്ചിട്ടുള്ളൂ.</translation>
-<translation id="6613125771987245372">ഈ Google അക്കൗണ്ട് ഉപയോഗിച്ചുള്ള സൈന്‍ ഇന്‍ ചെയ്യല്‍ അനുവദനീയമല്ല. മറ്റൊരു അക്കൗണ്ട് പരീക്ഷിക്കുക.</translation>
 <translation id="7357241217513796177">നിങ്ങൾക്ക് നെറ്റ്‌വർക്ക് കണക്ഷനുണ്ടെന്ന് ഉറപ്പാക്കി, വീണ്ടും ശ്രമിക്കുക.</translation>
-<translation id="7447167742844823007">നിങ്ങളുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക</translation>
 <translation id="7463006580194749499">വ്യക്തിയെ ചേർക്കുക</translation>
-<translation id="782439148700312319">എൻ്റർപ്രൈസ് മാനേജ്മെൻ്റിനായി ഈ കമ്പ്യൂട്ടർ എൻറോൾ ചെയ്യാനായില്ല.  മറ്റൊരു Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="8440458902131551808">നിങ്ങളുടെ അക്കൗണ്ട് ലോക്ക് ചെയ്‌തു. സിസ്‌റ്റം അഡ്‌മിനിസ്‌ട്രേറ്ററുമായി ബന്ധപ്പെടുക.</translation>
 <translation id="8474372283141585908">Google ക്രെഡന്‍ഷ്യല്‍ പ്രൊവൈഡർ</translation>
 <translation id="866458870819756755">ഒരു ഉപയോക്താവിനെ സൃഷ്‌ടിക്കാനായില്ല.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_mr.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_mr.xtb
index 714799e..028c715 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_mr.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_mr.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="mr">
-<translation id="1296843352074373664">Google वापरकर्ता</translation>
 <translation id="1383286653814676580">Google क्रेडेंशियल पुरवठादार साइन इन पेज रन करण्यासाठी वापरले.</translation>
-<translation id="1644179990571656190">नवीन नोंदणीकृत Google वापरकर्ता निर्माण करता आला नाही. ही सिस्टम फक्त एकच नोंदणीकृत Google वापरकर्ता तयार करण्याची अनुमती देते.</translation>
-<translation id="1813213595719100133">Google खात्यासह या डोमेनवर साइन इन करण्याची अनुमती नाही. वेगळे खाते वापरून पाहा.</translation>
-<translation id="195232392645680541">तुमचे Google खाते वापरून साइन इन करा</translation>
 <translation id="2595469428674600431">सॉरी, तुमच्या Windows पासवर्डची पडताळणी करता आली नाही. कृपया पुन्हा प्रयत्न करा.</translation>
-<translation id="2620296592151848576">Google वर तुमचा पासवर्ड बदलला आहे. तुमचे Windows खाते तुमच्या Google खात्याशी सिंक करण्यासाठी कृपया तुमचा सद्य Windows पासवर्ड एंटर करा.</translation>
-<translation id="3697479376287066058">या कॉंप्युटरवरील दुसर्‍या खात्याची या Google खात्यासह आधीच नोंदणी केलेली आहे. कृपया वेगळ्या Google खात्यासह साइन इन करा.</translation>
 <translation id="4057329986137569701">अंतर्गत एरर आली.</translation>
-<translation id="4128734677223009352">तुमच्या Google खातेमध्ये साइन इन करता आले नाही. कॉंप्युटरमध्ये इंटरनेट कनेक्शन असल्याची खात्री करा, नंतर पुन्हा प्रयत्न करा.</translation>
-<translation id="4175879131870609567">फक्त हे वर्कस्टेशन लॉक केलेल्या वापरकर्त्याला सध्या सिस्टममध्ये साइन इन करण्याची अनुमती आहे.</translation>
-<translation id="6613125771987245372">या Google खाते सह साइन इन करण्याची अनुमती आहे. वेगळे खाते वापरून पाहा.</translation>
 <translation id="7357241217513796177">तुमच्याकडे नेटवर्क कनेक्शन असल्याची खात्री करा आणि पुन्हा प्रयत्न करा.</translation>
-<translation id="7447167742844823007">तुमचे Google खाते वापरून साइन इन करा</translation>
 <translation id="7463006580194749499">व्यक्ती जोडा</translation>
-<translation id="782439148700312319">या कॉंप्युटरची एंटरप्राइझ व्यवस्थापनासाठी नोंदणी करता आली नाही.  कृपया वेगळ्या Google खाते सह साइन इन करा.</translation>
 <translation id="8440458902131551808">तुमचे खाते लॉक केले गेले आहे. कृपया सिस्टम अ‍ॅडमिनिस्ट्रेटरशी संपर्क साधा.</translation>
 <translation id="8474372283141585908">Google क्रेडेंशियल पुरवठादार</translation>
 <translation id="866458870819756755">वापरकर्ता तयार करता आला नाही.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ms.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ms.xtb
index 1763a86..37e191b9 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ms.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ms.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ms">
-<translation id="1296843352074373664">Pengguna Google</translation>
 <translation id="1383286653814676580">Digunakan untuk menjalankan halaman log masuk Penyedia Bukti Kelayakan Google.</translation>
-<translation id="1644179990571656190">Gagal membuat pengguna Google berdaftar baharu. Sistem ini hanya membenarkan satu pengguna Google berdaftar dibuat.</translation>
-<translation id="1813213595719100133">Tidak dibenarkan mengelog masuk dengan Akaun Google pada domain ini. Cuba akaun lain.</translation>
-<translation id="195232392645680541">Log masuk menggunakan Akaun Google anda.</translation>
 <translation id="2595469428674600431">Maaf, kata laluan Windows anda tidak dapat disahkan. Sila cuba lagi.</translation>
-<translation id="2620296592151848576">Kata laluan anda telah ditukar di Google. Sila masukkan kata laluan Windows semasa anda untuk menyegerakkan Akaun Windows anda dengan Akaun Google anda.</translation>
-<translation id="3697479376287066058">Akaun lain pada komputer ini sudah berdaftar dengan Akaun Google ini. Sila log masuk dengan Akaun Google lain.</translation>
 <translation id="4057329986137569701">Ralat dalaman telah berlaku.</translation>
-<translation id="4128734677223009352">Gagal untuk log masuk ke Akaun Google anda. Pastikan komputer mempunyai sambungan Internet, kemudian cuba lagi.</translation>
-<translation id="4175879131870609567">Hanya pengguna yang mengunci stesen kerja ini dibenarkan log masuk ke sistem pada masa ini.</translation>
-<translation id="6613125771987245372">Log masuk dengan Akaun Google ini tidak dibenarkan. Cuba akaun lain.</translation>
 <translation id="7357241217513796177">Pastikan anda mempunyai sambungan rangkaian dan cuba lagi.</translation>
-<translation id="7447167742844823007">Log masuk menggunakan Akaun Google anda</translation>
 <translation id="7463006580194749499">Tambah orang</translation>
-<translation id="782439148700312319">Tidak dapat mendaftarkan komputer ini untuk pengurusan perusahaan.  Sila log masuk dengan Akaun Google lain.</translation>
 <translation id="8440458902131551808">Akaun anda telah dikunci. Sila hubungi pentadbir sistem.</translation>
 <translation id="8474372283141585908">Penyedia Bukti Kelayakan Google</translation>
 <translation id="866458870819756755">Pengguna tidak dapat dibuat.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_nl.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_nl.xtb
index 4abfba84..15c35c9 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_nl.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_nl.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="nl">
-<translation id="1296843352074373664">Google-gebruiker</translation>
 <translation id="1383286653814676580">Wordt gebruikt om de inlogpagina van Google-inlogprovider uit te voeren.</translation>
-<translation id="1644179990571656190">Kan geen nieuwe geregistreerde Google-gebruiker maken. In dit systeem kan slechts één geregistreerde Google-gebruiker worden gemaakt.</translation>
-<translation id="1813213595719100133">Het is in dit domein niet toegestaan om in te loggen met Google-accounts. Gebruik een ander account.</translation>
-<translation id="195232392645680541">Log in met je Google-account.</translation>
 <translation id="2595469428674600431">Je Windows-wachtwoord kan niet worden geverifieerd. Probeer het opnieuw.</translation>
-<translation id="2620296592151848576">Je wachtwoord is gewijzigd op Google. Geef je huidige Windows-wachtwoord op om je Windows-account te synchroniseren met je Google-account.</translation>
-<translation id="3697479376287066058">Er is al een ander account op deze computer geregistreerd met dit Google-account. Log in met een ander Google-account.</translation>
 <translation id="4057329986137569701">Er is een interne fout opgetreden.</translation>
-<translation id="4128734677223009352">Inloggen op je Google-account is mislukt. Zorg dat de computer verbinding heeft met internet en probeer het daarna opnieuw.</translation>
-<translation id="4175879131870609567">Alleen de gebruiker die dit werkstation heeft vergrendeld, kan op dit moment inloggen bij het systeem.</translation>
-<translation id="6613125771987245372">Inloggen met dit Google-account is niet toegestaan. Probeer een ander account.</translation>
 <translation id="7357241217513796177">Zorg ervoor dat je over een netwerkverbinding beschikt en probeer het opnieuw.</translation>
-<translation id="7447167742844823007">Inloggen met je Google-account</translation>
 <translation id="7463006580194749499">Persoon toevoegen</translation>
-<translation id="782439148700312319">Kan deze computer niet inschrijven voor zakelijk beheer.  Log in met een ander Google-account.</translation>
 <translation id="8440458902131551808">Je account is vergrendeld. Neem contact op met een systeembeheerder.</translation>
 <translation id="8474372283141585908">Google-inlogprovider</translation>
 <translation id="866458870819756755">Gebruiker kan niet worden gemaakt.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_no.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_no.xtb
index 199aadb..169a8a3 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_no.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_no.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="no">
-<translation id="1296843352074373664">Google-bruker</translation>
 <translation id="1383286653814676580">Brukes til å kjøre påloggingssiden for Google-legitimasjonsleverandøren.</translation>
-<translation id="1813213595719100133">Du kan ikke logge på dette domenet med denne Google-kontoen. Prøv en annen konto.</translation>
-<translation id="195232392645680541">Logg på med Google-kontoen din.</translation>
 <translation id="2595469428674600431">Beklager, men Windows-passordet ditt kunne ikke bekreftes. Prøv på nytt.</translation>
-<translation id="2620296592151848576">Passordet ditt er endret hos Google. Skriv inn Windows-passordet ditt for å synkronisere Windows-kontoen din med Google-kontoen din.</translation>
-<translation id="3697479376287066058">En annen konto på denne datamaskinen er allerede registrert med denne Google-kontoen. Logg på med en annen Google-konto.</translation>
 <translation id="4057329986137569701">Det oppsto en intern feil.</translation>
-<translation id="4128734677223009352">Kunne ikke logge på Google-kontoen din. Sørg for at datamaskinen har en gyldig internettilkobling, og prøv på nytt.</translation>
-<translation id="4175879131870609567">Kun brukeren som låste denne arbeidsstasjonen, får lov til å logge på systemet akkurat nå.</translation>
-<translation id="6613125771987245372">Du kan ikke logge på med denne Google-kontoen. Prøv en annen konto.</translation>
 <translation id="7357241217513796177">Sørg for at du er koblet til et nettverk, og prøv på nytt.</translation>
-<translation id="7447167742844823007">Logg på med Google-kontoen din</translation>
 <translation id="7463006580194749499">Legg til person</translation>
-<translation id="782439148700312319">Kunne ikke registrere denne datamaskinen for bedriftsadministrering.  Logg på med en annen Google-konto.</translation>
 <translation id="8440458902131551808">Kontoen din er låst. Kontakt en systemadministrator.</translation>
 <translation id="8474372283141585908">Google-legitimasjonsleverandør</translation>
 <translation id="866458870819756755">Kunne ikke opprette bruker.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_pl.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_pl.xtb
index e616ec06..c25d7931 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_pl.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_pl.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="pl">
-<translation id="1296843352074373664">Użytkownik Google</translation>
 <translation id="1383286653814676580">Używane do uruchamiania strony logowania dostawcy danych uwierzytelniających Google.</translation>
-<translation id="1644179990571656190">Nie udało się utworzyć nowego zarejestrowanego użytkownika Google. Ten system pozwala na utworzenie tylko jednego zarejestrowanego użytkownika Google.</translation>
-<translation id="1813213595719100133">Logowanie się przy użyciu kont Google jest niedozwolone w tej domenie. Użyj innego konta.</translation>
-<translation id="195232392645680541">Zaloguj się, używając swojego konta Google.</translation>
 <translation id="2595469428674600431">Nie udało się zweryfikować Twojego hasła do systemu Windows. Spróbuj ponownie.</translation>
-<translation id="2620296592151848576">Twoje hasło zostało zmienione w Google. Wpisz swoje aktualne hasło do systemu Windows, by zsynchronizować konto Windows z kontem Google.</translation>
-<translation id="3697479376287066058">Inne konto na tym komputerze zostało już zarejestrowane przy użyciu tego konta Google. Zaloguj się, używając innego konta Google.</translation>
 <translation id="4057329986137569701">Wystąpił błąd wewnętrzny.</translation>
-<translation id="4128734677223009352">Nie udało się zalogować na to konto Google. Sprawdź, czy komputer jest połączony z internetem, i spróbuj jeszcze raz.</translation>
-<translation id="4175879131870609567">Tylko użytkownik, który zablokował tę stację roboczą, może teraz zalogować się w systemie.</translation>
-<translation id="6613125771987245372">Logowanie na to konto Google jest niedozwolone. Użyj innego konta.</translation>
 <translation id="7357241217513796177">Upewnij się, że masz połączenie sieciowe, i spróbuj ponownie.</translation>
-<translation id="7447167742844823007">Zaloguj się, używając swojego konta Google</translation>
 <translation id="7463006580194749499">Dodaj osobę</translation>
-<translation id="782439148700312319">Nie można zarejestrować tego komputera na potrzeby zarządzania w firmie.  Zaloguj się, używając innego konta Google.</translation>
 <translation id="8440458902131551808">Twoje konto zostało zablokowane. Skontaktuj się z administratorem systemu.</translation>
 <translation id="8474372283141585908">Dostawca danych uwierzytelniających Google</translation>
 <translation id="866458870819756755">Nie udało się utworzyć użytkownika.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_pt-BR.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_pt-BR.xtb
index 71003b5..6a10561 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_pt-BR.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_pt-BR.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="pt-BR">
-<translation id="1296843352074373664">Usuário do Google</translation>
 <translation id="1383286653814676580">Usado para executar a página de login do Provedor de credenciais do Google.</translation>
-<translation id="1644179990571656190">Falha ao criar novo usuário registrado do Google. Este sistema permite criar apenas um usuário registrado do Google.</translation>
-<translation id="1813213595719100133">O login com Contas do Google não é permitido neste domínio. Use outra conta.</translation>
-<translation id="195232392645680541">Faça login usando sua Conta do Google.</translation>
 <translation id="2595469428674600431">Não foi possível verificar a senha do Windows. Tente novamente.</translation>
-<translation id="2620296592151848576">Sua senha foi alterada no Google. Informe sua senha atual do Windows para sincronizar sua conta do Windows com sua Conta do Google.</translation>
-<translation id="3697479376287066058">Outra conta neste computador já foi registrada com esta Conta do Google. Faça login com outra Conta do Google.</translation>
 <translation id="4057329986137569701">Ocorreu um erro interno.</translation>
-<translation id="4128734677223009352">Não foi possível fazer login na sua Conta do Google. Verifique a conexão do computador com a Internet e tente novamente.</translation>
-<translation id="4175879131870609567">Apenas o usuário que bloqueou esta estação de trabalho tem permissão para fazer login no sistema.</translation>
-<translation id="6613125771987245372">O login com esta Conta do Google não é permitido. Use uma conta diferente.</translation>
 <translation id="7357241217513796177">Verifique se você tem uma conexão de rede e tente novamente.</translation>
-<translation id="7447167742844823007">Fazer login usando sua Conta do Google</translation>
 <translation id="7463006580194749499">Adicionar pessoa</translation>
-<translation id="782439148700312319">Não é possível inscrever este computador para o gerenciamento empresarial.  Faça login com outra Conta do Google.</translation>
 <translation id="8440458902131551808">Sua conta foi bloqueada. Entre em contato com um administrador do sistema.</translation>
 <translation id="8474372283141585908">Provedor de credenciais do Google</translation>
 <translation id="866458870819756755">Não foi possível criar um usuário.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_pt-PT.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_pt-PT.xtb
index 9d4dc05..61265864 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_pt-PT.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_pt-PT.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="pt-PT">
-<translation id="1296843352074373664">Utilizador do Google</translation>
 <translation id="1383286653814676580">Utilizado para executar a página de início de sessão do Google Credential Provider.</translation>
-<translation id="1644179990571656190">Falha ao criar o novo utilizador Google registado. Este sistema apenas permite a criação de um utilizador Google registado.</translation>
-<translation id="1813213595719100133">Não é permitido iniciar sessão com as Contas Google neste domínio. Experimente com outra conta.</translation>
-<translation id="195232392645680541">Inicie sessão com a sua Conta Google.</translation>
 <translation id="2595469428674600431">Lamentamos, mas não foi possível validar a sua palavra-passe do Windows. Tente novamente.</translation>
-<translation id="2620296592151848576">A sua palavra-passe foi alterada no Google. Introduza a sua palavra-passe do Windows atual para sincronizar a Conta do Windows com a Conta Google.</translation>
-<translation id="3697479376287066058">Outra conta neste computador já se registou com esta Conta Google. Inicie sessão com uma Conta Google diferente.</translation>
 <translation id="4057329986137569701">Ocorreu um erro interno.</translation>
-<translation id="4128734677223009352">Falha ao iniciar sessão na sua Conta Google. Certifique-se de que o computador possui uma ligação à Internet e, em seguida, tente novamente.</translation>
-<translation id="4175879131870609567">Apenas o utilizador que bloqueou esta estação de trabalho tem atualmente permissão para iniciar sessão no sistema.</translation>
-<translation id="6613125771987245372">Não é permitido iniciar sessão com esta Conta Google. Experimente uma conta diferente.</translation>
 <translation id="7357241217513796177">Certifique-se de que tem uma ligação de rede e tente novamente.</translation>
-<translation id="7447167742844823007">Iniciar sessão com a sua Conta Google</translation>
 <translation id="7463006580194749499">Adicionar pessoa</translation>
-<translation id="782439148700312319">Não é possível inscrever este computador para gestão empresarial.  Inicie sessão com uma Conta Google diferente.</translation>
 <translation id="8440458902131551808">A sua conta foi bloqueada. Contacte um administrador do sistema.</translation>
 <translation id="8474372283141585908">Google Credential Provider</translation>
 <translation id="866458870819756755">Não foi possível criar um utilizador.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ro.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ro.xtb
index 483d23f..f9709d67 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ro.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ro.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ro">
-<translation id="1296843352074373664">Utilizator Google</translation>
 <translation id="1383286653814676580">Folosit pentru a afișa pagina de conectare la furnizorul de date de conectare la Google.</translation>
-<translation id="1644179990571656190">Nu s-a reușit crearea utilizatorului Google nou înregistrat. Sistemul permite crearea unui singur utilizator înregistrat Google.</translation>
-<translation id="1813213595719100133">Pe acest domeniu nu este permisă conectarea folosind Contul Google. Încearcă alt cont</translation>
-<translation id="195232392645680541">Conectează-te folosind Contul Google.</translation>
 <translation id="2595469428674600431">Parola pentru Windows nu a putut fi confirmată. Încearcă din nou.</translation>
-<translation id="2620296592151848576">Parola a fost modificată în Google. Introdu parola Windows curentă pentru a sincroniza Contul Windows cu Contul Google.</translation>
-<translation id="3697479376287066058">Un alt cont de pe acest computer s-a înregistrat deja cu acest Cont Google. Te rugăm să te conectezi cu un alt Cont Google.</translation>
 <translation id="4057329986137569701">A apărut o eroare internă.</translation>
-<translation id="4128734677223009352">Conectarea la Contul Google nu a reușit. Asigură-te că acest computer e conectat la internet, apoi încearcă din nou.</translation>
-<translation id="4175879131870609567">Numai utilizatorul care a blocat această stație de lucru are acum permisiunea de a se conecta la sistem.</translation>
-<translation id="6613125771987245372">Conectarea cu acest Cont Google nu este permisă. Încearcă un alt cont.</translation>
 <translation id="7357241217513796177">Asigură-te că ai o conexiune la rețea și încearcă din nou.</translation>
-<translation id="7447167742844823007">Conectează-te folosind Contul Google</translation>
 <translation id="7463006580194749499">Adăugați o persoană</translation>
-<translation id="782439148700312319">Nu s-a putut înregistra acest computer pentru gestionarea de întreprindere.  Conectează-te cu un alt Cont Google.</translation>
 <translation id="8440458902131551808">Contul tău a fost blocat. Contactează un administrator de sistem.</translation>
 <translation id="8474372283141585908">Furnizor de date de conectare la Google</translation>
 <translation id="866458870819756755">Nu s-a putut crea un utilizator.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ru.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ru.xtb
index 78aa5c0..860b890 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ru.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ru.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ru">
-<translation id="1296843352074373664">Пользователь Google</translation>
 <translation id="1383286653814676580">Используется для перехода на страницу входа поставщика учетных данных Google.</translation>
-<translation id="1644179990571656190">Не удалось создать пользователя. В системе можно зарегистрировать только одного пользователя Google.</translation>
-<translation id="1813213595719100133">В этом домене запрещен вход с аккаунтами Google. Используйте другой аккаунт.</translation>
-<translation id="195232392645680541">Войти, используя аккаунт Google</translation>
 <translation id="2595469428674600431">Не удалось подтвердить пароль для Windows. Повторите попытку.</translation>
-<translation id="2620296592151848576">Пароль Google изменен. Чтобы синхронизировать аккаунты Windows и Google, введите актуальный пароль для Windows.</translation>
-<translation id="3697479376287066058">Этот аккаунт Google уже используется. Чтобы войти в систему, введите данные другого аккаунта.</translation>
 <translation id="4057329986137569701">Произошла внутренняя ошибка.</translation>
-<translation id="4128734677223009352">Не удалось войти в аккаунт Google. Убедитесь, что компьютер подключен к Интернету, и повторите попытку.</translation>
-<translation id="4175879131870609567">Пока в систему может войти только пользователь, заблокировавший рабочую станцию.</translation>
-<translation id="6613125771987245372">Нельзя войти с помощью этого аккаунта Google. Используйте другой.</translation>
 <translation id="7357241217513796177">Проверьте подключение к сети и повторите попытку.</translation>
-<translation id="7447167742844823007">Войти, используя аккаунт Google</translation>
 <translation id="7463006580194749499">Добавить пользователя</translation>
-<translation id="782439148700312319">Не удалось зарегистрировать этот компьютер в качестве корпоративного.  Чтобы войти в систему, введите данные другого аккаунта.</translation>
 <translation id="8440458902131551808">Ваш аккаунт заблокирован. Обратитесь к системному администратору.</translation>
 <translation id="8474372283141585908">Поставщик учетных данных Google</translation>
 <translation id="866458870819756755">Не удалось создать пользователя.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb
index 55379ee..8b801df 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sk">
-<translation id="1296843352074373664">Používateľ Googlu</translation>
 <translation id="1383286653814676580">Používa sa na spúšťanie prihlasovacej stránky poskytovateľa poverení Google</translation>
-<translation id="1644179990571656190">Nepodarilo sa vytvoriť nového registrovaného používateľa Google. Tento systém povoľuje vytvorenie iba jedného registrovaného používateľa Google.</translation>
-<translation id="1813213595719100133">Prihlasovanie pomocou účtov Google nie je v tejto doméne povolené. Skúste iný účet.</translation>
-<translation id="195232392645680541">Prihláste sa pomocou účtu Google.</translation>
 <translation id="2595469428674600431">Vaše heslo systému Windows sa nepodarilo overiť. Skúste to znova.</translation>
-<translation id="2620296592151848576">Vaše heslo sa zmenilo na Googli. Zadajte svoje aktuálne heslo systému Windows, aby sa váš účet systému Windows synchronizoval s účtom Google.</translation>
-<translation id="3697479376287066058">S týmto účtom Google je už registrovaný iný účet v tomto počítači. Prihláste sa pomocou iného účtu Google.</translation>
 <translation id="4057329986137569701">Vyskytla sa interná chyba.</translation>
-<translation id="4128734677223009352">Nepodarilo sa prihlásiť do účtu Google. Skontrolujte, či má počítač internetové pripojenie, a potom to skúste znova.</translation>
-<translation id="4175879131870609567">Do tohto systému sa momentálne môže prihlásiť iba používateľ, ktorý túto pracovnú stanicu uzamkol.</translation>
-<translation id="6613125771987245372">Prihlasovanie pomocou tohto účtu Google je zakázané. Vyskúšajte iný účet.</translation>
 <translation id="7357241217513796177">Uistite sa, že máte pripojenie k sieti, a skúste to znova.</translation>
-<translation id="7447167742844823007">Prihláste sa pomocou svojho účtu Google</translation>
 <translation id="7463006580194749499">Pridať osobu</translation>
-<translation id="782439148700312319">Tento počítač sa nepodarilo zaregistrovať do podnikovej správy.  Prihláste sa pomocou iného účtu Google.</translation>
 <translation id="8440458902131551808">Váš účet bol uzamknutý. Kontaktujte správcu systému.</translation>
 <translation id="8474372283141585908">Poskytovateľ poverení Google</translation>
 <translation id="866458870819756755">Používateľa sa nepodarilo vytvoriť.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_sl.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_sl.xtb
index 7c91e2b..a76d3ce 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_sl.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_sl.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sl">
-<translation id="1296843352074373664">Uporabnik Googla</translation>
 <translation id="1383286653814676580">Uporabljeno za izvajanje strani za prijavo z Googlovim ponudnikom poverilnic.</translation>
-<translation id="1644179990571656190">Novega registriranega uporabnika Googla ni bilo mogoče ustvariti. Ta sistem dovoli ustvarjanje samo enega registriranega uporabnika Googla.</translation>
-<translation id="1813213595719100133">Prijava z računom za Google v tej domeni ni dovoljena. Poskusite z drugim računom.</translation>
-<translation id="195232392645680541">Prijavite se z Google Računom.</translation>
 <translation id="2595469428674600431">Gesla za Windows ni bilo mogoče preveriti. Poskusite znova.</translation>
-<translation id="2620296592151848576">Geslo je bilo spremenjeno v Googlu. Vnesite trenutno geslo za Windows, če želite sinhronizirati račun za Windows z računom za Google.</translation>
-<translation id="3697479376287066058">S tem računom za Google je že registriran drug račun v tem računalniku. Prijavite se z drugim računom za Google.</translation>
 <translation id="4057329986137569701">Prišlo je do notranje napake.</translation>
-<translation id="4128734677223009352">Prijava v Google Račun ni uspela. Preverite, ali je v računalniku vzpostavljena internetna povezava, in poskusite znova.</translation>
-<translation id="4175879131870609567">V sistem se lahko trenutno prijavi samo uporabnik, ki je zaklenil to delovno postajo.</translation>
-<translation id="6613125771987245372">Prijava s tem Google Računom ni dovoljena. Poskusite uporabiti drug račun.</translation>
 <translation id="7357241217513796177">Prepričajte se, da imate omrežno povezavo, in poskusite znova.</translation>
-<translation id="7447167742844823007">Prijavite se z računom za Google</translation>
 <translation id="7463006580194749499">Dodaj osebo</translation>
-<translation id="782439148700312319">Tega računalnika ni mogoče včlaniti za upravljanje v poslovnem okolju.  Prijavite se z drugim računom za Google.</translation>
 <translation id="8440458902131551808">Vaš račun je zaklenjen. Obrnite se na skrbnika sistema.</translation>
 <translation id="8474372283141585908">Googlov ponudnik poverilnic</translation>
 <translation id="866458870819756755">Uporabnika ni bilo mogoče ustvariti.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_sr.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_sr.xtb
index 3f134fb..6e77f3f 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_sr.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_sr.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sr">
-<translation id="1296843352074373664">Google корисник</translation>
 <translation id="1383286653814676580">Користи се за покретање Google Credential Provider странице за пријављивање.</translation>
-<translation id="1644179990571656190">Прављење новог регистрованог Google корисника није успело. Овај систем дозвољава прављење само једног регистрованог Google корисника.</translation>
-<translation id="1813213595719100133">Пријављивање помоћу Google налога на овом домену није дозвољено. Пробајте са другим налогом.</translation>
-<translation id="195232392645680541">Пријавите се помоћу Google налога.</translation>
 <translation id="2595469428674600431">Жао нам је, верификација лозинке за Windows није успела. Пробајте поново.</translation>
-<translation id="2620296592151848576">Лозинка је промењена на Google-у. Унесите актуелну лозинку за Windows да бисте синхронизовали Windows налог са Google налогом.</translation>
-<translation id="3697479376287066058">Други налог на овом рачунару је већ регистрован помоћу овог Google налога. Пријавите се помоћу неког другог Google налога.</translation>
 <translation id="4057329986137569701">Дошло је до интерне грешке.</translation>
-<translation id="4128734677223009352">Пријављивање на Google налог није успело. Проверите да ли рачунар има интернет везу, па пробајте поново.</translation>
-<translation id="4175879131870609567">Само кориснику који је закључао ову радну станицу је тренутно дозвољено пријављивање у систем.</translation>
-<translation id="6613125771987245372">Није дозвољено пријављивање преко овог Google налога. Пробајте са другим налогом.</translation>
 <translation id="7357241217513796177">Уверите се да сте повезани на мрежу и пробајте поново.</translation>
-<translation id="7447167742844823007">Пријавите се помоћу Google налога</translation>
 <translation id="7463006580194749499">Додај особу</translation>
-<translation id="782439148700312319">Регистровање овог рачунара за управљање предузећима није успело.  Пријавите се помоћу неког другог Google налога.</translation>
 <translation id="8440458902131551808">Налог је закључан. Контактирајте администратора система.</translation>
 <translation id="8474372283141585908">Google добављач акредитива</translation>
 <translation id="866458870819756755">Прављење корисника није успело.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_sv.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_sv.xtb
index cd15aa4..3cd01b854 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_sv.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_sv.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sv">
-<translation id="1296843352074373664">Google-användare</translation>
 <translation id="1383286653814676580">Används för att köra inloggningssidan för Google Credential Provider.</translation>
-<translation id="1813213595719100133">Det är inte tillåtet att logga in med Google-konton på den här domänen. Testa med ett annat konto.</translation>
-<translation id="195232392645680541">Logga in med ditt Google-konto.</translation>
 <translation id="2595469428674600431">Det gick inte att verifiera Windows-lösenordet. Försök igen.</translation>
-<translation id="2620296592151848576">Ditt lösenord har ändrats på Google. Ange ditt nuvarande lösenord för Windows för att synkronisera Windows-kontot med Google-kontot.</translation>
-<translation id="3697479376287066058">Ett annat konto på datorn har redan registrerats med det här Google-kontot. Logga in med ett annat Google-konto.</translation>
 <translation id="4057329986137569701">Ett internt fel uppstod.</translation>
-<translation id="4128734677223009352">Det gick inte att logga in på Google-kontot. Kontrollera att datorn är ansluten till internet och försök sedan igen.</translation>
-<translation id="4175879131870609567">Bara den användare som låste arbetsstationen kan logga in i systemet.</translation>
-<translation id="6613125771987245372">Det är inte tillåtet att logga in med det här Google-kontot. Testa med ett annat konto.</translation>
 <translation id="7357241217513796177">Kontrollera nätverksanslutningen och försök igen.</translation>
-<translation id="7447167742844823007">Logga in med ditt Google-konto</translation>
 <translation id="7463006580194749499">Lägg till person</translation>
-<translation id="782439148700312319">Det går inte att registrera datorn för företagshantering.  Logga in med ett annat Google-konto.</translation>
 <translation id="8440458902131551808">Ditt konto har låsts. Kontakta systemadministratören.</translation>
 <translation id="8474372283141585908">Google Credential Provider</translation>
 <translation id="866458870819756755">Det gick inte att skapa en användare.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_sw.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_sw.xtb
index 77b58ee..7ae1caf 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_sw.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_sw.xtb
@@ -1,22 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sw">
-<translation id="1296843352074373664">Mtumiaji wa Google</translation>
 <translation id="1383286653814676580">Inatumika kutekeleza ukurasa wa kuingia katika akaunti ya Mtoa Huduma za Vitambulisho vya Google.</translation>
-<translation id="1644179990571656190">Imeshindwa kuweka mtumiaji mpya wa Google aliyesajiliwa. Mfumo unakuruhusu uweke mtumiaji mmoja pekee aliyesajiliwa na Google.</translation>
-<translation id="1813213595719100133">Huruhusiwi kuingia katika akaunti ukitumia Akaunti za Google kwenye kikoa hiki. Jaribu akaunti tofauti</translation>
-<translation id="195232392645680541">Ingia ukitumia Akaunti yako ya Google</translation>
 <translation id="2595469428674600431">Samahani, tumeshindwa kuthibitisha nenosiri lako la Windows. Tafadhali jaribu tena.</translation>
-<translation id="2620296592151848576">Nenosiri lako limebadilishwa kwenye Google. Tafadhali weka nenosiri lako la sasa la Windows ili usawazishe Akaunti yako ya Windows na Akaunti yako ya Google.</translation>
-<translation id="3697479376287066058">Tayari umesajili akaunti nyingine kwenye kompyuta hii ukitumia Akaunti hii ya Google. Ingia ukitumia Akaunti nyingine ya Google.</translation>
 <translation id="4057329986137569701">Hitilafu ya ndani imetokea.</translation>
-<translation id="4128734677223009352">Imeshindwa kuingia katika Akaunti yako ya Google. Hakikisha kuwa kompyuta ina muunganisho wa Intaneti, kisha ujaribu tena.</translation>
-<translation id="4175879131870609567">Mtumiaji aliyefunga sehemu hii ya kufanyia kazi ndiye kwa sasa anaruhusiwa kuingia katika mfumo pekee.</translation>
-<translation id="6613125771987245372">Huruhusiwi kuingia ukitumia Akaunti hii ya Google. Jaribu akaunti tofauti.</translation>
 <translation id="7357241217513796177">Hakikisha una muunganisho wa mtandao na ujaribu tena.</translation>
-<translation id="7447167742844823007">Ingia katika akaunti ukitumia Akaunti yako ya Google</translation>
 <translation id="7463006580194749499">Ongeza mtumiaji mwingine</translation>
-<translation id="782439148700312319">Imeshindwa kujumuisha kompyuta hii katika udhibiti wa biashara.  Tafadhali ingia ukitumia Akaunti nyingine ya Google.</translation>
 <translation id="8440458902131551808">Akaunti yako imefungwa. Tafadhali wasiliana na msimamizi wa mfumo.</translation>
 <translation id="8474372283141585908">Mtoa Huduma za Vitambulisho vya Google</translation>
 <translation id="866458870819756755">Imeshindwa kuweka mtumiaji.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ta.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ta.xtb
index de12dca..ca807dd8 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ta.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ta.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ta">
-<translation id="1296843352074373664">Google பயனர்</translation>
 <translation id="1383286653814676580">Google அனுமதிச் சான்று வழங்குநர் உள்நுழைவுப் பக்கத்தை இயக்கப் பயன்படுத்தப்படுகிறது.</translation>
-<translation id="1813213595719100133">இந்த டொமைனில் Google கணக்குகள் மூலம் உள்நுழைய அனுமதியில்லை. வேறொரு கணக்கு மூலம் உள்நுழையவும்.</translation>
-<translation id="195232392645680541">Google கணக்கைப் பயன்படுத்தி உள்நுழைக.</translation>
 <translation id="2595469428674600431">உங்கள் Windows கடவுச்சொல்லைச் சரிபார்க்க முடியவில்லை. மீண்டும் முயலவும்.</translation>
-<translation id="2620296592151848576">Googleளில் உங்கள் கடவுச்சொல் மாற்றப்பட்டுள்ளது. உங்கள் Windows கணக்குடன் உங்கள் Google கணக்கை ஒத்திசைக்க, தற்போதைய உங்கள் Windows கடவுச்சொல்லை உள்ளிடவும்.</translation>
-<translation id="3697479376287066058">இந்தக் கம்ப்யூட்டரிலுள்ள வேறொரு கணக்கு ஏற்கனவே இந்த Google கணக்கு மூலம் பதிவுசெய்யப்பட்டுள்ளது. வேறொரு Google கணக்கு மூலம் உள்நுழையவும்.</translation>
 <translation id="4057329986137569701">அகப்பிழை ஏற்பட்டது.</translation>
-<translation id="4128734677223009352">உங்கள் Google கணக்கில் உள்நுழைய முடியவில்லை. கம்ப்யூட்டரில் இணைய இணைப்பு உள்ளதா என்பதைச் சரிபார்த்து, மீண்டும் முயலவும்.</translation>
-<translation id="4175879131870609567">இந்த வொர்க்ஸ்டேஷனைப் பூட்டிய பயனர் மட்டுமே இப்போது சிஸ்டத்தில் உள்நுழைய அனுமதிக்கப்படுவார்.</translation>
-<translation id="6613125771987245372">இந்த Google கணக்கைப் பயன்படுத்தி உள்நுழைய அனுமதியில்லை. வேறொரு கணக்கைப் பயன்படுத்தவும்.</translation>
 <translation id="7357241217513796177">இணைய இணைப்பு இருப்பதை உறுதிசெய்து மீண்டும் முயலவும்.</translation>
-<translation id="7447167742844823007">உங்கள் Google கணக்கைப் பயன்படுத்தி உள்நுழைக</translation>
 <translation id="7463006580194749499">நபரைச் சேர்</translation>
-<translation id="782439148700312319">நிறுவன மேலாண்மைக்கு இந்தக் கம்ப்யூட்டரைப் பதிவுசெய்ய முடியவில்லை.  வேறொரு Google கணக்கு மூலம் உள்நுழையவும்.</translation>
 <translation id="8440458902131551808">உங்கள் கணக்கு பூட்டப்பட்டுள்ளது. சாதன நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation>
 <translation id="8474372283141585908">Google அனுமதிச் சான்று வழங்குநர்</translation>
 <translation id="866458870819756755">பயனரை உருவாக்க முடியவில்லை.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_te.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_te.xtb
index 0858ad5..982b0699 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_te.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_te.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="te">
-<translation id="1296843352074373664">Google వినియోగదారు</translation>
 <translation id="1383286653814676580">Google ఆధారాల ప్రదాత సైన్ ఇన్ పేజీని అమలు చేయడానికి ఉపయోగించబడుతుంది.</translation>
-<translation id="1813213595719100133">ఈ డొమైన్‌లో Google ఖాతాలతో సైన్ ఇన్ చేయడం అనుమతించబడదు. వేరొక ఖాతాతో ప్రయత్నించండి.</translation>
-<translation id="195232392645680541">మీ Google ఖాతాను ఉపయోగించి సైన్ ఇన్ చేయండి.</translation>
 <translation id="2595469428674600431">క్షమించండి, మీ Windows పాస్‌వర్డ్‌ను ధృవీకరించడం సాధ్యపడలేదు. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
-<translation id="2620296592151848576">Googleలో మీ పాస్‌వర్డ్ మార్చబడింది. మీ Windows ఖాతాను మీ Google ఖాతాతో సింక్ చేయడానికి, దయచేసి మీ ప్రస్తుత Windows పాస్‌వర్డ్‌ను నమోదు చేయండి.</translation>
-<translation id="3697479376287066058">ఈ కంప్యూటర్‌లో మరో ఖాతా ఇప్పటికే ఈ Google ఖాతాతో నమోదు చేయబడింది. దయచేసి వేరే Google ఖాతాతో సైన్ ఇన్ చేయండి.</translation>
 <translation id="4057329986137569701">అంతర్గత ఎర్రర్ ఏర్పడింది.</translation>
-<translation id="4128734677223009352">మీ Google ఖాతాకు సైన్ ఇన్ చేయడం విఫలమైంది. కంప్యూటర్‌లో ఇంటర్నెట్ కనెక్షన్ ఉన్నట్లు నిర్ధారించుకున్న తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
-<translation id="4175879131870609567">ప్రస్తుతం ఈ వర్క్‌స్టేషన్‌ను లాక్ చేసిన వినియోగదారు మాత్రమే సిస్టమ్‌కు సైన్ ఇన్ చేయడానికి అనుమతి పొందగలరు.</translation>
-<translation id="6613125771987245372">ఈ Google ఖాతాని ఉపయోగించి సైన్ ఇన్ చేయడానికి అనుమతి లేదు. మరో ఖాతాతో ప్రయత్నించండి.</translation>
 <translation id="7357241217513796177">మీకు నెట్‌వర్క్ కనెక్షన్ ఉందని నిర్ధారించుకుని, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
-<translation id="7447167742844823007">మీ Google ఖాతాను ఉపయోగించి సైన్ ఇన్ చేయండి.</translation>
 <translation id="7463006580194749499">వ్యక్తిని జోడించు</translation>
-<translation id="782439148700312319">ఈ కంప్యూటర్‌ను ఎంటర్‌ప్రైజ్ నిర్వహణ కోసం నమోదు చేయడం సాధ్యపడలేదు.  దయచేసి వేరే Google ఖాతాతో సైన్ ఇన్ చేయండి.</translation>
 <translation id="8440458902131551808">మీ ఖాతా లాక్ చేయబడింది. దయచేసి సిస్టమ్ నిర్వాహకుడిని సంప్రదించండి.</translation>
 <translation id="8474372283141585908">Google ఆధారాల ప్రదాత</translation>
 <translation id="866458870819756755">వినియోగదారుని సృష్టించడం సాధ్యం కాలేదు.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_th.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_th.xtb
index 1d19d76..7f545aa 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_th.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_th.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="th">
-<translation id="1296843352074373664">ผู้ใช้ Google</translation>
 <translation id="1383286653814676580">ใช้เพื่อเรียกใช้หน้าการลงชื่อเข้าใช้ของผู้ให้บริการข้อมูลรับรอง Google</translation>
-<translation id="1813213595719100133">ไม่อนุญาตให้ลงชื่อเข้าใช้ด้วยบัญชี Google บนโดเมนนี้ ลองใช้บัญชีอื่น</translation>
-<translation id="195232392645680541">ลงชื่อเข้าใช้ด้วยบัญชี Google</translation>
 <translation id="2595469428674600431">ขออภัย ยืนยันรหัสผ่าน Windows ไม่ได้ โปรดลองอีกครั้ง</translation>
-<translation id="2620296592151848576">มีการเปลี่ยนรหัสผ่านของคุณใน Google โปรดป้อนรหัสผ่าน Windows ปัจจุบันเพื่อซิงค์บัญชี Windows กับบัญชี Google</translation>
-<translation id="3697479376287066058">บัญชีอื่นในคอมพิวเตอร์เครื่องนี้ลงทะเบียนด้วยบัญชี Google นี้แล้ว โปรดลงชื่อเข้าใช้ด้วยบัญชี Google อื่น</translation>
 <translation id="4057329986137569701">เกิดข้อผิดพลาดภายใน</translation>
-<translation id="4128734677223009352">ลงชื่อเข้าใช้บัญชี Google ไม่สำเร็จ ตรวจสอบว่าคอมพิวเตอร์มีการเชื่อมต่ออินเทอร์เน็ต แล้วลองอีกครั้ง</translation>
-<translation id="4175879131870609567">ขณะนี้มีเฉพาะผู้ใช้ที่ล็อกเวิร์กสเตชันนี้ที่ได้รับอนุญาตให้ลงชื่อเข้าใช้ระบบ</translation>
-<translation id="6613125771987245372">ไม่อนุญาตให้ลงชื่อเข้าใช้ด้วยบัญชี Google นี้ ลองใช้บัญชีอื่น</translation>
 <translation id="7357241217513796177">ตรวจสอบว่าคุณมีการเชื่อมต่อเครือข่าย และลองอีกครั้ง</translation>
-<translation id="7447167742844823007">ลงชื่อเข้าใช้ด้วยบัญชี Google</translation>
 <translation id="7463006580194749499">เพิ่มบุคคล</translation>
-<translation id="782439148700312319">ลงทะเบียนคอมพิวเตอร์เครื่องนี้สำหรับการจัดการองค์กรไม่ได้  โปรดลงชื่อเข้าใช้ด้วยบัญชี Google อื่น</translation>
 <translation id="8440458902131551808">บัญชีของคุณถูกล็อกแล้ว โปรดติดต่อผู้ดูแลระบบ</translation>
 <translation id="8474372283141585908">โปรแกรมการเข้าสู่ระบบโดยใช้บัญชี Google</translation>
 <translation id="866458870819756755">สร้างผู้ใช้ไม่ได้</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_tr.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_tr.xtb
index 0fdfbc4..ec79349 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_tr.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_tr.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="tr">
-<translation id="1296843352074373664">Google kullanıcısı</translation>
 <translation id="1383286653814676580">Google Kimlik Bilgisi Sağlayıcısı oturum açma sayfasını çalıştırmak için kullanılır.</translation>
-<translation id="1813213595719100133">Bu alanda Google Hesabı ile oturum açmaya izin verilmiyor. Farklı bir hesap deneyin.</translation>
-<translation id="195232392645680541">Google Hesabınızı kullanarak oturum açın.</translation>
 <translation id="2595469428674600431">Maalesef Windows şifreniz doğrulanamadı. Lütfen tekrar deneyin.</translation>
-<translation id="2620296592151848576">Google'daki şifreniz değiştirildi. Windows Hesabınızı Google Hesabınızla senkronize etmek için lütfen mevcut Windows şifrenizi girin.</translation>
-<translation id="3697479376287066058">Bu bilgisayardaki başka bir hesap bu Google Hesabı'na zaten kayıtlı. Lütfen farklı bir Google Hesabı ile oturum açın.</translation>
 <translation id="4057329986137569701">Dahili bir hata oluştu.</translation>
-<translation id="4128734677223009352">Google Hesabınızda oturum açılamadı. Bilgisayarın internete bağlı olduğundan emin olun, sonra tekrar deneyin.</translation>
-<translation id="4175879131870609567">Şu anda yalnızca bu iş istasyonunu kilitleyen kullanıcı sistemde oturum açabilir.</translation>
-<translation id="6613125771987245372">Bu Google Hesabı ile oturum açmaya izin verilmiyor. Farklı bir hesapla oturum açmayı deneyin.</translation>
 <translation id="7357241217513796177">Ağ bağlantınız olduğundan emin olup tekrar deneyin.</translation>
-<translation id="7447167742844823007">Google Hesabınızı kullanarak oturum açın</translation>
 <translation id="7463006580194749499">Kişi ekle</translation>
-<translation id="782439148700312319">Bu bilgisayar kurumsal yönetime kaydedilemedi.  Lütfen farklı bir Google Hesabı ile oturum açın.</translation>
 <translation id="8440458902131551808">Hesabınız kilitlendi. Lütfen sistem yöneticisiyle iletişim kurun.</translation>
 <translation id="8474372283141585908">Google Kimlik Bilgisi Sağlayıcısı</translation>
 <translation id="866458870819756755">Kullanıcı oluşturulamadı.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_uk.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_uk.xtb
index 9147970..d71f48e 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_uk.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_uk.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="uk">
-<translation id="1296843352074373664">Користувач Google</translation>
 <translation id="1383286653814676580">Використовується для запуску сторінки входу в Постачальник облікових даних Google.</translation>
-<translation id="1813213595719100133">У цьому домені заборонено входити з даними облікових записів Google. Спробуйте інший обліковий запис.</translation>
-<translation id="195232392645680541">Увійдіть в обліковий запис Google.</translation>
 <translation id="2595469428674600431">Не вдалося підтвердити пароль Windows. Повторіть спробу.</translation>
-<translation id="2620296592151848576">Ваш пароль змінено в Google. Введіть поточний пароль Windows, щоб синхронізувати облікові записи Windows і Google.</translation>
-<translation id="3697479376287066058">На цьому комп’ютері вже зареєстровано інший обліковий запис із такими даними для входу в Google. Увійдіть через інший обліковий запис Google.</translation>
 <translation id="4057329986137569701">Сталася внутрішня помилка.</translation>
-<translation id="4128734677223009352">Не вдалося ввійти в обліковий запис Google. Перевірте інтернет-з’єднання й повторіть спробу.</translation>
-<translation id="4175879131870609567">Наразі входити в систему може лише користувач, який заблокував цю робочу станцію.</translation>
-<translation id="6613125771987245372">Вхід у цей обліковий запис Google заборонено. Спробуйте інший.</translation>
 <translation id="7357241217513796177">Переконайтеся, що з’єднання з мережею встановлено, і повторіть спробу.</translation>
-<translation id="7447167742844823007">Увійдіть через обліковий запис Google</translation>
 <translation id="7463006580194749499">Додати користувача</translation>
-<translation id="782439148700312319">Не вдалося зареєструвати цей комп’ютер для корпоративного керування.  Увійдіть в інший обліковий запис Google.</translation>
 <translation id="8440458902131551808">Ваш обліковий запис заблоковано. Зв’яжіться із системним адміністратором.</translation>
 <translation id="8474372283141585908">Постачальник облікових даних Google</translation>
 <translation id="866458870819756755">Не вдалося створити користувача.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_vi.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_vi.xtb
index f799300..83382f7 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_vi.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_vi.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="vi">
-<translation id="1296843352074373664">Người dùng Google</translation>
 <translation id="1383286653814676580">Dùng để chạy trang đăng nhập vào Nhà cung cấp chứng chỉ Google.</translation>
-<translation id="1813213595719100133">Bạn không được phép đăng nhập bằng Tài khoản Google trên miền này. Hãy thử một tài khoản khác.</translation>
-<translation id="195232392645680541">Đăng nhập bằng Tài khoản Google của bạn.</translation>
 <translation id="2595469428674600431">Rất tiếc, chúng tôi không thể xác minh được mật khẩu Windows của bạn. Vui lòng thử lại.</translation>
-<translation id="2620296592151848576">Mật khẩu của bạn đã thay đổi trên Google. Vui lòng nhập mật khẩu Windows hiện tại của bạn để đồng bộ hóa Tài khoản Windows với Tài khoản Google của bạn.</translation>
-<translation id="3697479376287066058">Bạn đã sử dụng Tài khoản Google này để đăng ký một tài khoản khác trên máy tính này. Vui lòng đăng nhập bằng một Tài khoản Google khác.</translation>
 <translation id="4057329986137569701">Đã xảy ra lỗi nội bộ.</translation>
-<translation id="4128734677223009352">Không đăng nhập được vào Tài khoản Google của bạn. Hãy đảm bảo rằng máy tính này đã kết nối Internet rồi thử lại.</translation>
-<translation id="4175879131870609567">Hiện tại, chỉ người dùng đã khóa máy trạm này mới được phép đăng nhập vào hệ thống.</translation>
-<translation id="6613125771987245372">Bạn không được phép đăng nhập bằng Tài khoản Google này. Hãy thử tài khoản khác.</translation>
 <translation id="7357241217513796177">Hãy đảm bảo bạn có kết nối mạng rồi thử lại.</translation>
-<translation id="7447167742844823007">Đăng nhập bằng Tài khoản Google của bạn</translation>
 <translation id="7463006580194749499">Thêm người</translation>
-<translation id="782439148700312319">Không thể đăng ký dịch vụ quản lý doanh nghiệp cho máy tính này.  Vui lòng đăng nhập bằng một Tài khoản Google khác.</translation>
 <translation id="8440458902131551808">Tài khoản của bạn đã bị khóa. Vui lòng liên hệ với quản trị viên hệ thống.</translation>
 <translation id="8474372283141585908">Nhà cung cấp chứng chỉ Google</translation>
 <translation id="866458870819756755">Không thể tạo người dùng.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-CN.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-CN.xtb
index f822be6..a7ec9bc 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-CN.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-CN.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="zh-CN">
-<translation id="1296843352074373664">Google 用户</translation>
 <translation id="1383286653814676580">用于运行 Google Credential Provider 登录页面。</translation>
-<translation id="1813213595719100133">此网域不允许使用 Google 帐号登录。请尝试改用其他帐号。</translation>
-<translation id="195232392645680541">使用您的 Google 帐号登录。</translation>
 <translation id="2595469428674600431">抱歉,无法验证您的 Windows 密码。请重试。</translation>
-<translation id="2620296592151848576">您在 Google 上使用的密码已更改。请输入您目前使用的 Windows 密码,以便将您的 Windows 帐号与 Google 帐号同步。</translation>
-<translation id="3697479376287066058">这台计算机上的另一帐号已使用此 Google 帐号注册。请改用其他 Google 帐号登录。</translation>
 <translation id="4057329986137569701">发生了内部错误。</translation>
-<translation id="4128734677223009352">未能成功登录您的 Google 帐号。请确保计算机已连接到互联网,然后重试。</translation>
-<translation id="4175879131870609567">目前,只允许那个锁定了此工作站的用户登录该系统。</translation>
-<translation id="6613125771987245372">不允许使用此 Google 帐号登录。请尝试改用其他帐号。</translation>
 <translation id="7357241217513796177">请确保您已连接到网络,然后重试。</translation>
-<translation id="7447167742844823007">使用您的 Google 帐号登录</translation>
 <translation id="7463006580194749499">添加用户</translation>
-<translation id="782439148700312319">无法为此计算机进行企业管理注册。请改用一个不同的 Google 帐号登录。</translation>
 <translation id="8440458902131551808">您的帐号已被锁定。请与系统管理员联系。</translation>
 <translation id="8474372283141585908">Google Credential Provider</translation>
 <translation id="866458870819756755">无法创建用户。</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-TW.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-TW.xtb
index fc80d586..2e8f883 100644
--- a/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-TW.xtb
+++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_zh-TW.xtb
@@ -1,21 +1,11 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="zh-TW">
-<translation id="1296843352074373664">Google 使用者</translation>
 <translation id="1383286653814676580">用於執行 Google 憑證提供者登入頁面。</translation>
-<translation id="1813213595719100133">系統不允許使用這個網域的 Google 帳戶登入。請改用其他帳戶。</translation>
-<translation id="195232392645680541">使用你的 Google 帳戶登入。</translation>
 <translation id="2595469428674600431">很抱歉,我們無法驗證你的 Windows 密碼,請再試一次。</translation>
-<translation id="2620296592151848576">你的 Google 密碼已變更。請輸入你目前的 Windows 密碼,以便為你的 Windows 帳戶和 Google 帳戶進行同步處理。</translation>
-<translation id="3697479376287066058">電腦上有另一個帳戶已註冊這個 Google 帳戶。請改用其他 Google 帳戶登入。</translation>
 <translation id="4057329986137569701">發生內部錯誤。</translation>
-<translation id="4128734677223009352">Google 帳戶登入失敗。請確認電腦已連上網際網路,然後再試一次。</translation>
-<translation id="4175879131870609567">目前只有鎖定這個工作站的使用者才能登入系統。</translation>
-<translation id="6613125771987245372">無法使用這個 Google 帳戶登入。請嘗試使用其他帳戶。</translation>
 <translation id="7357241217513796177">請確認你已連上網路,然後再試一次。</translation>
-<translation id="7447167742844823007">使用你的 Google 帳戶登入</translation>
 <translation id="7463006580194749499">新增使用者</translation>
-<translation id="782439148700312319">無法為這部電腦註冊企業管理服務。請改用其他 Google 帳戶登入。</translation>
 <translation id="8440458902131551808">你的帳戶已遭鎖定。請與系統管理員聯絡。</translation>
 <translation id="8474372283141585908">Google 憑證提供者</translation>
 <translation id="866458870819756755">無法建立使用者。</translation>
diff --git a/chrome/renderer/resources/extensions/automation_custom_bindings.js b/chrome/renderer/resources/extensions/automation_custom_bindings.js
index 1569aa11..e2d41e6 100644
--- a/chrome/renderer/resources/extensions/automation_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/automation_custom_bindings.js
@@ -5,7 +5,6 @@
 // Custom bindings for the automation API.
 var AutomationNode = require('automationNode').AutomationNode;
 var AutomationRootNode = require('automationNode').AutomationRootNode;
-var automation = apiBridge || require('binding').Binding.create('automation');
 var automationInternal =
     getInternalApi ?
         getInternalApi('automationInternal') :
@@ -105,7 +104,7 @@
   automationUtil.focusedNode = focus ? focus.root : null;
 };
 
-automation.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   // TODO(aboxhall, dtseng): Make this return the speced AutomationRootNode obj.
@@ -361,6 +360,3 @@
     return;
   privates(targetTree).impl.onGetTextLocationResult(textLocationParams);
 });
-
-if (!apiBridge)
-  exports.$set('binding', automation.generate());
diff --git a/chrome/renderer/resources/extensions/browser_action_custom_bindings.js b/chrome/renderer/resources/extensions/browser_action_custom_bindings.js
index e844f734..70a96c8 100644
--- a/chrome/renderer/resources/extensions/browser_action_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/browser_action_custom_bindings.js
@@ -4,8 +4,6 @@
 
 // Custom binding for the browserAction API.
 
-var binding = apiBridge || require('binding').Binding.create('browserAction');
-
 var setIcon = require('setIcon').setIcon;
 var getExtensionViews = requireNative('runtime').GetExtensionViews;
 var sendRequest = bindingUtil ?
@@ -18,7 +16,7 @@
       bindingUtil.hasLastError() : jsLastError.hasError(chrome);
 }
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   apiFunctions.setHandleRequest('setIcon', function(details, callback) {
@@ -43,6 +41,3 @@
     }
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/cast_streaming_receiver_session_custom_bindings.js b/chrome/renderer/resources/extensions/cast_streaming_receiver_session_custom_bindings.js
index 3dadf0e..64c5370 100644
--- a/chrome/renderer/resources/extensions/cast_streaming_receiver_session_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/cast_streaming_receiver_session_custom_bindings.js
@@ -4,18 +4,12 @@
 
 // Custom binding for the Cast Streaming Session API.
 
-var binding =
-    apiBridge ||
-    require('binding').Binding.create('cast.streaming.receiverSession');
 var natives = requireNative('cast_streaming_natives');
 
-binding.registerCustomHook(function(bindingsAPI, extensionId) {
+apiBridge.registerCustomHook(function(bindingsAPI, extensionId) {
   var apiFunctions = bindingsAPI.apiFunctions;
   apiFunctions.setHandleRequest(
       'createAndBind',
       function(ap, vp, local, weidgth, height, fr, url, cb, op) {
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/cast_streaming_rtp_stream_custom_bindings.js b/chrome/renderer/resources/extensions/cast_streaming_rtp_stream_custom_bindings.js
index 17ac6a5..8e4f312 100644
--- a/chrome/renderer/resources/extensions/cast_streaming_rtp_stream_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/cast_streaming_rtp_stream_custom_bindings.js
@@ -4,11 +4,9 @@
 
 // Custom binding for the Cast Streaming RtpStream API.
 
-var binding = apiBridge ||
-              require('binding').Binding.create('cast.streaming.rtpStream');
 var natives = requireNative('cast_streaming_natives');
 
-binding.registerCustomHook(function(bindingsAPI, extensionId) {
+apiBridge.registerCustomHook(function(bindingsAPI, extensionId) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   apiFunctions.setHandleRequest('destroy',
@@ -40,6 +38,3 @@
         natives.GetStats(transportId, callback);
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/cast_streaming_session_custom_bindings.js b/chrome/renderer/resources/extensions/cast_streaming_session_custom_bindings.js
index 3277edc..05afdd6 100644
--- a/chrome/renderer/resources/extensions/cast_streaming_session_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/cast_streaming_session_custom_bindings.js
@@ -4,17 +4,12 @@
 
 // Custom binding for the Cast Streaming Session API.
 
-var binding = apiBridge ||
-              require('binding').Binding.create('cast.streaming.session');
 var natives = requireNative('cast_streaming_natives');
 
-binding.registerCustomHook(function(bindingsAPI, extensionId) {
+apiBridge.registerCustomHook(function(bindingsAPI, extensionId) {
   var apiFunctions = bindingsAPI.apiFunctions;
   apiFunctions.setHandleRequest('create',
       function(audioTrack, videoTrack, callback) {
         natives.CreateSession(audioTrack, videoTrack, callback);
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/cast_streaming_udp_transport_custom_bindings.js b/chrome/renderer/resources/extensions/cast_streaming_udp_transport_custom_bindings.js
index 0ec5990..c3f64736 100644
--- a/chrome/renderer/resources/extensions/cast_streaming_udp_transport_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/cast_streaming_udp_transport_custom_bindings.js
@@ -4,11 +4,9 @@
 
 // Custom binding for the Cast Streaming UdpTransport API.
 
-var binding = apiBridge ||
-              require('binding').Binding.create('cast.streaming.udpTransport');
 var natives = requireNative('cast_streaming_natives');
 
-binding.registerCustomHook(function(bindingsAPI, extensionId) {
+apiBridge.registerCustomHook(function(bindingsAPI, extensionId) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   apiFunctions.setHandleRequest('destroy', function(transportId) {
@@ -23,6 +21,3 @@
       natives.SetOptionsCastUdpTransport(transportId, options);
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/certificate_provider_custom_bindings.js b/chrome/renderer/resources/extensions/certificate_provider_custom_bindings.js
index 0d00190..33d94f75 100644
--- a/chrome/renderer/resources/extensions/certificate_provider_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/certificate_provider_custom_bindings.js
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-var binding =
-    apiBridge || require('binding').Binding.create('certificateProvider');
 var certificateProviderInternal =
     getInternalApi ?
         getInternalApi('certificateProviderInternal') :
@@ -93,6 +91,3 @@
 
 handleEvent('onSignDigestRequested',
             certificateProviderInternal.reportSignature);
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/declarative_content_custom_bindings.js b/chrome/renderer/resources/extensions/declarative_content_custom_bindings.js
index 7dc18f57..36e3c19 100644
--- a/chrome/renderer/resources/extensions/declarative_content_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/declarative_content_custom_bindings.js
@@ -4,9 +4,6 @@
 
 // Custom binding for the declarativeContent API.
 
-var binding =
-    apiBridge || require('binding').Binding.create('declarativeContent');
-
 if (!apiBridge) {
   var utils = require('utils');
   var validate = require('schemaUtils').validate;
@@ -16,7 +13,7 @@
 
 var setIcon = require('setIcon').setIcon;
 
-binding.registerCustomHook(function(api) {
+apiBridge.registerCustomHook(function(api) {
   var declarativeContent = api.compiledApi;
 
   if (apiBridge) {
@@ -103,6 +100,3 @@
     }, this));
   };
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/desktop_capture_custom_bindings.js b/chrome/renderer/resources/extensions/desktop_capture_custom_bindings.js
index 19e9e8b..3e5d04c6 100644
--- a/chrome/renderer/resources/extensions/desktop_capture_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/desktop_capture_custom_bindings.js
@@ -4,13 +4,12 @@
 
 // Custom binding for the desktopCapture API.
 
-var binding = apiBridge || require('binding').Binding.create('desktopCapture');
 var sendRequest = bindingUtil ?
     $Function.bind(bindingUtil.sendRequest, bindingUtil) :
     require('sendRequest').sendRequest;
 var idGenerator = requireNative('id_generator');
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   var pendingRequests = {};
@@ -49,6 +48,3 @@
     }
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/developer_private_custom_bindings.js b/chrome/renderer/resources/extensions/developer_private_custom_bindings.js
index 6ad77d12..3e60a45 100644
--- a/chrome/renderer/resources/extensions/developer_private_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/developer_private_custom_bindings.js
@@ -4,10 +4,7 @@
 
 // Custom binding for the developerPrivate API.
 
-var binding =
-    apiBridge || require('binding').Binding.create('developerPrivate');
-
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   // Converts the argument of |functionName| from DirectoryEntry to URL.
@@ -60,6 +57,3 @@
     }, callback);
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/downloads_custom_bindings.js b/chrome/renderer/resources/extensions/downloads_custom_bindings.js
index 2393285..5609194 100644
--- a/chrome/renderer/resources/extensions/downloads_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/downloads_custom_bindings.js
@@ -4,7 +4,6 @@
 
 // Custom bindings for the downloads API.
 
-var binding = apiBridge || require('binding').Binding.create('downloads');
 var downloadsInternal =
     getInternalApi ?
         getInternalApi('downloadsInternal') :
@@ -66,6 +65,3 @@
     throw e;
   }
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/enterprise_platform_keys_custom_bindings.js b/chrome/renderer/resources/extensions/enterprise_platform_keys_custom_bindings.js
index bf7433b..83dab91 100644
--- a/chrome/renderer/resources/extensions/enterprise_platform_keys_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/enterprise_platform_keys_custom_bindings.js
@@ -14,12 +14,10 @@
 // wrapper.
 // The Token object holds the token id and the SubtleCrypto member.
 
-var binding =
-    apiBridge || require('binding').Binding.create('enterprise.platformKeys');
 var Token = require('enterprise.platformKeys.Token').Token;
 var internalAPI = require('enterprise.platformKeys.internalAPI');
 
-binding.registerCustomHook(function(api) {
+apiBridge.registerCustomHook(function(api) {
   var apiFunctions = api.apiFunctions;
 
   var ret = apiFunctions.setHandleRequest('getTokens', function(callback) {
@@ -29,6 +27,3 @@
     });
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/file_browser_handler_custom_bindings.js b/chrome/renderer/resources/extensions/file_browser_handler_custom_bindings.js
index f4a5aaa..7b24b7e 100644
--- a/chrome/renderer/resources/extensions/file_browser_handler_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/file_browser_handler_custom_bindings.js
@@ -4,9 +4,6 @@
 
 // Custom binding for the fileBrowserHandler API.
 
-var binding =
-    apiBridge || require('binding').Binding.create('fileBrowserHandler');
-
 var registerArgumentMassager = bindingUtil ?
     $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) :
     require('event_bindings').registerArgumentMassager;
@@ -37,7 +34,7 @@
   dispatch(args);
 });
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   apiFunctions.setHandleRequest('selectFile',
@@ -59,6 +56,3 @@
         selectionParams, $Function.bind(internalCallback, null, callback));
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js b/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js
index 5399e46..52c7b095 100644
--- a/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js
@@ -5,8 +5,6 @@
 // Custom binding for the fileManagerPrivate API.
 
 // Bindings
-var binding =
-    apiBridge || require('binding').Binding.create('fileManagerPrivate');
 var registerArgumentMassager = bindingUtil ?
     $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) :
     require('event_bindings').registerArgumentMassager;
@@ -23,7 +21,7 @@
 var GetFileSystem = fileManagerPrivateNatives.GetFileSystem;
 var GetExternalFileEntry = fileManagerPrivateNatives.GetExternalFileEntry;
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   // For FilesAppEntry types that wraps a native entry, returns the native entry
   // to be able to send to fileManagerPrivate API.
   function getEntryURL(entry) {
@@ -289,6 +287,3 @@
   }
   dispatch(args);
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/file_system_provider_custom_bindings.js b/chrome/renderer/resources/extensions/file_system_provider_custom_bindings.js
index b75136d..953d2a0 100644
--- a/chrome/renderer/resources/extensions/file_system_provider_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/file_system_provider_custom_bindings.js
@@ -4,8 +4,6 @@
 
 // Custom binding for the fileSystemProvider API.
 
-var binding =
-    apiBridge || require('binding').Binding.create('fileSystemProvider');
 var fileSystemProviderInternal =
     getInternalApi ?
         getInternalApi('fileSystemProviderInternal') :
@@ -382,6 +380,3 @@
       }
       dispatch([onSuccessCallback, onErrorCallback]);
     });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/gcm_custom_bindings.js b/chrome/renderer/resources/extensions/gcm_custom_bindings.js
index d901c23e..5d1f3be 100644
--- a/chrome/renderer/resources/extensions/gcm_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/gcm_custom_bindings.js
@@ -4,10 +4,9 @@
 
 // Custom binding for the GCM API.
 
-var binding = apiBridge || require('binding').Binding.create('gcm');
 var forEach = require('utils').forEach;
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
   var gcm = bindingsAPI.compiledApi;
 
@@ -40,6 +39,3 @@
       return arguments;
     });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/identity_custom_bindings.js b/chrome/renderer/resources/extensions/identity_custom_bindings.js
index 952e1e14..dcb6f75a 100644
--- a/chrome/renderer/resources/extensions/identity_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/identity_custom_bindings.js
@@ -4,9 +4,7 @@
 
 // Custom binding for the Identity API.
 
-var binding = apiBridge || require('binding').Binding.create('identity');
-
-binding.registerCustomHook(function(binding, id, contextType) {
+apiBridge.registerCustomHook(function(binding, id, contextType) {
   var apiFunctions = binding.apiFunctions;
 
   apiFunctions.setHandleRequest('getRedirectURL', function(path) {
@@ -19,6 +17,3 @@
     return 'https://' + id + '.chromiumapp.org' + path;
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/image_writer_private_custom_bindings.js b/chrome/renderer/resources/extensions/image_writer_private_custom_bindings.js
index 7af5e6a..3516de74 100644
--- a/chrome/renderer/resources/extensions/image_writer_private_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/image_writer_private_custom_bindings.js
@@ -4,10 +4,7 @@
 
 // Custom binding for the image writer private API.
 
-var binding =
-    apiBridge || require('binding').Binding.create('imageWriterPrivate');
-
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   apiFunctions.setUpdateArgumentsPostValidate(
@@ -17,6 +14,3 @@
     return [device, fileSystemName, relativePath, callback];
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/input.ime_custom_bindings.js b/chrome/renderer/resources/extensions/input.ime_custom_bindings.js
index 3ad1e5e..3a75ed5 100644
--- a/chrome/renderer/resources/extensions/input.ime_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/input.ime_custom_bindings.js
@@ -5,7 +5,6 @@
 // Custom binding for the input ime API. Only injected into the
 // v8 contexts for extensions which have permission for the API.
 
-var binding = apiBridge || require('binding').Binding.create('input.ime');
 var appWindowNatives = requireNative('app_window_natives');
 var registerArgumentMassager = bindingUtil ?
     $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) :
@@ -33,7 +32,7 @@
   }
 });
 
-binding.registerCustomHook(function(api) {
+apiBridge.registerCustomHook(function(api) {
   keyEventHandled = api.compiledApi.keyEventHandled;
 
   // TODO(shuchen): override onKeyEvent.addListener only for compatibility.
@@ -58,6 +57,3 @@
     callback(view);
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/media_galleries_custom_bindings.js b/chrome/renderer/resources/extensions/media_galleries_custom_bindings.js
index 4316bd2..ca92ca2c 100644
--- a/chrome/renderer/resources/extensions/media_galleries_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/media_galleries_custom_bindings.js
@@ -4,7 +4,6 @@
 
 // Custom binding for the Media Gallery API.
 
-var binding = apiBridge || require('binding').Binding.create('mediaGalleries');
 var blobNatives = requireNative('blob_natives');
 var mediaGalleriesNatives = requireNative('mediaGalleries');
 var sendRequest = bindingUtil ?
@@ -30,7 +29,7 @@
   return result;
 }
 
-binding.registerCustomHook(function(bindingsAPI, extensionId) {
+apiBridge.registerCustomHook(function(bindingsAPI, extensionId) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   // getMediaFileSystems and addUserSelectedFolder use a custom callback so that
@@ -107,6 +106,3 @@
                 bindingUtil ? undefined : this.definition.parameters, optArgs);
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/notifications_custom_bindings.js b/chrome/renderer/resources/extensions/notifications_custom_bindings.js
index 40686a1..94d773a7 100644
--- a/chrome/renderer/resources/extensions/notifications_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/notifications_custom_bindings.js
@@ -4,8 +4,6 @@
 
 // Custom bindings for the notifications API.
 //
-var binding = apiBridge || require('binding').Binding.create('notifications');
-
 var sendRequest = bindingUtil ?
     $Function.bind(bindingUtil.sendRequest, bindingUtil) :
     require('sendRequest').sendRequest;
@@ -154,7 +152,4 @@
   apiFunctions.setHandleRequest('update', handleUpdate);
 };
 
-binding.registerCustomHook(notificationsCustomHook);
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
+apiBridge.registerCustomHook(notificationsCustomHook);
diff --git a/chrome/renderer/resources/extensions/notifications_test_util.js b/chrome/renderer/resources/extensions/notifications_test_util.js
index 3e94c17..8183283d 100644
--- a/chrome/renderer/resources/extensions/notifications_test_util.js
+++ b/chrome/renderer/resources/extensions/notifications_test_util.js
@@ -5,21 +5,13 @@
 // NotificationsTestUtil contains stubs for the global classes and
 // variables used by notifications_custom_bindings.js that are not
 // available with gtestjs tests.
-var apiBridge = undefined;
+var apiBridge = {
+  registerCustomHook: function() {},
+};
 var bindingUtil = undefined;
 
 var require = function(library) {
   return {
-    binding: {
-      'Binding': {
-        'create': function () {
-          return {
-            registerCustomHook: function () {},
-            generate: function () {}
-          };
-        }
-      }
-    },
     lastError: {
       run: function() {}
     },
diff --git a/chrome/renderer/resources/extensions/omnibox_custom_bindings.js b/chrome/renderer/resources/extensions/omnibox_custom_bindings.js
index 77bba30..6e1815a 100644
--- a/chrome/renderer/resources/extensions/omnibox_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/omnibox_custom_bindings.js
@@ -5,8 +5,6 @@
 // Custom binding for the omnibox API. Only injected into the v8 contexts
 // for extensions which have permission for the omnibox API.
 
-var binding = apiBridge || require('binding').Binding.create('omnibox');
-
 var registerArgumentMassager = bindingUtil ?
     $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) :
     require('event_bindings').registerArgumentMassager;
@@ -86,7 +84,7 @@
   return result;
 }
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   apiFunctions.setUpdateArgumentsPreValidate('setDefaultSuggestion',
@@ -127,6 +125,3 @@
   };
   dispatch([text, suggestCallback]);
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/page_action_custom_bindings.js b/chrome/renderer/resources/extensions/page_action_custom_bindings.js
index 0034953..05d2fc303 100644
--- a/chrome/renderer/resources/extensions/page_action_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/page_action_custom_bindings.js
@@ -4,13 +4,12 @@
 
 // Custom binding for the pageAction API.
 
-var binding = apiBridge || require('binding').Binding.create('pageAction');
 var setIcon = require('setIcon').setIcon;
 var sendRequest = bindingUtil ?
     $Function.bind(bindingUtil.sendRequest, bindingUtil) :
     require('sendRequest').sendRequest;
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   apiFunctions.setHandleRequest('setIcon', function(details, callback) {
@@ -21,6 +20,3 @@
     }, this));
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/page_capture_custom_bindings.js b/chrome/renderer/resources/extensions/page_capture_custom_bindings.js
index f27147d..b148b04 100644
--- a/chrome/renderer/resources/extensions/page_capture_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/page_capture_custom_bindings.js
@@ -4,14 +4,12 @@
 
 // Custom binding for the pageCapture API.
 
-var binding = apiBridge || require('binding').Binding.create('pageCapture');
-
 var handleUncaughtException = require('uncaught_exception_handler').handle;
 var pageCaptureNatives = requireNative('page_capture');
 var CreateBlob = pageCaptureNatives.CreateBlob;
 var SendResponseAck = pageCaptureNatives.SendResponseAck;
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   apiFunctions.setCustomCallback('saveAsMHTML',
@@ -31,6 +29,3 @@
     }
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/platform_keys_custom_bindings.js b/chrome/renderer/resources/extensions/platform_keys_custom_bindings.js
index 3f06def..70faf9b 100644
--- a/chrome/renderer/resources/extensions/platform_keys_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/platform_keys_custom_bindings.js
@@ -4,7 +4,6 @@
 
 // Custom binding for the platformKeys API.
 
-var binding = apiBridge || require('binding').Binding.create('platformKeys');
 var SubtleCrypto = require('platformKeys.SubtleCrypto').SubtleCrypto;
 var getPublicKey = require('platformKeys.getPublicKey').getPublicKey;
 var internalAPI = require('platformKeys.internalAPI');
@@ -24,7 +23,7 @@
                  false /* not extractable */);
 }
 
-binding.registerCustomHook(function(api) {
+apiBridge.registerCustomHook(function(api) {
   var apiFunctions = api.apiFunctions;
   var subtleCrypto = new SubtleCrypto('' /* tokenId */);
 
@@ -62,6 +61,3 @@
         });
       });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/sync_file_system_custom_bindings.js b/chrome/renderer/resources/extensions/sync_file_system_custom_bindings.js
index 5f30f19f..586cd573 100644
--- a/chrome/renderer/resources/extensions/sync_file_system_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/sync_file_system_custom_bindings.js
@@ -4,9 +4,6 @@
 
 // Custom binding for the syncFileSystem API.
 
-var binding =
-    apiBridge || require('binding').Binding.create('syncFileSystem');
-
 var registerArgumentMassager = bindingUtil ?
     $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) :
     require('event_bindings').registerArgumentMassager;
@@ -14,7 +11,7 @@
 var fileSystemNatives = requireNative('file_system_natives');
 var syncFileSystemNatives = requireNative('sync_file_system');
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   // Functions which take in an [instanceOf=FileEntry].
@@ -107,6 +104,3 @@
   }
   dispatch([fileInfo]);
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/system_indicator_custom_bindings.js b/chrome/renderer/resources/extensions/system_indicator_custom_bindings.js
index 23e3e2d..d051a57 100644
--- a/chrome/renderer/resources/extensions/system_indicator_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/system_indicator_custom_bindings.js
@@ -6,15 +6,12 @@
 // TODO(dewittj) Refactor custom binding to reduce redundancy between the
 // extension action APIs.
 
-var binding =
-    apiBridge || require('binding').Binding.create('systemIndicator');
-
 var setIcon = require('setIcon').setIcon;
 var sendRequest = bindingUtil ?
     $Function.bind(bindingUtil.sendRequest, bindingUtil) :
     require('sendRequest').sendRequest;
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   apiFunctions.setHandleRequest('setIcon', function(details, callback) {
@@ -25,6 +22,3 @@
     }, this));
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/tab_capture_custom_bindings.js b/chrome/renderer/resources/extensions/tab_capture_custom_bindings.js
index 0f7b80d..dd44544 100644
--- a/chrome/renderer/resources/extensions/tab_capture_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/tab_capture_custom_bindings.js
@@ -4,8 +4,6 @@
 
 // Custom binding for the Tab Capture API.
 
-var binding = apiBridge || require('binding').Binding.create('tabCapture');
-
 var jsLastError = bindingUtil ? undefined : require('lastError');
 function runCallbackWithLastError(name, message, stack, callback, args) {
   if (bindingUtil) {
@@ -17,7 +15,7 @@
   }
 }
 
-binding.registerCustomHook(function(bindingsAPI, extensionId) {
+apiBridge.registerCustomHook(function(bindingsAPI, extensionId) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   function proxyToGetUserMedia(name, request, callback, response) {
@@ -68,6 +66,3 @@
   apiFunctions.setCustomCallback('capture', proxyToGetUserMedia);
   apiFunctions.setCustomCallback('captureOffscreenTab', proxyToGetUserMedia);
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/terminal_private_custom_bindings.js b/chrome/renderer/resources/extensions/terminal_private_custom_bindings.js
index fba3f96..dc592eb 100644
--- a/chrome/renderer/resources/extensions/terminal_private_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/terminal_private_custom_bindings.js
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-var binding = apiBridge || require('binding').Binding.create('terminalPrivate');
 var registerArgumentMassager = bindingUtil ?
     $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) :
     require('event_bindings').registerArgumentMassager;
@@ -19,6 +18,3 @@
     chrome.terminalPrivate.ackOutput(tabId, terminalId);
   }
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/tts_custom_bindings.js b/chrome/renderer/resources/extensions/tts_custom_bindings.js
index 2bc4166a..a0f4a3d 100644
--- a/chrome/renderer/resources/extensions/tts_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/tts_custom_bindings.js
@@ -4,15 +4,13 @@
 
 // Custom binding for the tts API.
 
-var binding = apiBridge || require('binding').Binding.create('tts');
-
 var idGenerator = requireNative('id_generator');
 var sendRequest = bindingUtil ?
     $Function.bind(bindingUtil.sendRequest, bindingUtil) :
     require('sendRequest').sendRequest;
 var lazyBG = requireNative('lazy_background_page');
 
-binding.registerCustomHook(function(api) {
+apiBridge.registerCustomHook(function(api) {
   var apiFunctions = api.apiFunctions;
   var tts = api.compiledApi;
   var handlers = {};
@@ -66,6 +64,3 @@
     return id;
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/tts_engine_custom_bindings.js b/chrome/renderer/resources/extensions/tts_engine_custom_bindings.js
index 486bdc98..3713092 100644
--- a/chrome/renderer/resources/extensions/tts_engine_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/tts_engine_custom_bindings.js
@@ -4,7 +4,6 @@
 
 // Custom binding for the ttsEngine API.
 
-var binding = apiBridge || require('binding').Binding.create('ttsEngine');
 var registerArgumentMassager = bindingUtil ?
     $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) :
     require('event_bindings').registerArgumentMassager;
@@ -22,7 +21,7 @@
   dispatch([text, options, sendTtsEvent]);
 });
 
-binding.registerCustomHook(function(api) {
+apiBridge.registerCustomHook(function(api) {
   // Provide a warning if deprecated parameters are used.
   api.apiFunctions.setHandleRequest('updateVoices', function(voices) {
     for (var i = 0; i < voices.length; i++) {
@@ -39,6 +38,3 @@
         bindingUtil ? undefined : this.definition.parameters, undefined);
   });
 }.bind(this));
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/web_view/chrome_web_view_internal_custom_bindings.js b/chrome/renderer/resources/extensions/web_view/chrome_web_view_internal_custom_bindings.js
index 3cc2e3d..46c6f4e 100644
--- a/chrome/renderer/resources/extensions/web_view/chrome_web_view_internal_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/web_view/chrome_web_view_internal_custom_bindings.js
@@ -2,11 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-var binding = apiBridge ||
-              require('binding').Binding.create('chromeWebViewInternal');
 var contextMenusHandlers = require('contextMenusHandlers');
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   var handlers = contextMenusHandlers.create(true /* isWebview */);
@@ -23,6 +21,3 @@
   apiFunctions.setHandleRequest(
       'contextMenusRemoveAll', handlers.requestHandlers.removeAll);
 });
-
-if (!apiBridge)
-  exports.$set('ChromeWebView', binding.generate());
diff --git a/chrome/renderer/resources/extensions/webrtc_desktop_capture_private_custom_bindings.js b/chrome/renderer/resources/extensions/webrtc_desktop_capture_private_custom_bindings.js
index 47455af..846cf8a8 100644
--- a/chrome/renderer/resources/extensions/webrtc_desktop_capture_private_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/webrtc_desktop_capture_private_custom_bindings.js
@@ -4,14 +4,12 @@
 
 // Custom binding for the webrtcDesktopCapturePrivate API.
 
-var binding = apiBridge ||
-              require('binding').Binding.create('webrtcDesktopCapturePrivate');
 var sendRequest = bindingUtil ?
     $Function.bind(bindingUtil.sendRequest, bindingUtil) :
     require('sendRequest').sendRequest;
 var idGenerator = requireNative('id_generator');
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   var pendingRequests = {};
@@ -45,6 +43,3 @@
     }
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/resources/extensions/webrtc_logging_private_custom_bindings.js b/chrome/renderer/resources/extensions/webrtc_logging_private_custom_bindings.js
index dd09c088..02c78aa 100644
--- a/chrome/renderer/resources/extensions/webrtc_logging_private_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/webrtc_logging_private_custom_bindings.js
@@ -4,17 +4,11 @@
 
 // Custom binding for the webrtcLoggingPrivate API.
 
-var binding = apiBridge ||
-              require('binding').Binding.create('webrtcLoggingPrivate');
-
 var getBindDirectoryEntryCallback =
     require('fileEntryBindingUtil').getBindDirectoryEntryCallback;
 
-binding.registerCustomHook(function(binding, id, contextType) {
+apiBridge.registerCustomHook(function(binding, id, contextType) {
   var apiFunctions = binding.apiFunctions;
   apiFunctions.setCustomCallback('getLogsDirectory',
                                  getBindDirectoryEntryCallback());
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index eef65e5..7fb3a19 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1040,6 +1040,7 @@
       "../browser/ui/webui/inspect_ui_browsertest.cc",
       "../browser/ui/webui/interstitials/interstitial_ui_browsertest.cc",
       "../browser/ui/webui/log_web_ui_url_browsertest.cc",
+      "../browser/ui/webui/management_ui_browsertest.cc",
       "../browser/ui/webui/net_internals/net_internals_ui_browsertest.cc",
       "../browser/ui/webui/net_internals/net_internals_ui_browsertest.h",
       "../browser/ui/webui/ntp/new_tab_ui_browsertest.cc",
diff --git a/chrome/test/data/webui/extensions/activity_log_stream_item_test.js b/chrome/test/data/webui/extensions/activity_log_stream_item_test.js
index 6528718..b046151f 100644
--- a/chrome/test/data/webui/extensions/activity_log_stream_item_test.js
+++ b/chrome/test/data/webui/extensions/activity_log_stream_item_test.js
@@ -26,7 +26,7 @@
       timestamp: 1550101623113,
       activityType: chrome.activityLogPrivate.ExtensionActivityType.API_CALL,
       pageUrl: '',
-      args: null,
+      args: JSON.stringify([]),
     };
 
     activityLogStreamItem = new extensions.ActivityLogStreamItem();
@@ -61,8 +61,48 @@
     activityLogStreamItem.$$('cr-expand-button').click();
 
     Polymer.dom.flush();
-    testVisible('.page-url-link', true);
-    testVisible('.data-args', true);
+    testVisible('#page-url-link', true);
+    testVisible('#args-list', true);
+  });
+
+  test('placeholder arg values are replaced by the argUrl', function() {
+    const argUrl = 'arg.url';
+    const placeholder = extensions.ARG_URL_PLACEHOLDER;
+    // The <arg_url> placeholder except the '<' is escaped into a unicode
+    // string to simulate the serializer on the C++ side.
+    const escapedPlaceholder = '\\u003Carg_url>';
+
+    testStreamItem = {
+      id: 'testAPI.testMethod1550101623113',
+      name: 'testAPI.testMethod',
+      timestamp: 1550101623113,
+      activityType: chrome.activityLogPrivate.ExtensionActivityType.API_CALL,
+      argUrl: argUrl,
+      args: `[
+        "${placeholder}",
+        "${escapedPlaceholder}",
+        ["${placeholder}"],
+        {"url":"${escapedPlaceholder}"}
+      ]`
+    };
+
+    activityLogStreamItem.set('data', testStreamItem);
+
+    Polymer.dom.flush();
+    testVisible('cr-expand-button', true);
+    activityLogStreamItem.$$('cr-expand-button').click();
+
+    Polymer.dom.flush();
+    testVisible('#args-list', true);
+
+    const argsDisplayed =
+        activityLogStreamItem.shadowRoot.querySelectorAll('.arg');
+    expectEquals(4, argsDisplayed.length);
+
+    expectEquals(`"${argUrl}"`, argsDisplayed[0].innerText);
+    expectEquals(`"${argUrl}"`, argsDisplayed[1].innerText);
+    expectEquals(`["${argUrl}"]`, argsDisplayed[2].innerText);
+    expectEquals(`{"url":"${argUrl}"}`, argsDisplayed[3].innerText);
   });
 
   teardown(function() {
diff --git a/chrome/test/data/webui/settings/site_details_tests.js b/chrome/test/data/webui/settings/site_details_tests.js
index 45a773c..c363d73 100644
--- a/chrome/test/data/webui/settings/site_details_tests.js
+++ b/chrome/test/data/webui/settings/site_details_tests.js
@@ -215,7 +215,7 @@
     // Replace it with a mock version.
     let usageCleared = false;
     Polymer({
-      is: 'mock-website-usage-private-api',
+      is: 'mock-website-usage-private-api-storage',
 
       fetchUsageTotal: function(host) {
         testElement.storedData_ = '1 KB';
@@ -225,7 +225,8 @@
         usageCleared = true;
       },
     });
-    let api = document.createElement('mock-website-usage-private-api');
+    const api =
+        document.createElement('mock-website-usage-private-api-storage');
     testElement.$.usageApi = api;
     Polymer.dom(parent).appendChild(api);
     Polymer.dom.flush();
@@ -244,6 +245,50 @@
     });
   });
 
+  test('cookies gets deleted properly', function() {
+    const origin = 'https://foo.com:443';
+    browserProxy.setPrefs(prefs);
+    loadTimeData.overrideValues({enableSiteSettings: true});
+    testElement = createSiteDetails(origin);
+
+    // Remove the current website-usage-private-api element.
+    const parent = testElement.$.usageApi.parentNode;
+    assertTrue(parent != undefined);
+    testElement.$.usageApi.remove();
+
+    // Replace it with a mock version.
+    let usageCleared = false;
+    Polymer({
+      is: 'mock-website-usage-private-api-cookies',
+
+      fetchUsageTotal: function(host) {
+        testElement.numCookies_ = '10 cookies';
+      },
+
+      clearUsage: function(origin, task) {
+        usageCleared = true;
+      },
+    });
+    const api =
+        document.createElement('mock-website-usage-private-api-cookies');
+    testElement.$.usageApi = api;
+    Polymer.dom(parent).appendChild(api);
+    Polymer.dom.flush();
+
+    // Call onOriginChanged_() manually to simulate a new navigation.
+    testElement.currentRouteChanged(settings.Route);
+    return browserProxy.whenCalled('getOriginPermissions').then(() => {
+      // Ensure the mock's methods were called and check usage was cleared on
+      // clicking the trash button.
+      assertEquals('10 cookies', testElement.numCookies_);
+      assertTrue(testElement.$$('#noStorage').hidden);
+      assertFalse(testElement.$$('#storage').hidden);
+
+      testElement.$$('#confirmClearStorage .action-button').click();
+      assertTrue(usageCleared);
+    });
+  });
+
   test('correct pref settings are shown', function() {
     browserProxy.setPrefs(prefs);
     // Make sure all the possible content settings are shown for this test.
diff --git a/chrome/test/data/webui/welcome/email_interstitial_test.js b/chrome/test/data/webui/welcome/email_interstitial_test.js
deleted file mode 100644
index 81a0d868..0000000
--- a/chrome/test/data/webui/welcome/email_interstitial_test.js
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-cr.define('onboarding_welcome_email_interstitial', function() {
-  suite('EmailInterstitialTest', function() {
-    const emails = [
-      {
-        id: 0,
-        name: 'Gmail',
-        icon: 'gmail',
-        url: 'http://www.gmail.com',
-      },
-      {
-        id: 1,
-        name: 'Yahoo',
-        icon: 'yahoo',
-        url: 'http://mail.yahoo.com',
-      }
-    ];
-
-    /** @type {nux.NuxEmailProxy} */
-    let testEmailBrowserProxy;
-
-    /** @type {nux.EmailInterstitialProxy} */
-    let testEmailInterstitialProxy;
-
-    /** @type {welcome.WelcomeBrowserProxy} */
-    let testWelcomeBrowserProxy;
-
-    /** @type {EmailChooserElement} */
-    let testElement;
-
-    setup(function() {
-      testEmailBrowserProxy = new TestNuxEmailProxy();
-      testEmailBrowserProxy.setEmailList(emails);
-      nux.EmailAppProxyImpl.instance_ = testEmailBrowserProxy;
-
-      testEmailInterstitialProxy = new TestEmailInterstititalProxy();
-      nux.EmailInterstitialProxyImpl.instance_ = testEmailInterstitialProxy;
-
-      testWelcomeBrowserProxy = new TestWelcomeBrowserProxy();
-      welcome.WelcomeBrowserProxyImpl.instance_ = testWelcomeBrowserProxy;
-
-      PolymerTest.clearBody();
-      testElement = document.createElement('email-interstitial');
-      document.body.appendChild(testElement);
-    });
-
-    teardown(function() {
-      testElement.remove();
-    });
-
-    test('email interstitial click continue button twice', function() {
-      // 'Continue' button is only paper-button.
-      const continueButton = testElement.$$('paper-button');
-      assertTrue(!!continueButton);
-
-      continueButton.click();
-      continueButton.click();
-
-      assertEquals(1, testEmailBrowserProxy.getCallCount('getAppList'));
-      assertEquals(1, testEmailInterstitialProxy.getCallCount('recordNext'));
-      return testWelcomeBrowserProxy.whenCalled('goToURL').then(url => {
-        assertEquals(url, emails[0].url);
-      });
-    });
-  });
-});
diff --git a/chrome/test/data/webui/welcome/onboarding_welcome_browsertest.js b/chrome/test/data/webui/welcome/onboarding_welcome_browsertest.js
index 7a825db..75f4376 100644
--- a/chrome/test/data/webui/welcome/onboarding_welcome_browsertest.js
+++ b/chrome/test/data/webui/welcome/onboarding_welcome_browsertest.js
@@ -54,28 +54,6 @@
   mocha.run();
 });
 
-OnboardingWelcomeEmailInterstitialTest =
-    class extends OnboardingWelcomeBrowserTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://welcome/email-interstitial?provider=0';
-  }
-
-  /** @override */
-  get extraLibraries() {
-    return super.extraLibraries.concat([
-      'email_interstitial_test.js',
-      'test_email_interstitial_proxy.js',
-      'test_nux_email_proxy.js',
-      'test_welcome_browser_proxy.js',
-    ]);
-  }
-};
-
-TEST_F('OnboardingWelcomeEmailInterstitialTest', 'All', function() {
-  mocha.run();
-});
-
 OnboardingWelcomeWelcomeAppTest = class extends OnboardingWelcomeBrowserTest {
   /** @override */
   get browsePreload() {
diff --git a/chrome/test/data/webui/welcome/signin_view_test.js b/chrome/test/data/webui/welcome/signin_view_test.js
index 5ab021f..19da9497 100644
--- a/chrome/test/data/webui/welcome/signin_view_test.js
+++ b/chrome/test/data/webui/welcome/signin_view_test.js
@@ -30,62 +30,20 @@
       testElement.remove();
     });
 
-    test('sign-in button with no email provider selected', function() {
+    test('sign-in button', function() {
       const signinButton = testElement.$$('paper-button');
       assertTrue(!!signinButton);
 
       signinButton.click();
-      return testEmailBrowserProxy.whenCalled('getSavedProvider')
-          .then(() => {
-            return testWelcomeBrowserProxy.whenCalled('handleActivateSignIn');
-          })
-          .then(redirectUrl => {
-            assertEquals(redirectUrl, null);
-          });
+      return testWelcomeBrowserProxy.whenCalled('handleActivateSignIn')
+          .then(redirectUrl => assertEquals(null, redirectUrl));
     });
 
-    test('sign-in button with a email provider selected', function() {
-      const signinButton = testElement.$$('paper-button');
-      assertTrue(!!signinButton);
-
-      testEmailBrowserProxy.setSavedProvider(3);
-
-      signinButton.click();
-      return testEmailBrowserProxy.whenCalled('getSavedProvider')
-          .then(() => {
-            return testWelcomeBrowserProxy.whenCalled('handleActivateSignIn');
-          })
-          .then(redirectUrl => {
-            assertEquals(
-                redirectUrl, 'chrome://welcome/email-interstitial?provider=3');
-          });
-    });
-
-    test('no-thanks button with no email provider selected', function() {
+    test('no-thanks button', function() {
       const noThanksButton = testElement.$$('button');
       assertTrue(!!noThanksButton);
-
       noThanksButton.click();
-      return Promise.all([
-        testEmailBrowserProxy.whenCalled('getSavedProvider'),
-        testWelcomeBrowserProxy.whenCalled('handleUserDecline'),
-      ]);
-    });
-
-    test('no-thanks button with an email provider selected', function() {
-      const noThanksButton = testElement.$$('button');
-      assertTrue(!!noThanksButton);
-
-      testEmailBrowserProxy.setSavedProvider(4);
-
-      noThanksButton.click();
-      return testEmailBrowserProxy.whenCalled('getSavedProvider')
-          .then(() => {
-            return testWelcomeBrowserProxy.whenCalled('handleUserDecline');
-          })
-          .then(url => {
-            assertEquals(url, 'chrome://welcome/email-interstitial?provider=4');
-          });
+      return testWelcomeBrowserProxy.whenCalled('handleUserDecline');
     });
   });
 });
diff --git a/chrome/test/data/webui/welcome/test_nux_email_proxy.js b/chrome/test/data/webui/welcome/test_nux_email_proxy.js
index 6921584..2a41e7b2 100644
--- a/chrome/test/data/webui/welcome/test_nux_email_proxy.js
+++ b/chrome/test/data/webui/welcome/test_nux_email_proxy.js
@@ -83,20 +83,11 @@
     super([
       'cacheBookmarkIcon',
       'getAppList',
-      'getSavedProvider',
       'recordProviderSelected',
     ]);
 
     /** @private {!Array<!nux.BookmarkListItem>} */
     this.emailList_ = [];
-
-    /** @private {number} */
-    this.stubSavedProvider_;
-  }
-
-  /** @param {number} id */
-  setSavedProvider(id) {
-    this.stubSavedProvider_ = id;
   }
 
   /** @override */
@@ -110,11 +101,6 @@
     this.methodCalled('cacheBookmarkIcon');
   }
 
-  getSavedProvider() {
-    this.methodCalled('getSavedProvider');
-    return this.stubSavedProvider_;
-  }
-
   /** @override */
   recordProviderSelected() {
     this.methodCalled('recordProviderSelected', arguments);
diff --git a/chromecast/renderer/resources/extensions/automation_custom_bindings.js b/chromecast/renderer/resources/extensions/automation_custom_bindings.js
index 1569aa11..e2d41e6 100644
--- a/chromecast/renderer/resources/extensions/automation_custom_bindings.js
+++ b/chromecast/renderer/resources/extensions/automation_custom_bindings.js
@@ -5,7 +5,6 @@
 // Custom bindings for the automation API.
 var AutomationNode = require('automationNode').AutomationNode;
 var AutomationRootNode = require('automationNode').AutomationRootNode;
-var automation = apiBridge || require('binding').Binding.create('automation');
 var automationInternal =
     getInternalApi ?
         getInternalApi('automationInternal') :
@@ -105,7 +104,7 @@
   automationUtil.focusedNode = focus ? focus.root : null;
 };
 
-automation.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   // TODO(aboxhall, dtseng): Make this return the speced AutomationRootNode obj.
@@ -361,6 +360,3 @@
     return;
   privates(targetTree).impl.onGetTextLocationResult(textLocationParams);
 });
-
-if (!apiBridge)
-  exports.$set('binding', automation.generate());
diff --git a/chromecast/renderer/resources/extensions/tabs_custom_bindings.js b/chromecast/renderer/resources/extensions/tabs_custom_bindings.js
index c60f09e8..2b9dad9 100644
--- a/chromecast/renderer/resources/extensions/tabs_custom_bindings.js
+++ b/chromecast/renderer/resources/extensions/tabs_custom_bindings.js
@@ -3,14 +3,13 @@
 // found in the LICENSE file.
 
 // Custom binding for the tabs API.
-var binding = apiBridge || require('binding').Binding.create('tabs');
 
 var messaging = require('messaging');
 var OpenChannelToTab = requireNative('messaging_natives').OpenChannelToTab;
 var sendRequestIsDisabled = requireNative('process').IsSendRequestDisabled();
 var forEach = require('utils').forEach;
 
-binding.registerCustomHook(function(bindingsAPI, extensionId) {
+apiBridge.registerCustomHook(function(bindingsAPI, extensionId) {
   var apiFunctions = bindingsAPI.apiFunctions;
   var tabs = bindingsAPI.compiledApi;
 
@@ -50,6 +49,3 @@
     messaging.sendMessageImpl(port, message, responseCallback);
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chromecast/renderer/resources/extensions/tts_custom_bindings.js b/chromecast/renderer/resources/extensions/tts_custom_bindings.js
index 1402d35..eb49fb4 100644
--- a/chromecast/renderer/resources/extensions/tts_custom_bindings.js
+++ b/chromecast/renderer/resources/extensions/tts_custom_bindings.js
@@ -4,15 +4,13 @@
 
 // Custom binding for the tts API.
 
-var binding = apiBridge || require('binding').Binding.create('tts');
-
 var idGenerator = requireNative('id_generator');
 var sendRequest = bindingUtil ?
     $Function.bind(bindingUtil.sendRequest, bindingUtil) :
     require('sendRequest').sendRequest;
 var lazyBG = requireNative('lazy_background_page');
 
-binding.registerCustomHook(function(api) {
+apiBridge.registerCustomHook(function(api) {
   var apiFunctions = api.apiFunctions;
   var tts = api.compiledApi;
   var handlers = {};
@@ -57,6 +55,3 @@
     return id;
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/chromeos/dbus/biod/biod_client.cc b/chromeos/dbus/biod/biod_client.cc
index 3827fc99..5590149 100644
--- a/chromeos/dbus/biod/biod_client.cc
+++ b/chromeos/dbus/biod/biod_client.cc
@@ -24,6 +24,8 @@
 
 namespace {
 
+BiodClient* g_instance = nullptr;
+
 // D-Bus response handler for methods that use void callbacks.
 void OnVoidResponse(VoidDBusMethodCallback callback, dbus::Response* response) {
   std::move(callback).Run(response != nullptr);
@@ -34,7 +36,9 @@
 // The BiodClient implementation used in production.
 class BiodClientImpl : public BiodClient {
  public:
-  BiodClientImpl() : weak_ptr_factory_(this) {}
+  BiodClientImpl(dbus::Bus* bus) : bus_(bus), weak_ptr_factory_(this) {
+    Init();
+  }
 
   ~BiodClientImpl() override = default;
 
@@ -206,13 +210,10 @@
                        weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
   }
 
- protected:
-  void Init(dbus::Bus* bus) override {
-    bus_ = bus;
-
+  void Init() {
     dbus::ObjectPath fpc_bio_path = dbus::ObjectPath(base::StringPrintf(
         "%s/%s", biod::kBiodServicePath, biod::kCrosFpBiometricsManagerName));
-    biod_proxy_ = bus->GetObjectProxy(biod::kBiodServiceName, fpc_bio_path);
+    biod_proxy_ = bus_->GetObjectProxy(biod::kBiodServiceName, fpc_bio_path);
 
     biod_proxy_->SetNameOwnerChangedCallback(
         base::Bind(&BiodClientImpl::NameOwnerChangedReceived,
@@ -410,16 +411,36 @@
   DISALLOW_COPY_AND_ASSIGN(BiodClientImpl);
 };
 
-BiodClient::BiodClient() = default;
+BiodClient::BiodClient() {
+  DCHECK(!g_instance);
+  g_instance = this;
+}
 
-BiodClient::~BiodClient() = default;
+BiodClient::~BiodClient() {
+  DCHECK_EQ(this, g_instance);
+  g_instance = nullptr;
+}
 
 // static
-BiodClient* BiodClient::Create(DBusClientImplementationType type) {
-  if (type == REAL_DBUS_CLIENT_IMPLEMENTATION)
-    return new BiodClientImpl();
-  DCHECK_EQ(FAKE_DBUS_CLIENT_IMPLEMENTATION, type);
-  return new FakeBiodClient();
+void BiodClient::Initialize(dbus::Bus* bus) {
+  DCHECK(bus);
+  new BiodClientImpl(bus);
+}
+
+// static
+void BiodClient::InitializeFake() {
+  new FakeBiodClient();
+}
+
+// static
+void BiodClient::Shutdown() {
+  DCHECK(g_instance);
+  delete g_instance;
+}
+
+// static
+BiodClient* BiodClient::Get() {
+  return g_instance;
 }
 
 }  // namespace chromeos
diff --git a/chromeos/dbus/biod/biod_client.h b/chromeos/dbus/biod/biod_client.h
index 88a22259..da81fe8 100644
--- a/chromeos/dbus/biod/biod_client.h
+++ b/chromeos/dbus/biod/biod_client.h
@@ -14,11 +14,14 @@
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "chromeos/dbus/biod/constants.pb.h"
-#include "chromeos/dbus/dbus_client.h"
 #include "chromeos/dbus/dbus_client_implementation_type.h"
 #include "chromeos/dbus/dbus_method_call_status.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 
+namespace dbus {
+class Bus;
+}
+
 namespace chromeos {
 
 // Each time the sensor detects a scan, an object containing all the users, each
@@ -30,7 +33,7 @@
 
 // BiodClient is used to communicate with a biod D-Bus manager
 // interface.
-class COMPONENT_EXPORT(CHROMEOS_DBUS) BiodClient : public DBusClient {
+class COMPONENT_EXPORT(CHROMEOS_DBUS) BiodClient {
  public:
   // Interface for observing changes from the biometrics manager.
   class Observer {
@@ -62,7 +65,19 @@
     virtual ~Observer() {}
   };
 
-  ~BiodClient() override;
+  virtual ~BiodClient();
+
+  // Creates and initializes the global instance. |bus| must not be null.
+  static void Initialize(dbus::Bus* bus);
+
+  // Creates and initializes a fake global instance if not already created.
+  static void InitializeFake();
+
+  // Destroys the global instance which must have been initialized.
+  static void Shutdown();
+
+  // Returns the global instance if initialized. May return null.
+  static BiodClient* Get();
 
   // Adds and removes the observer.
   virtual void AddObserver(Observer* observer) = 0;
@@ -136,13 +151,10 @@
   virtual void RequestRecordLabel(const dbus::ObjectPath& record_path,
                                   LabelCallback callback) = 0;
 
-  // Creates the instance.
-  static BiodClient* Create(DBusClientImplementationType type);
-
  protected:
   friend class BiodClientTest;
 
-  // Create() should be used instead.
+  // Use Initialize() instead.
   BiodClient();
 
  private:
diff --git a/chromeos/dbus/biod/biod_client_unittest.cc b/chromeos/dbus/biod/biod_client_unittest.cc
index 40eb918..8ad8958b 100644
--- a/chromeos/dbus/biod/biod_client_unittest.cc
+++ b/chromeos/dbus/biod/biod_client_unittest.cc
@@ -82,13 +82,15 @@
     EXPECT_CALL(*proxy_.get(), DoConnectToSignal(kInterface, _, _, _))
         .WillRepeatedly(Invoke(this, &BiodClientTest::ConnectToSignal));
 
-    client_.reset(BiodClient::Create(REAL_DBUS_CLIENT_IMPLEMENTATION));
-    client_->Init(bus_.get());
+    BiodClient::Initialize(bus_.get());
+    client_ = BiodClient::Get();
 
     // Execute callbacks posted by Init().
     base::RunLoop().RunUntilIdle();
   }
 
+  void TearDown() override { BiodClient::Shutdown(); }
+
   void GetBiometricType(biod::BiometricType type) { biometric_type_ = type; }
 
  protected:
@@ -162,7 +164,8 @@
   scoped_refptr<dbus::MockBus> bus_;
   scoped_refptr<dbus::MockObjectProxy> proxy_;
 
-  std::unique_ptr<BiodClient> client_;
+  // Convenience pointer to the global instance.
+  BiodClient* client_;
 
   // Maps from biod signal name to the corresponding callback provided by
   // |client_|.
diff --git a/chromeos/dbus/biod/fake_biod_client.cc b/chromeos/dbus/biod/fake_biod_client.cc
index 50d8236a..9f3176e 100644
--- a/chromeos/dbus/biod/fake_biod_client.cc
+++ b/chromeos/dbus/biod/fake_biod_client.cc
@@ -30,6 +30,8 @@
 // time.
 const char kAuthSessionObjectPath[] = "/AuthSession/";
 
+FakeBiodClient* g_instance = nullptr;
+
 }  // namespace
 
 // FakeRecord is the definition of a fake stored fingerprint template.
@@ -41,9 +43,21 @@
   std::vector<std::string> fake_fingerprint;
 };
 
-FakeBiodClient::FakeBiodClient() = default;
+FakeBiodClient::FakeBiodClient() {
+  DCHECK(!g_instance);
+  g_instance = this;
+}
 
-FakeBiodClient::~FakeBiodClient() = default;
+FakeBiodClient::~FakeBiodClient() {
+  DCHECK_EQ(this, g_instance);
+  g_instance = nullptr;
+}
+
+// static
+FakeBiodClient* FakeBiodClient::Get() {
+  DCHECK(g_instance);
+  return g_instance;
+}
 
 void FakeBiodClient::SendEnrollScanDone(const std::string& fingerprint,
                                         biod::ScanResult type_result,
@@ -108,8 +122,6 @@
   current_session_ = FingerprintSession::NONE;
 }
 
-void FakeBiodClient::Init(dbus::Bus* bus) {}
-
 void FakeBiodClient::AddObserver(Observer* observer) {
   observers_.AddObserver(observer);
 }
diff --git a/chromeos/dbus/biod/fake_biod_client.h b/chromeos/dbus/biod/fake_biod_client.h
index 9935ddb..4692abb 100644
--- a/chromeos/dbus/biod/fake_biod_client.h
+++ b/chromeos/dbus/biod/fake_biod_client.h
@@ -15,10 +15,6 @@
 #include "chromeos/dbus/biod/biod_client.h"
 #include "dbus/object_path.h"
 
-namespace dbus {
-class Bus;
-}  // namespace dbus
-
 namespace chromeos {
 
 // A fake implementation of BiodClient. It emulates the real Biod daemon by
@@ -33,6 +29,9 @@
   FakeBiodClient();
   ~FakeBiodClient() override;
 
+  // Checks that a FakeBiodClient instance was initialized and returns it.
+  static FakeBiodClient* Get();
+
   // Emulates the biod daemon by sending events which the daemon normally sends.
   // Notifies |observers_| about various events. These will be used in tests.
 
@@ -54,7 +53,6 @@
   void Reset();
 
   // BiodClient:
-  void Init(dbus::Bus* bus) override;
   void AddObserver(Observer* observer) override;
   void RemoveObserver(Observer* observer) override;
   bool HasObserver(const Observer* observer) const override;
diff --git a/chromeos/dbus/dbus_clients_browser.cc b/chromeos/dbus/dbus_clients_browser.cc
index 33420e3..a4f12e43 100644
--- a/chromeos/dbus/dbus_clients_browser.cc
+++ b/chromeos/dbus/dbus_clients_browser.cc
@@ -10,6 +10,7 @@
 #include "chromeos/dbus/arc_obb_mounter_client.h"
 #include "chromeos/dbus/arc_oemcrypto_client.h"
 #include "chromeos/dbus/auth_policy_client.h"
+#include "chromeos/dbus/cec_service_client.h"
 #include "chromeos/dbus/cicerone_client.h"
 #include "chromeos/dbus/concierge_client.h"
 #include "chromeos/dbus/cros_disks_client.h"
@@ -45,11 +46,16 @@
 #include "chromeos/dbus/runtime_probe_client.h"
 #include "chromeos/dbus/seneschal_client.h"
 #include "chromeos/dbus/smb_provider_client.h"
+#include "chromeos/dbus/update_engine_client.h"
 #include "chromeos/dbus/virtual_file_provider_client.h"
 
 namespace chromeos {
 
 DBusClientsBrowser::DBusClientsBrowser(bool use_real_clients) {
+  const DBusClientImplementationType client_impl_type =
+      use_real_clients ? REAL_DBUS_CLIENT_IMPLEMENTATION
+                       : FAKE_DBUS_CLIENT_IMPLEMENTATION;
+
   if (use_real_clients) {
     arc_appfuse_provider_client_ = ArcAppfuseProviderClient::Create();
   } else {
@@ -77,9 +83,9 @@
   else
     auth_policy_client_.reset(new FakeAuthPolicyClient);
 
-  cros_disks_client_.reset(CrosDisksClient::Create(
-      use_real_clients ? REAL_DBUS_CLIENT_IMPLEMENTATION
-                       : FAKE_DBUS_CLIENT_IMPLEMENTATION));
+  cec_service_client_ = CecServiceClient::Create(client_impl_type);
+
+  cros_disks_client_.reset(CrosDisksClient::Create(client_impl_type));
 
   if (use_real_clients)
     cicerone_client_ = CiceroneClient::Create();
@@ -146,6 +152,8 @@
   else
     smb_provider_client_ = std::make_unique<FakeSmbProviderClient>();
 
+  update_engine_client_.reset(UpdateEngineClient::Create(client_impl_type));
+
   if (use_real_clients)
     virtual_file_provider_client_.reset(VirtualFileProviderClient::Create());
   else
@@ -162,6 +170,7 @@
   arc_obb_mounter_client_->Init(system_bus);
   arc_oemcrypto_client_->Init(system_bus);
   auth_policy_client_->Init(system_bus);
+  cec_service_client_->Init(system_bus);
   cicerone_client_->Init(system_bus);
   concierge_client_->Init(system_bus);
   cros_disks_client_->Init(system_bus);
@@ -176,6 +185,7 @@
   runtime_probe_client_->Init(system_bus);
   seneschal_client_->Init(system_bus);
   smb_provider_client_->Init(system_bus);
+  update_engine_client_->Init(system_bus);
   virtual_file_provider_client_->Init(system_bus);
 }
 
diff --git a/chromeos/dbus/dbus_clients_browser.h b/chromeos/dbus/dbus_clients_browser.h
index 505b4ac..a0fd299 100644
--- a/chromeos/dbus/dbus_clients_browser.h
+++ b/chromeos/dbus/dbus_clients_browser.h
@@ -21,6 +21,7 @@
 class ArcObbMounterClient;
 class ArcOemCryptoClient;
 class AuthPolicyClient;
+class CecServiceClient;
 class CiceroneClient;
 class ConciergeClient;
 class CrosDisksClient;
@@ -35,6 +36,7 @@
 class RuntimeProbeClient;
 class SeneschalClient;
 class SmbProviderClient;
+class UpdateEngineClient;
 class VirtualFileProviderClient;
 
 // D-Bus clients used only in the browser process.
@@ -57,6 +59,7 @@
   std::unique_ptr<ArcObbMounterClient> arc_obb_mounter_client_;
   std::unique_ptr<ArcOemCryptoClient> arc_oemcrypto_client_;
   std::unique_ptr<AuthPolicyClient> auth_policy_client_;
+  std::unique_ptr<CecServiceClient> cec_service_client_;
   std::unique_ptr<CiceroneClient> cicerone_client_;
   std::unique_ptr<ConciergeClient> concierge_client_;
   std::unique_ptr<CrosDisksClient> cros_disks_client_;
@@ -71,6 +74,7 @@
   std::unique_ptr<RuntimeProbeClient> runtime_probe_client_;
   std::unique_ptr<SeneschalClient> seneschal_client_;
   std::unique_ptr<SmbProviderClient> smb_provider_client_;
+  std::unique_ptr<UpdateEngineClient> update_engine_client_;
   std::unique_ptr<VirtualFileProviderClient> virtual_file_provider_client_;
 
   DISALLOW_COPY_AND_ASSIGN(DBusClientsBrowser);
diff --git a/chromeos/dbus/dbus_clients_common.cc b/chromeos/dbus/dbus_clients_common.cc
index 21907d53..40a5b240 100644
--- a/chromeos/dbus/dbus_clients_common.cc
+++ b/chromeos/dbus/dbus_clients_common.cc
@@ -5,8 +5,6 @@
 #include "chromeos/dbus/dbus_clients_common.h"
 
 #include "base/command_line.h"
-#include "chromeos/dbus/biod/biod_client.h"
-#include "chromeos/dbus/cec_service_client.h"
 #include "chromeos/dbus/constants/dbus_switches.h"
 #include "chromeos/dbus/cras_audio_client.h"
 #include "chromeos/dbus/cryptohome_client.h"
@@ -36,7 +34,6 @@
 #include "chromeos/dbus/shill_service_client.h"
 #include "chromeos/dbus/shill_third_party_vpn_driver_client.h"
 #include "chromeos/dbus/sms_client.h"
-#include "chromeos/dbus/update_engine_client.h"
 
 namespace chromeos {
 
@@ -45,10 +42,6 @@
       use_real_clients ? REAL_DBUS_CLIENT_IMPLEMENTATION
                        : FAKE_DBUS_CLIENT_IMPLEMENTATION;
 
-  biod_client_.reset(BiodClient::Create(client_impl_type));
-
-  cec_service_client_ = CecServiceClient::Create(client_impl_type);
-
   if (use_real_clients)
     cras_audio_client_.reset(CrasAudioClient::Create());
   else
@@ -105,8 +98,6 @@
     sms_client_.reset(SMSClient::Create());
   else
     sms_client_.reset(new FakeSMSClient);
-
-  update_engine_client_.reset(UpdateEngineClient::Create(client_impl_type));
 }
 
 DBusClientsCommon::~DBusClientsCommon() = default;
@@ -114,8 +105,6 @@
 void DBusClientsCommon::Initialize(dbus::Bus* system_bus) {
   DCHECK(DBusThreadManager::IsInitialized());
 
-  biod_client_->Init(system_bus);
-  cec_service_client_->Init(system_bus);
   cras_audio_client_->Init(system_bus);
   cryptohome_client_->Init(system_bus);
   gsm_sms_client_->Init(system_bus);
@@ -130,7 +119,6 @@
   shill_profile_client_->Init(system_bus);
   shill_third_party_vpn_driver_client_->Init(system_bus);
   sms_client_->Init(system_bus);
-  update_engine_client_->Init(system_bus);
 
   ShillManagerClient::TestInterface* manager =
       shill_manager_client_->GetTestInterface();
diff --git a/chromeos/dbus/dbus_clients_common.h b/chromeos/dbus/dbus_clients_common.h
index 69c9f0740..41679b2 100644
--- a/chromeos/dbus/dbus_clients_common.h
+++ b/chromeos/dbus/dbus_clients_common.h
@@ -16,8 +16,6 @@
 
 namespace chromeos {
 
-class BiodClient;
-class CecServiceClient;
 class CrasAudioClient;
 class CryptohomeClient;
 class GsmSMSClient;
@@ -32,7 +30,6 @@
 class ShillServiceClient;
 class ShillThirdPartyVpnDriverClient;
 class SMSClient;
-class UpdateEngineClient;
 
 // D-Bus clients used in multiple processes (e.g. ash, browser, mus).
 class COMPONENT_EXPORT(CHROMEOS_DBUS) DBusClientsCommon {
@@ -49,8 +46,6 @@
   friend class DBusThreadManager;
   friend class DBusThreadManagerSetter;
 
-  std::unique_ptr<BiodClient> biod_client_;
-  std::unique_ptr<CecServiceClient> cec_service_client_;
   std::unique_ptr<CrasAudioClient> cras_audio_client_;
   std::unique_ptr<CryptohomeClient> cryptohome_client_;
   std::unique_ptr<GsmSMSClient> gsm_sms_client_;
@@ -66,7 +61,6 @@
   std::unique_ptr<PermissionBrokerClient> permission_broker_client_;
   std::unique_ptr<SMSClient> sms_client_;
   std::unique_ptr<SessionManagerClient> session_manager_client_;
-  std::unique_ptr<UpdateEngineClient> update_engine_client_;
 
   DISALLOW_COPY_AND_ASSIGN(DBusClientsCommon);
 };
diff --git a/chromeos/dbus/dbus_thread_manager.cc b/chromeos/dbus/dbus_thread_manager.cc
index 990caad..4413925b 100644
--- a/chromeos/dbus/dbus_thread_manager.cc
+++ b/chromeos/dbus/dbus_thread_manager.cc
@@ -15,7 +15,6 @@
 #include "chromeos/dbus/arc_obb_mounter_client.h"
 #include "chromeos/dbus/arc_oemcrypto_client.h"
 #include "chromeos/dbus/auth_policy_client.h"
-#include "chromeos/dbus/biod/biod_client.h"
 #include "chromeos/dbus/cec_service_client.h"
 #include "chromeos/dbus/cicerone_client.h"
 #include "chromeos/dbus/concierge_client.h"
@@ -140,12 +139,9 @@
                           : nullptr;
 }
 
-BiodClient* DBusThreadManager::GetBiodClient() {
-  return clients_common_->biod_client_.get();
-}
-
 CecServiceClient* DBusThreadManager::GetCecServiceClient() {
-  return clients_common_->cec_service_client_.get();
+  return clients_browser_ ? clients_browser_->cec_service_client_.get()
+                          : nullptr;
 }
 
 CiceroneClient* DBusThreadManager::GetCiceroneClient() {
@@ -272,7 +268,8 @@
 }
 
 UpdateEngineClient* DBusThreadManager::GetUpdateEngineClient() {
-  return clients_common_->update_engine_client_.get();
+  return clients_browser_ ? clients_browser_->update_engine_client_.get()
+                          : nullptr;
 }
 
 VirtualFileProviderClient* DBusThreadManager::GetVirtualFileProviderClient() {
@@ -368,11 +365,6 @@
       std::move(client);
 }
 
-void DBusThreadManagerSetter::SetBiodClient(
-    std::unique_ptr<BiodClient> client) {
-  DBusThreadManager::Get()->clients_common_->biod_client_ = std::move(client);
-}
-
 void DBusThreadManagerSetter::SetCiceroneClient(
     std::unique_ptr<CiceroneClient> client) {
   DBusThreadManager::Get()->clients_browser_->cicerone_client_ =
@@ -496,7 +488,7 @@
 
 void DBusThreadManagerSetter::SetUpdateEngineClient(
     std::unique_ptr<UpdateEngineClient> client) {
-  DBusThreadManager::Get()->clients_common_->update_engine_client_ =
+  DBusThreadManager::Get()->clients_browser_->update_engine_client_ =
       std::move(client);
 }
 
diff --git a/chromeos/dbus/dbus_thread_manager.h b/chromeos/dbus/dbus_thread_manager.h
index 25de2103..2ae60e4 100644
--- a/chromeos/dbus/dbus_thread_manager.h
+++ b/chromeos/dbus/dbus_thread_manager.h
@@ -29,7 +29,6 @@
 class ArcObbMounterClient;
 class ArcOemCryptoClient;
 class AuthPolicyClient;
-class BiodClient;
 class CecServiceClient;
 class CiceroneClient;
 class ConciergeClient;
@@ -137,7 +136,6 @@
   ArcObbMounterClient* GetArcObbMounterClient();
   ArcOemCryptoClient* GetArcOemCryptoClient();
   AuthPolicyClient* GetAuthPolicyClient();
-  BiodClient* GetBiodClient();
   CecServiceClient* GetCecServiceClient();
   CiceroneClient* GetCiceroneClient();
   ConciergeClient* GetConciergeClient();
@@ -203,7 +201,6 @@
   ~DBusThreadManagerSetter();
 
   void SetAuthPolicyClient(std::unique_ptr<AuthPolicyClient> client);
-  void SetBiodClient(std::unique_ptr<BiodClient> client);
   void SetCiceroneClient(std::unique_ptr<CiceroneClient> client);
   void SetConciergeClient(std::unique_ptr<ConciergeClient> client);
   void SetCrasAudioClient(std::unique_ptr<CrasAudioClient> client);
diff --git a/chromeos/dbus/dbus_thread_manager_unittest.cc b/chromeos/dbus/dbus_thread_manager_unittest.cc
index 704bf22f..2dfbc616 100644
--- a/chromeos/dbus/dbus_thread_manager_unittest.cc
+++ b/chromeos/dbus/dbus_thread_manager_unittest.cc
@@ -108,7 +108,6 @@
   EXPECT_TRUE(manager->GetShillServiceClient());
   EXPECT_TRUE(manager->GetShillThirdPartyVpnDriverClient());
   EXPECT_TRUE(manager->GetSMSClient());
-  EXPECT_TRUE(manager->GetUpdateEngineClient());
 
   // Clients for other processes were not created.
   EXPECT_FALSE(manager->GetArcMidisClient());
@@ -122,6 +121,7 @@
   EXPECT_FALSE(manager->GetImageBurnerClient());
   EXPECT_FALSE(manager->GetLorgnetteManagerClient());
   EXPECT_FALSE(manager->GetSeneschalClient());
+  EXPECT_FALSE(manager->GetUpdateEngineClient());
 
   DBusThreadManager::Shutdown();
 }
diff --git a/chromeos/ime/input_methods.txt b/chromeos/ime/input_methods.txt
index ab7e717..149897e 100644
--- a/chromeos/ime/input_methods.txt
+++ b/chromeos/ime/input_methods.txt
@@ -34,7 +34,7 @@
 # U.S. English
 xkb:us::eng             us               en,en-US,en-AU,en-NZ US   login
 xkb:us:intl:eng         us(intl)         en,en-US             INTL login
-xkb:us:intl_pc:eng      us(intl_pc)      en,en-US             INTL
+xkb:us:intl_pc:eng      us(intl_pc)      en,en-US             INTL login
 xkb:us:altgr-intl:eng   us(altgr-intl)   en,en-US             EXTD login
 xkb:us:dvorak:eng       us(dvorak)       en,en-US             DV   login
 xkb:us:dvp:eng          us(dvp)          en,en-US             DVP  login
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 133d8d0d..b3ea166 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -11,7 +11,6 @@
   sources = [
     "accessory_sheet_data.cc",
     "accessory_sheet_data.h",
-    "account_info_getter.h",
     "address.cc",
     "address.h",
     "address_combobox_model.cc",
@@ -96,10 +95,6 @@
     "autofill_type.h",
     "autofill_wallet_data_type_controller.cc",
     "autofill_wallet_data_type_controller.h",
-    "autofill_wallet_model_type_controller.cc",
-    "autofill_wallet_model_type_controller.h",
-    "card_unmask_delegate.cc",
-    "card_unmask_delegate.h",
     "contact_form_label_formatter.cc",
     "contact_form_label_formatter.h",
     "contact_info.cc",
@@ -114,10 +109,6 @@
     "credit_card.h",
     "credit_card_field.cc",
     "credit_card_field.h",
-    "credit_card_save_manager.cc",
-    "credit_card_save_manager.h",
-    "credit_card_save_strike_database.cc",
-    "credit_card_save_strike_database.h",
     "email_field.cc",
     "email_field.h",
     "field_candidates.cc",
@@ -139,14 +130,6 @@
     "label_formatter.h",
     "label_formatter_creator.cc",
     "label_formatter_creator.h",
-    "legacy_strike_database.cc",
-    "legacy_strike_database.h",
-    "legal_message_line.cc",
-    "legal_message_line.h",
-    "local_card_migration_manager.cc",
-    "local_card_migration_manager.h",
-    "local_card_migration_strike_database.cc",
-    "local_card_migration_strike_database.h",
     "metrics/address_form_event_logger.cc",
     "metrics/address_form_event_logger.h",
     "metrics/credit_card_form_event_logger.cc",
@@ -161,8 +144,25 @@
     "password_requirements_spec_fetcher_impl.h",
     "password_requirements_spec_printer.cc",
     "password_requirements_spec_printer.h",
+    "payments/account_info_getter.h",
+    "payments/autofill_wallet_model_type_controller.cc",
+    "payments/autofill_wallet_model_type_controller.h",
+    "payments/card_unmask_delegate.cc",
+    "payments/card_unmask_delegate.h",
+    "payments/credit_card_save_manager.cc",
+    "payments/credit_card_save_manager.h",
+    "payments/credit_card_save_strike_database.cc",
+    "payments/credit_card_save_strike_database.h",
     "payments/full_card_request.cc",
     "payments/full_card_request.h",
+    "payments/legacy_strike_database.cc",
+    "payments/legacy_strike_database.h",
+    "payments/legal_message_line.cc",
+    "payments/legal_message_line.h",
+    "payments/local_card_migration_manager.cc",
+    "payments/local_card_migration_manager.h",
+    "payments/local_card_migration_strike_database.cc",
+    "payments/local_card_migration_strike_database.h",
     "payments/payments_client.cc",
     "payments/payments_client.h",
     "payments/payments_customer_data.h",
@@ -171,6 +171,13 @@
     "payments/payments_service_url.h",
     "payments/payments_util.cc",
     "payments/payments_util.h",
+    "payments/risk_data_loader.h",
+    "payments/strike_database.cc",
+    "payments/strike_database.h",
+    "payments/strike_database_integrator_base.cc",
+    "payments/strike_database_integrator_base.h",
+    "payments/strike_database_integrator_test_strike_database.cc",
+    "payments/strike_database_integrator_test_strike_database.h",
     "personal_data_manager.cc",
     "personal_data_manager.h",
     "personal_data_manager_observer.h",
@@ -193,17 +200,10 @@
     "region_data_loader.h",
     "region_data_loader_impl.cc",
     "region_data_loader_impl.h",
-    "risk_data_loader.h",
     "search_field.cc",
     "search_field.h",
     "state_names.cc",
     "state_names.h",
-    "strike_database.cc",
-    "strike_database.h",
-    "strike_database_integrator_base.cc",
-    "strike_database_integrator_base.h",
-    "strike_database_integrator_test_strike_database.cc",
-    "strike_database_integrator_test_strike_database.h",
     "subkey_requester.cc",
     "subkey_requester.h",
     "suggestion.cc",
@@ -274,11 +274,11 @@
     sources += [
       "autofill_assistant.cc",
       "autofill_assistant.h",
-      "autofill_credit_card_filling_infobar_delegate_mobile.cc",
-      "autofill_credit_card_filling_infobar_delegate_mobile.h",
-      "autofill_save_card_infobar_delegate_mobile.cc",
-      "autofill_save_card_infobar_delegate_mobile.h",
-      "autofill_save_card_infobar_mobile.h",
+      "payments/autofill_credit_card_filling_infobar_delegate_mobile.cc",
+      "payments/autofill_credit_card_filling_infobar_delegate_mobile.h",
+      "payments/autofill_save_card_infobar_delegate_mobile.cc",
+      "payments/autofill_save_card_infobar_delegate_mobile.h",
+      "payments/autofill_save_card_infobar_mobile.h",
       "ui/card_expiration_date_fix_flow_view_delegate_mobile.cc",
       "ui/card_expiration_date_fix_flow_view_delegate_mobile.h",
       "ui/card_name_fix_flow_view_delegate_mobile.cc",
@@ -384,8 +384,18 @@
     "data_driven_test.h",
     "mock_autocomplete_history_manager.cc",
     "mock_autocomplete_history_manager.h",
+    "payments/test_credit_card_save_manager.cc",
+    "payments/test_credit_card_save_manager.h",
+    "payments/test_credit_card_save_strike_database.cc",
+    "payments/test_credit_card_save_strike_database.h",
+    "payments/test_legacy_strike_database.cc",
+    "payments/test_legacy_strike_database.h",
+    "payments/test_local_card_migration_manager.cc",
+    "payments/test_local_card_migration_manager.h",
     "payments/test_payments_client.cc",
     "payments/test_payments_client.h",
+    "payments/test_strike_database.cc",
+    "payments/test_strike_database.h",
     "suggestion_test_helpers.h",
     "test_address_normalizer.cc",
     "test_address_normalizer.h",
@@ -409,25 +419,15 @@
     "test_autofill_profile_validator_delayed.h",
     "test_autofill_provider.cc",
     "test_autofill_provider.h",
-    "test_credit_card_save_manager.cc",
-    "test_credit_card_save_manager.h",
-    "test_credit_card_save_strike_database.cc",
-    "test_credit_card_save_strike_database.h",
     "test_event_waiter.h",
     "test_form_data_importer.cc",
     "test_form_data_importer.h",
     "test_form_structure.cc",
     "test_form_structure.h",
-    "test_legacy_strike_database.cc",
-    "test_legacy_strike_database.h",
-    "test_local_card_migration_manager.cc",
-    "test_local_card_migration_manager.h",
     "test_personal_data_manager.cc",
     "test_personal_data_manager.h",
     "test_region_data_loader.cc",
     "test_region_data_loader.h",
-    "test_strike_database.cc",
-    "test_strike_database.h",
     "webdata/autofill_sync_bridge_test_util.cc",
     "webdata/autofill_sync_bridge_test_util.h",
     "webdata/mock_autofill_webdata_backend.cc",
@@ -546,7 +546,6 @@
     "country_combobox_model_unittest.cc",
     "country_names_unittest.cc",
     "credit_card_field_unittest.cc",
-    "credit_card_save_manager_unittest.cc",
     "credit_card_unittest.cc",
     "field_candidates_unittest.cc",
     "field_filler_unittest.cc",
@@ -554,17 +553,20 @@
     "form_field_unittest.cc",
     "form_structure_unittest.cc",
     "label_formatter_creator_unittest.cc",
-    "legacy_strike_database_unittest.cc",
-    "legal_message_line_unittest.cc",
-    "local_card_migration_manager_unittest.cc",
     "name_field_unittest.cc",
     "password_generator_fips181_unittest.cc",
     "password_generator_unittest.cc",
     "password_requirements_spec_fetcher_unittest.cc",
+    "payments/credit_card_save_manager_unittest.cc",
     "payments/full_card_request_unittest.cc",
+    "payments/legacy_strike_database_unittest.cc",
+    "payments/legal_message_line_unittest.cc",
+    "payments/local_card_migration_manager_unittest.cc",
     "payments/payments_client_unittest.cc",
     "payments/payments_service_url_unittest.cc",
     "payments/payments_util_unittest.cc",
+    "payments/strike_database_integrator_test_strike_database_unittest.cc",
+    "payments/strike_database_unittest.cc",
     "personal_data_manager_unittest.cc",
     "phone_field_unittest.cc",
     "phone_number_i18n_unittest.cc",
@@ -575,8 +577,6 @@
     "rationalization_util_unittest.cc",
     "region_combobox_model_unittest.cc",
     "search_field_unittest.cc",
-    "strike_database_integrator_test_strike_database_unittest.cc",
-    "strike_database_unittest.cc",
     "subkey_requester_unittest.cc",
     "suggestion_selection_unittest.cc",
     "ui/card_unmask_prompt_controller_impl_unittest.cc",
diff --git a/components/autofill/core/browser/autofill_assistant_unittest.cc b/components/autofill/core/browser/autofill_assistant_unittest.cc
index 958759b..40e1482 100644
--- a/components/autofill/core/browser/autofill_assistant_unittest.cc
+++ b/components/autofill/core/browser/autofill_assistant_unittest.cc
@@ -18,9 +18,9 @@
 #include "components/autofill/core/browser/credit_card.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/mock_autocomplete_history_manager.h"
+#include "components/autofill/core/browser/payments/test_credit_card_save_manager.h"
 #include "components/autofill/core/browser/test_autofill_client.h"
 #include "components/autofill/core/browser/test_autofill_driver.h"
-#include "components/autofill/core/browser/test_credit_card_save_manager.h"
 #include "components/autofill/core/browser/test_personal_data_manager.h"
 #include "components/autofill/core/common/autofill_constants.h"
 #include "components/autofill/core/common/autofill_features.h"
diff --git a/components/autofill/core/browser/autofill_client.h b/components/autofill/core/browser/autofill_client.h
index 0341ce2..af8a204 100644
--- a/components/autofill/core/browser/autofill_client.h
+++ b/components/autofill/core/browser/autofill_client.h
@@ -15,7 +15,7 @@
 #include "base/strings/string16.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "components/autofill/core/browser/risk_data_loader.h"
+#include "components/autofill/core/browser/payments/risk_data_loader.h"
 #include "components/security_state/core/security_state.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
 #include "ui/base/window_open_disposition.h"
diff --git a/components/autofill/core/browser/autofill_manager.h b/components/autofill/core/browser/autofill_manager.h
index e9871cd2..c6aee10 100644
--- a/components/autofill/core/browser/autofill_manager.h
+++ b/components/autofill/core/browser/autofill_manager.h
@@ -26,11 +26,11 @@
 #include "components/autofill/core/browser/autofill_driver.h"
 #include "components/autofill/core/browser/autofill_handler.h"
 #include "components/autofill/core/browser/autofill_metrics.h"
-#include "components/autofill/core/browser/card_unmask_delegate.h"
 #include "components/autofill/core/browser/field_filler.h"
 #include "components/autofill/core/browser/form_types.h"
 #include "components/autofill/core/browser/metrics/address_form_event_logger.h"
 #include "components/autofill/core/browser/metrics/credit_card_form_event_logger.h"
+#include "components/autofill/core/browser/payments/card_unmask_delegate.h"
 #include "components/autofill/core/browser/payments/full_card_request.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/popup_types.h"
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc
index 8cf4979..dcd07497 100644
--- a/components/autofill/core/browser/autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -36,6 +36,7 @@
 #include "components/autofill/core/browser/credit_card.h"
 #include "components/autofill/core/browser/metrics/form_events.h"
 #include "components/autofill/core/browser/mock_autocomplete_history_manager.h"
+#include "components/autofill/core/browser/payments/test_credit_card_save_manager.h"
 #include "components/autofill/core/browser/payments/test_payments_client.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/popup_item_ids.h"
@@ -46,7 +47,6 @@
 #include "components/autofill/core/browser/test_autofill_driver.h"
 #include "components/autofill/core/browser/test_autofill_external_delegate.h"
 #include "components/autofill/core/browser/test_autofill_manager.h"
-#include "components/autofill/core/browser/test_credit_card_save_manager.h"
 #include "components/autofill/core/browser/test_form_data_importer.h"
 #include "components/autofill/core/browser/test_form_structure.h"
 #include "components/autofill/core/browser/test_personal_data_manager.h"
diff --git a/components/autofill/core/browser/autofill_metrics_unittest.cc b/components/autofill/core/browser/autofill_metrics_unittest.cc
index 87afa30..43c7feb4 100644
--- a/components/autofill/core/browser/autofill_metrics_unittest.cc
+++ b/components/autofill/core/browser/autofill_metrics_unittest.cc
@@ -27,6 +27,7 @@
 #include "components/autofill/core/browser/metrics/credit_card_form_event_logger.h"
 #include "components/autofill/core/browser/metrics/form_events.h"
 #include "components/autofill/core/browser/mock_autocomplete_history_manager.h"
+#include "components/autofill/core/browser/payments/test_credit_card_save_manager.h"
 #include "components/autofill/core/browser/payments/test_payments_client.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/popup_item_ids.h"
@@ -34,7 +35,6 @@
 #include "components/autofill/core/browser/test_autofill_client.h"
 #include "components/autofill/core/browser/test_autofill_driver.h"
 #include "components/autofill/core/browser/test_autofill_manager.h"
-#include "components/autofill/core/browser/test_credit_card_save_manager.h"
 #include "components/autofill/core/browser/test_form_data_importer.h"
 #include "components/autofill/core/browser/test_form_structure.h"
 #include "components/autofill/core/browser/test_personal_data_manager.h"
diff --git a/components/autofill/core/browser/form_data_importer.h b/components/autofill/core/browser/form_data_importer.h
index a195d96c..be28615 100644
--- a/components/autofill/core/browser/form_data_importer.h
+++ b/components/autofill/core/browser/form_data_importer.h
@@ -13,9 +13,9 @@
 
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autofill_client.h"
-#include "components/autofill/core/browser/credit_card_save_manager.h"
 #include "components/autofill/core/browser/form_structure.h"
-#include "components/autofill/core/browser/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/credit_card_save_manager.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 #include "components/autofill/core/browser/payments/payments_client.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 
diff --git a/components/autofill/core/browser/payments/OWNERS b/components/autofill/core/browser/payments/OWNERS
new file mode 100644
index 0000000..c3fbe35
--- /dev/null
+++ b/components/autofill/core/browser/payments/OWNERS
@@ -0,0 +1 @@
+jsaul@google.com
diff --git a/components/autofill/core/browser/account_info_getter.h b/components/autofill/core/browser/payments/account_info_getter.h
similarity index 80%
rename from components/autofill/core/browser/account_info_getter.h
rename to components/autofill/core/browser/payments/account_info_getter.h
index 44fa238..42bf2fe3 100644
--- a/components/autofill/core/browser/account_info_getter.h
+++ b/components/autofill/core/browser/payments/account_info_getter.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_ACCOUNT_INFO_GETTER_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_ACCOUNT_INFO_GETTER_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_ACCOUNT_INFO_GETTER_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_ACCOUNT_INFO_GETTER_H_
 
 #include <string>
 
@@ -30,4 +30,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_ACCOUNT_INFO_GETTER_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_ACCOUNT_INFO_GETTER_H_
diff --git a/components/autofill/core/browser/autofill_credit_card_filling_infobar_delegate_mobile.cc b/components/autofill/core/browser/payments/autofill_credit_card_filling_infobar_delegate_mobile.cc
similarity index 95%
rename from components/autofill/core/browser/autofill_credit_card_filling_infobar_delegate_mobile.cc
rename to components/autofill/core/browser/payments/autofill_credit_card_filling_infobar_delegate_mobile.cc
index fe4a4be..aadf087d 100644
--- a/components/autofill/core/browser/autofill_credit_card_filling_infobar_delegate_mobile.cc
+++ b/components/autofill/core/browser/payments/autofill_credit_card_filling_infobar_delegate_mobile.cc
@@ -2,8 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/autofill_credit_card_filling_infobar_delegate_mobile.h"
+#include "components/autofill/core/browser/payments/autofill_credit_card_filling_infobar_delegate_mobile.h"
 
+#include "build/build_config.h"
 #include "components/autofill/core/browser/credit_card.h"
 #include "components/autofill/core/common/autofill_constants.h"
 #include "components/autofill/core/common/autofill_features.h"
diff --git a/components/autofill/core/browser/autofill_credit_card_filling_infobar_delegate_mobile.h b/components/autofill/core/browser/payments/autofill_credit_card_filling_infobar_delegate_mobile.h
similarity index 87%
rename from components/autofill/core/browser/autofill_credit_card_filling_infobar_delegate_mobile.h
rename to components/autofill/core/browser/payments/autofill_credit_card_filling_infobar_delegate_mobile.h
index c7b8172a..721af6e 100644
--- a/components/autofill/core/browser/autofill_credit_card_filling_infobar_delegate_mobile.h
+++ b/components/autofill/core/browser/payments/autofill_credit_card_filling_infobar_delegate_mobile.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_CREDIT_CARD_FILLING_INFOBAR_DELEGATE_MOBILE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_CREDIT_CARD_FILLING_INFOBAR_DELEGATE_MOBILE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_AUTOFILL_CREDIT_CARD_FILLING_INFOBAR_DELEGATE_MOBILE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_AUTOFILL_CREDIT_CARD_FILLING_INFOBAR_DELEGATE_MOBILE_H_
 
 #include <memory>
 
@@ -67,4 +67,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_CREDIT_CARD_FILLING_INFOBAR_DELEGATE_MOBILE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_AUTOFILL_CREDIT_CARD_FILLING_INFOBAR_DELEGATE_MOBILE_H_
diff --git a/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc b/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc
similarity index 97%
rename from components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc
rename to components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc
index 22fc50b..dda17122 100644
--- a/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc
+++ b/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h"
+#include "components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.h"
 
 #include <utility>
 
@@ -11,7 +11,7 @@
 #include "base/values.h"
 #include "components/autofill/core/browser/autofill_experiments.h"
 #include "components/autofill/core/browser/credit_card.h"
-#include "components/autofill/core/browser/legal_message_line.h"
+#include "components/autofill/core/browser/payments/legal_message_line.h"
 #include "components/autofill/core/common/autofill_constants.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_prefs.h"
diff --git a/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h b/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.h
similarity index 92%
rename from components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h
rename to components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.h
index a99817a0..62742f8 100644
--- a/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h
+++ b/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_SAVE_CARD_INFOBAR_DELEGATE_MOBILE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_SAVE_CARD_INFOBAR_DELEGATE_MOBILE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_AUTOFILL_SAVE_CARD_INFOBAR_DELEGATE_MOBILE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_AUTOFILL_SAVE_CARD_INFOBAR_DELEGATE_MOBILE_H_
 
 #include <memory>
 
@@ -12,7 +12,7 @@
 #include "base/strings/string16.h"
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/autofill_metrics.h"
-#include "components/autofill/core/browser/legal_message_line.h"
+#include "components/autofill/core/browser/payments/legal_message_line.h"
 #include "components/infobars/core/confirm_infobar_delegate.h"
 
 class PrefService;
@@ -127,4 +127,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_SAVE_CARD_INFOBAR_DELEGATE_MOBILE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_AUTOFILL_SAVE_CARD_INFOBAR_DELEGATE_MOBILE_H_
diff --git a/components/autofill/core/browser/autofill_save_card_infobar_mobile.h b/components/autofill/core/browser/payments/autofill_save_card_infobar_mobile.h
similarity index 66%
rename from components/autofill/core/browser/autofill_save_card_infobar_mobile.h
rename to components/autofill/core/browser/payments/autofill_save_card_infobar_mobile.h
index 995bc7d..969131b 100644
--- a/components/autofill/core/browser/autofill_save_card_infobar_mobile.h
+++ b/components/autofill/core/browser/payments/autofill_save_card_infobar_mobile.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_SAVE_CARD_INFOBAR_MOBILE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_SAVE_CARD_INFOBAR_MOBILE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_AUTOFILL_SAVE_CARD_INFOBAR_MOBILE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_AUTOFILL_SAVE_CARD_INFOBAR_MOBILE_H_
 
 #include <memory>
 
@@ -21,4 +21,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_SAVE_CARD_INFOBAR_MOBILE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_AUTOFILL_SAVE_CARD_INFOBAR_MOBILE_H_
diff --git a/components/autofill/core/browser/autofill_wallet_model_type_controller.cc b/components/autofill/core/browser/payments/autofill_wallet_model_type_controller.cc
similarity index 96%
rename from components/autofill/core/browser/autofill_wallet_model_type_controller.cc
rename to components/autofill/core/browser/payments/autofill_wallet_model_type_controller.cc
index e725f1e..e293d4f 100644
--- a/components/autofill/core/browser/autofill_wallet_model_type_controller.cc
+++ b/components/autofill/core/browser/payments/autofill_wallet_model_type_controller.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/autofill_wallet_model_type_controller.h"
+#include "components/autofill/core/browser/payments/autofill_wallet_model_type_controller.h"
 
 #include <utility>
 
diff --git a/components/autofill/core/browser/autofill_wallet_model_type_controller.h b/components/autofill/core/browser/payments/autofill_wallet_model_type_controller.h
similarity index 86%
rename from components/autofill/core/browser/autofill_wallet_model_type_controller.h
rename to components/autofill/core/browser/payments/autofill_wallet_model_type_controller.h
index 1f9fcb5..33726ed 100644
--- a/components/autofill/core/browser/autofill_wallet_model_type_controller.h
+++ b/components/autofill/core/browser/payments/autofill_wallet_model_type_controller.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_WALLET_MODEL_TYPE_CONTROLLER_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_WALLET_MODEL_TYPE_CONTROLLER_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_AUTOFILL_WALLET_MODEL_TYPE_CONTROLLER_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_AUTOFILL_WALLET_MODEL_TYPE_CONTROLLER_H_
 
 #include <memory>
 #include <string>
@@ -60,4 +60,4 @@
 
 }  // namespace browser_sync
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_WALLET_MODEL_TYPE_CONTROLLER_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_AUTOFILL_WALLET_MODEL_TYPE_CONTROLLER_H_
diff --git a/components/autofill/core/browser/card_unmask_delegate.cc b/components/autofill/core/browser/payments/card_unmask_delegate.cc
similarity index 85%
rename from components/autofill/core/browser/card_unmask_delegate.cc
rename to components/autofill/core/browser/payments/card_unmask_delegate.cc
index f22bbb1..82d06ec 100644
--- a/components/autofill/core/browser/card_unmask_delegate.cc
+++ b/components/autofill/core/browser/payments/card_unmask_delegate.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/card_unmask_delegate.h"
+#include "components/autofill/core/browser/payments/card_unmask_delegate.h"
 
 namespace autofill {
 
diff --git a/components/autofill/core/browser/card_unmask_delegate.h b/components/autofill/core/browser/payments/card_unmask_delegate.h
similarity index 80%
rename from components/autofill/core/browser/card_unmask_delegate.h
rename to components/autofill/core/browser/payments/card_unmask_delegate.h
index 232a348..729e5a34 100644
--- a/components/autofill/core/browser/card_unmask_delegate.h
+++ b/components/autofill/core/browser/payments/card_unmask_delegate.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_CARD_UNMASK_DELEGATE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_CARD_UNMASK_DELEGATE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_CARD_UNMASK_DELEGATE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_CARD_UNMASK_DELEGATE_H_
 
 #include <string>
 
@@ -41,4 +41,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_CARD_UNMASK_DELEGATE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_CARD_UNMASK_DELEGATE_H_
diff --git a/components/autofill/core/browser/credit_card_save_manager.cc b/components/autofill/core/browser/payments/credit_card_save_manager.cc
similarity index 99%
rename from components/autofill/core/browser/credit_card_save_manager.cc
rename to components/autofill/core/browser/payments/credit_card_save_manager.cc
index 6aa41e8e..7ce02840 100644
--- a/components/autofill/core/browser/credit_card_save_manager.cc
+++ b/components/autofill/core/browser/payments/credit_card_save_manager.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/credit_card_save_manager.h"
+#include "components/autofill/core/browser/payments/credit_card_save_manager.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -33,11 +33,11 @@
 #include "components/autofill/core/browser/autofill_type.h"
 #include "components/autofill/core/browser/credit_card.h"
 #include "components/autofill/core/browser/form_structure.h"
-#include "components/autofill/core/browser/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/legacy_strike_database.h"
 #include "components/autofill/core/browser/payments/payments_client.h"
 #include "components/autofill/core/browser/payments/payments_util.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
-#include "components/autofill/core/browser/strike_database.h"
 #include "components/autofill/core/browser/validation.h"
 #include "components/autofill/core/common/autofill_clock.h"
 #include "components/autofill/core/common/autofill_constants.h"
diff --git a/components/autofill/core/browser/credit_card_save_manager.h b/components/autofill/core/browser/payments/credit_card_save_manager.h
similarity index 97%
rename from components/autofill/core/browser/credit_card_save_manager.h
rename to components/autofill/core/browser/payments/credit_card_save_manager.h
index 5cffff6..44444215 100644
--- a/components/autofill/core/browser/credit_card_save_manager.h
+++ b/components/autofill/core/browser/payments/credit_card_save_manager.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_CREDIT_CARD_SAVE_MANAGER_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_CREDIT_CARD_SAVE_MANAGER_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_CREDIT_CARD_SAVE_MANAGER_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_CREDIT_CARD_SAVE_MANAGER_H_
 
 #include <map>
 #include <memory>
@@ -17,9 +17,9 @@
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/autofill_metrics.h"
 #include "components/autofill/core/browser/credit_card.h"
-#include "components/autofill/core/browser/credit_card_save_strike_database.h"
 #include "components/autofill/core/browser/form_structure.h"
-#include "components/autofill/core/browser/local_card_migration_strike_database.h"
+#include "components/autofill/core/browser/payments/credit_card_save_strike_database.h"
+#include "components/autofill/core/browser/payments/local_card_migration_strike_database.h"
 #include "components/autofill/core/browser/payments/payments_client.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "url/origin.h"
@@ -366,4 +366,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_CREDIT_CARD_SAVE_MANAGER_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_CREDIT_CARD_SAVE_MANAGER_H_
diff --git a/components/autofill/core/browser/credit_card_save_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
similarity index 99%
rename from components/autofill/core/browser/credit_card_save_manager_unittest.cc
rename to components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
index ec4e91e..d0d990d 100644
--- a/components/autofill/core/browser/credit_card_save_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/credit_card_save_manager.h"
+#include "components/autofill/core/browser/payments/credit_card_save_manager.h"
 
 #include <stddef.h>
 
@@ -28,16 +28,16 @@
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/credit_card.h"
 #include "components/autofill/core/browser/mock_autocomplete_history_manager.h"
+#include "components/autofill/core/browser/payments/test_credit_card_save_manager.h"
+#include "components/autofill/core/browser/payments/test_credit_card_save_strike_database.h"
+#include "components/autofill/core/browser/payments/test_legacy_strike_database.h"
 #include "components/autofill/core/browser/payments/test_payments_client.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/test_autofill_client.h"
 #include "components/autofill/core/browser/test_autofill_clock.h"
 #include "components/autofill/core/browser/test_autofill_driver.h"
 #include "components/autofill/core/browser/test_autofill_manager.h"
-#include "components/autofill/core/browser/test_credit_card_save_manager.h"
-#include "components/autofill/core/browser/test_credit_card_save_strike_database.h"
 #include "components/autofill/core/browser/test_form_data_importer.h"
-#include "components/autofill/core/browser/test_legacy_strike_database.h"
 #include "components/autofill/core/browser/test_personal_data_manager.h"
 #include "components/autofill/core/browser/validation.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
diff --git a/components/autofill/core/browser/credit_card_save_strike_database.cc b/components/autofill/core/browser/payments/credit_card_save_strike_database.cc
similarity index 91%
rename from components/autofill/core/browser/credit_card_save_strike_database.cc
rename to components/autofill/core/browser/payments/credit_card_save_strike_database.cc
index 5df822f3..cd0fd9e0a 100644
--- a/components/autofill/core/browser/credit_card_save_strike_database.cc
+++ b/components/autofill/core/browser/payments/credit_card_save_strike_database.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/credit_card_save_strike_database.h"
+#include "components/autofill/core/browser/payments/credit_card_save_strike_database.h"
 
 #include "components/autofill/core/browser/proto/strike_data.pb.h"
 
diff --git a/components/autofill/core/browser/credit_card_save_strike_database.h b/components/autofill/core/browser/payments/credit_card_save_strike_database.h
similarity index 62%
rename from components/autofill/core/browser/credit_card_save_strike_database.h
rename to components/autofill/core/browser/payments/credit_card_save_strike_database.h
index 5376822..fbe68217 100644
--- a/components/autofill/core/browser/credit_card_save_strike_database.h
+++ b/components/autofill/core/browser/payments/credit_card_save_strike_database.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_CREDIT_CARD_SAVE_STRIKE_DATABASE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_CREDIT_CARD_SAVE_STRIKE_DATABASE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_CREDIT_CARD_SAVE_STRIKE_DATABASE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_CREDIT_CARD_SAVE_STRIKE_DATABASE_H_
 
 #include <string>
 
-#include "components/autofill/core/browser/strike_database.h"
-#include "components/autofill/core/browser/strike_database_integrator_base.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database_integrator_base.h"
 
 namespace autofill {
 
@@ -27,4 +27,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_CREDIT_CARD_SAVE_STRIKE_DATABASE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_CREDIT_CARD_SAVE_STRIKE_DATABASE_H_
diff --git a/components/autofill/core/browser/payments/full_card_request.h b/components/autofill/core/browser/payments/full_card_request.h
index 3877904..661ddad 100644
--- a/components/autofill/core/browser/payments/full_card_request.h
+++ b/components/autofill/core/browser/payments/full_card_request.h
@@ -13,7 +13,7 @@
 #include "base/strings/string16.h"
 #include "base/time/time.h"
 #include "components/autofill/core/browser/autofill_client.h"
-#include "components/autofill/core/browser/card_unmask_delegate.h"
+#include "components/autofill/core/browser/payments/card_unmask_delegate.h"
 #include "components/autofill/core/browser/payments/payments_client.h"
 
 namespace autofill {
diff --git a/components/autofill/core/browser/legacy_strike_database.cc b/components/autofill/core/browser/payments/legacy_strike_database.cc
similarity index 98%
rename from components/autofill/core/browser/legacy_strike_database.cc
rename to components/autofill/core/browser/payments/legacy_strike_database.cc
index d575b2e4..9baf216 100644
--- a/components/autofill/core/browser/legacy_strike_database.cc
+++ b/components/autofill/core/browser/payments/legacy_strike_database.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/legacy_strike_database.h"
 
 #include <string>
 #include <utility>
diff --git a/components/autofill/core/browser/legacy_strike_database.h b/components/autofill/core/browser/payments/legacy_strike_database.h
similarity index 95%
rename from components/autofill/core/browser/legacy_strike_database.h
rename to components/autofill/core/browser/payments/legacy_strike_database.h
index c0aca236..38e7c29 100644
--- a/components/autofill/core/browser/legacy_strike_database.h
+++ b/components/autofill/core/browser/payments/legacy_strike_database.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_LEGACY_STRIKE_DATABASE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_LEGACY_STRIKE_DATABASE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_LEGACY_STRIKE_DATABASE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_LEGACY_STRIKE_DATABASE_H_
 
 #include <memory>
 #include <string>
@@ -145,4 +145,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_LEGACY_STRIKE_DATABASE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_LEGACY_STRIKE_DATABASE_H_
diff --git a/components/autofill/core/browser/legacy_strike_database_unittest.cc b/components/autofill/core/browser/payments/legacy_strike_database_unittest.cc
similarity index 98%
rename from components/autofill/core/browser/legacy_strike_database_unittest.cc
rename to components/autofill/core/browser/payments/legacy_strike_database_unittest.cc
index 44e60a4..cbcd36e 100644
--- a/components/autofill/core/browser/legacy_strike_database_unittest.cc
+++ b/components/autofill/core/browser/payments/legacy_strike_database_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/legacy_strike_database.h"
 
 #include <utility>
 #include <vector>
diff --git a/components/autofill/core/browser/legal_message_line.cc b/components/autofill/core/browser/payments/legal_message_line.cc
similarity index 98%
rename from components/autofill/core/browser/legal_message_line.cc
rename to components/autofill/core/browser/payments/legal_message_line.cc
index 87adcc5..b18bc27 100644
--- a/components/autofill/core/browser/legal_message_line.cc
+++ b/components/autofill/core/browser/payments/legal_message_line.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/legal_message_line.h"
+#include "components/autofill/core/browser/payments/legal_message_line.h"
 
 #include "base/i18n/message_formatter.h"
 #include "base/logging.h"
diff --git a/components/autofill/core/browser/legal_message_line.h b/components/autofill/core/browser/payments/legal_message_line.h
similarity index 92%
rename from components/autofill/core/browser/legal_message_line.h
rename to components/autofill/core/browser/payments/legal_message_line.h
index cb1dbf33..4d9f2659 100644
--- a/components/autofill/core/browser/legal_message_line.h
+++ b/components/autofill/core/browser/payments/legal_message_line.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_LEGAL_MESSAGE_LINE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_LEGAL_MESSAGE_LINE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_LEGAL_MESSAGE_LINE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_LEGAL_MESSAGE_LINE_H_
 
 #include <string>
 #include <vector>
@@ -88,4 +88,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_LEGAL_MESSAGE_LINE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_LEGAL_MESSAGE_LINE_H_
diff --git a/components/autofill/core/browser/legal_message_line_unittest.cc b/components/autofill/core/browser/payments/legal_message_line_unittest.cc
similarity index 99%
rename from components/autofill/core/browser/legal_message_line_unittest.cc
rename to components/autofill/core/browser/payments/legal_message_line_unittest.cc
index 2dfe0fd..d5a10a1 100644
--- a/components/autofill/core/browser/legal_message_line_unittest.cc
+++ b/components/autofill/core/browser/payments/legal_message_line_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/legal_message_line.h"
+#include "components/autofill/core/browser/payments/legal_message_line.h"
 
 #include <memory>
 #include <string>
diff --git a/components/autofill/core/browser/local_card_migration_manager.cc b/components/autofill/core/browser/payments/local_card_migration_manager.cc
similarity index 99%
rename from components/autofill/core/browser/local_card_migration_manager.cc
rename to components/autofill/core/browser/payments/local_card_migration_manager.cc
index 8d3beb1..2091f743 100644
--- a/components/autofill/core/browser/local_card_migration_manager.cc
+++ b/components/autofill/core/browser/payments/local_card_migration_manager.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 
 #include <stddef.h>
 
diff --git a/components/autofill/core/browser/local_card_migration_manager.h b/components/autofill/core/browser/payments/local_card_migration_manager.h
similarity index 96%
rename from components/autofill/core/browser/local_card_migration_manager.h
rename to components/autofill/core/browser/payments/local_card_migration_manager.h
index 02365d3..9c12b4e 100644
--- a/components/autofill/core/browser/local_card_migration_manager.h
+++ b/components/autofill/core/browser/payments/local_card_migration_manager.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_LOCAL_CARD_MIGRATION_MANAGER_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_LOCAL_CARD_MIGRATION_MANAGER_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_LOCAL_CARD_MIGRATION_MANAGER_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_LOCAL_CARD_MIGRATION_MANAGER_H_
 
 #include <memory>
 #include <string>
@@ -13,7 +13,7 @@
 #include "base/strings/string16.h"
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/autofill_metrics.h"
-#include "components/autofill/core/browser/local_card_migration_strike_database.h"
+#include "components/autofill/core/browser/payments/local_card_migration_strike_database.h"
 #include "components/autofill/core/browser/payments/payments_client.h"
 
 namespace autofill {
@@ -222,4 +222,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_LOCAL_CARD_MIGRATION_MANAGER_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_LOCAL_CARD_MIGRATION_MANAGER_H_
diff --git a/components/autofill/core/browser/local_card_migration_manager_unittest.cc b/components/autofill/core/browser/payments/local_card_migration_manager_unittest.cc
similarity index 99%
rename from components/autofill/core/browser/local_card_migration_manager_unittest.cc
rename to components/autofill/core/browser/payments/local_card_migration_manager_unittest.cc
index 654309b..4313fc85 100644
--- a/components/autofill/core/browser/local_card_migration_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/local_card_migration_manager_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 
 #include <stddef.h>
 
@@ -27,6 +27,8 @@
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/credit_card.h"
 #include "components/autofill/core/browser/mock_autocomplete_history_manager.h"
+#include "components/autofill/core/browser/payments/test_credit_card_save_manager.h"
+#include "components/autofill/core/browser/payments/test_local_card_migration_manager.h"
 #include "components/autofill/core/browser/payments/test_payments_client.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/sync_utils.h"
@@ -34,9 +36,7 @@
 #include "components/autofill/core/browser/test_autofill_clock.h"
 #include "components/autofill/core/browser/test_autofill_driver.h"
 #include "components/autofill/core/browser/test_autofill_manager.h"
-#include "components/autofill/core/browser/test_credit_card_save_manager.h"
 #include "components/autofill/core/browser/test_form_data_importer.h"
-#include "components/autofill/core/browser/test_local_card_migration_manager.h"
 #include "components/autofill/core/browser/test_personal_data_manager.h"
 #include "components/autofill/core/browser/validation.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
diff --git a/components/autofill/core/browser/local_card_migration_strike_database.cc b/components/autofill/core/browser/payments/local_card_migration_strike_database.cc
similarity index 93%
rename from components/autofill/core/browser/local_card_migration_strike_database.cc
rename to components/autofill/core/browser/payments/local_card_migration_strike_database.cc
index 5c204950..7cc649b 100644
--- a/components/autofill/core/browser/local_card_migration_strike_database.cc
+++ b/components/autofill/core/browser/payments/local_card_migration_strike_database.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/local_card_migration_strike_database.h"
+#include "components/autofill/core/browser/payments/local_card_migration_strike_database.h"
 
 #include "components/autofill/core/browser/proto/strike_data.pb.h"
 
diff --git a/components/autofill/core/browser/local_card_migration_strike_database.h b/components/autofill/core/browser/payments/local_card_migration_strike_database.h
similarity index 73%
rename from components/autofill/core/browser/local_card_migration_strike_database.h
rename to components/autofill/core/browser/payments/local_card_migration_strike_database.h
index 1124374..c63866d 100644
--- a/components/autofill/core/browser/local_card_migration_strike_database.h
+++ b/components/autofill/core/browser/payments/local_card_migration_strike_database.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_LOCAL_CARD_MIGRATION_STRIKE_DATABASE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_LOCAL_CARD_MIGRATION_STRIKE_DATABASE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_LOCAL_CARD_MIGRATION_STRIKE_DATABASE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_LOCAL_CARD_MIGRATION_STRIKE_DATABASE_H_
 
 #include <string>
 
-#include "components/autofill/core/browser/strike_database.h"
-#include "components/autofill/core/browser/strike_database_integrator_base.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database_integrator_base.h"
 
 namespace autofill {
 
@@ -36,4 +36,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_LOCAL_CARD_MIGRATION_STRIKE_DATABASE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_LOCAL_CARD_MIGRATION_STRIKE_DATABASE_H_
diff --git a/components/autofill/core/browser/payments/payments_client.cc b/components/autofill/core/browser/payments/payments_client.cc
index eb228c3..0fd0b85 100644
--- a/components/autofill/core/browser/payments/payments_client.cc
+++ b/components/autofill/core/browser/payments/payments_client.cc
@@ -18,12 +18,12 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "components/autofill/core/browser/account_info_getter.h"
 #include "components/autofill/core/browser/autofill_data_model.h"
 #include "components/autofill/core/browser/autofill_experiments.h"
 #include "components/autofill/core/browser/autofill_type.h"
 #include "components/autofill/core/browser/credit_card.h"
-#include "components/autofill/core/browser/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/account_info_getter.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 #include "components/autofill/core/browser/payments/payments_request.h"
 #include "components/autofill/core/browser/payments/payments_service_url.h"
 #include "components/autofill/core/common/autofill_features.h"
diff --git a/components/autofill/core/browser/payments/payments_client.h b/components/autofill/core/browser/payments/payments_client.h
index ad6c075..6af5be7 100644
--- a/components/autofill/core/browser/payments/payments_client.h
+++ b/components/autofill/core/browser/payments/payments_client.h
@@ -13,8 +13,8 @@
 #include "base/memory/weak_ptr.h"
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/autofill_profile.h"
-#include "components/autofill/core/browser/card_unmask_delegate.h"
 #include "components/autofill/core/browser/credit_card.h"
+#include "components/autofill/core/browser/payments/card_unmask_delegate.h"
 #include "components/prefs/pref_service.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 #include "services/identity/public/cpp/access_token_fetcher.h"
diff --git a/components/autofill/core/browser/payments/payments_client_unittest.cc b/components/autofill/core/browser/payments/payments_client_unittest.cc
index 6f9edce..12bdabf 100644
--- a/components/autofill/core/browser/payments/payments_client_unittest.cc
+++ b/components/autofill/core/browser/payments/payments_client_unittest.cc
@@ -17,8 +17,8 @@
 #include "base/values.h"
 #include "components/autofill/core/browser/autofill_experiments.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
-#include "components/autofill/core/browser/credit_card_save_manager.h"
-#include "components/autofill/core/browser/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/credit_card_save_manager.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 #include "components/autofill/core/browser/payments/payments_client.h"
 #include "components/autofill/core/browser/test_personal_data_manager.h"
 #include "components/autofill/core/common/autofill_features.h"
@@ -513,29 +513,6 @@
               std::string::npos);
 }
 
-TEST_F(PaymentsClientTest, GetUploadAccountFromSyncTest) {
-  EnableAutofillGetPaymentsIdentityFromSync();
-  // Set up a different account.
-  const AccountInfo& secondary_account_info =
-      identity_test_env_.MakeAccountAvailable("secondary@gmail.com");
-  test_personal_data_.SetAccountInfoForPayments(secondary_account_info);
-
-  StartUploading(/*include_cvc=*/true);
-  ReturnResponse(net::HTTP_OK, "{}");
-
-  // Issue a token for the secondary account.
-  identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
-      secondary_account_info.account_id, "secondary_account_token",
-      base::Time::Now() + base::TimeDelta::FromDays(10));
-
-  // Verify the auth header.
-  std::string auth_header_value;
-  EXPECT_TRUE(intercepted_headers_.GetHeader(
-      net::HttpRequestHeaders::kAuthorization, &auth_header_value))
-      << intercepted_headers_.ToString();
-  EXPECT_EQ("Bearer secondary_account_token", auth_header_value);
-}
-
 TEST_F(PaymentsClientTest, GetUploadDetailsVariationsTest) {
   // Register a trial and variation id, so that there is data in variations
   // headers. Also, the variations header provider may have been registered to
@@ -567,6 +544,104 @@
   variations::VariationsHttpHeaderProvider::GetInstance()->ResetForTesting();
 }
 
+TEST_F(PaymentsClientTest, GetDetailsIncludeBillableServiceNumber) {
+  StartGettingUploadDetails();
+
+  // Verify that billable service number was included in the request.
+  EXPECT_TRUE(GetUploadData().find("\"billable_service\":12345") !=
+              std::string::npos);
+}
+
+TEST_F(PaymentsClientTest, GetDetailsFollowedByUploadSuccess) {
+  StartGettingUploadDetails();
+  ReturnResponse(
+      net::HTTP_OK,
+      "{ \"context_token\": \"some_token\", \"legal_message\": {} }");
+  EXPECT_EQ(AutofillClient::SUCCESS, result_);
+
+  result_ = AutofillClient::NONE;
+
+  StartUploading(/*include_cvc=*/true);
+  IssueOAuthToken();
+  ReturnResponse(net::HTTP_OK, "{}");
+  EXPECT_EQ(AutofillClient::SUCCESS, result_);
+}
+
+TEST_F(PaymentsClientTest, GetDetailsFollowedByMigrationSuccess) {
+  StartGettingUploadDetails();
+  ReturnResponse(
+      net::HTTP_OK,
+      "{ \"context_token\": \"some_token\", \"legal_message\": {} }");
+  EXPECT_EQ(AutofillClient::SUCCESS, result_);
+
+  result_ = AutofillClient::NONE;
+
+  StartMigrating(/*has_cardholder_name=*/true);
+  IssueOAuthToken();
+  ReturnResponse(
+      net::HTTP_OK,
+      "{\"save_result\":[],\"value_prop_display_text\":\"display text\"}");
+  EXPECT_EQ(AutofillClient::SUCCESS, result_);
+}
+
+TEST_F(PaymentsClientTest, GetDetailsMissingContextToken) {
+  StartGettingUploadDetails();
+  ReturnResponse(net::HTTP_OK, "{ \"legal_message\": {} }");
+  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
+}
+
+TEST_F(PaymentsClientTest, GetDetailsMissingLegalMessage) {
+  StartGettingUploadDetails();
+  ReturnResponse(net::HTTP_OK, "{ \"context_token\": \"some_token\" }");
+  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
+  EXPECT_EQ(nullptr, legal_message_.get());
+}
+
+TEST_F(PaymentsClientTest, SupportedCardBinRangesParsesCorrectly) {
+  StartGettingUploadDetails();
+  ReturnResponse(net::HTTP_OK,
+                 "{"
+                 "  \"context_token\" : \"some_token\","
+                 "  \"legal_message\" : {},"
+                 "  \"supported_card_bin_ranges\" : [ {"
+                 "    \"start\": 35, \"end\": 38"
+                 "  }, {"
+                 "    \"start\": 123, \"end\": 123"
+                 "  } ] "
+                 "}");
+  EXPECT_EQ(AutofillClient::SUCCESS, result_);
+  // Check that |supported_card_bin_ranges_| has the two entries specified in
+  // ReturnResponse(~) above.
+  ASSERT_EQ(2U, supported_card_bin_ranges_.size());
+  EXPECT_EQ(35, supported_card_bin_ranges_[0].first);
+  EXPECT_EQ(38, supported_card_bin_ranges_[0].second);
+  EXPECT_EQ(123, supported_card_bin_ranges_[1].first);
+  EXPECT_EQ(123, supported_card_bin_ranges_[1].second);
+}
+
+TEST_F(PaymentsClientTest, GetUploadAccountFromSyncTest) {
+  EnableAutofillGetPaymentsIdentityFromSync();
+  // Set up a different account.
+  const AccountInfo& secondary_account_info =
+      identity_test_env_.MakeAccountAvailable("secondary@gmail.com");
+  test_personal_data_.SetAccountInfoForPayments(secondary_account_info);
+
+  StartUploading(/*include_cvc=*/true);
+  ReturnResponse(net::HTTP_OK, "{}");
+
+  // Issue a token for the secondary account.
+  identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
+      secondary_account_info.account_id, "secondary_account_token",
+      base::Time::Now() + base::TimeDelta::FromDays(10));
+
+  // Verify the auth header.
+  std::string auth_header_value;
+  EXPECT_TRUE(intercepted_headers_.GetHeader(
+      net::HttpRequestHeaders::kAuthorization, &auth_header_value))
+      << intercepted_headers_.ToString();
+  EXPECT_EQ("Bearer secondary_account_token", auth_header_value);
+}
+
 TEST_F(PaymentsClientTest, UploadCardVariationsTest) {
   // Register a trial and variation id, so that there is data in variations
   // headers. Also, the variations header provider may have been registered to
@@ -664,14 +739,6 @@
   variations::VariationsHttpHeaderProvider::GetInstance()->ResetForTesting();
 }
 
-TEST_F(PaymentsClientTest, GetDetailsIncludeBillableServiceNumber) {
-  StartGettingUploadDetails();
-
-  // Verify that billable service number was included in the request.
-  EXPECT_TRUE(GetUploadData().find("\"billable_service\":12345") !=
-              std::string::npos);
-}
-
 TEST_F(PaymentsClientTest, UploadSuccessWithoutServerId) {
   StartUploading(/*include_cvc=*/true);
   IssueOAuthToken();
@@ -914,57 +981,12 @@
   EXPECT_EQ("display text", display_text_);
 }
 
-TEST_F(PaymentsClientTest, GetDetailsFollowedByUploadSuccess) {
-  StartGettingUploadDetails();
-  ReturnResponse(
-      net::HTTP_OK,
-      "{ \"context_token\": \"some_token\", \"legal_message\": {} }");
-  EXPECT_EQ(AutofillClient::SUCCESS, result_);
-
-  result_ = AutofillClient::NONE;
-
-  StartUploading(/*include_cvc=*/true);
-  IssueOAuthToken();
-  ReturnResponse(net::HTTP_OK, "{}");
-  EXPECT_EQ(AutofillClient::SUCCESS, result_);
-}
-
-TEST_F(PaymentsClientTest, GetDetailsFollowedByMigrationSuccess) {
-  StartGettingUploadDetails();
-  ReturnResponse(
-      net::HTTP_OK,
-      "{ \"context_token\": \"some_token\", \"legal_message\": {} }");
-  EXPECT_EQ(AutofillClient::SUCCESS, result_);
-
-  result_ = AutofillClient::NONE;
-
-  StartMigrating(/*has_cardholder_name=*/true);
-  IssueOAuthToken();
-  ReturnResponse(
-      net::HTTP_OK,
-      "{\"save_result\":[],\"value_prop_display_text\":\"display text\"}");
-  EXPECT_EQ(AutofillClient::SUCCESS, result_);
-}
-
 TEST_F(PaymentsClientTest, UnmaskMissingPan) {
   StartUnmasking();
   ReturnResponse(net::HTTP_OK, "{}");
   EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
 }
 
-TEST_F(PaymentsClientTest, GetDetailsMissingContextToken) {
-  StartGettingUploadDetails();
-  ReturnResponse(net::HTTP_OK, "{ \"legal_message\": {} }");
-  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
-}
-
-TEST_F(PaymentsClientTest, GetDetailsMissingLegalMessage) {
-  StartGettingUploadDetails();
-  ReturnResponse(net::HTTP_OK, "{ \"context_token\": \"some_token\" }");
-  EXPECT_EQ(AutofillClient::PERMANENT_FAILURE, result_);
-  EXPECT_EQ(nullptr, legal_message_.get());
-}
-
 TEST_F(PaymentsClientTest, RetryFailure) {
   StartUnmasking();
   IssueOAuthToken();
diff --git a/components/autofill/core/browser/risk_data_loader.h b/components/autofill/core/browser/payments/risk_data_loader.h
similarity index 69%
rename from components/autofill/core/browser/risk_data_loader.h
rename to components/autofill/core/browser/payments/risk_data_loader.h
index 2b8468bb..a9860ee 100644
--- a/components/autofill/core/browser/risk_data_loader.h
+++ b/components/autofill/core/browser/payments/risk_data_loader.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_RISK_DATA_LOADER_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_RISK_DATA_LOADER_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_RISK_DATA_LOADER_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_RISK_DATA_LOADER_H_
 
 #include <string>
 
@@ -23,4 +23,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_RISK_DATA_LOADER_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_RISK_DATA_LOADER_H_
diff --git a/components/autofill/core/browser/strike_database.cc b/components/autofill/core/browser/payments/strike_database.cc
similarity index 98%
rename from components/autofill/core/browser/strike_database.cc
rename to components/autofill/core/browser/payments/strike_database.cc
index 4100250..10ff55f 100644
--- a/components/autofill/core/browser/strike_database.cc
+++ b/components/autofill/core/browser/payments/strike_database.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 
 #include <algorithm>
 #include <string>
diff --git a/components/autofill/core/browser/strike_database.h b/components/autofill/core/browser/payments/strike_database.h
similarity index 96%
rename from components/autofill/core/browser/strike_database.h
rename to components/autofill/core/browser/payments/strike_database.h
index 8b8915d..029aebe6 100644
--- a/components/autofill/core/browser/strike_database.h
+++ b/components/autofill/core/browser/payments/strike_database.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_STRIKE_DATABASE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_STRIKE_DATABASE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_STRIKE_DATABASE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_STRIKE_DATABASE_H_
 
 #include <map>
 #include <memory>
@@ -165,4 +165,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_STRIKE_DATABASE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_STRIKE_DATABASE_H_
diff --git a/components/autofill/core/browser/strike_database_integrator_base.cc b/components/autofill/core/browser/payments/strike_database_integrator_base.cc
similarity index 97%
rename from components/autofill/core/browser/strike_database_integrator_base.cc
rename to components/autofill/core/browser/payments/strike_database_integrator_base.cc
index 5b04261..1d0f11324 100644
--- a/components/autofill/core/browser/strike_database_integrator_base.cc
+++ b/components/autofill/core/browser/payments/strike_database_integrator_base.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/strike_database_integrator_base.h"
+#include "components/autofill/core/browser/payments/strike_database_integrator_base.h"
 
 #include <algorithm>
 #include <string>
diff --git a/components/autofill/core/browser/strike_database_integrator_base.h b/components/autofill/core/browser/payments/strike_database_integrator_base.h
similarity index 92%
rename from components/autofill/core/browser/strike_database_integrator_base.h
rename to components/autofill/core/browser/payments/strike_database_integrator_base.h
index 3e1bf565..63e624e 100644
--- a/components/autofill/core/browser/strike_database_integrator_base.h
+++ b/components/autofill/core/browser/payments/strike_database_integrator_base.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_STRIKE_DATABASE_INTEGRATOR_BASE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_STRIKE_DATABASE_INTEGRATOR_BASE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_STRIKE_DATABASE_INTEGRATOR_BASE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_STRIKE_DATABASE_INTEGRATOR_BASE_H_
 
-#include "components/autofill/core/browser/strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 
 namespace autofill {
 
@@ -104,4 +104,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_STRIKE_DATABASE_INTEGRATOR_BASE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_STRIKE_DATABASE_INTEGRATOR_BASE_H_
diff --git a/components/autofill/core/browser/strike_database_integrator_test_strike_database.cc b/components/autofill/core/browser/payments/strike_database_integrator_test_strike_database.cc
similarity index 92%
rename from components/autofill/core/browser/strike_database_integrator_test_strike_database.cc
rename to components/autofill/core/browser/payments/strike_database_integrator_test_strike_database.cc
index c5be513..99e701a 100644
--- a/components/autofill/core/browser/strike_database_integrator_test_strike_database.cc
+++ b/components/autofill/core/browser/payments/strike_database_integrator_test_strike_database.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/strike_database_integrator_test_strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database_integrator_test_strike_database.h"
 
 #include "components/autofill/core/browser/proto/strike_data.pb.h"
 
diff --git a/components/autofill/core/browser/strike_database_integrator_test_strike_database.h b/components/autofill/core/browser/payments/strike_database_integrator_test_strike_database.h
similarity index 64%
rename from components/autofill/core/browser/strike_database_integrator_test_strike_database.h
rename to components/autofill/core/browser/payments/strike_database_integrator_test_strike_database.h
index 3a50f6e..22afb7a7 100644
--- a/components/autofill/core/browser/strike_database_integrator_test_strike_database.h
+++ b/components/autofill/core/browser/payments/strike_database_integrator_test_strike_database.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_STRIKE_DATABASE_INTEGRATOR_TEST_STRIKE_DATABASE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_STRIKE_DATABASE_INTEGRATOR_TEST_STRIKE_DATABASE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_STRIKE_DATABASE_INTEGRATOR_TEST_STRIKE_DATABASE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_STRIKE_DATABASE_INTEGRATOR_TEST_STRIKE_DATABASE_H_
 
 #include <string>
 
-#include "components/autofill/core/browser/strike_database.h"
-#include "components/autofill/core/browser/strike_database_integrator_base.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database_integrator_base.h"
 
 namespace autofill {
 
@@ -33,4 +33,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_STRIKE_DATABASE_INTEGRATOR_TEST_STRIKE_DATABASE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_STRIKE_DATABASE_INTEGRATOR_TEST_STRIKE_DATABASE_H_
diff --git a/components/autofill/core/browser/strike_database_integrator_test_strike_database_unittest.cc b/components/autofill/core/browser/payments/strike_database_integrator_test_strike_database_unittest.cc
similarity index 98%
rename from components/autofill/core/browser/strike_database_integrator_test_strike_database_unittest.cc
rename to components/autofill/core/browser/payments/strike_database_integrator_test_strike_database_unittest.cc
index a6e961b..41910b9 100644
--- a/components/autofill/core/browser/strike_database_integrator_test_strike_database_unittest.cc
+++ b/components/autofill/core/browser/payments/strike_database_integrator_test_strike_database_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/strike_database_integrator_test_strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database_integrator_test_strike_database.h"
 
 #include <utility>
 #include <vector>
diff --git a/components/autofill/core/browser/strike_database_unittest.cc b/components/autofill/core/browser/payments/strike_database_unittest.cc
similarity index 98%
rename from components/autofill/core/browser/strike_database_unittest.cc
rename to components/autofill/core/browser/payments/strike_database_unittest.cc
index 88a5ede..508a1bc7 100644
--- a/components/autofill/core/browser/strike_database_unittest.cc
+++ b/components/autofill/core/browser/payments/strike_database_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 
 #include <utility>
 #include <vector>
diff --git a/components/autofill/core/browser/test_credit_card_save_manager.cc b/components/autofill/core/browser/payments/test_credit_card_save_manager.cc
similarity index 94%
rename from components/autofill/core/browser/test_credit_card_save_manager.cc
rename to components/autofill/core/browser/payments/test_credit_card_save_manager.cc
index 21007fe..19fc90c 100644
--- a/components/autofill/core/browser/test_credit_card_save_manager.cc
+++ b/components/autofill/core/browser/payments/test_credit_card_save_manager.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/test_credit_card_save_manager.h"
+#include "components/autofill/core/browser/payments/test_credit_card_save_manager.h"
 
 #include "components/autofill/core/browser/payments/test_payments_client.h"
 
diff --git a/components/autofill/core/browser/test_credit_card_save_manager.h b/components/autofill/core/browser/payments/test_credit_card_save_manager.h
similarity index 82%
rename from components/autofill/core/browser/test_credit_card_save_manager.h
rename to components/autofill/core/browser/payments/test_credit_card_save_manager.h
index c01c302..7a16e63e 100644
--- a/components/autofill/core/browser/test_credit_card_save_manager.h
+++ b/components/autofill/core/browser/payments/test_credit_card_save_manager.h
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_CREDIT_CARD_SAVE_MANAGER_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_CREDIT_CARD_SAVE_MANAGER_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_CREDIT_CARD_SAVE_MANAGER_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_CREDIT_CARD_SAVE_MANAGER_H_
 
 #include <string>
 
-#include "components/autofill/core/browser/credit_card_save_manager.h"
+#include "components/autofill/core/browser/payments/credit_card_save_manager.h"
 
 namespace autofill {
 
@@ -56,4 +56,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_CREDIT_CARD_SAVE_MANAGER_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_CREDIT_CARD_SAVE_MANAGER_H_
diff --git a/components/autofill/core/browser/test_credit_card_save_strike_database.cc b/components/autofill/core/browser/payments/test_credit_card_save_strike_database.cc
similarity index 80%
rename from components/autofill/core/browser/test_credit_card_save_strike_database.cc
rename to components/autofill/core/browser/payments/test_credit_card_save_strike_database.cc
index ebeb05a..14d8505 100644
--- a/components/autofill/core/browser/test_credit_card_save_strike_database.cc
+++ b/components/autofill/core/browser/payments/test_credit_card_save_strike_database.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/test_credit_card_save_strike_database.h"
+#include "components/autofill/core/browser/payments/test_credit_card_save_strike_database.h"
 
 namespace autofill {
 
diff --git a/components/autofill/core/browser/payments/test_credit_card_save_strike_database.h b/components/autofill/core/browser/payments/test_credit_card_save_strike_database.h
new file mode 100644
index 0000000..0db857c57
--- /dev/null
+++ b/components/autofill/core/browser/payments/test_credit_card_save_strike_database.h
@@ -0,0 +1,19 @@
+// 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_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_CREDIT_CARD_SAVE_STRIKE_DATABASE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_CREDIT_CARD_SAVE_STRIKE_DATABASE_H_
+
+#include "components/autofill/core/browser/payments/credit_card_save_strike_database.h"
+
+namespace autofill {
+
+class TestCreditCardSaveStrikeDatabase : public CreditCardSaveStrikeDatabase {
+ public:
+  TestCreditCardSaveStrikeDatabase(StrikeDatabase* strike_database);
+};
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_CREDIT_CARD_SAVE_STRIKE_DATABASE_H_
diff --git a/components/autofill/core/browser/test_legacy_strike_database.cc b/components/autofill/core/browser/payments/test_legacy_strike_database.cc
similarity index 95%
rename from components/autofill/core/browser/test_legacy_strike_database.cc
rename to components/autofill/core/browser/payments/test_legacy_strike_database.cc
index 28d334b3..0ec6a57 100644
--- a/components/autofill/core/browser/test_legacy_strike_database.cc
+++ b/components/autofill/core/browser/payments/test_legacy_strike_database.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/test_legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/test_legacy_strike_database.h"
 
 #include "components/autofill/core/browser/proto/strike_data.pb.h"
 
diff --git a/components/autofill/core/browser/test_legacy_strike_database.h b/components/autofill/core/browser/payments/test_legacy_strike_database.h
similarity index 78%
rename from components/autofill/core/browser/test_legacy_strike_database.h
rename to components/autofill/core/browser/payments/test_legacy_strike_database.h
index ddf878f..ca8ca1a7 100644
--- a/components/autofill/core/browser/test_legacy_strike_database.h
+++ b/components/autofill/core/browser/payments/test_legacy_strike_database.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_LEGACY_STRIKE_DATABASE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_LEGACY_STRIKE_DATABASE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_LEGACY_STRIKE_DATABASE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_LEGACY_STRIKE_DATABASE_H_
 
 #include <memory>
 #include <string>
@@ -11,7 +11,7 @@
 #include <utility>
 #include <vector>
 
-#include "components/autofill/core/browser/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/legacy_strike_database.h"
 
 namespace autofill {
 
@@ -42,4 +42,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_LEGACY_STRIKE_DATABASE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_LEGACY_STRIKE_DATABASE_H_
diff --git a/components/autofill/core/browser/test_local_card_migration_manager.cc b/components/autofill/core/browser/payments/test_local_card_migration_manager.cc
similarity index 97%
rename from components/autofill/core/browser/test_local_card_migration_manager.cc
rename to components/autofill/core/browser/payments/test_local_card_migration_manager.cc
index b9808476..34577f8 100644
--- a/components/autofill/core/browser/test_local_card_migration_manager.cc
+++ b/components/autofill/core/browser/payments/test_local_card_migration_manager.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/test_local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/test_local_card_migration_manager.h"
 
 #include "components/autofill/core/browser/autofill_metrics.h"
 #include "components/autofill/core/browser/payments/test_payments_client.h"
diff --git a/components/autofill/core/browser/test_local_card_migration_manager.h b/components/autofill/core/browser/payments/test_local_card_migration_manager.h
similarity index 88%
rename from components/autofill/core/browser/test_local_card_migration_manager.h
rename to components/autofill/core/browser/payments/test_local_card_migration_manager.h
index 722d366..25d38d7ae 100644
--- a/components/autofill/core/browser/test_local_card_migration_manager.h
+++ b/components/autofill/core/browser/payments/test_local_card_migration_manager.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 COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_LOCAL_CARD_MIGRATION_MANAGER_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_LOCAL_CARD_MIGRATION_MANAGER_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_LOCAL_CARD_MIGRATION_MANAGER_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_LOCAL_CARD_MIGRATION_MANAGER_H_
 
 #include <memory>
 #include <string>
 #include <utility>
 #include <vector>
 
-#include "components/autofill/core/browser/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 #include "components/autofill/core/browser/sync_utils.h"
 #include "components/autofill/core/browser/test_personal_data_manager.h"
 
@@ -79,4 +79,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_LOCAL_CARD_MIGRATION_MANAGER_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_LOCAL_CARD_MIGRATION_MANAGER_H_
diff --git a/components/autofill/core/browser/test_strike_database.cc b/components/autofill/core/browser/payments/test_strike_database.cc
similarity index 94%
rename from components/autofill/core/browser/test_strike_database.cc
rename to components/autofill/core/browser/payments/test_strike_database.cc
index 4aee9cb..7b96773 100644
--- a/components/autofill/core/browser/test_strike_database.cc
+++ b/components/autofill/core/browser/payments/test_strike_database.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/test_strike_database.h"
+#include "components/autofill/core/browser/payments/test_strike_database.h"
 
 #include "components/autofill/core/browser/proto/strike_data.pb.h"
 
diff --git a/components/autofill/core/browser/test_strike_database.h b/components/autofill/core/browser/payments/test_strike_database.h
similarity index 78%
rename from components/autofill/core/browser/test_strike_database.h
rename to components/autofill/core/browser/payments/test_strike_database.h
index d46be27b..803a1f1 100644
--- a/components/autofill/core/browser/test_strike_database.h
+++ b/components/autofill/core/browser/payments/test_strike_database.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_STRIKE_DATABASE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_STRIKE_DATABASE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_STRIKE_DATABASE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_STRIKE_DATABASE_H_
 
 #include <memory>
 #include <string>
@@ -11,7 +11,7 @@
 #include <utility>
 #include <vector>
 
-#include "components/autofill/core/browser/strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 
 namespace autofill {
 
@@ -41,4 +41,4 @@
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_STRIKE_DATABASE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_STRIKE_DATABASE_H_
diff --git a/components/autofill/core/browser/personal_data_manager.h b/components/autofill/core/browser/personal_data_manager.h
index 0876f33..6b547d13 100644
--- a/components/autofill/core/browser/personal_data_manager.h
+++ b/components/autofill/core/browser/personal_data_manager.h
@@ -19,11 +19,11 @@
 #include "base/observer_list.h"
 #include "base/strings/string16.h"
 #include "build/build_config.h"
-#include "components/autofill/core/browser/account_info_getter.h"
 #include "components/autofill/core/browser/autofill_profile.h"
 #include "components/autofill/core/browser/autofill_profile_validator.h"
 #include "components/autofill/core/browser/credit_card.h"
 #include "components/autofill/core/browser/field_types.h"
+#include "components/autofill/core/browser/payments/account_info_getter.h"
 #include "components/autofill/core/browser/payments/payments_customer_data.h"
 #include "components/autofill/core/browser/proto/server.pb.h"
 #include "components/autofill/core/browser/suggestion.h"
diff --git a/components/autofill/core/browser/test_autofill_client.cc b/components/autofill/core/browser/test_autofill_client.cc
index dadbbd1d..fe92b8c 100644
--- a/components/autofill/core/browser/test_autofill_client.cc
+++ b/components/autofill/core/browser/test_autofill_client.cc
@@ -7,7 +7,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "components/autofill/core/browser/autofill_metrics.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
-#include "components/autofill/core/browser/local_card_migration_manager.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 
 namespace autofill {
diff --git a/components/autofill/core/browser/test_autofill_client.h b/components/autofill/core/browser/test_autofill_client.h
index 71baad7..70217e9 100644
--- a/components/autofill/core/browser/test_autofill_client.h
+++ b/components/autofill/core/browser/test_autofill_client.h
@@ -16,12 +16,12 @@
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/mock_autocomplete_history_manager.h"
+#include "components/autofill/core/browser/payments/test_legacy_strike_database.h"
 #include "components/autofill/core/browser/payments/test_payments_client.h"
+#include "components/autofill/core/browser/payments/test_strike_database.h"
 #include "components/autofill/core/browser/test_address_normalizer.h"
 #include "components/autofill/core/browser/test_form_data_importer.h"
-#include "components/autofill/core/browser/test_legacy_strike_database.h"
 #include "components/autofill/core/browser/test_personal_data_manager.h"
-#include "components/autofill/core/browser/test_strike_database.h"
 #include "components/prefs/pref_service.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "services/identity/public/cpp/identity_test_environment.h"
diff --git a/components/autofill/core/browser/test_credit_card_save_strike_database.h b/components/autofill/core/browser/test_credit_card_save_strike_database.h
deleted file mode 100644
index 070337c..0000000
--- a/components/autofill/core/browser/test_credit_card_save_strike_database.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_CREDIT_CARD_SAVE_STRIKE_DATABASE_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_CREDIT_CARD_SAVE_STRIKE_DATABASE_H_
-
-#include "components/autofill/core/browser/credit_card_save_strike_database.h"
-
-namespace autofill {
-
-class TestCreditCardSaveStrikeDatabase : public CreditCardSaveStrikeDatabase {
- public:
-  TestCreditCardSaveStrikeDatabase(StrikeDatabase* strike_database);
-};
-
-}  // namespace autofill
-
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_CREDIT_CARD_SAVE_STRIKE_DATABASE_H_
diff --git a/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.h b/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.h
index c7e3fb3..28c998f 100644
--- a/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.h
+++ b/components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.h
@@ -11,8 +11,8 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "components/autofill/core/browser/autofill_metrics.h"
-#include "components/autofill/core/browser/card_unmask_delegate.h"
 #include "components/autofill/core/browser/credit_card.h"
+#include "components/autofill/core/browser/payments/card_unmask_delegate.h"
 #include "components/autofill/core/browser/ui/card_unmask_prompt_controller.h"
 
 namespace autofill {
diff --git a/components/autofill/core/browser/ui/local_card_migration_dialog_controller.h b/components/autofill/core/browser/ui/local_card_migration_dialog_controller.h
index f2dcc17..0ce37929 100644
--- a/components/autofill/core/browser/ui/local_card_migration_dialog_controller.h
+++ b/components/autofill/core/browser/ui/local_card_migration_dialog_controller.h
@@ -10,7 +10,7 @@
 
 #include "base/macros.h"
 #include "base/strings/string16.h"
-#include "components/autofill/core/browser/legal_message_line.h"
+#include "components/autofill/core/browser/payments/legal_message_line.h"
 #include "url/gurl.h"
 
 namespace autofill {
diff --git a/components/autofill/core/browser/ui/save_card_bubble_controller.h b/components/autofill/core/browser/ui/save_card_bubble_controller.h
index d549f55..bbf3eb62 100644
--- a/components/autofill/core/browser/ui/save_card_bubble_controller.h
+++ b/components/autofill/core/browser/ui/save_card_bubble_controller.h
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/strings/string16.h"
 #include "components/autofill/core/browser/autofill_client.h"
-#include "components/autofill/core/browser/legal_message_line.h"
+#include "components/autofill/core/browser/payments/legal_message_line.h"
 #include "components/autofill/core/browser/sync_utils.h"
 #include "components/signin/core/browser/account_info.h"
 #include "url/gurl.h"
diff --git a/components/autofill/ios/browser/credit_card_save_manager_test_observer_bridge.h b/components/autofill/ios/browser/credit_card_save_manager_test_observer_bridge.h
index 4089ada..6c8f2d6 100644
--- a/components/autofill/ios/browser/credit_card_save_manager_test_observer_bridge.h
+++ b/components/autofill/ios/browser/credit_card_save_manager_test_observer_bridge.h
@@ -8,7 +8,7 @@
 #import <Foundation/Foundation.h>
 
 #include "base/macros.h"
-#include "components/autofill/core/browser/credit_card_save_manager.h"
+#include "components/autofill/core/browser/payments/credit_card_save_manager.h"
 
 // A protocol to be adopted by EarlGrey tests to get notified of actions that
 // occur in autofill::CreditCardSaveManager.
diff --git a/components/browser_sync/profile_sync_components_factory_impl.cc b/components/browser_sync/profile_sync_components_factory_impl.cc
index 77fc254..7fc51a1 100644
--- a/components/browser_sync/profile_sync_components_factory_impl.cc
+++ b/components/browser_sync/profile_sync_components_factory_impl.cc
@@ -12,7 +12,7 @@
 #include "base/single_thread_task_runner.h"
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autofill_wallet_data_type_controller.h"
-#include "components/autofill/core/browser/autofill_wallet_model_type_controller.h"
+#include "components/autofill/core/browser/payments/autofill_wallet_model_type_controller.h"
 #include "components/autofill/core/browser/webdata/autocomplete_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/autofill_profile_data_type_controller.h"
 #include "components/autofill/core/browser/webdata/autofill_profile_model_type_controller.h"
diff --git a/components/exo/shell_surface.cc b/components/exo/shell_surface.cc
index 94cf9f5..aea68e11 100644
--- a/components/exo/shell_surface.cc
+++ b/components/exo/shell_surface.cc
@@ -561,7 +561,7 @@
       ->set_parent_controls_visibility(true);
 }
 
-void ShellSurface::Configure() {
+void ShellSurface::Configure(bool ends_drag) {
   // Delay configure callback if |scoped_configure_| is set.
   if (scoped_configure_) {
     scoped_configure_->set_needs_configure();
@@ -577,7 +577,7 @@
         ash::wm::GetWindowState(widget_->GetNativeWindow());
 
     // If surface is being resized, save the resize direction.
-    if (window_state->is_dragged())
+    if (window_state->is_dragged() && !ends_drag)
       resize_component = window_state->drag_details()->window_component;
   }
 
@@ -659,10 +659,7 @@
 
 void ShellSurface::EndDrag() {
   if (resize_component_ != HTCAPTION) {
-    // Clear the drag details here as Configure uses it to decide if
-    // the window is being dragged.
-    ash::wm::GetWindowState(widget_->GetNativeWindow())->DeleteDragDetails();
-    Configure();
+    Configure(/*ends_drag=*/true);
   }
 }
 
diff --git a/components/exo/shell_surface.h b/components/exo/shell_surface.h
index 1a6419b..fb30af25 100644
--- a/components/exo/shell_surface.h
+++ b/components/exo/shell_surface.h
@@ -146,8 +146,9 @@
   // surface has a widget with a parent).
   void MaybeMakeTransient();
 
-  // Asks the client to configure its surface.
-  void Configure();
+  // Asks the client to configure its surface. Optionally, the user can override
+  // the behaviour to check for window dragging by setting ends_drag to true.
+  void Configure(bool ends_drag = false);
 
   void AttemptToStartDrag(int component);
 
diff --git a/components/gwp_asan/client/guarded_page_allocator.cc b/components/gwp_asan/client/guarded_page_allocator.cc
index 63e99f8..81abb6ef 100644
--- a/components/gwp_asan/client/guarded_page_allocator.cc
+++ b/components/gwp_asan/client/guarded_page_allocator.cc
@@ -48,11 +48,15 @@
 
 GuardedPageAllocator::GuardedPageAllocator() {}
 
-void GuardedPageAllocator::Init(size_t max_alloced_pages, size_t total_pages) {
+void GuardedPageAllocator::Init(size_t max_alloced_pages,
+                                size_t num_metadata,
+                                size_t total_pages) {
   CHECK_GT(max_alloced_pages, 0U);
   CHECK_LE(max_alloced_pages, total_pages);
-  CHECK_LE(total_pages, AllocatorState::kGpaMaxPages);
+  CHECK_EQ(num_metadata, total_pages);
+  CHECK_LE(total_pages, AllocatorState::kMaxSlots);
   max_alloced_pages_ = max_alloced_pages;
+  state_.num_metadata = num_metadata;
   state_.total_pages = total_pages;
 
   state_.page_size = base::GetPageSize();
@@ -74,7 +78,8 @@
     free_slots_end_ = total_pages;
   }
 
-  metadata_ = std::make_unique<AllocatorState::SlotMetadata[]>(total_pages);
+  metadata_ =
+      std::make_unique<AllocatorState::SlotMetadata[]>(state_.num_metadata);
   state_.metadata_addr = reinterpret_cast<uintptr_t>(metadata_.get());
 }
 
diff --git a/components/gwp_asan/client/guarded_page_allocator.h b/components/gwp_asan/client/guarded_page_allocator.h
index d820079..283d1ae 100644
--- a/components/gwp_asan/client/guarded_page_allocator.h
+++ b/components/gwp_asan/client/guarded_page_allocator.h
@@ -32,8 +32,8 @@
 
   // Configures this allocator to allocate up to max_alloced_pages pages at a
   // time from a pool of total_pages pages, where:
-  //   1 <= max_alloced_pages <= total_pages <= kGpaMaxPages
-  void Init(size_t max_alloced_pages, size_t total_pages);
+  //   1 <= max_alloced_pages <= num_metadata == total_pages <= kMaxSlots
+  void Init(size_t max_alloced_pages, size_t num_metadata, size_t total_pages);
 
   // On success, returns a pointer to size bytes of page-guarded memory. On
   // failure, returns nullptr. The allocation is not guaranteed to be
@@ -109,18 +109,18 @@
   base::Lock lock_;
 
   // Fixed-size array used to store all free slot indices.
-  AllocatorState::SlotIdx free_slots_[AllocatorState::kGpaMaxPages] GUARDED_BY(
+  AllocatorState::SlotIdx free_slots_[AllocatorState::kMaxSlots] GUARDED_BY(
       lock_);
   // Stores the end index of the array.
   size_t free_slots_end_ GUARDED_BY(lock_) = 0;
 
   // Number of currently-allocated pages.
   size_t num_alloced_pages_ GUARDED_BY(lock_) = 0;
-  // Max number of pages to allocate at once.
+  // Max number of concurrent allocations.
   size_t max_alloced_pages_ = 0;
 
   // We dynamically allocate the SlotMetadata array to avoid allocating
-  // extraneous memory for when total_pages < kGpaMaxPages.
+  // extraneous memory for when num_metadata < kMaxMetadata.
   std::unique_ptr<AllocatorState::SlotMetadata[]> metadata_;
 
   // Required for a singleton to access the constructor.
diff --git a/components/gwp_asan/client/guarded_page_allocator_unittest.cc b/components/gwp_asan/client/guarded_page_allocator_unittest.cc
index 2a17c1a..d4d82bc 100644
--- a/components/gwp_asan/client/guarded_page_allocator_unittest.cc
+++ b/components/gwp_asan/client/guarded_page_allocator_unittest.cc
@@ -18,12 +18,13 @@
 namespace gwp_asan {
 namespace internal {
 
-static constexpr size_t kGpaMaxPages = AllocatorState::kGpaMaxPages;
+static constexpr size_t kMaxMetadata = AllocatorState::kMaxMetadata;
+static constexpr size_t kMaxSlots = AllocatorState::kMaxSlots;
 
 class GuardedPageAllocatorTest : public testing::Test {
  protected:
-  explicit GuardedPageAllocatorTest(size_t max_allocated_pages = kGpaMaxPages) {
-    gpa_.Init(max_allocated_pages, kGpaMaxPages);
+  explicit GuardedPageAllocatorTest(size_t max_allocated_pages = kMaxMetadata) {
+    gpa_.Init(max_allocated_pages, kMaxMetadata, kMaxSlots);
   }
 
   // Get a left- or right- aligned allocation (or nullptr on error.)
@@ -137,7 +138,7 @@
 
 TEST_P(GuardedPageAllocatorParamTest, AllocDeallocAllPages) {
   size_t num_allocations = GetParam();
-  char* bufs[kGpaMaxPages];
+  char* bufs[kMaxMetadata];
   for (size_t i = 0; i < num_allocations; i++) {
     bufs[i] = reinterpret_cast<char*>(gpa_.Allocate(1));
     EXPECT_NE(bufs[i], nullptr);
@@ -165,24 +166,24 @@
 }
 INSTANTIATE_TEST_SUITE_P(VaryNumPages,
                          GuardedPageAllocatorParamTest,
-                         testing::Values(1, kGpaMaxPages / 2, kGpaMaxPages));
+                         testing::Values(1, kMaxMetadata / 2, kMaxMetadata));
 
 class ThreadedAllocCountDelegate : public base::DelegateSimpleThread::Delegate {
  public:
   explicit ThreadedAllocCountDelegate(
       GuardedPageAllocator* gpa,
-      std::array<void*, kGpaMaxPages>* allocations)
+      std::array<void*, kMaxMetadata>* allocations)
       : gpa_(gpa), allocations_(allocations) {}
 
   void Run() override {
-    for (size_t i = 0; i < kGpaMaxPages; i++) {
+    for (size_t i = 0; i < kMaxMetadata; i++) {
       (*allocations_)[i] = gpa_->Allocate(1);
     }
   }
 
  private:
   GuardedPageAllocator* gpa_;
-  std::array<void*, kGpaMaxPages>* allocations_;
+  std::array<void*, kMaxMetadata>* allocations_;
 
   DISALLOW_COPY_AND_ASSIGN(ThreadedAllocCountDelegate);
 };
@@ -191,7 +192,7 @@
 // extra pages are allocated when there's concurrent calls to Allocate().
 TEST_F(GuardedPageAllocatorTest, ThreadedAllocCount) {
   constexpr size_t num_threads = 2;
-  std::array<void*, kGpaMaxPages> allocations[num_threads];
+  std::array<void*, kMaxMetadata> allocations[num_threads];
   {
     base::DelegateSimpleThreadPool threads("alloc_threads", num_threads);
     threads.Start();
@@ -208,12 +209,12 @@
   }
   std::set<void*> allocations_set;
   for (size_t i = 0; i < num_threads; i++) {
-    for (size_t j = 0; j < kGpaMaxPages; j++) {
+    for (size_t j = 0; j < kMaxMetadata; j++) {
       allocations_set.insert(allocations[i][j]);
     }
   }
   allocations_set.erase(nullptr);
-  EXPECT_EQ(allocations_set.size(), kGpaMaxPages);
+  EXPECT_EQ(allocations_set.size(), kMaxMetadata);
 }
 
 class ThreadedHighContentionDelegate
@@ -267,7 +268,7 @@
   }
 
   // Verify all pages have been deallocated now that all threads are done.
-  for (size_t i = 0; i < kGpaMaxPages; i++)
+  for (size_t i = 0; i < kMaxMetadata; i++)
     EXPECT_NE(gpa_.Allocate(1), nullptr);
 }
 
diff --git a/components/gwp_asan/client/gwp_asan.cc b/components/gwp_asan/client/gwp_asan.cc
index 1f64ea3..d556855 100644
--- a/components/gwp_asan/client/gwp_asan.cc
+++ b/components/gwp_asan/client/gwp_asan.cc
@@ -57,12 +57,12 @@
   if (!base::FeatureList::IsEnabled(kGwpAsan))
     return false;
 
-  static_assert(AllocatorState::kGpaMaxPages <= std::numeric_limits<int>::max(),
-                "kGpaMaxPages out of range");
-  constexpr int kMaxPages = static_cast<int>(AllocatorState::kGpaMaxPages);
+  static_assert(AllocatorState::kMaxSlots <= std::numeric_limits<int>::max(),
+                "kMaxSlots out of range");
+  constexpr int kMaxSlots = static_cast<int>(AllocatorState::kMaxSlots);
 
   int total_pages = kTotalPagesParam.Get();
-  if (total_pages < 1 || total_pages > kMaxPages) {
+  if (total_pages < 1 || total_pages > kMaxSlots) {
     DLOG(ERROR) << "GWP-ASan TotalPages is out-of-range: " << total_pages;
     return false;
   }
@@ -96,7 +96,7 @@
     multiplier += kIncreasedMemoryMultiplierParam.Get();
 
   if (!multiplier.IsValid() || multiplier.ValueOrDie() < 1 ||
-      multiplier.ValueOrDie() > kMaxPages) {
+      multiplier.ValueOrDie() > kMaxSlots) {
     DLOG(ERROR) << "GWP-ASan IncreaseMemoryMultiplier is out-of-range";
     return false;
   }
@@ -112,14 +112,15 @@
     return false;
   }
 
-  total_pages = std::min<int>(total_pages_mult.ValueOrDie(), kMaxPages);
+  total_pages = std::min<int>(total_pages_mult.ValueOrDie(), kMaxSlots);
   max_allocations =
       std::min<int>(max_allocations_mult.ValueOrDie(), total_pages);
 
   if (base::RandDouble() >= process_sampling_probability)
     return false;
 
-  InstallAllocatorHooks(max_allocations, total_pages, alloc_sampling_freq);
+  InstallAllocatorHooks(max_allocations, total_pages, total_pages,
+                        alloc_sampling_freq);
   return true;
 }
 
diff --git a/components/gwp_asan/client/sampling_allocator_shims.cc b/components/gwp_asan/client/sampling_allocator_shims.cc
index 5651bd2..2c24768b 100644
--- a/components/gwp_asan/client/sampling_allocator_shims.cc
+++ b/components/gwp_asan/client/sampling_allocator_shims.cc
@@ -323,11 +323,12 @@
 }
 
 void InstallAllocatorHooks(size_t max_allocated_pages,
+                           size_t num_metadata,
                            size_t total_pages,
                            size_t sampling_frequency) {
 #if BUILDFLAG(USE_ALLOCATOR_SHIM)
   gpa = new GuardedPageAllocator();
-  gpa->Init(max_allocated_pages, total_pages);
+  gpa->Init(max_allocated_pages, num_metadata, total_pages);
   RegisterAllocatorAddress(gpa->GetCrashKeyAddress());
   sampling_state.Init(sampling_frequency);
   base::allocator::InsertAllocatorDispatch(&g_allocator_dispatch);
diff --git a/components/gwp_asan/client/sampling_allocator_shims.h b/components/gwp_asan/client/sampling_allocator_shims.h
index a331dde..ded650a4 100644
--- a/components/gwp_asan/client/sampling_allocator_shims.h
+++ b/components/gwp_asan/client/sampling_allocator_shims.h
@@ -12,9 +12,10 @@
 namespace gwp_asan {
 namespace internal {
 
-// Initialize the guarded allocator with the given total and max allocated pages
-// and install sampling allocator shims with the provided sampling frequency.
+// Initialize the guarded allocator with the given parameters, and install the
+// sampling allocator shims with the provided sampling frequency.
 GWP_ASAN_EXPORT void InstallAllocatorHooks(size_t max_allocated_pages,
+                                           size_t num_metadata,
                                            size_t total_pages,
                                            size_t sampling_frequency);
 
diff --git a/components/gwp_asan/client/sampling_allocator_shims_unittest.cc b/components/gwp_asan/client/sampling_allocator_shims_unittest.cc
index f74fbf9..f287fe6 100644
--- a/components/gwp_asan/client/sampling_allocator_shims_unittest.cc
+++ b/components/gwp_asan/client/sampling_allocator_shims_unittest.cc
@@ -69,8 +69,9 @@
     base::allocator::InitializeAllocatorShim();
 #endif  // defined(OS_MACOSX)
     crash_reporter::InitializeCrashKeys();
-    InstallAllocatorHooks(AllocatorState::kGpaMaxPages,
-                          AllocatorState::kGpaMaxPages, kSamplingFrequency);
+    InstallAllocatorHooks(AllocatorState::kMaxMetadata,
+                          AllocatorState::kMaxMetadata,
+                          AllocatorState::kMaxSlots, kSamplingFrequency);
   }
 
  protected:
@@ -297,20 +298,20 @@
 MULTIPROCESS_TEST_MAIN_WITH_SETUP(
     BatchFree,
     SamplingAllocatorShimsTest::multiprocessTestSetup) {
-  void* ptrs[AllocatorState::kGpaMaxPages + 1];
-  for (size_t i = 0; i < AllocatorState::kGpaMaxPages; i++) {
+  void* ptrs[AllocatorState::kMaxMetadata + 1];
+  for (size_t i = 0; i < AllocatorState::kMaxMetadata; i++) {
     ptrs[i] = GetGpaForTesting().Allocate(16);
     CHECK(ptrs[i]);
   }
   // Check that all GPA allocations were consumed.
   CHECK_EQ(GetGpaForTesting().Allocate(16), nullptr);
 
-  ptrs[AllocatorState::kGpaMaxPages] =
+  ptrs[AllocatorState::kMaxMetadata] =
       malloc_zone_malloc(malloc_default_zone(), 16);
-  CHECK(ptrs[AllocatorState::kGpaMaxPages]);
+  CHECK(ptrs[AllocatorState::kMaxMetadata]);
 
   malloc_zone_batch_free(malloc_default_zone(), ptrs,
-                         AllocatorState::kGpaMaxPages + 1);
+                         AllocatorState::kMaxMetadata + 1);
 
   // Check that GPA allocations were freed.
   CHECK(GetGpaForTesting().Allocate(16));
diff --git a/components/gwp_asan/common/allocator_state.cc b/components/gwp_asan/common/allocator_state.cc
index a547c695..f09f175 100644
--- a/components/gwp_asan/common/allocator_state.cc
+++ b/components/gwp_asan/common/allocator_state.cc
@@ -13,7 +13,8 @@
 namespace internal {
 
 // TODO: Delete out-of-line constexpr defininitons once C++17 is in use.
-constexpr size_t AllocatorState::kGpaMaxPages;
+constexpr size_t AllocatorState::kMaxMetadata;
+constexpr size_t AllocatorState::kMaxSlots;
 constexpr size_t AllocatorState::kMaxStackFrames;
 constexpr size_t AllocatorState::kMaxPackedTraceLength;
 
@@ -39,7 +40,7 @@
   if (!page_size || page_size != base::GetPageSize())
     return false;
 
-  if (total_pages == 0 || total_pages > kGpaMaxPages)
+  if (total_pages == 0 || total_pages > kMaxSlots)
     return false;
 
   if (pages_base_addr % page_size != 0 || pages_end_addr % page_size != 0 ||
@@ -125,7 +126,7 @@
 }
 
 uintptr_t AllocatorState::SlotToAddr(AllocatorState::SlotIdx slot) const {
-  DCHECK_LT(slot, kGpaMaxPages);
+  DCHECK_LT(slot, kMaxSlots);
   return first_page_addr + 2 * slot * page_size;
 }
 
@@ -134,8 +135,8 @@
   uintptr_t offset = addr - first_page_addr;
   DCHECK_EQ((offset >> base::bits::Log2Floor(page_size)) % 2, 0ULL);
   size_t slot = (offset >> base::bits::Log2Floor(page_size)) / 2;
-  DCHECK_LT(slot, kGpaMaxPages);
-  return static_cast<AllocatorState::SlotIdx>(slot);
+  DCHECK_LT(slot, kMaxSlots);
+  return static_cast<SlotIdx>(slot);
 }
 
 AllocatorState::SlotMetadata::SlotMetadata() {}
diff --git a/components/gwp_asan/common/allocator_state.h b/components/gwp_asan/common/allocator_state.h
index 7332fec..6a81f952 100644
--- a/components/gwp_asan/common/allocator_state.h
+++ b/components/gwp_asan/common/allocator_state.h
@@ -40,17 +40,22 @@
   using MetadataIdx = uint8_t;
   using SlotIdx = uint8_t;
 
-  // Maximum number of pages this class can allocate.
-  static constexpr size_t kGpaMaxPages = 256;
+  // Maximum number of virtual memory slots (guard-page buffered pages) this
+  // class can allocate.
+  static constexpr size_t kMaxSlots = 256;
+  // Maximum number of concurrent allocations/metadata this class can allocate.
+  static constexpr size_t kMaxMetadata = 256;
+
   // Maximum number of stack trace frames to collect.
   static constexpr size_t kMaxStackFrames = 60;
   // Number of bytes to allocate for packed stack traces. This can hold
   // approximately kMaxStackFrames under normal conditions.
   static constexpr size_t kMaxPackedTraceLength = 200;
 
-  static_assert(std::numeric_limits<SlotIdx>::max() >=
-                    AllocatorState::kGpaMaxPages - 1,
-                "SlotIdx can hold all possible slot values");
+  static_assert(std::numeric_limits<SlotIdx>::max() >= kMaxSlots - 1,
+                "SlotIdx can hold all possible slot index values");
+  static_assert(std::numeric_limits<MetadataIdx>::max() >= kMaxMetadata - 1,
+                "MetadataIdx can hold all possible metadata index values");
 
   enum class ErrorType {
     kUseAfterFree = 0,
@@ -142,7 +147,8 @@
   uintptr_t pages_base_addr = 0;  // Points to start of mapped region.
   uintptr_t pages_end_addr = 0;   // Points to the end of mapped region.
   uintptr_t first_page_addr = 0;  // Points to first allocatable page.
-  size_t total_pages = 0;         // Size of the page pool to allocate from.
+  size_t num_metadata = 0;        // Number of entries in |metadata_addr|.
+  size_t total_pages = 0;         // Virtual memory page pool size.
   size_t page_size = 0;           // Page size.
 
   // Pointer to an array of metadata about every allocation, including its size,
diff --git a/components/gwp_asan/common/allocator_state_unittest.cc b/components/gwp_asan/common/allocator_state_unittest.cc
index 44cff48e..47191c5 100644
--- a/components/gwp_asan/common/allocator_state_unittest.cc
+++ b/components/gwp_asan/common/allocator_state_unittest.cc
@@ -13,16 +13,19 @@
 namespace gwp_asan {
 namespace internal {
 
-static constexpr size_t kGpaMaxPages = AllocatorState::kGpaMaxPages;
+static constexpr size_t kMaxMetadata = AllocatorState::kMaxMetadata;
+static constexpr size_t kMaxSlots = AllocatorState::kMaxSlots;
 
 class AllocatorStateTest : public testing::Test {
  protected:
   void InitializeState(size_t page_size,
+                       size_t num_metadata,
                        size_t total_pages,
                        int base_addr_offset = 0,
                        int first_page_offset = 0,
                        int end_addr_offset = 0) {
     state_.page_size = page_size;
+    state_.num_metadata = num_metadata;
     state_.total_pages = total_pages;
 
     // Some arbitrary page-aligned address
@@ -40,56 +43,58 @@
 };
 
 TEST_F(AllocatorStateTest, Valid) {
-  InitializeState(base::GetPageSize(), 1);
+  InitializeState(base::GetPageSize(), 1, 1);
   EXPECT_TRUE(state_.IsValid());
-  InitializeState(base::GetPageSize(), kGpaMaxPages);
+  InitializeState(base::GetPageSize(), kMaxMetadata, kMaxSlots);
   EXPECT_TRUE(state_.IsValid());
 }
 
 TEST_F(AllocatorStateTest, InvalidNumPages) {
-  InitializeState(base::GetPageSize(), 0);
+  InitializeState(base::GetPageSize(), 1, 0);
   EXPECT_FALSE(state_.IsValid());
 
-  InitializeState(base::GetPageSize(), kGpaMaxPages + 1);
+  InitializeState(base::GetPageSize(), 1, kMaxSlots + 1);
   EXPECT_FALSE(state_.IsValid());
 
-  InitializeState(base::GetPageSize(), std::numeric_limits<size_t>::max());
+  InitializeState(base::GetPageSize(), 1, std::numeric_limits<size_t>::max());
   EXPECT_FALSE(state_.IsValid());
 }
 
 TEST_F(AllocatorStateTest, InvalidPageSize) {
-  InitializeState(0, 1);
+  InitializeState(0, 1, 1);
   EXPECT_FALSE(state_.IsValid());
 
-  InitializeState(base::GetPageSize() + 1, 1);
+  InitializeState(base::GetPageSize() + 1, 1, 1);
   EXPECT_FALSE(state_.IsValid());
 
-  InitializeState(base::GetPageSize() * 2, 1);
+  InitializeState(base::GetPageSize() * 2, 1, 1);
   EXPECT_FALSE(state_.IsValid());
 }
 
 TEST_F(AllocatorStateTest, InvalidAddresses) {
   // Invalid [pages_base_addr, first_page_addr, pages_end_addr]
-  InitializeState(base::GetPageSize(), 1, 1, 1, 1);
+  InitializeState(base::GetPageSize(), 1, 1, 1, 1, 1);
   EXPECT_FALSE(state_.IsValid());
 
-  InitializeState(base::GetPageSize(), 1, 1, 0, 0);
+  InitializeState(base::GetPageSize(), 1, 1, 1, 0, 0);
   EXPECT_FALSE(state_.IsValid());
-  InitializeState(base::GetPageSize(), 1, 0, 1, 0);
+  InitializeState(base::GetPageSize(), 1, 1, 0, 1, 0);
   EXPECT_FALSE(state_.IsValid());
-  InitializeState(base::GetPageSize(), 1, 0, 0, 1);
+  InitializeState(base::GetPageSize(), 1, 1, 0, 0, 1);
   EXPECT_FALSE(state_.IsValid());
 
-  InitializeState(base::GetPageSize(), 1, base::GetPageSize(), 0, 0);
+  InitializeState(base::GetPageSize(), 1, 1, base::GetPageSize(), 0, 0);
   EXPECT_FALSE(state_.IsValid());
-  InitializeState(base::GetPageSize(), 1, 0, base::GetPageSize(), 0);
+  InitializeState(base::GetPageSize(), 1, 1, 0, base::GetPageSize(), 0);
+  EXPECT_FALSE(state_.IsValid());
+  InitializeState(base::GetPageSize(), 1, 1, 0, 0, base::GetPageSize());
   EXPECT_FALSE(state_.IsValid());
   InitializeState(base::GetPageSize(), 1, 0, 0, base::GetPageSize());
   EXPECT_FALSE(state_.IsValid());
 }
 
 TEST_F(AllocatorStateTest, GetNearestValidPageEdgeCases) {
-  InitializeState(base::GetPageSize(), kGpaMaxPages);
+  InitializeState(base::GetPageSize(), kMaxMetadata, kMaxSlots);
   EXPECT_TRUE(state_.IsValid());
 
   EXPECT_EQ(
@@ -101,7 +106,7 @@
 }
 
 TEST_F(AllocatorStateTest, GetErrorTypeEdgeCases) {
-  InitializeState(base::GetPageSize(), kGpaMaxPages);
+  InitializeState(base::GetPageSize(), kMaxMetadata, kMaxSlots);
   EXPECT_TRUE(state_.IsValid());
 
   EXPECT_EQ(state_.GetErrorType(state_.pages_base_addr, true, false),
@@ -113,7 +118,7 @@
 // Correctly handle the edge case when a free() occurs on a page that has never
 // been allocated.
 TEST_F(AllocatorStateTest, GetErrorTypeFreeInvalidAddressEdgeCase) {
-  InitializeState(base::GetPageSize(), kGpaMaxPages);
+  InitializeState(base::GetPageSize(), kMaxMetadata, kMaxSlots);
   EXPECT_TRUE(state_.IsValid());
 
   state_.free_invalid_address = state_.first_page_addr;
diff --git a/components/gwp_asan/crash_handler/crash_analyzer.cc b/components/gwp_asan/crash_handler/crash_analyzer.cc
index 0644caedc..1b28de46 100644
--- a/components/gwp_asan/crash_handler/crash_analyzer.cc
+++ b/components/gwp_asan/crash_handler/crash_analyzer.cc
@@ -121,21 +121,23 @@
   if (ret == AllocatorState::GetMetadataReturnType::kUnrelatedCrash)
     return GwpAsanCrashAnalysisResult::kUnrelatedCrash;
 
-  SlotMetadata slot;
-  if (!memory.Read(slot_address, sizeof(slot), &slot)) {
+  SlotMetadata metadata;
+  if (!memory.Read(slot_address, sizeof(metadata), &metadata)) {
     DLOG(ERROR) << "Failed to read SlotMetadata from process.";
     return GwpAsanCrashAnalysisResult::kErrorFailedToReadSlotMetadata;
   }
 
-  AllocatorState::ErrorType error = valid_state.GetErrorType(
-      exception_addr, slot.alloc.trace_collected, slot.dealloc.trace_collected);
+  AllocatorState::ErrorType error =
+      valid_state.GetErrorType(exception_addr, metadata.alloc.trace_collected,
+                               metadata.dealloc.trace_collected);
   proto->set_error_type(static_cast<Crash_ErrorType>(error));
-  proto->set_allocation_address(slot.alloc_ptr);
-  proto->set_allocation_size(slot.alloc_size);
-  if (slot.alloc.tid != base::kInvalidThreadId || slot.alloc.trace_len)
-    ReadAllocationInfo(slot.alloc, proto->mutable_allocation());
-  if (slot.dealloc.tid != base::kInvalidThreadId || slot.dealloc.trace_len)
-    ReadAllocationInfo(slot.dealloc, proto->mutable_deallocation());
+  proto->set_allocation_address(metadata.alloc_ptr);
+  proto->set_allocation_size(metadata.alloc_size);
+  if (metadata.alloc.tid != base::kInvalidThreadId || metadata.alloc.trace_len)
+    ReadAllocationInfo(metadata.alloc, proto->mutable_allocation());
+  if (metadata.dealloc.tid != base::kInvalidThreadId ||
+      metadata.dealloc.trace_len)
+    ReadAllocationInfo(metadata.dealloc, proto->mutable_deallocation());
   proto->set_region_start(valid_state.pages_base_addr);
   proto->set_region_size(valid_state.pages_end_addr -
                          valid_state.pages_base_addr);
diff --git a/components/gwp_asan/crash_handler/crash_handler_unittest.cc b/components/gwp_asan/crash_handler/crash_handler_unittest.cc
index 33c1c860..3b69926 100644
--- a/components/gwp_asan/crash_handler/crash_handler_unittest.cc
+++ b/components/gwp_asan/crash_handler/crash_handler_unittest.cc
@@ -40,7 +40,7 @@
 
 constexpr size_t kAllocationSize = 902;
 constexpr int kSuccess = 0;
-constexpr size_t kTotalPages = AllocatorState::kGpaMaxPages;
+constexpr size_t kTotalPages = AllocatorState::kMaxSlots;
 
 int HandlerMainAdaptor(int argc, char* argv[]) {
   crashpad::UserStreamDataSources user_stream_data_sources;
@@ -78,7 +78,8 @@
 // Child process that launches the crashpad handler and then crashes.
 MULTIPROCESS_TEST_MAIN(CrashingProcess) {
   base::NoDestructor<GuardedPageAllocator> gpa;
-  gpa->Init(AllocatorState::kGpaMaxPages, kTotalPages);
+  gpa->Init(AllocatorState::kMaxMetadata, AllocatorState::kMaxMetadata,
+            kTotalPages);
 
   base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
   base::FilePath directory = cmd_line->GetSwitchValuePath("directory");
diff --git a/components/metrics/net/net_metrics_log_uploader.cc b/components/metrics/net/net_metrics_log_uploader.cc
index 9f208fe..b7293f2 100644
--- a/components/metrics/net/net_metrics_log_uploader.cc
+++ b/components/metrics/net/net_metrics_log_uploader.cc
@@ -7,7 +7,11 @@
 #include "base/base64.h"
 #include "base/bind.h"
 #include "base/feature_list.h"
+#include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/rand_util.h"
+#include "base/task/post_task.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "components/data_use_measurement/core/data_use_user_data.h"
 #include "components/encrypted_messages/encrypted_message.pb.h"
 #include "components/encrypted_messages/message_encrypter.h"
@@ -26,6 +30,29 @@
 const base::Feature kHttpRetryFeature{"UMAHttpRetry",
                                       base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Run ablation on UMA collector connectivity to client. This study will
+// ablate a clients upload of all logs that use |metrics::ReportingService|
+// to upload logs. This include |metrics::MetricsReportingService| for uploading
+// UMA logs. |ukm::UKMReportionService| for uploading UKM logs.
+// Rappor service use |rappor::LogUploader| which is not a
+// |metrics::ReportingService| so, it won't be ablated.
+// similar frequency.
+// To restrict the study to UMA or UKM, set the "service-affected" param.
+const base::Feature kAblateMetricsLogUploadFeature{
+    "AblateMetricsLogUpload", base::FEATURE_DISABLED_BY_DEFAULT};
+
+// Fraction of Collector uploads that should be failed artificially.
+constexpr base::FeatureParam<int> kParamFailureRate{
+    &kAblateMetricsLogUploadFeature, "failure-rate", 100};
+
+// HTTP Error code to pass when artificially failing uploads.
+constexpr base::FeatureParam<int> kParamErrorCode{
+    &kAblateMetricsLogUploadFeature, "error-code", 503};
+
+// Service type to ablate. Can be "UMA" or "UKM". Leave it empty to ablate all.
+constexpr base::FeatureParam<std::string> kParamAblateServiceType{
+    &kAblateMetricsLogUploadFeature, "service-type", ""};
+
 // Constants used for encrypting logs that are sent over HTTP. The
 // corresponding private key is used by the metrics server to decrypt logs.
 const char kEncryptedMessageLabel[] = "metrics log";
@@ -284,6 +311,25 @@
     url_loader_->AttachStringForUpload(compressed_log_data, mime_type_);
   }
 
+  if (base::FeatureList::IsEnabled(kAblateMetricsLogUploadFeature)) {
+    int failure_rate = kParamFailureRate.Get();
+    std::string service_restrict = kParamAblateServiceType.Get();
+    bool should_ablate =
+        service_restrict.empty() ||
+        (service_type_ == MetricsLogUploader::UMA &&
+         service_restrict == "UMA") ||
+        (service_type_ == MetricsLogUploader::UKM && service_restrict == "UKM");
+    if (should_ablate && base::RandInt(0, 99) < failure_rate) {
+      // Simulate collector outage by not actually trying to upload the
+      // logs but instead call on_upload_complete_ immediately.
+      bool was_https = url_loader_->GetFinalURL().SchemeIs(url::kHttpsScheme);
+      url_loader_.reset();
+      base::SequencedTaskRunnerHandle::Get()->PostTask(
+          FROM_HERE, base::BindOnce(on_upload_complete_, kParamErrorCode.Get(),
+                                    net::ERR_FAILED, was_https));
+      return;
+    }
+  }
   // It's safe to use |base::Unretained(this)| here, because |this| owns
   // the |url_loader_|, and the callback will be cancelled if the |url_loader_|
   // is destroyed.
diff --git a/components/policy/core/common/mock_configuration_policy_provider.cc b/components/policy/core/common/mock_configuration_policy_provider.cc
index ae8458a..da826f3 100644
--- a/components/policy/core/common/mock_configuration_policy_provider.cc
+++ b/components/policy/core/common/mock_configuration_policy_provider.cc
@@ -22,7 +22,7 @@
 
 void MockConfigurationPolicyProvider::UpdateChromePolicy(
     const PolicyMap& policy) {
-  std::unique_ptr<PolicyBundle> bundle(new PolicyBundle());
+  std::unique_ptr<PolicyBundle> bundle = std::make_unique<PolicyBundle>();
   bundle->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
       .CopyFrom(policy);
   UpdatePolicy(std::move(bundle));
@@ -30,13 +30,24 @@
     base::RunLoop().RunUntilIdle();
 }
 
+void MockConfigurationPolicyProvider::UpdateExtensionPolicy(
+    const PolicyMap& policy,
+    const std::string& extension_id) {
+  std::unique_ptr<PolicyBundle> bundle = std::make_unique<PolicyBundle>();
+  bundle->Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, extension_id))
+      .CopyFrom(policy);
+  UpdatePolicy(std::move(bundle));
+  if (base::MessageLoopCurrent::IsSet())
+    base::RunLoop().RunUntilIdle();
+}
+
 void MockConfigurationPolicyProvider::SetAutoRefresh() {
   EXPECT_CALL(*this, RefreshPolicies()).WillRepeatedly(
       Invoke(this, &MockConfigurationPolicyProvider::RefreshWithSamePolicies));
 }
 
 void MockConfigurationPolicyProvider::RefreshWithSamePolicies() {
-  std::unique_ptr<PolicyBundle> bundle(new PolicyBundle);
+  std::unique_ptr<PolicyBundle> bundle = std::make_unique<PolicyBundle>();
   bundle->CopyFrom(policies());
   UpdatePolicy(std::move(bundle));
 }
diff --git a/components/policy/core/common/mock_configuration_policy_provider.h b/components/policy/core/common/mock_configuration_policy_provider.h
index 84f664c71..76dbdb0f 100644
--- a/components/policy/core/common/mock_configuration_policy_provider.h
+++ b/components/policy/core/common/mock_configuration_policy_provider.h
@@ -31,8 +31,17 @@
 
   // Utility method that invokes UpdatePolicy() with a PolicyBundle that maps
   // the Chrome namespace to a copy of |policy|.
+  // Note: Replaces the PolicyBundle, so any policy that has been set previously
+  // will be lost when calling this utility method.
   void UpdateChromePolicy(const PolicyMap& policy);
 
+  // Utility method that invokes UpdatePolicy() with a PolicyBundle that maps
+  // the extension's |extension_id| namespace to a copy of |policy|.
+  // Note: Replaces the PolicyBundle, so any policy that has been set previously
+  // will be lost when calling this utility method.
+  void UpdateExtensionPolicy(const PolicyMap& policy,
+                             const std::string& extension_id);
+
   // Convenience method so that tests don't need to create a registry to create
   // this mock.
   using ConfigurationPolicyProvider::Init;
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb
index 645acb2..2c6997e 100644
--- a/components/policy/resources/policy_templates_am.xtb
+++ b/components/policy/resources/policy_templates_am.xtb
@@ -2880,10 +2880,6 @@
 
       ይህ መመሪያ ካልተዋቀረ ወይም ወደ ሐሰት ከተዋቀረ <ph name="TLS_FALSE_START" /> ይነቃል። ወደ እውነት ከተዋቀረ <ph name="TLS_FALSE_START" /> ይሰናከላል።</translation>
 <translation id="7433714841194914373">ቅጽበትን ያንቁ</translation>
-<translation id="7443061725198440541">ይህ መመሪያ ካልተዋቀረ ወይም ከነቃ ተጠቃሚው ፊደል ማረሚያን እንዲጠቀም ይፈቀድለታል።
-
-      ይህ መመሪያ ከተሰናከለ ተጠቃሚው ፊደል ማረሚያን እንዲጠቀም አይፈቀድለትም። ይህ መመሪያ ሲሰናከልም እንዲሁም የSpellcheckLanguage መመሪያው ችላ ይባላል።
-      </translation>
 <translation id="7443616896860707393">ምንጨ-ተቋራጭ ኤችቲቲፒ መሠረታዊ ማረጋገጫ መጠየቂያዎች</translation>
 <translation id="7458437477941640506">የሥርዓተ ክወናው ስሪት ከዒላማው ይበልጥ አዲስ ከሆነ ወደ ዒላማ አይቀልብሱ። ዝማኔዎች እንዲሁም ተሰናክለዋል።</translation>
 <translation id="7464991223784276288">ኩኪዎች ዩአርኤሎችን ከአሁኑ ክፍለ-ጊዜ ጋር እንዳያዛምዱ ይገድቡ</translation>
@@ -3463,15 +3459,6 @@
 <translation id="8870318296973696995">መነሻ ገጽ</translation>
 <translation id="8876188741456358123">ነባሪው የህትመት ዱፕሌክስ ሁነታውን ይሽራል። ሁነታው የማይገኝ ከሆነ ይህ መመሪያ ችላ ይባላል።</translation>
 <translation id="8882006618241293596">በእነዚህ ጣቢያዎች ላይ የ<ph name="FLASH_PLUGIN_NAME" /> ተሰኪውን ያግዱ</translation>
-<translation id="890403179930035128">የፊደል ማረሚያ ቋንቋዎችን በግዳጅ ያነቃል። በዚያ ዝርዝር ውስጥ ያሉ ያልታወቁ ቋንቋዎች ችላ ይባላሉ።
-
-      ይህን መመሪያ ካነቁት ተጠቃሚው ፊደል ማረሚያ ካነቃላቸው ቋንቋዎች በተጨማሪ ለተገለጹት ቋንቋዎች ይነቃል።
-
-      ይህን መመሪያ ካላዋቀሩት በተጠቃሚው የፊደል ማረሚያ ምርጫዎች ላይ ምንም ለውጥ አይኖርም።
-
-      የSpellcheckEnabled መመሪያው ወደ ተሰናሏል ከተዋቀረ ይህ መመሪያ ምንም ውጤት አይኖረውም።
-
-      በአሁኑ ጊዜ የሚደገፉት ቋንቋዎች እነዚህ ናቸው፦ af፣ bg፣ ca፣ cs፣ da፣ de፣ el፣ en-AU፣ en-CA፣ en-GB፣ en-US፣ es፣ es-419፣ es-AR፣ es-ES፣ es-MX፣ es-US፣ et፣ fa፣ fo፣ fr፣ he፣ hi፣ hr፣ hu፣ id፣ it፣ ko፣ lt፣ lv፣ nb፣ nl፣ pl፣ pt-BR፣ pt-PT፣ ro፣ ru፣ sh፣ sk፣ sl፣ sq፣ sr፣ sv፣ ta፣ tg፣ tr፣ uk፣ vi።</translation>
 <translation id="8906768759089290519">የእንግዳ ሁነታን ያንቁ</translation>
 <translation id="8908294717014659003">ድር ጣቢያዎች የሚዲያ ያዢ መሣሪያዎች መዳረሻ ይኖራቸው ወይም አይኖራቸው እንደሆነ እንዲያዋቅሩ ያስችልዎታል። የሚዲያ ያዢ መሣሪያዎች መዳረሻ በነባሪነት ሊፈቀድ ይችላል ወይም አንድ ድር ጣቢያ የሚዲያ ያዢ መሣሪያ መዳረሻ በፈለገ ቁጥር ተጠቃሚውን ሊጠየቅ ይችላል።
 
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb
index b83370f..90b2f5b 100644
--- a/components/policy/resources/policy_templates_ar.xtb
+++ b/components/policy/resources/policy_templates_ar.xtb
@@ -2761,10 +2761,6 @@
 
       إذا لم يتم تعيين السياسة أو تم تعيينها على "false"، فحينئذٍ سيتم تفعيل <ph name="TLS_FALSE_START" />. وإذا تم تعيينها على "true"، فسيتم إيقاف <ph name="TLS_FALSE_START" />.</translation>
 <translation id="7433714841194914373">تفعيل البحث الفوري</translation>
-<translation id="7443061725198440541">‏في حال عدم تعيين هذه السياسة أو تفعيلها، يتم السماح للمستخدم باستخدام التدقيق الإملائي.
-
-      في حال إيقاف هذه السياسة، لا يتم السماح للمستخدم باستخدام التدقيق الإملائي. وسيتم أيضًا تجاهل سياسة "SpellcheckLanguage" عندما يتم إيقاف هذه السياسة.
-      </translation>
 <translation id="7443616896860707393">‏مطالبات مشتركة المصدر لمصادقة HTTP أساسية</translation>
 <translation id="7458437477941640506">لا تعُد إلى الإصدار المستهدف إذا كان إصدار نظام التشغيل أحدث منه، مع العِلم أنّه تم إيقاف التحديثات أيضًا.</translation>
 <translation id="7464991223784276288">‏تقييد ملفات تعريف الارتباط من عناوين URL المطابقة بالجلسة الحالية</translation>
@@ -3346,15 +3342,6 @@
 <translation id="8870318296973696995">الصفحة الرئيسية</translation>
 <translation id="8876188741456358123">يُلغَى الوضع التلقائي المزدوج للطباعة. وفي حال عدم توفُّر هذا الوضع، سيتم تجاهل هذه السياسة.</translation>
 <translation id="8882006618241293596">حظر المكّون الإضافي <ph name="FLASH_PLUGIN_NAME" /> في هذه المواقع</translation>
-<translation id="890403179930035128">‏فرض تفعيل التدقيق الإملائي للغات. سيتم تجاهل اللغات غير المعروفة في هذه القائمة.
-
-      في حال تفعيل هذه السياسة، سيتم تفعيل التدقيق الإملائي للغات المُحدَّدة بالإضافة إلى اللغات التي فعّل المستخدم التدقيق الإملائي لها.
-
-      في حال إيقاف هذه السياسة أو عدم تعيينها، لن يكون هناك أي تغيير لتفضيلات التدقيق الإملائي للمستخدم.
-
-      إذا تم تعيين سياسة "SpellcheckEnabled" على "متوقفة"، لن يكون لهذه السياسة أي تأثير.
-
-      اللغات المتاحة حاليًا هي: الأفريقانية، والبلغارية، والكتالونية، والتشيكية، والدانماركية، والألمانية، واليونانية، والإنجليزية (أستراليا)، والإنجليزية (كندا)، والإنجليزية (المملكة المتحدة)، والإنجليزية (الولايات المتحدة)، والإسبانية، والإسبانية (أمريكا اللاتينية)، والإسبانية (الأرجنتين)، والإسبانية (إسبانيا)، والإسبانية (المكسيك)، والإسبانية (الولايات المتحدة)، والإستونية، والفارسية، والفاروية، والفرنسية، والعبرية، والهندية، والكرواتية، والهنغارية، والأندونيسية، والإيطالية، والكورية، والليتوانية، واللاتفية، والنرويجية، والهولندية، والبولندية، والبرتغالية (البرازيل)، والبرتغالية (البرتغال)، والرومانية، والروسية، والصربية الكرواتية، والسلوفاكية، والسلوفينية، والألبانية، والصربية، والسويدية والتاميلية، والطاجيكية، والتركية، والأوكرانية، والفيتنامية.</translation>
 <translation id="8906768759089290519">تفعيل وضع الضيف</translation>
 <translation id="8908294717014659003">‏للسماح لك بتعيين ما إذا كان يُسمح للمواقع الإلكترونية بالحصول على إمكانية الدخول إلى أجهزة التقاط الوسائط. يمكن السماح بالدخول إلى أجهزة التقاط الوسائط بشكل تلقائي أو سؤال المستخدم في كل مرة يريد فيها أحد المواقع الحصول على إمكانية الدخول إلى أجهزة التقاط الوسائط.
 
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb
index e99b7e27a..0385bff 100644
--- a/components/policy/resources/policy_templates_bg.xtb
+++ b/components/policy/resources/policy_templates_bg.xtb
@@ -2766,10 +2766,6 @@
 
 Ако то не е зададено или е false, функцията <ph name="TLS_FALSE_START" /> ще е активирана. В случай че правилото е true, <ph name="TLS_FALSE_START" /> ще се деактивира.</translation>
 <translation id="7433714841194914373">Активиране на Динамично търсене</translation>
-<translation id="7443061725198440541">Ако това правило не е зададено или е активирано, потребителите ще могат да използват функцията за проверка на правописа.
-
-В случай че то е деактивирано, потребителите няма да могат да използват функцията и правилото SpellcheckLanguage ще се пренебрегва.
-      </translation>
 <translation id="7443616896860707393">Подкани за базово HTTP удостоверяване от външен източник</translation>
 <translation id="7458437477941640506">Да не се изпълнява връщане към целевата версия, ако версията на ОС е по-нова от целевата. Актуализациите също са деактивирани.</translation>
 <translation id="7464991223784276288">„Бисквитките“ от съответстващи URL адреси са ограничени до текущата сесия</translation>
@@ -3351,15 +3347,6 @@
 <translation id="8870318296973696995">Начална страница</translation>
 <translation id="8876188741456358123">Заменя стандартния режим за двустранно отпечатване. Ако режимът не е наличен, това правило се пренебрегва.</translation>
 <translation id="8882006618241293596">Блокиране на приставката <ph name="FLASH_PLUGIN_NAME" /> на съответните сайтове</translation>
-<translation id="890403179930035128">Служи за принудително активиране на езици за проверка на правописа. Неразпознатите езици в този списък ще се пренебрегват.
-
-Ако активирате правилото, функцията за проверка на правописа ще е включена за посочените езици, както и за тези, за които потребителят я е активирал.
-
-В случай че правилото не е зададено или е деактивирано, няма да има промяна в потребителските предпочитания за проверка на правописа.
-
-То няма да има ефект, ако правилото SpellcheckEnabled е деактивирано.
-
-Понастоящем поддържаните езици са: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Активиране на режима като гост</translation>
 <translation id="8908294717014659003">Позволява да зададете дали на уебсайтовете е разрешено да получават достъп до устройства за снимане на медия. Възможно е това да се разреши по подразбиране или потребителят може да бъде питан всеки път, когато сайт иска достъп до съответните устройства.
 
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb
index b140414..dad42c8 100644
--- a/components/policy/resources/policy_templates_bn.xtb
+++ b/components/policy/resources/policy_templates_bn.xtb
@@ -3191,10 +3191,6 @@
       যদি নীতিটি সেট না করা হয়, বা মিথ্যাতে সেট করা থাকে, তাহলে <ph name="TLS_FALSE_START" />  সক্ষম করা হবে। যদি এটি সত্যতে সেট করা থাকে, তাহলে <ph name="TLS_FALSE_START" /> অক্ষম করা হবে।</translation>
 <translation id="7433714841194914373">ঝটপট সক্ষম করুন</translation>
 <translation id="7434202861148928348">দূরবর্তী অ্যাক্সেস ক্লায়েন্টের জন্য আবশ্যক ডোমেন নাম কনফিগার করুন</translation>
-<translation id="7443061725198440541">যদি এই নীতিটি সেট অথবা সক্ষম না করা হয়, তাহলে ব্যবহারকারীকে বানান পরীক্ষা ব্যবহার করার অনুমতি দেওয়া হয়।
-
-      এই নীতিটি অক্ষম থাকলে, ব্যবহারকারীকে বানান পরীক্ষা ব্যবহার করার অনুমতি দেওয়া হয় না। এই নীতিটি নিষ্ক্রিয় থাকলে SpellcheckLanguage নীতিটি উপেক্ষা করা হবে।
-      </translation>
 <translation id="7443616896860707393">ক্রশ-অরিজিন HTTP বেসিক প্রমাণীকরণ প্রম্পট</translation>
 <translation id="7458437477941640506">যদি OS ভার্সনটি টার্গেট ভার্সনের থেকে নতুন হয় তাহলে টার্গেট ভার্সনে ফিরে আসার দরকার নেই। আপডেটেগুলিও বন্ধ আছে।</translation>
 <translation id="7464991223784276288">বর্তমান সেশনের মানানসই ইউআরএলগুলির মধ্যে কুকিজকে সীমাবদ্ধ রাখুন</translation>
@@ -3841,15 +3837,6 @@
 <translation id="8870318296973696995">হোম পৃষ্ঠা</translation>
 <translation id="8876188741456358123">ডিফল্ট প্রিন্টিং ডুপ্লেক্স মোডকে ওভাররাইড করে। মোডটি উপলভ্য না থাকলে এই নীতি অগ্রাহ্য করা হয়।</translation>
 <translation id="8882006618241293596">এই সাইটগুলিতে <ph name="FLASH_PLUGIN_NAME" /> প্লাগ ইন ব্লক করুন</translation>
-<translation id="890403179930035128">বানান পরীক্ষা বাধ্যতামূলকভাবে সক্ষম করে। তালিকার যে ভাষাগুলি শনাক্ত করা যাবে না সেগুলিতে বানান পরীক্ষা করা হবে না।
-
-      এই নীতিটি সক্ষম করলে ব্যবহারকারী আগে যে ভাষাগুলি বেছে নিয়েছেন সেগুলি ছাড়াও এখানে নির্দিষ্ট করে দেওয়া ভাষাগুলিতে বানান পরীক্ষা করা হবে।
-
-      এই নীতিটি সেট না করলে অথবা অক্ষম করে দিলে বানান পরীক্ষার পছন্দে কোনও পরিবর্তন হবে না।
-
-      যদি SpellcheckEnabled নীতিটি অক্ষম করা থাকে তাহলে এই নীতিটির কোনও প্রভাব থাকবে না।
-
-      বর্তমানে এই ভাষাগুলি সমর্থিত: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">অতিথি মোড সক্ষম করুন</translation>
 <translation id="8908294717014659003">ওয়েবসাইটগুলিকে মিডিয়া ক্যাপচার ডিভাইসে অ্যাক্সেসের মঞ্জুরি দেওয়া হবে কি না আপনাকে তা সেট করার মঞ্জুরি দেয়৷ মিডিয়া ক্যাপচার ডিভাইসে অ্যাক্সেস ডিফল্টভাবে মঞ্জুর করা যেতে পারে অথবা যখনই কোনো ওয়েবসাইট মিডিয়া ক্যাপচার ডিভাইসে অ্যাক্সেস চাইবে তখনই ব্যবহারকারীর কাছে তা জানতে চাওয়া হবে৷
 
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb
index eaaa6e7..c35c243 100644
--- a/components/policy/resources/policy_templates_ca.xtb
+++ b/components/policy/resources/policy_templates_ca.xtb
@@ -414,6 +414,7 @@
       Si aquesta opció de configuració està activada, el servei de protecció de contrasenyes capturarà l'empremta digital de la contrasenya en aquests URL per detectar la reutilització de contrasenyes.
       Si aquesta opció de configuració està desactivada o no s'estableix, el servei de protecció de contrasenyes només capturarà l'empremta digital de la contrasenya a https://accounts.google.com.
       Aquesta política només està disponible en instàncies de Windows que s'hagin unit a un domini de <ph name="MS_AD_NAME" /> o instàncies de Windows 10 Pro o Enterprise que s'hagin inscrit per a la gestió de dispositius.</translation>
+<translation id="1919802376548418720">Utilitza la política del KDC per delegar les credencials.</translation>
 <translation id="1920046221095339924">Permet sessions gestionades al dispositiu</translation>
 <translation id="1929709556673267855">Proporciona configuracions per a les impressores d'empresa vinculades a dispositius.
 
@@ -571,6 +572,15 @@
 <translation id="2231817271680715693">Importació de l'historial de navegació des del navegador predeterminat en la primera execució</translation>
 <translation id="2236488539271255289">No permetis que cap lloc estableixi dades locals</translation>
 <translation id="2240879329269430151">Us permet definir si els llocs web poden mostrar finestres emergents. L'aparició de finestres emergents es pot autoritzar o denegar per a tots els llocs web. Si no es defineix aquesta política, s'utilitzarà el paràmetre "BlockPopups" i l'usuari podrà canviar-lo.</translation>
+<translation id="2265214338421787313">Aquesta política permet que un administrador especifiqui que és possible que una pàgina mostri finestres emergents mentre es desactiva.
+
+      Si s'activa la política, es permet que les pàgines mostrin finestres emergents mentre es desactiven.
+
+      Si es desactiva la política o no s'estableix, no es permet que les pàgines mostrin finestres emergents mentre es desactiven, tal com s'indica a l'especificació (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name).
+
+      Aquesta política se suprimirà a Chrome 82.
+
+      Consulta https://www.chromestatus.com/feature/5989473649164288 .</translation>
 <translation id="2269319728625047531">Permet mostrar el consentiment de sincronització durant l'inici de sessió</translation>
 <translation id="2274864612594831715">Amb aquesta política es configura el teclat virtual per activar-lo com a dispositiu d'introducció de text a Chrome OS. Els usuaris no poden substituir aquesta política.
 
@@ -2130,6 +2140,7 @@
 <translation id="602728333950205286">URL instantani del proveïdor de cerca predeterminat</translation>
 <translation id="603410445099326293">Paràmetres per a l'URL suggerit que utilitza POST</translation>
 <translation id="6034341625190551415">Controla els tipus de compte de sessió pública i de quiosc.</translation>
+<translation id="6034603289689965535">Permet que una pàgina mostri finestres emergents mentre es desactiva</translation>
 <translation id="6036523166753287175">Activa que es pugui travessar el tallafoc des d'un amfitrió d'accés remot</translation>
 <translation id="6070667616071269965">Dissenys de teclat de la pantalla d'inici de sessió del dispositiu</translation>
 <translation id="6074963268421707432">No permetis que cap lloc mostri notificacions d'escriptori</translation>
@@ -2759,10 +2770,6 @@
 
       Si la política no s'estableix o s'estableix en false, s'activarà <ph name="TLS_FALSE_START" />. Si s'estableix en true, <ph name="TLS_FALSE_START" /> es desactivarà.</translation>
 <translation id="7433714841194914373">Activa Instant</translation>
-<translation id="7443061725198440541">Si aquesta política no es defineix ni s'activa, l'usuari podrà fer servir el corrector ortogràfic.
-
-      Si aquesta política es desactiva, l'usuari no podrà fer servir el corrector ortogràfic. La política SpellcheckLanguage també s'ignorarà quan aquesta política es desactivi.
-      </translation>
 <translation id="7443616896860707393">Línies d'ordre d'autenticació bàsica HTTP de diversos orígens</translation>
 <translation id="7458437477941640506">No torna a la versió de destinació si la versió del sistema operatiu és més recent que la de destinació. Les actualitzacions també estan desactivades.</translation>
 <translation id="7464991223784276288">Limita que les galetes coincideixin amb URL de la sessió actual</translation>
@@ -3330,15 +3337,6 @@
 <translation id="8870318296973696995">Pàgina d'inici</translation>
 <translation id="8876188741456358123">Substitueix el mode d'impressió a doble cara predeterminat. Si el mode no està disponible, aquesta política s'ignora.</translation>
 <translation id="8882006618241293596">Bloqueja el connector <ph name="FLASH_PLUGIN_NAME" /> en aquests llocs</translation>
-<translation id="890403179930035128">Força l'activació del corrector ortogràfic d'idiomes. S'ignoraran els idiomes de la llista que no es reconeguin.
-
-      Si actives aquesta política, s'activarà el corrector ortogràfic en els idiomes especificats, a més dels idiomes en què l'usuari ja l'havia activat.
-
-      Si no defineixes aquesta política o si la desactives, no es modificaran les preferències del corrector ortogràfic de l'usuari.
-
-      Si es desactiva la política SpellcheckEnabled, aquesta política no tindrà cap efecte.
-
-      En aquests moments s'admeten els idiomes següents: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Activa el mode de convidat</translation>
 <translation id="8908294717014659003">Us permet decidir si els llocs web poden accedir als vostres dispositius de captura multimèdia. Es pot proporcionar accés als dispositius de captura multimèdia de manera predeterminada o demanar permís a l'usuari cada vegada que un lloc web vol accedir als dispositius de captura multimèdia.
 
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb
index d1554fb..2efb716c 100644
--- a/components/policy/resources/policy_templates_cs.xtb
+++ b/components/policy/resources/policy_templates_cs.xtb
@@ -409,6 +409,7 @@
       Pokud je toto nastavení zapnuté, bude služba pro ochranu hesel na těchto adresách URL pořizovat otisk hesla pro účely detekce jeho opětovného použití.
       Pokud je toto nastavení vypnuté nebo není zadané, bude služba pro ochranu hesel pořizovat otisk hesla pouze na adrese https://accounts.google.com.
       Tato zásada je k dispozici jen v instancích systému Windows, které jsou připojené k doméně <ph name="MS_AD_NAME" />, nebo v instancích systému Windows 10 Pro nebo Enterprise, které jsou zaregistrované ke správě zařízení.</translation>
+<translation id="1919802376548418720">K delegování Identifikačních údajů používat zásadu KDC.</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.
 
@@ -561,6 +562,15 @@
 <translation id="2240879329269430151">Umožňuje nastavit, zda mohou webové stránky zobrazovat vyskakovací okna. Zobrazování vyskakovacích oken lze buď povolit pro všechny weby, nebo je pro všechny weby zakázat.
 
           Není-li zásada nastavena, bude použita zásada BlockPopups a uživatelé ji budou moci změnit.</translation>
+<translation id="2265214338421787313">Pomocí této zásady může správce zadat, že stránka při odstraňování z paměti může zobrazovat vyskakovací okna.
+
+      Když je tato zásada nastavená na Zapnuto, stránky při odstraňování z paměti mohou zobrazovat vyskakovací okna.
+
+      Když je tato zásada nastavená na Vypnuto nebo není nastavená, stránky nemají povoleno zobrazovat při odstraňování z paměti vyskakovací okna podle specifikace (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name).
+
+      V Chromu 82 tato zásada bude odstraněna.
+
+      Viz https://www.chromestatus.com/feature/5989473649164288.</translation>
 <translation id="2269319728625047531">Zapnout zobrazení souhlasu se synchronizací při přihlašování</translation>
 <translation id="2274864612594831715">Tato zásada konfiguruje aktivaci virtuální klávesnice jako vstupního zařízení v systému Chrome OS. Tuto zásadu nemohou uživatelé přepsat.
 
@@ -2175,6 +2185,7 @@
 <translation id="602728333950205286">Adresa URL dynamického vyhledávání výchozího poskytovatele vyhledávání</translation>
 <translation id="603410445099326293">Parametry pro adresu URL návrhu, která používá metodu POST</translation>
 <translation id="6034341625190551415">Ovládá typy účtů veřejných relací a veřejných terminálů</translation>
+<translation id="6034603289689965535">Povoluje stránce zobrazovat při odstraňování z paměti vyskakovací okna</translation>
 <translation id="6036523166753287175">Povolení přechodu přes bránu firewall z hostitele vzdáleného připojení</translation>
 <translation id="6070667616071269965">Rozložení klávesnice na přihlašovací obrazovce zařízení</translation>
 <translation id="6074963268421707432">Nepovolovat žádnému webu zobrazovat oznámení na ploše</translation>
@@ -2819,10 +2830,6 @@
 
 Pokud tato zásada není nastavena nebo je nastavena na hodnotu False, optimalizace <ph name="TLS_FALSE_START" /> bude aktivována. Je-li nastavena na hodnotu True, optimalizace <ph name="TLS_FALSE_START" /> bude zakázána.</translation>
 <translation id="7433714841194914373">Aktivovat Dynamický režim</translation>
-<translation id="7443061725198440541">Pokud tato zásada není nastavena nebo je povolena, má uživatel dovoleno používat kontrolu pravopisu.
-
-      Je-li tato zásada zakázána, uživatel kontrolu pravopisu používat nemůže. Pokud je tato zásada zakázána, bude také ignorována zásada SpellcheckLanguage.
-      </translation>
 <translation id="7443616896860707393">Požadavky typu cross-origin standardu HTTP Basic Auth</translation>
 <translation id="7458437477941640506">Pokud je verze operačního systému novější než cílová verze, nevracet se k cílové verzi. Jsou zakázány i aktualizace.</translation>
 <translation id="7464991223784276288">Omezit soubory cookie z odpovídajících adres URL na aktuální relaci</translation>
@@ -3396,15 +3403,6 @@
 <translation id="8870318296973696995">Domovská stránka</translation>
 <translation id="8876188741456358123">Přepíše výchozí režim oboustranného tisku. Pokud režim není k dispozici, zásada bude ignorována.</translation>
 <translation id="8882006618241293596">Blokovat plugin <ph name="FLASH_PLUGIN_NAME" /> na těchto webech</translation>
-<translation id="890403179930035128">Vynutí povolení jazyků kontroly pravopisu. Neznámé jazyky v seznamu budou ignorovány.
-
-      Pokud tuto zásadu povolíte, bude kontrola pravopisu kromě jazyků, pro které ji povolil uživatel, povolena také pro zadané jazyky.
-
-      Pokud tuto zásadu nenastavíte nebo ji zakážete, bude platit nastavení kontroly pravopisu zadané uživatelem beze změny.
-
-      Je-li kontrola pravopisu zakázána pomocí zásady SpellcheckEnabled, nebude mít tato zásada žádný účinek.
-
-      V současné době jsou podporovány tyto jazyky: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Aktivovat režim hosta</translation>
 <translation id="8908294717014659003">Umožňuje nastavit, zda webové stránky smějí používat zařízení pro pořizování mediálního obsahu. Přístup k zařízením pro pořizování mediálního obsahu může být povolen ve výchozím nastavení, nebo se uživateli může zobrazit dotaz pokaždé, když nějaké webové stránky budou chtít použít zařízení pro pořízení mediálního obsahu.
 
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb
index 05ae226..2b59540 100644
--- a/components/policy/resources/policy_templates_da.xtb
+++ b/components/policy/resources/policy_templates_da.xtb
@@ -2802,10 +2802,6 @@
 
       Hvis politikken ikke indstilles eller indstilles til falsk, aktiveres <ph name="TLS_FALSE_START" />. Hvis den indstilles til sand, deaktiveres <ph name="TLS_FALSE_START" />.</translation>
 <translation id="7433714841194914373">Aktiver Direkte</translation>
-<translation id="7443061725198440541">Hvis denne politik ikke er indstillet eller aktiveret, har brugeren tilladelse til at bruge stavekontrol.
-
-      Hvis denne politik er deaktiveret, har brugeren ikke tilladelse til at bruge stavekontrol. Politikken SpellcheckLanguage ignoreres også, når denne politik er deaktiveret.
-      </translation>
 <translation id="7443616896860707393">Påmindelser om HTTP Basic Auth med krydsoprindelse</translation>
 <translation id="7458437477941640506">Gå ikke tilbage til målversionen, hvis OS-versionen er nyere end målet. Opdateringer deaktiveres også.</translation>
 <translation id="7464991223784276288">Begræns cookies fra matchende webadresser til den aktuelle session</translation>
@@ -3386,15 +3382,6 @@
 <translation id="8870318296973696995">Startside</translation>
 <translation id="8876188741456358123">Tilsidesætter standardudskrivning i duplex-tilstand. Hvis tilstanden ikke er tilgængelig, ignoreres denne politik.</translation>
 <translation id="8882006618241293596">Bloker <ph name="FLASH_PLUGIN_NAME" />-pluginnet på disse websites</translation>
-<translation id="890403179930035128">Gennemtvinger aktivering af stavekontrol af sprog. Ikke-genkendte sprog på denne liste ignoreres.
-
-      Hvis du aktiverer denne politik, aktiveres stavekontrol for de angivne sprog samt de sprog, for hvilke brugeren har aktiveret stavekontrol.
-
-      Hvis du ikke indstiller denne politik, eller hvis du deaktiverer den, vil der ikke være nogen ændring af brugerens præferencer i forhold til stavekontrol.
-
-      Hvis politikken SpellcheckEnabled er deaktiveret, har denne politik ikke nogen effekt.
-
-      De aktuelt understøttede sprog er følgende: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Aktivér gæstetilstand</translation>
 <translation id="8908294717014659003">Giver dig mulighed for at angive, om websites skal have adgang til optageenheder. Der kan gives adgang til optageenheder som standard, eller brugeren kan blive spurgt, hver gang et website ønsker at få adgang til optageenheder.
 
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 36b8c91..b7b4373 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -2783,9 +2783,6 @@
 
       Wenn die Richtlinie nicht konfiguriert oder auf "false" festgelegt ist, wird die Funktion "<ph name="TLS_FALSE_START" />" aktiviert. Ist "true" festgelegt, wird die Funktion "<ph name="TLS_FALSE_START" />" deaktiviert.</translation>
 <translation id="7433714841194914373">Google Instant aktivieren</translation>
-<translation id="7443061725198440541">Wenn diese Richtlinie nicht festgelegt oder aktiviert wird, darf der Nutzer die Rechtschreibprüfung verwenden.
-
-      Wenn diese Richtlinie deaktiviert wird, darf der Nutzer die Rechtschreibprüfung nicht verwenden. Die Richtlinie "SpellcheckLanguage" wird darüber hinaus ignoriert, wenn diese Richtlinie deaktiviert ist.</translation>
 <translation id="7443616896860707393">Ursprungsübergreifende HTTP-Basic-Authentifizierungsabfragen</translation>
 <translation id="7458437477941640506">Führen Sie kein Rollback auf die Zielversion durch, wenn die Version des Betriebssystems neuer als die der Zielversion ist. Aktualisierungen sind ebenfalls deaktiviert.</translation>
 <translation id="7464991223784276288">Cookies von übereinstimmenden URLs auf die aktuelle Sitzung beschränken</translation>
@@ -3343,15 +3340,6 @@
 <translation id="8870318296973696995">Startseite</translation>
 <translation id="8876188741456358123">Dadurch wird der standardmäßige Duplexmodus überschrieben. Wenn der Modus nicht verfügbar ist, wird die Richtlinie ignoriert.</translation>
 <translation id="8882006618241293596">Das Plug-in "<ph name="FLASH_PLUGIN_NAME" />" auf diesen Websites blockieren</translation>
-<translation id="890403179930035128">Erzwingt die Aktivierung von Sprachen für die Rechtschreibprüfung. Sprachen in dieser Liste, die nicht erkannt werden, werden ignoriert.
-
-      Wenn diese Richtlinie aktiviert wird, wird die Rechtschreibprüfung für die angegebenen Sprachen aktiviert, zusätzlich zu den Sprachen, für die der Nutzer die Rechtschreibprüfung aktiviert hat.
-
-      Wenn diese Richtlinie nicht festgelegt oder deaktiviert wird, werden keine Änderungen an den Einstellungen des Nutzers für die Rechtschreibprüfung vorgenommen.
-
-      Wenn die Richtlinie "SpellcheckEnabled" auf "disabled" festgelegt wird, hat diese Richtlinie keinerlei Auswirkungen.
-
-      Aktuell werden die folgenden Sprachen unterstützt: de, af, bg, ca, cs, da, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Gastmodus aktivieren</translation>
 <translation id="8908294717014659003">Hier können Sie festlegen, ob Websites der Zugriff auf Medienaufnahmegeräte erlaubt werden soll. Der Zugriff auf Medienaufnahmegeräte kann standardmäßig zugelassen werden oder Sie können einstellen, dass der Nutzer jedes Mal gefragt wird, wenn eine Website auf Medienaufnahmegeräte zugreifen möchte.
 
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb
index 6bf12f66..715e986 100644
--- a/components/policy/resources/policy_templates_el.xtb
+++ b/components/policy/resources/policy_templates_el.xtb
@@ -2896,10 +2896,6 @@
 
       Εάν δεν οριστεί αυτή η πολιτική ή οριστεί μη αληθής, θα ενεργοποιηθεί το <ph name="TLS_FALSE_START" />. Εάν οριστεί αληθής, το <ph name="TLS_FALSE_START" /> θα απενεργοποιηθεί.</translation>
 <translation id="7433714841194914373">Ενεργοποίηση Instant</translation>
-<translation id="7443061725198440541">Εάν αυτή η πολιτική δεν οριστεί ή δεν είναι ενεργή, ο χρήστης μπορεί να χρησιμοποιεί τον ορθογραφικό έλεγχο.
-
-      Εάν αυτή η πολιτική απενεργοποιηθεί, δεν επιτρέπεται στον χρήστη να χρησιμοποιεί τον ορθογραφικό έλεγχο. Η πολιτική SpellcheckLanguage θα αγνοείται επίσης όταν είναι απενεργοποιημένη αυτή η πολιτική.
-      </translation>
 <translation id="7443616896860707393">Μηνύματα ειδοποίησης βασικού ελέγχου ταυτότητας HTTP διασταυρούμενων προελεύσεων</translation>
 <translation id="7458437477941640506">Να μην γίνει επαναφορά στην έκδοση-στόχο, αν η έκδοση του λειτουργικού συστήματος είναι νεότερη από την έκδοση-στόχο. Απενεργοποιήθηκαν επίσης οι ενημερώσεις.</translation>
 <translation id="7464991223784276288">Περιορισμός της αντιστοίχισης URL από τα cookie για την τρέχουσα περίοδος λειτουργίας</translation>
@@ -3501,15 +3497,6 @@
 <translation id="8870318296973696995">Αρχική σελίδα</translation>
 <translation id="8876188741456358123">Παρακάμπτει την προεπιλεγμένη λειτουργία διπλής εκτύπωσης. Εάν η λειτουργία δεν είναι διαθέσιμη, αυτή η πολιτική αγνοείται.</translation>
 <translation id="8882006618241293596">Αποκλείστε την προσθήκη <ph name="FLASH_PLUGIN_NAME" /> σε αυτούς τους ιστοτόπους</translation>
-<translation id="890403179930035128">Ενεργοποιεί αναγκαστικά τις γλώσσες ορθογραφικού ελέγχου. Οι γλώσσες που δεν αναγνωρίζονται στη λίστα θα αγνοούνται.
-
-      Εάν ενεργοποιήσετε αυτήν την πολιτική, εκτός από τις γλώσσες για τις οποίες ο χρήστης έχει ενεργοποιήσει τον ορθογραφικό έλεγχο, ο ορθογραφικός έλεγχος θα ενεργοποιηθεί επίσης για τις καθορισμένες γλώσσες.
-
-      Εάν δεν ορίσετε αυτήν την πολιτική ή την απενεργοποιήσετε, αυτή η πολιτική δεν θα επιφέρει καμία αλλαγή.
-
-      Εάν η πολιτική SpellcheckEnabled οριστεί ως απενεργοποιημένη, η πολιτική δεν θα επιφέρει καμία αλλαγή.
-
-      Οι γλώσσες που υποστηρίζονται προς το παρόν είναι οι εξής: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Ενεργοποίηση λειτουργίας επισκέπτη</translation>
 <translation id="8908294717014659003">Σας επιτρέπει να ορίσετε εάν επιτρέπεται στους ιστότοπους η πρόσβαση σε συσκευές μέσων εγγραφής. Η πρόσβαση στις συσκευές μέσω καταγραφής ενδέχεται να επιτρέπεται από προεπιλογή ή ενδέχεται να γίνεται ερώτηση στον χρήστη κάθε φορά που ένας ιστότοπος ζητά πρόσβαση στις συσκευές μέσων εγγραφής.
 
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb
index 91e71209..ee16973 100644
--- a/components/policy/resources/policy_templates_en-GB.xtb
+++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -2905,10 +2905,6 @@
 
       If the policy is not set or is set to false, then <ph name="TLS_FALSE_START" /> will be enabled. If it is set to true, <ph name="TLS_FALSE_START" /> will be disabled.</translation>
 <translation id="7433714841194914373">Enable Instant</translation>
-<translation id="7443061725198440541">If this policy is not set or enabled, the user is allowed to use spellcheck.
-
-      If this policy is disabled, the user is not allowed to use spellcheck. The SpellcheckLanguage policy will also be ignored when this policy is disabled.
-      </translation>
 <translation id="7443616896860707393">Cross-origin HTTP Basic Auth prompts</translation>
 <translation id="7458437477941640506">Do not roll back to target version if OS version is newer than target. Updates are also disabled.</translation>
 <translation id="7464991223784276288">Limit cookies from matching URLs to the current session</translation>
@@ -3512,15 +3508,6 @@
 <translation id="8870318296973696995">Homepage</translation>
 <translation id="8876188741456358123">Overrides default printing duplex mode. If the mode is unavailable, this policy is ignored.</translation>
 <translation id="8882006618241293596">Block the <ph name="FLASH_PLUGIN_NAME" /> plug-in on these sites</translation>
-<translation id="890403179930035128">Force-enables spellcheck languages. Unrecognised languages in that list will be ignored.
-
-      If you enable this policy, spellcheck will be enabled for the languages specified, in addition to the languages for which the user has enabled spellcheck.
-
-      If you do not set this policy, or disable it, there will be no change to the user's spellcheck preferences.
-
-      If the SpellcheckEnabled policy is set to disabled, this policy will have no effect.
-
-      The currently supported languages are: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Enable guest mode</translation>
 <translation id="8908294717014659003">Allows you to set whether websites are allowed to get access to media capture devices. Access to media capture devices can be allowed by default, or the user can be asked every time a website wants to get access to media capture devices.
 
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index bff7def..963cdd3 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -2801,10 +2801,6 @@
 
       Si la política se establece en false o no se configura, <ph name="TLS_FALSE_START" /> se habilitará. Si se establece en true, <ph name="TLS_FALSE_START" /> se inhabilitará.</translation>
 <translation id="7433714841194914373">Habilitar Instant</translation>
-<translation id="7443061725198440541">Si esta política no se establece o se habilita, el usuario podrá usar la corrección ortográfica.
-
-      Si se inhabilita, el usuario no podrá usar esta función y, además, se omitirá la política SpellcheckLanguage.
-      </translation>
 <translation id="7443616896860707393">Avisos de autenticación básica de HTTP de origen cruzado</translation>
 <translation id="7458437477941640506">No implementes una reversión a la versión objetivo si la versión del sistema operativo es más reciente que la objetivo. Las actualizaciones también se inhabilitan.</translation>
 <translation id="7464991223784276288">Restringir las cookies solo para las URL coincidentes en la sesión actual</translation>
@@ -3402,15 +3398,6 @@
 <translation id="8870318296973696995">Página principal</translation>
 <translation id="8876188741456358123">Anula el modo predeterminado de impresión doble. Si el modo no está disponible, se ignorará esta política.</translation>
 <translation id="8882006618241293596">Bloquear el complemento <ph name="FLASH_PLUGIN_NAME" /> en estos sitios</translation>
-<translation id="890403179930035128">Habilita la corrección ortográfica de idiomas. Se omitirán los idiomas que no se reconozcan en esa lista.
-
-      Si se habilita esta política, se habilitará la corrección ortográfica para los idiomas especificados, además de los idiomas en los que el usuario tenga habilitada la corrección ortográfica.
-
-      Si no se establece o se inhabilita, no se implementarán cambios en las preferencias del usuario con respecto a la corrección ortográfica.
-
-      Si se inhabilita la política SpellcheckEnabled, esta política no tendrá ningún efecto.
-
-      Los idiomas compatibles por el momento son los siguientes: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Activar el modo de invitado</translation>
 <translation id="8908294717014659003">Te permite establecer si se autoriza que los sitios web tengan acceso a dispositivos de captura de contenido multimedia. El acceso a estos dispositivos puede permitirse de manera predeterminada, o se puede preguntar al usuario cada vez que un sitio web quiera acceder a dispositivos de captura de contenido multimedia.
 
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index c20371b..aae9ea4 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -430,6 +430,7 @@
       Si se habilita esta opción, el servicio de protección de contraseñas capturará la huella digital de la contraseña en estas URL para detectar si la contraseña se reutiliza.
       Si se inhabilita esta opción o no se configura, el servicio de protección de contraseñas solo capturará la huella digital en la página https://accounts.google.com.
       Esta política solo está disponible en instancias de Windows que estén vinculadas a un dominio de <ph name="MS_AD_NAME" /> y en instancias de Windows 10 Pro o Enterprise que se hayan registrado para gestionar dispositivos.</translation>
+<translation id="1919802376548418720">Usa la política del centro de distribución de llaves (KDC) para delegar credenciales.</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.
 
@@ -588,6 +589,15 @@
 <translation id="2240879329269430151">Permite establecer si los sitios web pueden mostrar o no pop-ups. La ejecución de pop-ups se permite o se deniega a todos los sitios web.
 
           Si no se establece esta política, se usará la política BlockPopups y el usuario podrá modificarla.</translation>
+<translation id="2265214338421787313">Esta política permite que un administrador especifique si las páginas pueden mostrar ventanas emergentes mientras se descargan.
+
+      Si la política está habilitada, las páginas pueden mostrar ventanas emergentes mientras se descargan.
+
+      Si la política está inhabilitada o no está definida, las páginas no pueden mostrar ventanas emergentes mientras se descargan (según la especificación https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name).
+
+      Esta política se eliminará en la versión 82 de Chrome.
+
+      Consulta https://www.chromestatus.com/feature/5989473649164288</translation>
 <translation id="2269319728625047531">Habilitar Sync Consent durante el inicio de sesión</translation>
 <translation id="2274864612594831715">Esta política configura la habilitación del teclado virtual como un dispositivo de entrada en Chrome OS. Los usuarios no pueden anular esta política.
 
@@ -2224,6 +2234,7 @@
 <translation id="602728333950205286">URL de función Instant del proveedor de búsquedas predeterminadas</translation>
 <translation id="603410445099326293">Parámetros para URL sugerida que utiliza POST</translation>
 <translation id="6034341625190551415">Controla los tipos de cuenta de sesión pública y de kiosko.</translation>
+<translation id="6034603289689965535">Permite que una página muestre ventanas emergentes mientras se descarga</translation>
 <translation id="6036523166753287175">Habilita que se pueda pasar a través de un cortafuegos desde un host de acceso remoto.</translation>
 <translation id="6070667616071269965">Diseños de teclado para la pantalla de inicio de sesión del dispositivo</translation>
 <translation id="6074963268421707432">No permitir que ningún sitio muestre notificaciones de escritorio</translation>
@@ -2888,10 +2899,6 @@
 
       Si esta política no se establece o se le asigna el valor false, se habilitará <ph name="TLS_FALSE_START" />. Si se asigna el valor true a esta política, se inhabilitará <ph name="TLS_FALSE_START" />.</translation>
 <translation id="7433714841194914373">Habilitar Instant</translation>
-<translation id="7443061725198440541">Si no se asigna ningún valor a esta política o se habilita, los usuarios podrán utilizar el corrector ortográfico.
-
-      Si la política está inhabilitada, los usuarios no podrán utilizar el corrector ortográfico y se ignorará la política SpellcheckLanguage.
-      </translation>
 <translation id="7443616896860707393">Mensajes de autenticación básica de HTTP de origen cruzado</translation>
 <translation id="7458437477941640506">No vuelve a instalar la versión de destino si la versión del SO es más reciente que la de destino. También inhabilita las actualizaciones.</translation>
 <translation id="7464991223784276288">Limitar las cookies de las URL coincidentes de la sesión actual</translation>
@@ -3473,15 +3480,6 @@
 <translation id="8870318296973696995">Página de inicio</translation>
 <translation id="8876188741456358123">Anula el modo predeterminado de impresión por las dos caras. Si el modo no está disponible, se ignora la política.</translation>
 <translation id="8882006618241293596">Bloquear el complemento <ph name="FLASH_PLUGIN_NAME" /> en estos sitios web</translation>
-<translation id="890403179930035128">Fuerza la habilitación del corrector ortográfico de idiomas. Se ignorarán los idiomas de la lista que no se reconozcan.
-
-      Si se habilita esta política, se habilitará el corrector ortográfico en los idiomas especificados, además de los idiomas en los que lo haya activado el usuario.
-
-      Si no se le asigna ningún valor a esta política o se inhabilita, no se modificarán las preferencias de corrector ortográfico del usuario.
-
-      Si se inhabilita la política SpellcheckEnabled, esta política no tendrá ningún efecto.
-
-      Los idiomas que actualmente se admiten son af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk y vi.</translation>
 <translation id="8906768759089290519">Habilitar el modo de invitado</translation>
 <translation id="8908294717014659003">Te permite establecer si los sitios web pueden acceder a los dispositivos de captura multimedia. El acceso a los dispositivos de captura multimedia se puede establecer de forma predeterminada o se puede configurar para que el usuario reciba un mensaje cada vez que un sitio web quiera acceder a estos dispositivos.
 
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb
index 34df0e26..d657a76 100644
--- a/components/policy/resources/policy_templates_et.xtb
+++ b/components/policy/resources/policy_templates_et.xtb
@@ -2902,10 +2902,6 @@
 
       Kui reegel on määramata või selle väärtuseks on määratud Väär, siis <ph name="TLS_FALSE_START" /> lubatakse. Kui väärtuseks on määratud Tõene, siis <ph name="TLS_FALSE_START" /> keelatakse.</translation>
 <translation id="7433714841194914373">Luba Instant</translation>
-<translation id="7443061725198440541">Kui reegel on määramata või lubatud, saab kasutaja õigekirjakontrolli kasutada.
-
-      Kui reegel on keelatud, ei ole kasutajal lubatud õigekirjakontrolli kasutada. Kui reegel on keelatud, eiratakse reeglit SpellcheckLanguage.
-      </translation>
 <translation id="7443616896860707393">Erineva päritoluga HTTP Basic Authi viibad</translation>
 <translation id="7458437477941640506">Ära minge tagasi sihtversioonile, kui operatsioonisüsteemi versioon on uuem kui sihtversioon. Värskendused on samuti keelatud.</translation>
 <translation id="7464991223784276288">Vastavatelt URL-idelt pärit küpsisefailide seansipõhine piiramine</translation>
@@ -3506,15 +3502,6 @@
 <translation id="8870318296973696995">Avaleht</translation>
 <translation id="8876188741456358123">Alistab printimisel vaikimisi kasutatava dupleksrežiimi. Reeglit eiratakse, kui režiim ei ole saadaval.</translation>
 <translation id="8882006618241293596">Blokeeri nendel saitidel pistikprogramm <ph name="FLASH_PLUGIN_NAME" /></translation>
-<translation id="890403179930035128">Sundlubab õigekirjakontrolli keeled. Loendis olevaid tundmatuid keeli eiratakse.
-
-      Kui lubate reegli, lubatakse õigekirjakontroll määratud keelte jaoks, mis lisanduvad keeltele, mille jaoks kasutaja on õigekirjakontrolli lubanud.
-
-      Kui jätate reegli määramata või keelate selle, ei mõjuta see kasutaja õigekirjakontrolli eelistusi.
-
-      Kui reegel SpellcheckEnabled on keelatud, ei ole sellel mingit mõju.
-
-      Praegu toetatakse järgmisi keeli: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Luba külastajarežiim</translation>
 <translation id="8908294717014659003">Võimaldab määrata veebisaitidele juurdepääsu meediahõiveseadmetele. Juurdepääsu meediahõiveseadmetele saab lubada vaikimisi või lasta iga kord kasutajalt küsida, kui mõni veebisait neile juurdepääsu soovib.
 
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb
index 8b08fce..2bb75066 100644
--- a/components/policy/resources/policy_templates_fa.xtb
+++ b/components/policy/resources/policy_templates_fa.xtb
@@ -2792,10 +2792,6 @@
 
       اگر این خط‌مشی تنظیم نشود یا روی نادرست تنظیم شود، <ph name="TLS_FALSE_START" /> فعال می‌شود. اگر روی درست تنظیم شود، <ph name="TLS_FALSE_START" /> غیرفعال می‌شود.</translation>
 <translation id="7433714841194914373">فعال کردن جستجوی آنی</translation>
-<translation id="7443061725198440541">‏اگر این خط‌مشی تنظیم یا فعال نشود، کاربر برای استفاده از غلط‌گیر املا مجاز است.
-
-     اگر این خط‌مشی غیرفعال شود، کاربر برای استفاده از غلط‌گیر املا مجاز نیست. وقتی این خط‌مشی غیرفعال شود، خط‌مشی SpellcheckLanguage نیز نادیده گرفته می‌شود.
-      </translation>
 <translation id="7443616896860707393">‏فرمان‌های Cross-origin HTTP Basic Auth</translation>
 <translation id="7458437477941640506">‏اگر نسخه OS جدیدتر از نسخه هدف باشد، عقب‌گرد به نسخه هدف انجام نشود. به‌روزرسانی نیز غیرفعال می‌شود.</translation>
 <translation id="7464991223784276288">محدود کردن کوکی‌های نشانی‌های وب منطبق به جلسه کنونی</translation>
@@ -3374,15 +3370,6 @@
 <translation id="8870318296973696995">صفحهٔ اصلی</translation>
 <translation id="8876188741456358123">حالت پیش‌فرض چاپ دورویه را لغو می‌کند. اگر این حالت دردسترس نباشد، این خط‌مشی نادیده گرفته می‌شود.</translation>
 <translation id="8882006618241293596">مسدود کردن افزایه <ph name="FLASH_PLUGIN_NAME" /> در این سایت‌ها</translation>
-<translation id="890403179930035128">‏غلط‌گیر املای زبان‌ها را به‌صورت اجباری فعال می‌کند. زبان‌های شناسایی‌نشده موجود در این فهرست نادیده گرفته می‌شوند.
-
-      اگر این خط‌مشی را فعال کنید، غلط‌گیر املا علاوه بر زبان‌هایی که کاربر غلط‌گیر املا را برایشان فعال کرده است برای زبان‌های مشخص‌شده فعال خواهد شد.
-
-      اگر این خط‌مشی را تنظیم نکنید یا آن را غیر فعال کنید، هیچ تغییری در تنظیمات برگزیده غلط‌گیر املای کاربر ایجاد نخواهد شد.
-
-      اگر خط‌مشی SpellcheckEnabled روی غیرفعال تنظیم شود، این خط‌مشی هیچ تأثیری نخواهد داشت.
-
-      زبان‌هایی که درحال‌حاضر پشتیبانی می‌شوند: af‏، bg،‏ ca،‏ cs،‏ da،‏ de، ‏el، ‏en-AU، ‏en-CA،‏ en-GB،‏ en-US،‏ es،‏ es-419، ‏es-AR، ‏es-ES،‏ es-MX،‏ es-US‏، et،‏ fa،‏ fo،‏ fr،‏ he، ‏hi، ‏hr، ‏hu،‏ id،‏ it، ‏ko،‏ lt، ‏lv،‏ nb،‏ nl،‏ pl،‏ pt-BR،‏ pt-PT،‏ ro،‏ ru،‏ sh،‏ sk،‏ sl،‏ sq،‏ sr،‏ sv،‏ ta،‏ tg،‏ tr،‏ uk و vi.</translation>
 <translation id="8906768759089290519">حالت مهمان فعال شود</translation>
 <translation id="8908294717014659003">‏به شما اجازه می‌دهد تنظیم کنید آیا وب سایت‌ها مجاز هستند به دستگاه‌های ضبط رسانه دسترسی داشته باشند، یا هربار که کاربر می‌خواهد به دستگاه‌های ضبط رسانه دسترسی داشته باشد از وی پرسیده شود.
 
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb
index 0862ff4..e6d2c623 100644
--- a/components/policy/resources/policy_templates_fi.xtb
+++ b/components/policy/resources/policy_templates_fi.xtb
@@ -429,6 +429,7 @@
       Jos tämä asetus on käytössä, salasanojen suojauspalvelu tallentaa näissä URL-osoitteissa salasanojen tunnisteita, joiden avulla tarkistetaan, onko salasanoja käytetty aiemmin.
       Jos tämä asetus on poistettu käytöstä tai sitä ei ole määritetty, salasanojen suojauspalvelu tallentaa salasanojen tunnisteita vain osoitteessa https://accounts.google.com.
       Tämä käytäntö on käytettävissä vain Windows-esiintymissä, jotka on yhdistetty <ph name="MS_AD_NAME" /> ‑verkkotunnukseen, tai Windows 10 Pro- ja Enterprise ‑esiintymissä, jotka on rekisteröity laitteiden hallinnointiohjelmaan.</translation>
+<translation id="1919802376548418720">Käytä KDC-käytäntöä kirjautumistietojen valtuuttamiseen.</translation>
 <translation id="1920046221095339924">Salli hallinnoidut käyttökerrat laitteella</translation>
 <translation id="1929709556673267855">Määritä laitteisiin yhdistettyjen yritystulostimien asetuksia.
 
@@ -585,6 +586,15 @@
 <translation id="2231817271680715693">Tuo selaushistoria oletusselaimesta ensimmäisellä käyttökerralla</translation>
 <translation id="2236488539271255289">Älä salli sivustojen luoda tiedostoja tietokoneelle</translation>
 <translation id="2240879329269430151">Voit määrittää, saavatko sivustot näyttää ponnahdusikkunoita. Ponnahdusikkunoiden näyttäminen voidaan sallia kaikille sivustoille tai kieltää kaikilta sivustoilta. Jos tätä käytäntöä ei ole määritetty, käytetään BlockPopups-asetusta, ja käyttäjä voi muuttaa asetusta.</translation>
+<translation id="2265214338421787313">Tämä käytäntö antaa järjestelmänvalvojan määrittää, että sivu voi näyttää ponnahdusikkunoita tyhjentämisen aikana.
+
+      Kun käytännön arvoksi on määritetty käytössä, sivut voivat näyttää ponnahdusikkunoita niiden tyhjentämisen aikana.
+
+      Kun käytännön arvoksi on määritetty ei käytössä tai arvoa ei ole määritetty, sivut eivät saa näyttää ponnahdusikkunoita tyhjentämisen aikana teknisten tietojen mukaisesti (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name).
+
+      Tämä käytäntö poistetaan Chrome 82:ssa.
+
+      Katso https://www.chromestatus.com/feature/5989473649164288 .</translation>
 <translation id="2269319728625047531">Ota käyttöön synkronointisuostumuksen näyttäminen kirjautumisen aikana</translation>
 <translation id="2274864612594831715">Tämän käytännön avulla virtuaalinen näppäimistö voidaan ottaa käyttöön syöttölaitteena Chrome-käyttöjärjestelmässä. Käyttäjät eivät voi ohittaa tätä käytäntöä.
 
@@ -2155,6 +2165,7 @@
 <translation id="602728333950205286">Oletushakupalvelun Instant-URL-osoite</translation>
 <translation id="603410445099326293">POST-metodia käyttävän ehdotushaun URL-osoitteen parametrit</translation>
 <translation id="6034341625190551415">Määrittää julkisten istuntojen ja kioskien tilityypit</translation>
+<translation id="6034603289689965535">Sallii sivun näyttää ponnahdusikkunoita sen tyhjentämisen aikana</translation>
 <translation id="6036523166753287175">Ota käyttöön palomuurin siirto etäisännästä</translation>
 <translation id="6070667616071269965">Laitteen kirjautumisnäytön näppäimistöasettelut</translation>
 <translation id="6074963268421707432">Älä anna sivustojen näyttää työpöytäilmoituksia</translation>
@@ -2797,10 +2808,6 @@
 
       Jos tätä käytäntöä ei aseteta tai jos sen arvo on Epätosi, <ph name="TLS_FALSE_START" /> otetaan käyttöön. Jos käytännön arvo on Tosi, <ph name="TLS_FALSE_START" /> poistetaan käytöstä.</translation>
 <translation id="7433714841194914373">Ota Instant käyttöön</translation>
-<translation id="7443061725198440541">Jos tätä käytäntöä ei ole määritetty tai se on käytössä, käyttäjä voi tarkistaa oikeinkirjoituksen.
-
-      Jos käytäntö on poistettu käytöstä, käyttäjä ei voi tarkistaa oikeinkirjoitusta. Jos käytäntö on poistettu käytöstä, myös SpellcheckLanguage-käytäntö ohitetaan.
-      </translation>
 <translation id="7443616896860707393">Eri lähteiden HTTP-todennuskehotteet</translation>
 <translation id="7458437477941640506">Älä palauta kohdeversioon, jos käyttöjärjestelmän versio on uudempi kuin kohde. Myös päivitykset on estetty.</translation>
 <translation id="7464991223784276288">Rajoita evästeitä liittämästä URL-osoitteita nykyiseen käyttökertaan</translation>
@@ -3383,15 +3390,6 @@
 <translation id="8870318296973696995">Etusivu</translation>
 <translation id="8876188741456358123">Ohittaa kaksipuolisen tulostustilan. Jos tila ei ole käytettävissä, tämä käytäntö ohitetaan.</translation>
 <translation id="8882006618241293596">Estä <ph name="FLASH_PLUGIN_NAME" />-laajennus näillä sivustoilla.</translation>
-<translation id="890403179930035128">Pakottaa ottamaan oikeinkirjoituksen tarkistuskielet käyttöön. Jos luettelossa on tunnistamattomia kieliä, ne ohitetaan.
-
-      Jos otat tämän käytännön käyttöön, oikeinkirjoitus voidaan tarkistaa määritetyillä kielillä käyttäjän valitsemien tarkistuskielten lisäksi.
-
-      Jos et määritä käytännölle arvoa tai poistat sen käytöstä, käyttäjän oikeinkirjoituksen tarkistusasetuksia ei muuteta.
-
-      Jos SpellcheckEnabled-käytäntö on poistettu käytöstä, tällä käytännöllä ei ole vaikutusta.
-
-      Seuraavat kielet ovat tällä hetkellä tuettuja: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Ota vierastila käyttöön</translation>
 <translation id="8908294717014659003">Voit määrittää, mitkä sivut saavat käyttää mediantallennuslaitteita. Mediantallennuslaitteiden käyttö voidaan sallia oletuksena, tai käyttäjältä voidaan kysyä aina, kun sivusto haluaa käyttää tallennuslaitteita.
 
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb
index 88526f1..4adef50fc 100644
--- a/components/policy/resources/policy_templates_fil.xtb
+++ b/components/policy/resources/policy_templates_fil.xtb
@@ -436,6 +436,7 @@
       Kung naka-enable ang setting na ito, kukuha ng fingerprint ng password ang serbisyo ng proteksyon sa password sa mga URL na ito para sa pagtukoy ng umulit na paggamit ng password.
       Kung naka-disable o hindi nakatakda ang setting na ito, sa https://accounts.google.com lang kukuha ng fingerprint ng password ang serbisyo ng proteksyon sa password.
       Available lang ang patakarang ito sa mga instance ng Windows na kasama sa domain ng<ph name="MS_AD_NAME" />. O kaya, sa mga instance ng Windows 10 Pro o Enterprise na naka-enroll para sa pamamahala sa device.</translation>
+<translation id="1919802376548418720">Gamitin ang patakaran ng KDC para maglaan ng mga kredensyal.</translation>
 <translation id="1920046221095339924">Payagan ang pinapamahalaang session sa device</translation>
 <translation id="1929709556673267855">Nagbibigay ng mga configuration para sa mga printer ng enterprise na naka-bind sa mga device.
 
@@ -594,6 +595,15 @@
 <translation id="2240879329269430151">Binibigyang-daan kang magtakda kung pinapayagan o hindi ang mga website na magpakita ng mga pop-up. Maaaring payagan para sa lahat ng website o tanggihan para sa lahat ng website ang pagpapakita ng mga popup.
 
           Kung hinayaang hindi nakatakda ang patakarang ito, gagamitin ang 'BlockPopups' at magagawa ng user na baguhin ito.</translation>
+<translation id="2265214338421787313">Nagbibigay-daan ang patakarang ito sa isang admin na tukuyin na puwedeng magpakita ng mga popup ang isang page habang nag-a-unload ito.
+
+      Kapag naka-enable ang patakarang ito, pinapayagan ang mga page na magpakita ng mga popup habang ina-unload ang mga ito.
+
+      Kapag naka-disable o hindi nakatakda ang patakaran, hindi pinapayagang magpakita ng mga popup ang mga page habang ina-unload ang mga ito, ayon sa mga detalye (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name).
+
+      Aalisin ang patakarang ito sa Chrome 82.
+
+      Tingnan ang https://www.chromestatus.com/feature/5989473649164288 .</translation>
 <translation id="2269319728625047531">I-enable ang pagpapakita ng Pahintulot sa Pag-sync habang nagsa-sign in</translation>
 <translation id="2274864612594831715">Kino-configure ng patakarang ito ang pag-e-enable ng virtual na keyboard bilang isang input device sa ChromeOS. Hindi maaaring i-override ng mga user ang patakarang ito.
 
@@ -2223,6 +2233,7 @@
 <translation id="602728333950205286">Instant na URL ng default na provider ng paghahanap</translation>
 <translation id="603410445099326293">Mga parameter para sa URL ng mungkahi na ginagamit ang POST</translation>
 <translation id="6034341625190551415">Nagkokontrol sa pampublikong session at mga uri ng account ng kiosk.</translation>
+<translation id="6034603289689965535">Nagbibigay-daan sa isang page na magpakita ng mga popup habang nag-a-unload ito</translation>
 <translation id="6036523166753287175">Paganahin ang firewall traversal mula sa host ng malayuang pag-access</translation>
 <translation id="6070667616071269965">Mga layout ng keyboard sa screen ng pag-sign in ng device</translation>
 <translation id="6074963268421707432">Huwag payagan ang anumang site na magpakita ng mga notification sa desktop</translation>
@@ -2890,10 +2901,6 @@
 
       Kungh indi nakatakda ang patakaran, o nakatakda sa false, ie-enable ang <ph name="TLS_FALSE_START" />. Kung nakatakda ito sa true, idi-disable ang <ph name="TLS_FALSE_START" />.</translation>
 <translation id="7433714841194914373">Paganahin ang Instant</translation>
-<translation id="7443061725198440541">Kung hindi nakatakda ang patakarang ito o kung naka-enable ito, pinapayagan ang user na gamitin ang spellcheck.
-
-      Kung naka-disable ang patakarang ito, hindi pinapayagan ang user na gamitin ang spellcheck. Babalewalain ang patakarang SpellcheckLanguage kapag naka-disable ang patakarang ito.
-      </translation>
 <translation id="7443616896860707393">Mga prompt ng Cross-origin HTTP Basic Auth</translation>
 <translation id="7458437477941640506">Huwag mag-roll back sa target na bersyon kung mas bago ang bersyon ng OS kaysa sa target. Naka-disable din ang mga update.</translation>
 <translation id="7464991223784276288">Limitahan ang cookies sa pagtutugma ng mga URL sa kasalukuyang session</translation>
@@ -3496,15 +3503,6 @@
 <translation id="8870318296973696995">Home page</translation>
 <translation id="8876188741456358123">Ino-override ang default na printing duplex mode. Kung hindi available ang mode, binabalewala ang patakarang ito.</translation>
 <translation id="8882006618241293596">I-block ang plugin na <ph name="FLASH_PLUGIN_NAME" /> sa mga site na ito</translation>
-<translation id="890403179930035128">Puwersahang ine-enable ang mga wika ng spellcheck. Babalewalain ang mga hindi kilalang wika sa listahang iyon.
-
-      Kung ie-enable mo ang patakarang ito, mae-enable ang spellcheck para sa mga tinukoy na wika, bukod pa sa mga wikang kung saan na-enable ng user ang spellcheck.
-
-      Kung hindi mo itatakda ang patakarang ito, o kung idi-disable ito, walang mababago sa mga kagustuhan sa spellcheck ng user.
-
-      Kung itatakda sa naka-disable ang patakarang SpellcheckEnabled, hindi magkakaroon ng epekto ang patakarang ito.
-
-      Ang mga kasalukuyang sinusuportahang wika ay: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Payagan ang mode ng bisita</translation>
 <translation id="8908294717014659003">Binibigyang-daan kang itakda kung papayagan ang mga website na makakuha ng access sa mga media capture na device. Maaaring payagan bilang default ang access sa mga media capture na device, o maaaring tanungin ang user sa tuwing may website na nagnanais na mag-access sa mga media capture na device.
 
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index e1c3178..759e8fbe 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -439,6 +439,7 @@
       Si cette règle est activée, le service de protection par mot de passe enregistre l'empreinte numérique du mot de passe au niveau de ces URL afin de détecter les mots de passe réutilisés.
       Si cette règle est désactivée ou n'est pas configurée, le service de protection par mot de passe n'enregistre l'empreinte numérique du mot de passe que sur https://accounts.google.com.
       Cette règle n'est disponible que sur les instances Windows qui sont associées à un domaine <ph name="MS_AD_NAME" />, ou sur les instances Windows 10 Pro ou Windows Enterprise qui sont enregistrées pour bénéficier de la gestion des appareils.</translation>
+<translation id="1919802376548418720">Utiliser la règle KDC pour déléguer les identifiants.</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.
 
@@ -603,6 +604,15 @@
 <translation id="2240879329269430151">Permet de définir si les sites Web sont autorisés à afficher les pop-ups. L'affichage des pop-ups peut être soit autorisé pour tous les sites, soit refusé pour tous les sites. 
 
 Si cette règle n'est pas configurée, le paramètre "BlockPopups" est utilisé et l'utilisateur est en mesure de le modifier.</translation>
+<translation id="2265214338421787313">Cette règle autorise un administrateur à indiquer qu'une page peut afficher des fenêtres contextuelles pendant son déchargement.
+
+      Lorsque cette règle est activée, les pages sont autorisées à afficher des fenêtres contextuelles lors de leurs déchargement.
+
+      Si la règle est désactivée ou n'est pas définie, les pages ne peuvent pas afficher de fenêtres contextuelles pendant leur déchargement, conformément aux spécifications (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name).
+
+      Cette règle sera supprimée dans Chrome 82.
+
+      Pour en savoir plus, consultez l'article https://www.chromestatus.com/feature/5989473649164288.</translation>
 <translation id="2269319728625047531">Activer l'affichage de l'autorisation de synchronisation lors de la connexion</translation>
 <translation id="2274864612594831715">Cette règle configure l'activation du clavier virtuel en tant que périphérique d'entrée sur Chrome OS. Les utilisateurs ne peuvent pas la modifier.
 
@@ -2240,6 +2250,7 @@
 <translation id="602728333950205286">URL de recherche instantanée du moteur de recherche par défaut</translation>
 <translation id="603410445099326293">Paramètres pour l'URL de suggestion utilisant POST</translation>
 <translation id="6034341625190551415">Contrôle les types de comptes kiosque et les sessions publiques.</translation>
+<translation id="6034603289689965535">Autorise une page à afficher des fenêtres contextuelles pendant son déchargement</translation>
 <translation id="6036523166753287175">Activer la traversée de pare-feu depuis l'hôte d'accès à distance</translation>
 <translation id="6070667616071269965">Dispositions de clavier de l'écran de connexion de l'appareil</translation>
 <translation id="6074963268421707432">Interdire à tous les sites d'afficher des notifications sur le Bureau</translation>
@@ -2901,10 +2912,6 @@
 
       Si cette règle n'est pas configurée, ou si elle est définie sur "False", <ph name="TLS_FALSE_START" /> est activé. Si elle est définie sur "True", <ph name="TLS_FALSE_START" /> est désactivé.</translation>
 <translation id="7433714841194914373">Activer la recherche instantanée</translation>
-<translation id="7443061725198440541">Si cette règle n'est pas définie ou activée, l'utilisateur est autorisé à utiliser la vérification orthographique.
-
-       Si cette règle est désactivée, l'utilisateur n'est pas autorisé à utiliser la vérification orthographique. La règle SpellcheckLanguage est également ignorée lorsque cette règle est désactivée.
-      </translation>
 <translation id="7443616896860707393">Invites d'authentification de base HTTP (Basic Auth) multi-domaine</translation>
 <translation id="7458437477941640506">Ne rétablissez pas la version cible si elle est antérieure à la version de l'OS. Les mises à jour seront également désactivées.</translation>
 <translation id="7464991223784276288">Limiter les cookies des URL correspondantes à la session en cours</translation>
@@ -3497,15 +3504,6 @@
 <translation id="8870318296973696995">Page d'accueil</translation>
 <translation id="8876188741456358123">Remplace le mode recto verso d'impression par défaut. Si le mode est indisponible, cette règle est ignorée.</translation>
 <translation id="8882006618241293596">Bloquer le plug-in "<ph name="FLASH_PLUGIN_NAME" />" sur ces sites</translation>
-<translation id="890403179930035128">Active de manière forcée les langues pour la vérification orthographique. Les langues non compatibles de cette liste seront ignorées.
-
-      Si vous activez cette règle, la vérification orthographique sera activée pour les langues spécifiées, en plus des langues pour lesquelles l'utilisateur a activé la vérification orthographique.
-
-      Si vous ne configurez pas cette règle ou que vous la désactivez, aucune modification ne sera apportée aux préférences de correction orthographique de l'utilisateur.
-
-      Si la règle SpellcheckEnabled est définie sur "désactivé", cette règle n'aura aucun effet.
-
-      Actuellement, les langues compatibles sont les suivantes : af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk et vi.</translation>
 <translation id="8906768759089290519">Activer le mode invité</translation>
 <translation id="8908294717014659003">Vous permet de définir si les sites Web sont autorisés à accéder aux périphériques de capture multimédia. L'accès aux périphériques de capture multimédia peut être autorisé par défaut, ou l'utilisateur doit confirmer son autorisation chaque fois qu'un site Web souhaite accéder à ceux-ci.
 
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb
index 139a7f8..388bf82b 100644
--- a/components/policy/resources/policy_templates_gu.xtb
+++ b/components/policy/resources/policy_templates_gu.xtb
@@ -3179,10 +3179,6 @@
       જો આ નીતિ સેટ કરેલ નથી અથવા તો false પર સેટ કરેલ છે, તો પછી <ph name="TLS_FALSE_START" /> સક્ષમ કરવામાં આવશે. જો તે true પર સેટ કરેલ છે, તો <ph name="TLS_FALSE_START" /> અક્ષમ કરવામાં આવશે.</translation>
 <translation id="7433714841194914373">ઝટપટ ચાલુ કરો</translation>
 <translation id="7434202861148928348">રિમોટ ઍક્સેસ ક્લાઇન્ટ માટે આવશ્યક ડોમેન નામ ગોઠવે છે</translation>
-<translation id="7443061725198440541">જો આ નીતિ સેટ કરેલ અથવા ચાલુ કરેલ હોય, તો વપરાશકર્તા જોડણી-તપાસનો ઉપયોગ કરવાની મંજૂરી આપે છે.
-
-      જો આ નીતિ બંધ કરેલ હોય, તો વપરાશકર્તા જોડણી-તપાસનો ઉપયોગ કરવાની મંજૂરી આપતા નથી. આ નીતિને બંધ કરેલ હોય ત્યારે SpellcheckLanguage નીતિને પણ અવગણવામાં આવશે.
-      </translation>
 <translation id="7443616896860707393">Cross-origin HTTP Basic Auth સંકેતો</translation>
 <translation id="7458437477941640506">જો OS વર્ઝન લક્ષ્ય કરતાં નવું હોય, તો લક્ષ્ય વર્ઝન પર રોલબૅક કરશો નહીંં. અપડેટ પણ બંધ કરેલી છે.</translation>
 <translation id="7464991223784276288">કુકીને URLsનો હાલના સત્ર સાથે મેળ કરવાથી મર્યાદિત કરો</translation>
@@ -3837,15 +3833,6 @@
 <translation id="8870318296973696995">હોમ પેજ</translation>
 <translation id="8876188741456358123">ડિફૉલ્ટ પ્રિન્ટિંગ ડુપ્લેક્સ મોડને ઓવરરાઇડ કરે છે. મોડ ઉપલબ્ધ ન હોય તો આ નીતિ અવગણવામાં આવે છે.</translation>
 <translation id="8882006618241293596">આ સાઇટ પર <ph name="FLASH_PLUGIN_NAME" /> પ્લગ-ઇન અવરોધિત કરો</translation>
-<translation id="890403179930035128">ફરજિયાતપણે ચાલુ થતી જોડણી તપાસ માટેની ભાષાઓ. તે સૂચિ પરની વણઓળખાયેલ ભાષાઓને અવગણવામાં આવશે.
-
-      જો તમે આ નીતિ ચાલુ કરો છો, તો વપરાશકર્તા એ જે ભાષાઓ માટે જોડણી-તપાસ ચાલુ કરેલી છે તે સિવાયની ભાષાઓ ઉપરાંત, જોડણી-તપાસને ઉલ્લેખિત ભાષાઓ માટે પણ ચાલુ કરવામાં આવશે.
-
-      જો તમે આ નીતિને સેટ કરેલી ન હોય અથવા તેને બંધ કરેલી હોય, તો વપરાશકર્તાની જોડણી-તપાસની પસંદગીઓમાં કોઈ ફેરફાર થશે નહીં.
-
-      જો જોડણી-તપાસ ચાલુ કરેલી નીતિ બંધ પર સેટ હોય, તો આ નીતિ પર કોઈ અસર પડશે નહીં.
-
-      હાલમાં આ ભાષાઓ સમર્થિત છે: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">અતિથિ મોડને ચાલુ કરો</translation>
 <translation id="8908294717014659003">વેબસાઇટને મીડિયા કૅપ્ચર ડિવાઇસનો ઍક્સેસ મેળવવાની મંજૂરી આપવી કે નહિ તે તમને સેટ કરવા દે છે. મીડિયા કૅપ્ચર ડિવાઇસનો ઍક્સેસની ડિફોલ્ટ રૂપે મંજૂરી આપેલી હોઈ શકે છે અથવા વેબસાઇટને મીડિયા કૅપ્ચર ડિવાઇસનો ઍક્સેસ મેળવવા માંગે ત્યારે દર વખતે વપરાશકર્તાને પૂછવામાં આવી શકે છે.
 
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb
index 5c327439..48eddcd 100644
--- a/components/policy/resources/policy_templates_hi.xtb
+++ b/components/policy/resources/policy_templates_hi.xtb
@@ -2018,15 +2018,15 @@
       यह नीति सिर्फ़ तब प्रभावी होती है जब <ph name="CHROME_REPORTING_EXTENSION_NAME" /> चालू हो और मशीन का नाम <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" /> के ज़रिए दर्ज कराया गया हो.</translation>
 <translation id="5584132346604748282">Android Google स्थान सेवाओं को नियंत्रित करती है</translation>
 <translation id="5586942249556966598">कुछ न करें</translation>
-<translation id="5590494712401018042">डिवाइस के प्रस्तुतिकरण मोड में होने पर, यह नीति स्क्रीन की रोशनी कितनी देर में कम हो, इस समय को स्केल करने (घटाने या बढ़ाने) का प्रतिशत तय करती है.
+<translation id="5590494712401018042">डिवाइस के प्रस्तुतीकरण मोड में होने पर, यह नीति स्क्रीन की रोशनी कितनी देर में कम हो, इस समय को स्केल करने (घटाने या बढ़ाने) का प्रतिशत तय करती है.
 
-          अगर यह नीति सेट हो, तो डिवाइस के प्रस्तुतिकरण मोड में होने पर, यह नीति स्क्रीन की रोशनी कितनी देर में कम हो, इस समय को स्केल करने (घटाने या बढ़ाने) का प्रतिशत तय करती है. जब इस समय को कम या ज़्यादा किया जाता है, तो बंद स्क्रीन, स्क्रीन लॉक और 'इस्तेमाल में नहीं' की स्थिति में पहुंचने में लगने वाला समय एडजस्ट हो जाता है. यह इस तरह एडजस्ट होता है कि इस समय और स्क्रीन की रोशनी कम होने में लगने वाले समय के बीच वही समान दूरी बनी रहे जो मूल रूप से कॉन्फ़िगर की गई है.
+          अगर यह नीति सेट हो, तो डिवाइस के प्रस्तुतीकरण मोड में होने पर, यह नीति स्क्रीन की रोशनी कितनी देर में कम हो, इस समय को स्केल करने (घटाने या बढ़ाने) का प्रतिशत तय करती है. जब इस समय को कम या ज़्यादा किया जाता है, तो बंद स्क्रीन, स्क्रीन लॉक और 'इस्तेमाल में नहीं' की स्थिति में पहुंचने में लगने वाला समय एडजस्ट हो जाता है. यह इस तरह एडजस्ट होता है कि इस समय और स्क्रीन की रोशनी कम होने में लगने वाले समय के बीच वही समान दूरी बनी रहे जो मूल रूप से कॉन्फ़िगर की गई है.
 
           अगर नीति सेट नहीं हो, तो स्केल करने का डिफ़ॉल्ट तरीका इस्तेमाल किया जाता है.
 
           यह नीति तब लागू होती है, जब <ph name="POWER_SMART_DIM_ENABLED_POLICY_NAME" /> को बंद कर दिया जाता है. नहीं तो, इस नीति को अनदेखा कर दिया जाता है क्योंकि स्क्रीन की रोशनी कितनी देर में कम हो, यह मशीन लर्निंग के मॉडल से तय होता है.
 
-          स्केल फ़ैक्टर 100% या उससे ज़्यादा होना चाहिए. ऐसे मानों की अनुमति नहीं है जिनसे प्रस्तुतिकरण मोड में स्क्रीन की रोशनी कम होने में सामान्य से कम समय लगे.</translation>
+          स्केल फ़ैक्टर 100% या उससे ज़्यादा होना चाहिए. ऐसे मानों की अनुमति नहीं है जिनसे प्रस्तुतीकरण मोड में स्क्रीन की रोशनी कम होने में सामान्य से कम समय लगे.</translation>
 <translation id="5592242031005200087">
       अगर नीति चालू होती है, तो 'कॉमा-सेपरेटेड लिस्ट' में बताया गया
       हर मूल उसकी अपनी प्रक्रिया में चलेगा. इससे सबडोमेन के
@@ -2894,10 +2894,6 @@
 
       यदि पॉलिसी सेट नहीं की जाती है या असत्य पर सेट की जाती है, तो <ph name="TLS_FALSE_START" /> को अक्षम किया जाएगा. यदि इसे सत्य पर सेट किया जाता है, तो <ph name="TLS_FALSE_START" /> को अक्षम कर दिया जाएगा.</translation>
 <translation id="7433714841194914373">झटपट सक्षम करें</translation>
-<translation id="7443061725198440541">अगर इस नीति को सेट नहीं किया गया है या यह चालू नहीं है तो, उपयोगकर्ता को वर्तनी जांच का इस्तेमाल करने की अनुमति होती है.
-
-      अगर यह नीति बंद हो तो, उपयोगकर्ता को वर्तनी जांच का इस्तेमाल करने की अनुमति नहीं होती है. इस नीति के बंद होने पर, SpellcheckLanguage नीति को भी अनदेखा किया जाएगा.
-      </translation>
 <translation id="7443616896860707393">क्रॉस-ओरिजिन HTTP मूल प्रमाणीकरण संकेत</translation>
 <translation id="7458437477941640506">अगर OS वर्शन टार्गेट से नया है, तो टार्गेट वर्शन में रोल बैक नहीं करें. अपडेट भी बंद कर दिए गए हैं.</translation>
 <translation id="7464991223784276288">मिलान करने वाले यूआरएल की कुकी को मौजूदा सत्र तक सीमित करें</translation>
@@ -3496,15 +3492,6 @@
 <translation id="8870318296973696995">मुख्यपृष्ठ</translation>
 <translation id="8876188741456358123">डिफ़ॉल्ट रूप से डुप्लेक्स मोड में प्रिंट करना ओवरराइड कर देती है. अगर मोड उपलब्ध नहीं है तो नीति को अनदेखा कर दिया जाता है.</translation>
 <translation id="8882006618241293596">इन साइटों पर <ph name="FLASH_PLUGIN_NAME" /> प्लग इन ब्लॉक करें</translation>
-<translation id="890403179930035128">वर्तनी जाँच भाषाओं को ज़बरन चालू करती है. इस सूची में शामिल जिन भाषाओं की पहचान नहीं हुई है उन्हें अनदेखा किया जाएगा.
-
-      अगर आप इस नीति को चालू करते हैं, तो उपयोगकर्ता ने जिन भाषाओं के लिए वर्तनी जाँच चालू किया है उनके अलावा, तय की गई भाषाओं के लिए वर्तनी जाँच चालू कर दिया जाएगा.
-
-      अगर आप यह नीति सेट नहीं करते हैं या इसे बंद कर देते हैं, तो उपयोगकर्ता की वर्तनी जाँच प्राथमिकताओं में कोई बदलाव नहीं होगा.
-
-      अगर SpellcheckEnabled नीति को बंद पर सेट किया गया है, तो इस नीति का कोई प्रभाव नहीं होगा.
-
-      इस समय काम करने वाली भाषाएं इस प्रकार हैं: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">मेहमान मोड सक्षम करें</translation>
 <translation id="8908294717014659003">यह सेट करने की सुविधा देती है कि वेबसाइटों को मीडिया कैप्चर डिवाइस का एक्सेस करने की अनुमति है या नहीं. मीडिया कैप्चर डिवाइस के एक्सेस की अनुमति डिफ़ॉल्ट रूप से दी जा सकती है, या जब भी कोई वेबसाइट मीडिया कैप्चर डिवाइस का एक्सेस पाना चाहेगी तब-तब उपयोगकर्ता से पूछा जा सकता है.
 
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb
index 0dc588a..c8cc569 100644
--- a/components/policy/resources/policy_templates_hr.xtb
+++ b/components/policy/resources/policy_templates_hr.xtb
@@ -2794,10 +2794,6 @@
 
       Ako se to pravilo ne postavi ili se postavi na "False", omogućit će se <ph name="TLS_FALSE_START" />. Ako se postavi na "True", neće se omogućiti <ph name="TLS_FALSE_START" />.</translation>
 <translation id="7433714841194914373">Omogući Instant</translation>
-<translation id="7443061725198440541">Ako ovo pravilo nije postavljeno ili omogućeno, korisnik će moći upotrebljavati provjeru pravopisa.
-
-      Ako je pravilo onemogućeno, korisnik neće moći upotrebljavati provjeru pravopisa. Pravilo SpellcheckLanguage zanemarit će se i kad je ovo pravilo onemogućeno.
-      </translation>
 <translation id="7443616896860707393">Zahtjevi za Cross-origin HTTP Basic Auth</translation>
 <translation id="7458437477941640506">Nemoj se vratiti na ciljnu verziju ako je verzija OS-a novija od ciljne. Ažuriranja su također onemogućena.</translation>
 <translation id="7464991223784276288">Ograničavanje kolačića iz podudarnih URL-ova na trenutačnu sesiju</translation>
@@ -3385,15 +3381,6 @@
 <translation id="8870318296973696995">Početna stranica</translation>
 <translation id="8876188741456358123">Nadjačava dvostruki način zadanog ispisa. Pravilo se zanemaruje ako način nije dostupan.</translation>
 <translation id="8882006618241293596">Blokiraj dodatak <ph name="FLASH_PLUGIN_NAME" /> na ovim web-lokacijama</translation>
-<translation id="890403179930035128">Nameće provjeru pravopisa za jezike. Neprepoznati jezici na popisu zanemarit će se.
-
-      Ako omogućite ovo pravilo, provjera pravopisa bit će omogućena za navedene jezike, kao i za jezike za koje je korisnik omogućio provjeru pravopisa.
-
-      Ako ne postavite ovo pravilo ili ga onemogućite, korisnikove postavke provjere pravopisa neće se promijeniti.
-
-      Ako je pravilo SpellcheckEnabled postavljeno na "onemogućeno", ovo pravilo neće imati učinka.
-
-      Trenutačno podržani jezici: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Omogući način gosta</translation>
 <translation id="8908294717014659003">Omogućuje vam da postavite hoće li web-lokacijama biti dopušten pristup medijskim uređajima za snimanje. Pristup medijskim uređajima za snimanje može biti dopušten prema zadanim postavkama ili se korisniku može postaviti pitanje svaki put kada web-lokacija želi pristupiti tim uređajima.
 
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb
index d2a51703..d478250 100644
--- a/components/policy/resources/policy_templates_hu.xtb
+++ b/components/policy/resources/policy_templates_hu.xtb
@@ -2808,10 +2808,6 @@
 
       Ha a házirend nincs beállítva, illetve értéke hamis, akkor a <ph name="TLS_FALSE_START" /> engedélyezve lesz. Ha értéke igaz, akkor a <ph name="TLS_FALSE_START" /> le lesz tiltva.</translation>
 <translation id="7433714841194914373">Az Instant funkció engedélyezése</translation>
-<translation id="7443061725198440541">Ha a házirend nincs beállítva, illetve engedélyezve van, a felhasználó használhatja a helyesírás-ellenőrzés funkciót.
-
-      Ha a házirend le van tiltva, a felhasználó nem használhatja a helyesírás-ellenőrzés funkciót. Letiltott házirend esetén a SpellcheckLanguage házirendet is figyelmen kívül hagyja a rendszer.
-      </translation>
 <translation id="7443616896860707393">Cross-origin HTTP Basic Auth-kérdés</translation>
 <translation id="7458437477941640506">Ne állítsa vissza a célverziót, ha az operációs rendszer verziója újabb a célverziónál. A frissítések is le vannak tiltva.</translation>
 <translation id="7464991223784276288">Cookie-k korlátozása egyező URL-ekről az aktuális munkamenetre</translation>
@@ -3395,15 +3391,6 @@
 <translation id="8870318296973696995">Kezdőoldal</translation>
 <translation id="8876188741456358123">Felülbírálja az alapértelmezett kétoldalas nyomtatási módot. Ha nem áll rendelkezésre a kétoldalas nyomtatási mód, akkor a rendszer figyelmen kívül hagyja ezt a házirendet.</translation>
 <translation id="8882006618241293596">A(z) <ph name="FLASH_PLUGIN_NAME" /> beépülő modul letiltása ezeken a webhelyeken</translation>
-<translation id="890403179930035128">Kényszeríti a helyesírás-ellenőrzéshez használt nyelvek engedélyezését. A rendszer figyelmen kívül hagyja a listában található, fel nem ismert nyelveket.
-
-      Ha engedélyezi a házirendet, a felhasználó által engedélyezett nyelvek mellett a megadott nyelveknél is engedélyezve lesz a helyesírás-ellenőrző.
-
-      Ha nem állítja be, illetve ha letiltja a házirendet, a felhasználó helyesírás-ellenőrzéssel kapcsolatos beállításai érintetlenek maradnak.
-
-      Letiltott SpellcheckEnabled házirend mellett ennek a házirendnek semmilyen hatása sincs.
-
-      A jelenleg támogatott nyelvek a következők: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Vendég mód bekapcsolása</translation>
 <translation id="8908294717014659003">Lehetővé teszi annak beállítását, hogy a webhelyek hozzáférhetnek-e a felvevőeszközökhöz. A felvevőeszközökhöz való hozzáférés engedélyezhető alapértelmezés szerint, vagy a rendszer rákérdezhet minden alkalommal, amikor egy webhely megpróbál hozzájuk férni.
 
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 1e231c9..f39056a 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -2770,10 +2770,6 @@
 
       Jika kebijakan tidak disetel, atau disetel ke False, <ph name="TLS_FALSE_START" /> akan diaktifkan. Jika disetel ke True, <ph name="TLS_FALSE_START" /> akan dinonaktifkan.</translation>
 <translation id="7433714841194914373">Aktifkan Instan</translation>
-<translation id="7443061725198440541">Jika kebijakan ini tidak disetel atau diaktifkan, pengguna diizinkan untuk menggunakan fitur pemeriksa ejaan.
-
-      Jika kebijakan ini dinonaktifkan, pengguna tidak diizinkan menggunakan fitur pemeriksa ejaan. Kebijakan SpellcheckLanguage juga akan diabaikan jika kebijakan ini dinonaktifkan.
-      </translation>
 <translation id="7443616896860707393">Permintaan Autentikasi Dasar HTTP lintas asal</translation>
 <translation id="7458437477941640506">Jangan kembalikan ke versi target jika versi OS lebih baru daripada target. Update juga dinonaktifkan.</translation>
 <translation id="7464991223784276288">Membatasi cookie dari URL yang cocok ke sesi saat ini</translation>
@@ -3333,15 +3329,6 @@
 <translation id="8870318296973696995">Beranda</translation>
 <translation id="8876188741456358123">Mengganti mode dupleks pencetakan default. Jika mode tersebut tidak tersedia, kebijakan ini akan diabaikan.</translation>
 <translation id="8882006618241293596">Blokir plugin <ph name="FLASH_PLUGIN_NAME" /> di situs ini</translation>
-<translation id="890403179930035128">Mengaktifkan paksa fitur pemeriksa ejaan bahasa. Bahasa yang tidak dikenal dalam daftar akan diabaikan.
-
-      Jika Anda mengaktifkan kebijakan ini, fitur pemeriksa ejaan akan diaktifkan untuk bahasa yang ditentukan, selain bahasa yang telah diaktifkan oleh pengguna.
-
-      Jika Anda tidak menyetel kebijakan ini, atau menonaktifkannya, tidak akan ada perubahan pada preferensi fitur pemeriksa ejaan pengguna.
-
-      Jika kebijakan SpellcheckEnabled disetel menjadi dinonaktifkan, kebijakan ini tidak akan berlaku.
-
-      Bahasa yang didukung saat ini adalah: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Aktifkan mode tamu</translation>
 <translation id="8908294717014659003">Memungkinkan Anda menyetel apakah situs web diizinkan untuk mengakses perangkat tangkap media. Akses ke perangkat tangkap media dapat diizinkan secara default, atau dapat ditanyakan pada pengguna setiap saat situs web ingin mendapatkan akses ke perangkat tangkap media.
 
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 1238eaf..fc8250ea 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -2754,10 +2754,6 @@
 
       Se la norma non viene impostata, o viene impostata su false, l'ottimizzazione <ph name="TLS_FALSE_START" /> viene attivata. Se viene impostata su true, l'ottimizzazione <ph name="TLS_FALSE_START" /> viene disattivata.</translation>
 <translation id="7433714841194914373">Abilita Instant</translation>
-<translation id="7443061725198440541">Se questa norma non viene impostata o viene attivata, l'utente può usare il controllo ortografico.
-
-      Se questa norma viene disattivata, l'utente non può usare il controllo ortografico. Se questa norma viene disattivata, viene ignorata anche la norma SpellcheckLanguage.
-      </translation>
 <translation id="7443616896860707393">Richieste di autenticazione di base HTTP tra origini</translation>
 <translation id="7458437477941640506">Non eseguire il rollback alla versione target se la versione del sistema operativo è più nuova del target. Anche gli aggiornamenti sono disattivati.</translation>
 <translation id="7464991223784276288">Limita i cookie degli URL corrispondenti alla sessione corrente</translation>
@@ -3321,15 +3317,6 @@
 <translation id="8870318296973696995">Pagina iniziale</translation>
 <translation id="8876188741456358123">Consente di eseguire l'override della modalità di stampa fronte/retro predefinita. Se la modalità non è disponibile, questa norma viene ignorata.</translation>
 <translation id="8882006618241293596">Blocca il plug-in <ph name="FLASH_PLUGIN_NAME" /> su questi siti</translation>
-<translation id="890403179930035128">Consente di forzare l'attivazione delle lingue per il controllo ortografico. Le lingue non riconosciute dell'elenco verranno ignorate.
-
-      Se questa norma viene attivata, il controllo ortografico verrà attivato per le lingue specificate, oltre che per le lingue per cui l'utente ha attivato il controllo ortografico.
-
-      Se questa norma non viene impostata o viene disattivata, le preferenze dell'utente relative al controllo ortografico rimarranno invariate.
-
-      Se viene disattivata la norma SpellcheckEnabled, questa norma non verrà applicata.
-
-      Le lingue attualmente supportate sono: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Attiva modalità ospite</translation>
 <translation id="8908294717014659003">Consente di stabilire se i siti web possono accedere ai dispositivi di acquisizione dei contenuti multimediali. L'accesso ai dispositivi di acquisizione dei contenuti multimediali può essere consentito per impostazione predefinita oppure l'utente può visualizzare una richiesta ogni volta che un sito web vuole accedere ai dispositivi di acquisizione dei contenuti multimediali.
 
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb
index 07a71ab1..cd181fc2 100644
--- a/components/policy/resources/policy_templates_iw.xtb
+++ b/components/policy/resources/policy_templates_iw.xtb
@@ -419,6 +419,7 @@
       אם ההגדרה הזו מופעלת, שירות הגנת הסיסמאות יתעד את טביעת האצבע של הסיסמה כדי לזהות שימוש חוזר בסיסמאות.
       אם ההגדרה הזו מושבתת או לא מוגדרת, שירות הגנת הסיסמאות יתעד טביעות אצבע של סיסמאות רק ב-https://accounts.google.com.
       המדיניות הזו זמינה רק במופעים של Windows שמצורפים לדומיין <ph name="MS_AD_NAME" />, או במופעים של Windows 10 Pro או Enterprise שרשומים לניהול מכשירים.</translation>
+<translation id="1919802376548418720">‏שימוש במדיניות KDC כדי להעניק גישה לפרטי כניסה.</translation>
 <translation id="1920046221095339924">התרת סשן מנוהל במכשיר</translation>
 <translation id="1929709556673267855">‏מספקת תצורה למדפסות ארגוניות המשויכות למכשירים.
 
@@ -575,6 +576,15 @@
 <translation id="2231817271680715693">ייבא ​​היסטוריית גלישה מדפדפן ברירת המחדל בהפעלה הראשונה</translation>
 <translation id="2236488539271255289">אל תאפשר לאף אתר להגדיר נתונים מקומיים</translation>
 <translation id="2240879329269430151">‏מאפשר לך לקבוע אם מותר לאתרים להציג חלונות קופצים. ניתן להציג חלונות קופצים עבור כל האתרים או לבטל את הצגתם עבור כל האתרים. אם לא הגדרת מדיניות זו, המערכת תשתמש ב-'BlockPopups' והמשתמש יוכל לשנות זאת.</translation>
+<translation id="2265214338421787313">‏המדיניות הזו מאפשרת למנהל המערכת לציין שדף יכול להציג חלונות קופצים בזמן הטעינה שלו.
+
+      כשהמדיניות מופעלת, הדפים מורשים להציג חלונות קופצים בזמן הטעינה שלהם.
+
+      כשהמדיניות מושבתת או אינה מוגדרת, דפים אינם מורשים להציג חלונות קופצים בזמן הטעינה שלהם, לפי המפרט (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name).
+
+      המדיניות הזו תוסר ב-Chrome 82.
+
+      יש לעיין בכתובת https://www.chromestatus.com/feature/5989473649164288 .</translation>
 <translation id="2269319728625047531">הפעלה של הצגת הסכמה לסינכרון במהלך הכניסה לחשבון</translation>
 <translation id="2274864612594831715">‏מדיניות זו מגדירה הפעלה של המקלדת הווירטואלית כהתקן קלט במערכת ההפעלה של Chrome. משתמשים אינם יכולים לעקוף מדיניות זו.
 
@@ -2138,6 +2148,7 @@
 <translation id="602728333950205286">‏כתובת אתר Instant של ספק חיפוש המוגדר כברירת מחדל</translation>
 <translation id="603410445099326293">‏פרמטרים עבור כתובת אתר להצעה שמשתמשת ב-POST</translation>
 <translation id="6034341625190551415">שולטת בסוגי חשבונות של קיוסק וסשנים ציבוריים.</translation>
+<translation id="6034603289689965535">מאפשרת לדף להראות חלונות קופצים בזמן הטעינה</translation>
 <translation id="6036523166753287175">אפשר חציית חומת אש ממארח הגישה מרחוק</translation>
 <translation id="6070667616071269965">פריסות המקלדת של מסך הכניסה במכשיר</translation>
 <translation id="6074963268421707432">אל תרשה לאף אתר להציג התראות בשולחן העבודה</translation>
@@ -2778,10 +2789,6 @@
 
    אם המדיניות לא תוגדר, או תוגדר כ-false‎, <ph name="TLS_FALSE_START" /> תופעל. אם תוגדר כ-true, ‏<ph name="TLS_FALSE_START" /> תושבת.</translation>
 <translation id="7433714841194914373">‏הפוך את Google Instant לפעיל</translation>
-<translation id="7443061725198440541">‏אם המדיניות הזו תופעל או לא תוגדר, המשתמש יוכל להשתמש בבדיקת איות.
-
-      אם המדיניות הזו תושבת, המשתמש לא יוכל להשתמש בבדיקת איות. כשהמדיניות הזו מושבתת, גם המדיניות SpellcheckLanguage לא מובאת בחשבון.
-      </translation>
 <translation id="7443616896860707393">‏בקשות אימות בסיסיות של HTTP ממקורות שונים</translation>
 <translation id="7458437477941640506">‏אין לחזור לגירסת היעד אם גירסת ה-OS חדשה מהיעד. גם העדכונים מושבתים.</translation>
 <translation id="7464991223784276288">‏הגבלה של קובצי Cookie מכתובות אתרים תואמות אל הסשן הנוכחי</translation>
@@ -3360,15 +3367,6 @@
 <translation id="8870318296973696995">דף הבית</translation>
 <translation id="8876188741456358123">עוקפת את מצב ברירת המחדל של הדפסה משני צידי הדף. אם המצב לא זמין, המדיניות הזו לא מובאת בחשבון.</translation>
 <translation id="8882006618241293596">חוסמת את הפלאגין <ph name="FLASH_PLUGIN_NAME" /> באתרים האלה</translation>
-<translation id="890403179930035128">‏מאלצת הפעלה של שפות בבדיקת האיות. שפות לא מוכרות ברשימה לא יובאו בחשבון.
-
-      אם המדיניות הזו מופעלת, בדיקת האיות תופעל בשביל השפות שצוינו, בנוסף לשפות שעבורן המשתמש הפעיל בדיקת איות.
-
-      אם המדיניות הזו לא מוגדרת, או אם היא מושבתת, לא יהיה שינוי בהעדפות בדיקת האיות של המשתמש.
-
-      אם המדיניות SpellcheckEnabled מושבתת, למדיניות הזו לא תהיה השפעה.
-
-      השפות הנתמכות כרגע הן: af‏, bg‏, ca‏, cs‏, da‏, de‏, el‏, en-AU‏, en-CA‏, en-GB‏, en-US‏, es‏, es-419‏, es-AR‏, es-ES‏, es-MX‏, es-US‏, et‏, fa‏, fo‏, fr‏, he‏, hi‏, hr‏, hu‏, id‏, it‏, ko‏, lt‏, lv‏, nb‏, nl‏, pl‏, pt-BR‏, pt-PT‏, ro‏, ru‏, sh‏, sk‏, sl‏, sq‏, sr‏, sv‏, ta‏, tg‏, tr‏, uk‏, vi.</translation>
 <translation id="8906768759089290519">הפעל מצב אורח</translation>
 <translation id="8908294717014659003">‏מאפשר לך לקבוע אם אתרים מורשים לקבל גישה למכשירי לכידת מדיה. ניתן לאפשר גישה למכשירי לכידת מדיה כברירת מחדל, או שבכל פעם שאתר רוצה לקבל גישה למכשירי לכידת מדיה, תוצג בקשה למשתמש.
 
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index 29ba2487..a55e75ac 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -299,8 +299,8 @@
 <translation id="1599424828227887013">Android 端末で指定の発行元に対してサイト分離を有効にする</translation>
 <translation id="1608259529294767544">このポリシーでは、Google アシスタントで音声サービスの起動ワードを有効にするかどうかを指定します。
 
-      このポリシーを有効に設定した場合は、Google アシスタントで音声サービスの起動ワードを有効にします。
-      このポリシーを無効に設定した場合は、Google アシスタントで音声サービスの起動ワードを無効にします。
+      このポリシーを有効に設定した場合は、Google アシスタントで音声サービスの起動ワードが有効になります。
+      このポリシーを無効に設定した場合は、Google アシスタントで音声サービスの起動ワードが無効になります。
       このポリシーが未設定の場合は、Google アシスタントで音声サービスの起動ワードを有効にするかどうかをユーザーが指定できます。
       </translation>
 <translation id="1608755754295374538">ユーザー確認なしで音声キャプチャ デバイスへのアクセスが許可される URL</translation>
@@ -1955,7 +1955,7 @@
 
           このポリシーは、「<ph name="POWER_SMART_DIM_ENABLED_POLICY_NAME" />」が無効の場合にのみ効果を持ちます。それ以外の場合、画面を暗くするまでの時間は機械学習モデルによって決定されるため、このポリシーは無視されます。
 
-          調整比率は 100% 以上で指定する必要があります。プレゼンテーション モードで画面を暗くするまでの時間を通常のときより短くするような値を指定することはできません。</translation>
+          調整比率は 100% 以上で指定する必要があります。プレゼンテーション モードの画面を暗くするまでの時間が通常のときより短くなるような値は指定できません。</translation>
 <translation id="5592242031005200087">
       このポリシーが有効に設定されている場合、カンマ区切りのリストで指定された
       発行元が各自のプロセスで実行されます。また、サブドメインによって指定された
@@ -2803,10 +2803,6 @@
 
       このポリシーが未設定の場合、または false に設定されている場合、「<ph name="TLS_FALSE_START" />」は有効になります。true に設定されている場合、「<ph name="TLS_FALSE_START" />」は無効になります。</translation>
 <translation id="7433714841194914373">インスタント検索を有効にする</translation>
-<translation id="7443061725198440541">このポリシーが未設定の場合、または有効になっている場合、ユーザーはスペルチェックを使用できます。
-
-      このポリシーが無効になっている場合、ユーザーはスペルチェックを使用できません。この場合、SpellcheckLanguage ポリシーの設定も無視されます。
-      </translation>
 <translation id="7443616896860707393">クロスオリジンでの HTTP Basic 認証プロンプト</translation>
 <translation id="7458437477941640506">OS のバージョンが対象バージョンよりも新しい場合に、対象バージョンに戻さず、アップデートも行いません。</translation>
 <translation id="7464991223784276288">一致する URL からの Cookie を現在のセッションに限定する</translation>
@@ -3381,15 +3377,6 @@
 <translation id="8870318296973696995">ホームページ</translation>
 <translation id="8876188741456358123">デフォルトの両面印刷モードをオーバーライドします。このモードを使用できない場合、このポリシーは無視されます。</translation>
 <translation id="8882006618241293596">これらのサイトで <ph name="FLASH_PLUGIN_NAME" /> プラグインをブロックする</translation>
-<translation id="890403179930035128">言語のスペルチェックを強制的に有効にします。指定した言語のうち認識されないものは無視されます。
-
-      このポリシーを有効にした場合は、ユーザーがスペルチェックを有効にしている言語に加え、指定した言語に対してスペルチェックが有効になります。
-
-      このポリシーを未設定のままにするか無効にした場合は、ユーザーのスペルチェック設定が変更なくそのまま適用されます。
-
-      SpellcheckEnabled ポリシーが無効に設定されている場合、このポリシーは無視されます。
-
-      現在サポートされている言語は次のとおりです。af、bg、ca、cs、da、de、el、en-AU、en-CA、en-GB、en-US、es、es-419、es-AR、es-ES、es-MX、es-US、et、fa、fo、fr、he、hi、hr、hu、id、it、ko、lt、lv、nb、nl、pl、pt-BR、pt-PT、ro、ru、sh、sk、sl、sq、sr、sv、ta、tg、tr、uk、vi。</translation>
 <translation id="8906768759089290519">ゲスト モードを有効にする</translation>
 <translation id="8908294717014659003">メディア キャプチャ デバイスのアクセスをウェブサイトに許可するかどうかを設定できます。デフォルトでメディア キャプチャ デバイスへのアクセスを許可するか、メディア キャプチャ デバイスへのアクセス要求がウェブサイトからあるたびにユーザーに確認することができます。
 
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb
index 4951711..59173228 100644
--- a/components/policy/resources/policy_templates_kn.xtb
+++ b/components/policy/resources/policy_templates_kn.xtb
@@ -2990,10 +2990,6 @@
       ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಇದ್ದರೆ ಅಥವಾ ತಪ್ಪು ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಿದರೆ, ಆಗ <ph name="TLS_FALSE_START" /> ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ. ಅದನ್ನು ಸರಿ ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಿದರೆ, <ph name="TLS_FALSE_START" /> ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.</translation>
 <translation id="7433714841194914373">ಇನ್‌ಸ್ಟೆಂಟ್ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="7434202861148928348">ರಿಮೋಟ್ ಪ್ರವೇಶ ಕ್ಲೈಂಟ್‌‌ಗಳಿಗೆ ಅಗತ್ಯವಿರುವ ಡೊಮೇನ್ ಹೆಸರಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ</translation>
-<translation id="7443061725198440541">ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ ಅಥವಾ ಸಕ್ರಿಯಗೊಳಿಸದಿದ್ದರೆ, ಕಾಗುಣಿತ ಪರೀಕ್ಷಕವನ್ನು ಬಳಸಲು ಬಳಕೆದಾರರಿಗೆ ಅನುಮತಿಸಲಾಗುತ್ತದೆ.
-
-      ಈ ನೀತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ, ಕಾಗುಣಿತ ಪರೀಕ್ಷಕವನ್ನು ಬಳಸಲು ಬಳಕೆದಾರರಿಗೆ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ. ಈ ನೀತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದಾಗ ಕಾಗುಣಿತ ಪರೀಕ್ಷಕ ಭಾಷಾ ನೀತಿಯನ್ನು ಸಹ ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.
-      </translation>
 <translation id="7443616896860707393">ಕ್ರಾಸ್-ಆರಿಜಿನ್ HTTP ಮೂಲ ದೃಢೀಕರಣ ಪ್ರಾಂಪ್ಟ್‌ಗಳು</translation>
 <translation id="7458437477941640506">OS ಆವೃತ್ತಿಯು ಟಾರ್ಗೆಟ್‌ಗಿಂತ ಹೊಸದಾಗಿದ್ದರೆ ಟಾರ್ಗೆಟ್‌ ಆವೃತ್ತಿಗೆ ಹಿಂತಿರುಗಬೇಡಿ. ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಸಹ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation>
 <translation id="7464991223784276288">ಪ್ರಸ್ತುತ ಸೆಶನ್‌ಗೆ ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತಿರುವ URL ಗಳಿಂದ ಕುಕೀಗಳನ್ನು ಮಿತಿಗೊಳಿಸಿ</translation>
@@ -3625,15 +3621,6 @@
 <translation id="8870318296973696995">ಮುಖ ಪುಟ</translation>
 <translation id="8876188741456358123">ಡೀಫಾಲ್ಟ್‌ ಮುದ್ರಣ ಡ್ಯೂಪ್ಲೆಕ್ಸ್ ಮೋಡ್‌ ಅನ್ನು ಅತಿಕ್ರಮಿಸುತ್ತದೆ. ಮೋಡ್‌ ಲಭ್ಯವಿಲ್ಲದಿದ್ದರೆ, ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.</translation>
 <translation id="8882006618241293596">ಈ ಸೈಟ್‌ಗಳಲ್ಲಿ <ph name="FLASH_PLUGIN_NAME" /> ಪ್ಲಗ್‌ಇನ್ ನಿರ್ಬಂಧಿಸಿ</translation>
-<translation id="890403179930035128">ಭಾಷೆಗಳ ಕಾಗುಣಿತ ಪರೀಕ್ಷಕವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ಒತ್ತಾಯಿಸಿ. ಆ ಪಟ್ಟಿಯಲ್ಲಿರುವ ಗುರುತಿಸಲಾಗದ ಭಾಷೆಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.
-        ಈ ನೀತಿಯನ್ನು ನೀವು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಕಾಗುಣಿತ ಪರೀಕ್ಷಕವು ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಭಾಷೆಗೆ , ಹೆಚ್ಚುವರಿಯಾಗಿ ಕಾಗುಣಿತ ಪರೀಕ್ಷಕವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದ ಭಾಷೆಗಳಿಗೆ ಸಕ್ರಿಯಗೊಳ್ಳುತ್ತದೆ.
-
-      ಈ ನೀತಿಯನ್ನು ನೀವು ಹೊಂದಿಸದಿದ್ದರೆ ಅಥವಾ ಅದನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ, ಬಳಕೆದಾರರ ಕಾಗುಣಿತದ ಆದ್ಯತೆಗಳಿಗೆ ಯಾವುದೇ ಬದಲಾವಣೆಗಳಿರುವುದಿಲ್ಲ.
-
-
-      ಕಾಗುಣಿತ ಪರೀಕ್ಷಕ ಸಕ್ರಿಯಗೊಳಿಸಿದ ನೀತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ, ಈ ನೀತಿಯು ಯಾವುದೇ ಪರಿಣಾಮವನ್ನು ಬೀರುವುದಿಲ್ಲ.
-
-        ಪ್ರಸ್ತುತ ಬೆಂಬಲಿತ ಭಾಷೆಗಳೆಂದರೆ: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">ಅತಿಥಿ ಮೋಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="8908294717014659003">ಮಾಧ್ಯಮ ಸೆರೆಹಿಡಿಯುವ ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಪಡೆಯಲು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಹೊಂದಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಮಾಧ್ಯಮ ಸೆರೆಹಿಡಿಯುವ ಸಾಧನಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಡಿಫಾಲ್ಟ್ ಆಗಿ ಅನುಮತಿಸಬಹುದಾಗಿದೆ ಅಥವಾ ಬಳೆಕದಾರರು ಮಾಧ್ಯಮ ಸೆರೆಹಿಡಿಯುವ ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಪಡೆಯಲು ಪ್ರತಿ ಬಾರಿಯೂ ಕೇಳಬೇಕಾಗುತ್ತದೆ.
 
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index ad9cbb9..35fded0 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -437,6 +437,7 @@
       이 설정이 사용되면 비밀번호 보호 서비스에서 비밀번호 재사용 감지 시 사용할 비밀번호 지문을 이러한 URL에서 캡처합니다.
       이 설정이 사용 중지되거나 설정되지 않으면 비밀번호 보호 서비스가 https://accounts.google.com에서만 비밀번호 지문을 캡처합니다.
       이 정책은 <ph name="MS_AD_NAME" /> 도메인에 참여하는 Windows 인스턴스 또는 기기 관리에 등록된 Windows 10 Pro/Enterprise 인스턴트에서만 사용할 수 있습니다.</translation>
+<translation id="1919802376548418720">KDC 정책을 사용하여 사용자 인증 정보를 위임합니다.</translation>
 <translation id="1920046221095339924">기기에서 관리 세션 허용</translation>
 <translation id="1929709556673267855">기기에 적용되는 엔터프라이즈 프린터 설정을 제공합니다.
 
@@ -595,6 +596,15 @@
 <translation id="2240879329269430151">웹사이트에서 팝업을 표시하도록 허용할지 여부를 설정할 수 있습니다. 팝업 표시는 모든 사이트에서 허용 또는 거부하도록 할 수 있습니다.
 
           이 정책을 설정하지 않은 경우 'BlockPopups'가 사용되며 사용자가 설정을 변경할 수 있습니다.</translation>
+<translation id="2265214338421787313">이 정책은 관리자가 로드 해제 중 페이지에서 팝업을 표시할 수 있음을 지정하게 합니다.
+
+      정책을 사용 설정하면 페이지가 로드 해제 중 팝업을 표시할 수 있도록 허용됩니다.
+
+      정책을 사용하지 않도록 설정하거나 설정하지 않으면 사양에 따라 페이지가 언로딩 중에 팝업을 표시할 수 없습니다(https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name).
+
+      이 정책은 Chrome 82에서 삭제됩니다.
+
+      https://www.chromestatus.com/feature/5989473649164288을 참조하세요.</translation>
 <translation id="2269319728625047531">로그인 시 동기화 동의 표시 사용</translation>
 <translation id="2274864612594831715">이 정책은 ChromeOS에서 가상 키보드를 입력 기기로 사용하도록 설정합니다. 사용자는 이 정책을 덮어쓸 수 없습니다.
 
@@ -2224,6 +2234,7 @@
 <translation id="602728333950205286">기본 검색 공급자 순간 검색 URL</translation>
 <translation id="603410445099326293">POST를 사용하는 추천 URL용 매개변수</translation>
 <translation id="6034341625190551415">공개 세션 및 키오스크 계정 유형을 제어합니다.</translation>
+<translation id="6034603289689965535">로드 해제 중 페이지에서 팝업을 표시할 수 있게 허용</translation>
 <translation id="6036523166753287175">원격 액세스 호스트의 방화벽 통과 허용</translation>
 <translation id="6070667616071269965">기기 로그인 화면 키보드 레이아웃</translation>
 <translation id="6074963268421707432">모든 사이트에서 데스크톱 알림 표시 허용 안함</translation>
@@ -2890,10 +2901,6 @@
 
       이 정책이 설정되지 않거나 false로 설정되면 <ph name="TLS_FALSE_START" />가 사용됩니다. 이 정책이 true로 설정되면 <ph name="TLS_FALSE_START" />가 사용 중지됩니다.</translation>
 <translation id="7433714841194914373">순간 검색 사용</translation>
-<translation id="7443061725198440541">이 정책이 설정되지 않거나 사용 설정되면 사용자는 맞춤법 검사를 사용할 수 있습니다.
-
-      이 정책이 사용 중지되면 사용자는 맞춤법 검사를 사용할 수 없습니다. 이 정책이 사용 중지되면 SpellcheckLanguage 정책도 무시됩니다.
-      </translation>
 <translation id="7443616896860707393">교차 도메인 HTTP 기본 인증 프롬프트</translation>
 <translation id="7458437477941640506">OS 버전이 대상 버전보다 높은 경우 대상 버전으로 롤백하지 않습니다. 이 경우 업데이트도 사용 중지됩니다.</translation>
 <translation id="7464991223784276288">일치하는 URL의 쿠키를 현재 세션으로 제한</translation>
@@ -3495,15 +3502,6 @@
 <translation id="8870318296973696995">홈페이지</translation>
 <translation id="8876188741456358123">기본 양면 인쇄 모드를 재정의합니다. 이 모드를 사용할 수 없는 경우 이 정책은 무시됩니다.</translation>
 <translation id="8882006618241293596">이 사이트에서 <ph name="FLASH_PLUGIN_NAME" /> 플러그인 차단</translation>
-<translation id="890403179930035128">언어 맞춤법 검사를 강제 사용 설정합니다. 목록에서 인식할 수 없는 언어는 무시됩니다.
-
-      이 정책을 사용 설정하면 사용자가 맞춤법 검사를 사용 설정한 언어 외에도 지정된 언어의 맞춤법 검사가 사용 설정됩니다.
-
-      이 정책이 설정되어 있지 않거나 사용 중지되어 있으면 사용자의 맞춤법 검사 환경설정은 변경되지 않습니다.
-
-      SpellcheckEnabled 정책이 사용 중지로 설정되어 있으면 이 정책은 아무 효과가 없습니다.
-
-      현재 지원되는 언어는 af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi입니다.</translation>
 <translation id="8906768759089290519">게스트 모드 사용</translation>
 <translation id="8908294717014659003">미디어 캡쳐 장치에 대한 웹사이트의 액세스 허용 여부를 설정할 수 있습니다. 미디어 캡쳐 장치에 대해 액세스를 기본적으로 허용하거나 웹사이트가 액세스하려고 할 때마다 확인하도록 설정할 수도 있습니다.
 
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb
index 2cf2fb8d..307129b9 100644
--- a/components/policy/resources/policy_templates_lt.xtb
+++ b/components/policy/resources/policy_templates_lt.xtb
@@ -2903,10 +2903,6 @@
 
       Jei politika nenustatyta arba nustatyta į „false“, <ph name="TLS_FALSE_START" /> įgalinamas. Jei ji nustatyta į „true“, <ph name="TLS_FALSE_START" /> išjungiamas.</translation>
 <translation id="7433714841194914373">Įgalinti intuityviąją paiešką</translation>
-<translation id="7443061725198440541">Jei ši politika nenustatyta arba neįgalinta, naudotojui leidžiama naudoti rašybos tikrinimą.
-
-      Jei ši politika išjungta, naudotojui neleidžiama naudoti rašybos tikrinimo. Politikos „SpellcheckLanguage“ taip pat bus nepaisoma, kai ši politika išjungta.
-      </translation>
 <translation id="7443616896860707393">Mišrios kilmės HTTP pagrindinio autentifikavimo raginimai</translation>
 <translation id="7458437477941640506">Negrąžinti tikslinės versijos, jei OS versija naujesnė nei tikslinė. Naujiniai taip pat išjungiami.</translation>
 <translation id="7464991223784276288">Ribojami slapukai, kad URL nesutaptų su dabartine sesija</translation>
@@ -3511,15 +3507,6 @@
 <translation id="8870318296973696995">Pagrindinis puslapis</translation>
 <translation id="8876188741456358123">Nepaisoma numatytojo spausdinimo dvipusiu režimu. Jei režimas nepasiekiamas, šios politikos nepaisoma.</translation>
 <translation id="8882006618241293596">Užblokuoti papildinį „<ph name="FLASH_PLUGIN_NAME" />“ šiose svetainėse</translation>
-<translation id="890403179930035128">Priverstinai įgalinamos rašybos tikrinimo kalbos. Bus nepaisoma tame sąraše nurodytų neatpažintų kalbų.
-
-      Jei įgalinsite šią politiką, be kalbų, kurių rašybos tikrinimą įgalino naudotojas, bus įgalintas nurodytų kalbų rašybos tikrinimas.
-
-      Jei šios politikos nenustatysite arba ją išjungsite, nebus atlikta naudotojo rašybos tikrinimo nuostatų pakeitimų.
-
-      Jei politika „SpellcheckEnabled“ išjungta, ši politika neturės jokio poveikio.
-
-      Šiuo metu palaikomos šios kalbos: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Įgalinti svečio režimą</translation>
 <translation id="8908294717014659003">Leidžiama jums nustatyti, ar svetainėms leidžiama prieiga prie medijos vaizdų įvedimo įrenginių. Medijos vaizdų įvedimo įrenginių prieiga gali būti leidžiama pagal numatytuosius nustatymus arba naudotojo (-os) gali būti klausiama kiekvieną kartą, kai svetainė nori gauti prieigą prie medijos vaizdų įvedimo įrenginių.
 
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb
index 19fec903..cc767c18 100644
--- a/components/policy/resources/policy_templates_lv.xtb
+++ b/components/policy/resources/policy_templates_lv.xtb
@@ -2875,10 +2875,6 @@
 
       Ja šī politika nav iestatīta vai tās vērtība ir Nepatiesa, funkcija <ph name="TLS_FALSE_START" /> tiks iespējota. Ja ir iestatīta vērtība Patiesa, funkcija <ph name="TLS_FALSE_START" /> tiks atspējota.</translation>
 <translation id="7433714841194914373">Iespējo dinamisko meklēšanu</translation>
-<translation id="7443061725198440541">Ja šī politika nav iestatīta vai iespējota, lietotājs varēs lietot pareizrakstības pārbaudi.
-
-      Ja šī politika ir atspējota, lietotājs nevarēs lietot pareizrakstības pārbaudi. Ja šī politika ir atspējota, tiks ignorēta arī politika SpellcheckLanguage.
-      </translation>
 <translation id="7443616896860707393">Savstarpējās izcelsmes HTTP pamata autentifikācijas uzvednes</translation>
 <translation id="7458437477941640506">Neatritināt uz mērķa versiju, ja operētājsistēmas versija ir jaunāka nekā mērķa versija. Atjauninājumi ir atspējoti.</translation>
 <translation id="7464991223784276288">Atbilstošu vietrāžu URL sīkfailu ierobežošana pašreizējā sesijā</translation>
@@ -3477,14 +3473,6 @@
 <translation id="8870318296973696995">Sākumlapa</translation>
 <translation id="8876188741456358123">Tiek ignorēts noklusējuma divpusējas drukāšanas režīms. Ja režīms nav pieejams, šī politika tiek ignorēta.</translation>
 <translation id="8882006618241293596">Spraudņa <ph name="FLASH_PLUGIN_NAME" /> bloķēšana šajās vietnēs</translation>
-<translation id="890403179930035128">Piespiedu kārtā iespējo pareizrakstības pārbaudes valodas. Tiks ignorētas sarakstā iekļautās valodas, kuras nevarēs atpazīt.
-      Ja iespējosiet šo politiku, pareizrakstības pārbaude tiks iespējota gan norādītajās valodās, gan tajās valodās, kurām lietotājs ir iespējojis pareizrakstības pārbaudi.
-
-      Ja šī politika nav iespējota vai tā tiek atspējota, lietotāja pareizrakstības preferencēs netiks ieviestas izmaiņas.
-
-      Ja politika SpellcheckEnabled ir atspējota, tā nedarbosies.
-
-      Pašreiz atbalstītās valodas: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Iespējot viesa režīmu</translation>
 <translation id="8908294717014659003">Ļauj iestatīt, vai vietnēm ir atļauts iegūt piekļuvi multivides tveršanas ierīcēm. Piekļuve multivides tveršanas ierīcēm var būt atļauta pēc noklusējuma, vai lietotājam var tikt parādīts atbilstošs jautājums katru reizi, kad vietne vēlas iegūt piekļuvi multivides tveršanas ierīcēm.
 
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb
index ba51192..e08485c4 100644
--- a/components/policy/resources/policy_templates_ml.xtb
+++ b/components/policy/resources/policy_templates_ml.xtb
@@ -3122,10 +3122,6 @@
       നയം സജ്ജീകരിച്ചിട്ടില്ലെങ്കിലോ false എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിലോ, <ph name="TLS_FALSE_START" /> പ്രവർത്തനക്ഷമമാകും. ഇത് true എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, <ph name="TLS_FALSE_START" /> പ്രവർത്തനരഹിതമാകും.</translation>
 <translation id="7433714841194914373">തല്‍ക്ഷണം പ്രാപ്തമാക്കുക</translation>
 <translation id="7434202861148928348">വിദൂര ആക്‌സസ്സ് ക്ലയന്റുകൾ ആവശ്യമുള്ള ഡൊമെയ്‌ൻ പേര് കോൺഫിഗർ ചെയ്യുക</translation>
-<translation id="7443061725198440541">ഈ നയം സജ്ജമാക്കിയിട്ടില്ലെങ്കിലോ പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിലോ, അക്ഷര‌പ്പിശക് പരിശോധന  ഉപയോഗിക്കാൻ ഉപയോക്താവിനെ അനുവദിക്കും.
-
-      ഈ നയം പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിലോ, അക്ഷര‌പ്പിശക് പരിശോധന  ഉപയോഗിക്കാൻ ഉപയോക്താവിനെ അനുവദിക്കില്ല. ഈ നയം പ്രവർത്തനരഹിതമാക്കിയിട്ടുള്ളപ്പോൾ, SpellcheckLanguage നയവും അവഗണിക്കപ്പെടും.
-      </translation>
 <translation id="7443616896860707393">ക്രോസ്സ്-ഒറിജിൻ HTTP ബേസിക് ഓത്ത് പ്രോംപ്റ്റുകൾ</translation>
 <translation id="7458437477941640506">ടാർഗറ്റിനെക്കാൾ പുതിയതാണ് OS പതിപ്പ് എങ്കിൽ  ടാർ‌ഗറ്റ് പതിപ്പിലേക്ക് തിരികെ പോകരുത്. അപ്‌ഡേറ്റുകളും പ്രവർത്തനരഹിതമാണ്.</translation>
 <translation id="7464991223784276288">പൊരുത്തപ്പെടുന്ന URL-കളിൽ നിന്നുള്ള കുക്കികൾ നിലവിലെ സെഷനിലേക്ക് പരിമിതപ്പെടുത്തുക</translation>
@@ -3762,15 +3758,6 @@
 <translation id="8870318296973696995">ഹോം പേജ്</translation>
 <translation id="8876188741456358123">രണ്ട് വശത്തും അച്ചടിക്കാവുന്ന ഡിഫോൾട്ട് പ്രിന്റിങ് മോഡ് അസാധുവാക്കുന്നു. മോഡ് ലഭ്യമല്ലെങ്കിൽ, ഈ നയം അവഗണിക്കപ്പെടും.</translation>
 <translation id="8882006618241293596">ഈ സൈറ്റുകളിൽ <ph name="FLASH_PLUGIN_NAME" /> പ്ലഗിൻ ബ്ലോക്കുചെയ്യുക</translation>
-<translation id="890403179930035128">ഭാഷകളുടെ അക്ഷരപ്പിശക് പരിശോധന നിർവന്ധിച്ച് പ്രവർത്തനക്ഷമമാക്കുന്നു. ലിസ്റ്റിലെ തിരിച്ചറിയാനാകാത്ത ഭാഷകൾ അവഗണിക്കപ്പെടും.
-
-      നിങ്ങൾ ഈ നയം പ്രവർത്തനക്ഷമമാക്കുന്നുവെങ്കിൽ, ഉപയോക്താവ് അക്ഷരപ്പിശക് പരിശോധന പ്രവർത്തനക്ഷമമാക്കിയിട്ടുള്ള ഭാഷകൾക്ക് പുറമെ, വ്യക്തമാക്കിയിട്ടുള്ള ഭാഷകൾക്കായും അക്ഷരപ്പിശക് പരിശോധന പ്രവർത്തനക്ഷമമാക്കപ്പെടും
-
-      നിങ്ങൾ ഈ നയം സജ്ജമാക്കുന്നില്ലെങ്കിലോ അത് പ്രവർത്തനരഹിതമാക്കുന്നുവെങ്കിലോ, ഉപയോക്താവിന്‍റെ ഉപയോക്താവ് അക്ഷരപ്പിശക് പരിശോധനാ മുൻഗണനകളുമായി ബന്ധപ്പെട്ട് ഒരു മാറ്റവും ഉണ്ടാകില്ല.
-
-      SpellcheckEnabled നയം പ്രവർത്തനരഹിതമാക്കുന്ന തരത്തിൽ സജ്ജമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ നയത്തിന് പ്രഭാവമൊന്നും ഉണ്ടായിരിക്കുകയില്ല.
-
-      നിലവിൽ പിന്തുണയ്ക്കപ്പെടുന്ന ഭാഷകൾ ഇവയൊക്കെയാണ്: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">അതിഥി മോഡ് പ്രാപ്‌തമാക്കുക</translation>
 <translation id="8908294717014659003">മീഡിയ ക്യാപ്‌ചർ ഉപകരണങ്ങളിലേക്ക് വെബ്‌സൈറ്റുകൾക്ക് ആക്‌സസ്സ് അനുവദിക്കണമെന്നോയെന്നത് സജ്ജമാക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. മീഡിയ ക്യാപ്‌ചർ ഉപകരണങ്ങളിലേക്കുള്ള ആക്‌സസ്സ് സ്ഥിരസ്ഥിതിയായി അനുവദിക്കാം അല്ലെങ്കിൽ ഒരു വെബ്‌സൈറ്റിന് മീഡിയ ക്യാപ്‌ചർ ഉപകരണങ്ങളിലേക്ക് ആക്‌സസ്സ് ആവശ്യമുള്ളപ്പോഴെല്ലാം ഉപയോക്താവിനോട് ആവശ്യപ്പെടാം.
 
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb
index 38f9838..3f9596c 100644
--- a/components/policy/resources/policy_templates_mr.xtb
+++ b/components/policy/resources/policy_templates_mr.xtb
@@ -3134,10 +3134,6 @@
       धोरण सेट केले नसल्यास किंवा असत्य वर सेट केले असल्यास, <ph name="TLS_FALSE_START" /> सक्षम केले जाईल. ते सत्य वर सेट केले असल्यास, <ph name="TLS_FALSE_START" /> अक्षम केले जाईल.</translation>
 <translation id="7433714841194914373">झटपट सक्षम करा</translation>
 <translation id="7434202861148928348">रिमोट अॅक्सेस क्लायंटसाठी आवश्यक असलेली डोमेन नावे कॉन्फिगर करा</translation>
-<translation id="7443061725198440541">हे धोरण सेट किंवा चालू केलेले नसल्‍यास, वापरकर्त्‍याला शब्‍दलेखन वापरण्‍याची अनुमती आहे.
-
-      हे धोरण बंद केलेले असल्‍यास, वापरकर्त्‍याला शब्‍दलेखन वापरण्‍याची अनुमती नाही. हे धोरण बंद असताना शब्‍दलेखन भाषा देखील दुर्लक्ष केले जाईल.
-      </translation>
 <translation id="7443616896860707393">HTTP मूळ प्रमाणिकरण सूचना क्रॉस-‍ओरिजिन करा</translation>
 <translation id="7458437477941640506">OS आवृत्ती लक्ष्यापेक्षा नवीन असल्यास लक्ष्य आवृत्तीवर परत येऊ नका. अपडेट देखील बंद केले आहेत.</translation>
 <translation id="7464991223784276288">सद्य सेशनच्या जुळणाऱ्या URL वरील कुकी मर्यादित करा</translation>
@@ -3761,15 +3757,6 @@
 <translation id="8870318296973696995">मुख्यपृष्ठ</translation>
 <translation id="8876188741456358123">डीफॉल्ट प्रिंटिंग डुप्लेक्स मोड ओव्हरराइड करते. मोड उपलब्ध नसल्यास या धोरणाकडे दुर्लक्ष केले जाते.</translation>
 <translation id="8882006618241293596">या साइटवर <ph name="FLASH_PLUGIN_NAME" /> प्लगइन ब्लॉक करा</translation>
-<translation id="890403179930035128">शब्‍दलेखन भाषा जाणीवपूर्वक सुरू करा. त्‍या सूचीतील न ओेळखलेल्‍या भाषांकडे दुर्लक्ष केले जाईल.
-
-      तुम्‍ही हे धोरण सुरू केले असल्‍यास, वापरकर्त्‍याने शब्‍दलेखन सुरू केलेल भाषांखेरीज निर्दिष्‍ट केलेल्‍या भाषेसाठी शब्‍दलेखन सुरू केले जाईल.
-
-      तुम्‍ही हे धोरण सुरू केले नसल्‍यास किंवा बंद केले असल्‍यास,  वापरकर्त्‍याच्‍या शब्‍दलेखन प्राधान्‍यांमध्‍ये काहीही बदल होणार नाही.
-
-      शब्‍दलेखन सुरू धोरण बंद असे सेट केले असल्‍यास, या धोरणाचा काहीही प्रभाव राहणार नाही.
-
-सध्‍या सपोर्ट असलेल्‍या भाषा: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">अतिथी मोड सक्षम करा</translation>
 <translation id="8908294717014659003">वेबसाइट्सना माध्यम कॅप्चर डिव्हाइसेससमध्ये प्रवेश करण्याच्या अनुमती देण्याबाबत तुम्हाला सेट करण्याची अनुमती देते. माध्यम कॅप्चर डिव्हाइसेसमध्ये प्रवेश करणे डीफॉल्टनुसार अनुमती दिली जाऊ शकते किंवा दरवेळी वेबसाइट माध्यम कॅप्चर डिव्हाइसेसमध्ये प्रवेश करू इच्छित असताना वापरकर्त्यास दर वेळी विचाले जाऊ शकते.
 
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb
index 823db8e..3a411028 100644
--- a/components/policy/resources/policy_templates_ms.xtb
+++ b/components/policy/resources/policy_templates_ms.xtb
@@ -2899,10 +2899,6 @@
 
       Jika dasar ini tidak ditetapkan atau ditetapkan kepada palsu, maka <ph name="TLS_FALSE_START" /> akan didayakan. Jika dasar ditetapkan kepada benar, <ph name="TLS_FALSE_START" /> akan dilumpuhkan.</translation>
 <translation id="7433714841194914373">Dayakan Semerta</translation>
-<translation id="7443061725198440541">Jika dasar ini tidak ditetapkan atau didayakan, pengguna dibenarkan untuk menggunakan semakan ejaan.
-
-      Jika dasar ini dilumpuhkan, pengguna tidak dibenarkan untuk menggunakan semakan ejaan. Dasar SpellcheckLanguage turut akan diabaikan semasa dasar ini dilumpuhkan.
-      </translation>
 <translation id="7443616896860707393">Gesaan Pengesahan Asas HTTP Asas Silang</translation>
 <translation id="7458437477941640506">Jangan undur kepada versi sasaran jika versi OS lebih baharu daripada sasaran. Kemas kini juga dilumpuhkan.</translation>
 <translation id="7464991223784276288">Hadkan kuki daripada URL yang sepadan pada sesi semasa</translation>
@@ -3507,15 +3503,6 @@
 <translation id="8870318296973696995">Halaman utama</translation>
 <translation id="8876188741456358123">Mengatasi mod dupleks pencetakan lalai. Jika mod tidak tersedia, dasar ini akan diabaikan.</translation>
 <translation id="8882006618241293596">Sekat pemalam <ph name="FLASH_PLUGIN_NAME" /> pada tapak ini</translation>
-<translation id="890403179930035128">Paksa dayakan bahasa semakan ejaan. Bahasa yang tidak dikenali dalam senarai itu akan diabaikan.
-
-      Jika anda mendayakan dasar ini, semakan ejaan akan didayakan untuk bahasa yang dinyatakan, sebagai tambahan kepada bahasa yang telah didayakan semakan ejaan oleh pengguna.
-
-      Jika anda tidak menetapkan dasar ini atau melumpuhkannya, tiada perubahan akan dibuat terhadap pilihan semakan ejaan pengguna.
-
-      Jika dasar SpellcheckEnabled ditetapkan kepada dilumpuhkan, dasar ini tidak akan berkuat kuasa.
-
-      Bahasa yang disokong pada masa ini ialah: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Dayakan mod tetamu</translation>
 <translation id="8908294717014659003">Membenarkan anda menetapkan sama ada laman web dibenarkan untuk mendapatkan akses kepada peranti tangkapan media. Akses kepada peranti tangkapan media boleh dibenarkan secara lalai atau pengguna boleh ditanya setiap kali laman web ingin mendapatkan akses kepada peranti tangkapan media.
 
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index d2083349..ba3d4d8 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -2881,10 +2881,6 @@
 
       Als dit beleid niet is ingesteld of is ingesteld op 'False', wordt <ph name="TLS_FALSE_START" /> ingeschakeld. Als dit beleid is ingesteld op 'True', wordt <ph name="TLS_FALSE_START" /> uitgeschakeld.</translation>
 <translation id="7433714841194914373">Instant inschakelen</translation>
-<translation id="7443061725198440541">Als dit beleid niet is ingesteld of ingeschakeld, kan de gebruiker de spellingcontrole gebruiken.
-
-      Als dit beleid is uitgeschakeld, kan de gebruiker de spellingcontrole niet gebruiken. Het beleid SpellcheckLanguage wordt ook genegeerd wanneer dit beleid is uitgeschakeld.
-      </translation>
 <translation id="7443616896860707393">Prompts voor algemene HTTP-authenticatie met verschillende herkomst</translation>
 <translation id="7458437477941640506">Herstel de doelversie niet als de OS-versie nieuwer is dan de doelversie. Updates zijn ook uitgeschakeld.</translation>
 <translation id="7464991223784276288">Cookies van overeenkomende URL's beperken tot de huidige sessie</translation>
@@ -3462,15 +3458,6 @@
 <translation id="8870318296973696995">Homepage</translation>
 <translation id="8876188741456358123">Hiermee overschrijf je de standaardmodus voor dubbelzijdig afdrukken. Als de modus niet beschikbaar is, wordt dit beleid genegeerd.</translation>
 <translation id="8882006618241293596">De <ph name="FLASH_PLUGIN_NAME" />-plug-in blokkeren op deze sites</translation>
-<translation id="890403179930035128">De spellingcontrole van talen wordt afgedwongen. Niet-herkende talen in de lijst worden genegeerd.
-
-      Als je dit beleid inschakelt, wordt de spellingcontrole ingeschakeld voor de opgegeven talen, naast de talen waarvoor de gebruiker de spellingcontrole heeft ingeschakeld.
-
-      Als je dit beleid niet instelt of uitschakelt, worden de voorkeuren van de gebruiker met betrekking tot de spellingcontrole niet gewijzigd.
-
-      Als het beleid SpellcheckEnabled niet is ingeschakeld, heeft het beleid geen effect.
-
-      De volgende talen worden momenteel ondersteund: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Gastmodus inschakelen</translation>
 <translation id="8908294717014659003">Hiermee kun je instellen of websites toegang mogen krijgen tot media-opnameapparaten. Toegang tot media-opnameapparaten kan standaard worden toegestaan of de gebruiker kan elke keer om toestemming worden gevraagd wanneer een website toegang wil hebben tot media-opnameapparaten.
 
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb
index f37a794..a471bda 100644
--- a/components/policy/resources/policy_templates_no.xtb
+++ b/components/policy/resources/policy_templates_no.xtb
@@ -421,6 +421,7 @@
       Hvis denne innstillingen er slått på, registrerer tjenesten for passordbeskyttelse fingeravtrykkene til passord på disse nettadressene. Dette gjøres for å oppdage om de samme passordene også blir brukt andre steder.
       Hvis denne innstillingen er slått av eller ikke er angitt, registrerer tjenesten for passordbeskyttelse bare fingeravtrykkene til passord på https://accounts.google.com.
       Denne regelen er bare tilgjengelig på Windows-forekomster som er tilknyttet <ph name="MS_AD_NAME" />-domener, eller Windows 10 Pro- eller Enterprise-forekomster som er registrert for enhetsadministrering.</translation>
+<translation id="1919802376548418720">Bruk KDC-regel til å delegere legitimasjon.</translation>
 <translation id="1920046221095339924">Tillat administrerte økter på enheten</translation>
 <translation id="1929709556673267855">Gir konfigurasjoner for bedriftsskrivere som er bundet til enheter.
 
@@ -577,6 +578,15 @@
 <translation id="2231817271680715693">Importér nettleserlogg fra standard nettleser ved første kjøring</translation>
 <translation id="2236488539271255289">Ikke la noen nettsteder angi lokale data</translation>
 <translation id="2240879329269430151">Gjør at du kan angi om nettsteder tillates å vise forgrunnsvinduer. Visning av forgrunnsvinduer kan enten tillates for alle nettsteder, eller nektes for alle nettsteder. Hvis denne retningslinjen ikke angis, brukes BlockPopups, og brukeren har mulighet til å endre på dette.</translation>
+<translation id="2265214338421787313">Denne regelen lar administratorer angi at sider kan vise forgrunnsvinduer mens de lastes ut.
+
+      Når regelen er satt til «enabled» (aktivert), kan sider vise forgrunnsvinduer mens de lastes ut.
+
+      Når regelen er satt til «disabled» (deaktivert) eller ikke er angitt, kan sider ikke vise forgrunnsvinduer mens de lastes ut, i tråd med spesifikasjonen (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name).
+
+      Denne regelen fjernes i Chrome 82.
+
+      Se https://www.chromestatus.com/feature/5989473649164288 .</translation>
 <translation id="2269319728625047531">Aktiver visning av samtykke for synkronisering under påloggingen</translation>
 <translation id="2274864612594831715">Denne innstillingen konfigurerer aktiveringen av det virtuelle tastaturet som en inndataenhet på Chrome OS. Brukerne kan ikke overstyre denne innstillingen.
 
@@ -2191,6 +2201,7 @@
 <translation id="602728333950205286">Umiddelbar nettadresse for standard søkeleverandør</translation>
 <translation id="603410445099326293">Parametere for forslagsnettadressser som bruker POST</translation>
 <translation id="6034341625190551415">Kontrollerer typer kioskkontoer og offentlige økter.</translation>
+<translation id="6034603289689965535">Tillater sider å vise forgrunnsvinduer mens de lastes ut</translation>
 <translation id="6036523166753287175">Muliggjør kryssing av brannmur fra ekstern tilgangsvert</translation>
 <translation id="6070667616071269965">Tastaturoppsett for påloggingsskjermen på enheten</translation>
 <translation id="6074963268421707432">Ikke tillat noen nettsteder å vise skrivebordsvarsler</translation>
@@ -2848,10 +2859,6 @@
 
       Hvis du ikke spesifiserer denne regelen, eller hvis du setter den til false (usann), slås <ph name="TLS_FALSE_START" /> på. Hvis du setter den til true (sann), slås <ph name="TLS_FALSE_START" /> av.</translation>
 <translation id="7433714841194914373">Aktiver Instant</translation>
-<translation id="7443061725198440541">Hvis regelen ikke er spesifisert eller slått på, kan brukeren bruke stavekontroll.
-
-      Hvis regelen er slått av, kan ikke brukeren bruke stavekontroll. SpellcheckLanguage-regelen ignoreres også når denne regelen er slått av.
-      </translation>
 <translation id="7443616896860707393">Opphavsuavhengig HTTP Basic Auth-forespørsler</translation>
 <translation id="7458437477941640506">Ikke utfør rollback til målversjonen hvis OS-versjonen er nyere. Oppdateringer er også slått av.</translation>
 <translation id="7464991223784276288">Begrens informasjonkapsler fra samsvarende nettadresser til den gjeldende økten</translation>
@@ -3441,15 +3448,6 @@
 <translation id="8870318296973696995">Startside</translation>
 <translation id="8876188741456358123">Overstyrer tosidig utskrift som standard. Hvis tosidig utskrift ikke er tilgjengelig, ignoreres regelen.</translation>
 <translation id="8882006618241293596">Blokkér <ph name="FLASH_PLUGIN_NAME" />-programtillegget på disse nettstedene</translation>
-<translation id="890403179930035128">Tvinger aktivering av språk med stavekontroll. Språk som ikke gjenkjennes i listen, blir ignorert.
-
-      Hvis du aktiverer denne regelen, aktiveres stavekontroll for de spesifiserte språkene, i tillegg til språkene brukeren har aktivert stavekontroll for.
-
-      Hvis du ikke spesifiserer denne regelen, eller hvis du deaktiverer den, blir det ingen endring av brukerens innstillinger for stavekontroll.
-
-      Hvis SpellcheckEnabled-regelen er satt til «deaktivert», har denne regelen ingen effekt.
-
-      Språkene som støttes foreløpig, er: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Aktiver gjestemodus</translation>
 <translation id="8908294717014659003">Lar deg angi om nettsteder skal gis tillatelse til å bruke digitaliseringsenhetene dine. Bruk av digitaliseringsenheter kan tillates som standard, eller angis slik at brukeren blir spurt om tillatelse hver gang et nettsted ønsker å bruke slike enheter.
 
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb
index d010542..7d026c1 100644
--- a/components/policy/resources/policy_templates_pl.xtb
+++ b/components/policy/resources/policy_templates_pl.xtb
@@ -2802,10 +2802,6 @@
 
       Jeśli ta zasada jest nieskonfigurowana lub jest wyłączona, to <ph name="TLS_FALSE_START" /> będzie włączone. Jeśli jest włączona, <ph name="TLS_FALSE_START" /> będzie wyłączone.</translation>
 <translation id="7433714841194914373">Włącz wyszukiwanie dynamiczne</translation>
-<translation id="7443061725198440541">Jeśli ta zasada jest nieskonfigurowana lub włączona, użytkownik może korzystać ze sprawdzania pisowni.
-
-      Jeśli ta zasada jest wyłączona, użytkownik nie może korzystać ze sprawdzania pisowni. Po jej wyłączeniu jest też ignorowana zasada SpellcheckLanguage.
-      </translation>
 <translation id="7443616896860707393">Monity o podstawowe uwierzytelnienie HTTP pochodzące z innych witryn</translation>
 <translation id="7458437477941640506">Nie cofaj do docelowej wersji systemu operacyjnego, jeśli zainstalowana jest wersja nowsza niż docelowa. Aktualizacje też są wyłączone.</translation>
 <translation id="7464991223784276288">Ogranicz pliki cookie z odpowiednich adresów URL tylko do bieżącej sesji</translation>
@@ -3392,15 +3388,6 @@
 <translation id="8870318296973696995">Strona główna</translation>
 <translation id="8876188741456358123">Zastępuje domyślny tryb drukowania dwustronnego. Jeśli tryb jest niedostępny, zasada jest ignorowana.</translation>
 <translation id="8882006618241293596">Blokuj uruchamianie wtyczki <ph name="FLASH_PLUGIN_NAME" /> w tych witrynach</translation>
-<translation id="890403179930035128">Wymusza włączenie sprawdzania pisowni. Nierozpoznane języki z tej listy będą ignorowane.
-
-      Jeśli ta zasada jest włączona, sprawdzanie pisowni będzie dostępne także dla wskazanych języków, a nie tylko dla tych, dla których funkcję tę włączył użytkownik.
-
-      Jeśli ta zasada jest nieskonfigurowana lub wyłączona, ustawienia użytkownika dotyczące sprawdzania pisowni nie zmieniają się.
-
-      Jeśli zasada SpellcheckEnabled jest wyłączona, ta zasada nie ma żadnego wpływu na ustawienia.
-
-      Obecnie obsługiwane języki: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Włącz tryb gościa</translation>
 <translation id="8908294717014659003">Pozwala określić, czy strony mogą korzystać z urządzeń do rejestrowania multimediów. Dostęp do tych urządzeń może być dozwolony domyślnie lub użytkownik może być pytany za każdym razem, gdy strona chce użyć urządzenia do rejestrowania multimediów.
 
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index 84e0ade..cf5a18ab 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -2796,10 +2796,6 @@
 
       Se a política não for configurada ou se for definida como "false", <ph name="TLS_FALSE_START" /> será ativada. Se for definida como "true", <ph name="TLS_FALSE_START" /> será desativada.</translation>
 <translation id="7433714841194914373">Ativar o Instant</translation>
-<translation id="7443061725198440541">Se esta política não for definida ou ativada, o usuário poderá usar a correção ortográfica.
-
-      Se esta política for desativada, o usuário não poderá usar a correção ortográfica. A política SpellcheckLanguage também será ignorada quando esta política for desativada.
-      </translation>
 <translation id="7443616896860707393">Solicitações básicas de autorização HTTPS de múltiplas origens</translation>
 <translation id="7458437477941640506">Não faça a reversão para a versão de destino se a versão do SO for mais recente que a de destino. As atualizações também estão desativadas.</translation>
 <translation id="7464991223784276288">Limita cookies de URLs correspondentes à sessão atual</translation>
@@ -3378,15 +3374,6 @@
 <translation id="8870318296973696995">Página inicial</translation>
 <translation id="8876188741456358123">Modifica o modo duplex de impressão padrão. Se o modo não estiver disponível, esta política será ignorada.</translation>
 <translation id="8882006618241293596">Bloquear o plug-in <ph name="FLASH_PLUGIN_NAME" /> nestes sites</translation>
-<translation id="890403179930035128">Força a ativação da correção ortográfica de idiomas. Idiomas não reconhecidos nessa lista serão ignorados.
-
-      Se você ativar esta política, a correção ortográfica será ativada para os idiomas especificados, além dos idiomas para os quais o usuário ativou a correção ortográfica.
-
-      Se você não configurar esta política ou se desativá-la, não haverá alterações nas preferências de correção ortográfica do usuário.
-
-      Se a política SpellcheckEnabled for desativada, esta política não terá efeito.
-
-      Os idiomas compatíveis no momento são: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Ativa o modo visitante</translation>
 <translation id="8908294717014659003">Permite definir se os sites podem ter acesso a dispositivos de captura de mídia. O acesso a dispositivos de captura de mídia pode ser permitido por padrão, ou uma pergunta será feita ao usuário cada vez que um site quiser ter acesso a dispositivos de captura de mídia.
 
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb
index 9146b1b..29279ee 100644
--- a/components/policy/resources/policy_templates_pt-PT.xtb
+++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -2812,10 +2812,6 @@
 
       Se a política não for definida ou for definida como falsa, o <ph name="TLS_FALSE_START" /> fica ativado. Se for definida como verdadeira, o <ph name="TLS_FALSE_START" /> fica desativado.</translation>
 <translation id="7433714841194914373">Ativar Instantâneo</translation>
-<translation id="7443061725198440541">Se esta política não estiver definida ou estiver ativada, o utilizador tem autorização para utilizar a verificação ortográfica.
-
-      Se esta política estiver desativada, o utilizador não tem autorização para utilizar a verificação ortográfica. Quando esta política está desativada, a política SpellcheckLanguage também é ignorada.
-      </translation>
 <translation id="7443616896860707393">Mensagens de Autorização Básica de HTTP de origem cruzada</translation>
 <translation id="7458437477941640506">Não reverta para a versão de destino se a versão do SO for mais recente do que a do destino. As atualizações também estão desativadas.</translation>
 <translation id="7464991223784276288">Limitar os cookies dos URLs correspondentes à sessão atual.</translation>
@@ -3396,15 +3392,6 @@
 <translation id="8870318296973696995">Página inicial</translation>
 <translation id="8876188741456358123">Substitui o modo de impressão duplex padrão. Se o modo não estiver disponível, esta política é ignorada.</translation>
 <translation id="8882006618241293596">Bloquear o plug-in <ph name="FLASH_PLUGIN_NAME" /> nestes sites</translation>
-<translation id="890403179930035128">Força a ativação de idiomas com verificação ortográfica. Os idiomas não reconhecidos dessa lista são ignorados.
-
-      Se ativar esta política, a verificação ortográfica é ativada para os idiomas especificados, além dos idiomas para os quais o utilizador tenha ativado a verificação ortográfica.
-
-      Se não definir ou se desativar esta política, não há qualquer alteração às preferências de verificação ortográfica do utilizador.
-
-      Se a política SpellcheckEnabled estiver desativada, esta política não tem qualquer efeito.
-
-      Atualmente, os idiomas suportados são: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Ativar o modo de convidado</translation>
 <translation id="8908294717014659003">Permite-lhe definir se os Sites podem aceder a dispositivos de captura de multimédia. O acesso a dispositivos de captura de multimédia pode ser autorizado por predefinição ou o utilizador pode ser consultado sempre que um Website pretenda obter acesso a dispositivos de captura de multimédia.
 
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb
index 4e18d2052..7796c71 100644
--- a/components/policy/resources/policy_templates_ro.xtb
+++ b/components/policy/resources/policy_templates_ro.xtb
@@ -2809,10 +2809,6 @@
 
       Dacă politica nu este configurată sau este dezactivată, optimizarea <ph name="TLS_FALSE_START" /> va fi activată. Dacă politica este activată, optimizarea <ph name="TLS_FALSE_START" /> va fi dezactivată.</translation>
 <translation id="7433714841194914373">Activează Instant</translation>
-<translation id="7443061725198440541">Dacă politica nu este configurată sau activată, utilizatorului i se permite să folosească verificarea ortografică.
-
-      Dacă politica este dezactivată, utilizatorului nu i se permite să folosească verificarea ortografică. De asemenea, politica SpellcheckLanguage va fi ignorată când această politică este dezactivată.
-      </translation>
 <translation id="7443616896860707393">Mesaje de solicitare pentru autentificarea HTTP de bază indiferent de sursă</translation>
 <translation id="7458437477941640506">Nu reveni la versiunea țintă dacă versiunea SO este mai nouă decât ținta. Actualizările sunt, de asemenea, dezactivate.</translation>
 <translation id="7464991223784276288">Limitează cookie-urile de la adresele URL corespunzătoare la sesiunea curentă</translation>
@@ -3386,15 +3382,6 @@
 <translation id="8870318296973696995">Pagina de pornire</translation>
 <translation id="8876188741456358123">Modifică modul duplex prestabilit pentru printare. Dacă modul nu este disponibil, această politică este ignorată.</translation>
 <translation id="8882006618241293596">Blochează plunginul <ph name="FLASH_PLUGIN_NAME" /> pe aceste site-uri</translation>
-<translation id="890403179930035128">Forțează activarea verificării ortografice pentru limbi. Limbile nerecunoscute din listă vor fi ignorate.
-
-      Dacă activezi această politică, verificarea ortografică va fi activată pentru limbile specificate, pe lângă limbile pentru care utilizatorul a activat verificarea ortografică.
-
-     Dacă nu setezi această politică sau dacă o dezactivezi, nu vor exista modificări în preferințele utilizatorului privind verificarea ortografică.
-
-      Dacă politica SpellcheckEnabled este dezactivată, aceasta nu va avea niciun efect.
-
-      Limbile acceptate în prezent sunt: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-RU, en-SUA, es, es-419, es-AR, es-ES, es-MX, es-SUA, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Activați modul pentru invitați</translation>
 <translation id="8908294717014659003">Vă permite să stabiliți dacă site-urile web au acces la dispozitivele de captură media. Accesul la dispozitivele de captură media poate fi permis în mod prestabilit sau se poate solicita confirmarea utilizatorului de fiecare dată când un site web dorește acces la dispozitivele de captură media.
 
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 920b60d8..2dcbbe4 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -117,7 +117,7 @@
 
       Если в элементах списка нет переменной ${url}, URL появится в конце командной строки.
 
-      Переменные среды расширены. В Windows значение переменной среды ABC передается символом %ABC%.</translation>
+      Переменные среды расширены. В Windows в название переменной среды %ABC% подставляется ее значение ABC.</translation>
 <translation id="1151353063931113432">Разрешить показ изображений на этих сайтах</translation>
 <translation id="1152117524387175066">Сообщать о состоянии переключателя dev при начальной загрузке устройства.
 
@@ -183,7 +183,7 @@
 <translation id="1363612796557848469">Это правило разрешает Google Ассистенту просматривать данные на экране и отправлять их на сервер Google.
       Если правило включено, Google Ассистент сможет просматривать данные на экране устройства.
       Если правило отключено, Google Ассистент не сможет просматривать данные на экране.
-      Если правило не настроено, пользователи самостоятельно выбирают, разрешать ли Google Ассистенту просматривать данные на экране.</translation>
+      Если правило не настроено, пользователи самостоятельно выбирают, разрешать ли Google Ассистенту просматривать данные на экране или нет.</translation>
 <translation id="1383493480903114193">Это правило принудительно запускает сетевой код в процессе браузера.
 
       По умолчанию правило отключено. Если оно включено, безопасность пользователей оказывается под угрозой, как только сетевой процесс запускается в изолированной среде.
@@ -291,8 +291,8 @@
 <translation id="1599424828227887013">Включить изоляцию для определенных сайтов на устройствах Android</translation>
 <translation id="1608259529294767544">Это правило позволяет включать Google Ассистента с помощью голосовых команд.
 
-      Если правило включено, функция голосовой активации Google Ассистента будет работать.
-      Если правило выключено, функция голосовой активации Google Ассистента работать не будет.
+      Если правило включено, Google Ассистент будет распознавать голосовую активацию.
+      Если правило выключено, Google Ассистент не будет распознавать голосовую активацию.
       Если правило не настроено, пользователи самостоятельно выбирают, включать голосовую активацию Google Ассистента или нет.
       </translation>
 <translation id="1608755754295374538">URL, которым доступ к аудиозаписывающим устройствам предоставляется без запроса</translation>
@@ -1441,7 +1441,7 @@
 
 
           Данная политика действует только в случае, если включена политика 'DefaultSearchProviderEnabled'.</translation>
-<translation id="427706009709857238">"Разрешить активацию Google Ассистента по голосовой команде"</translation>
+<translation id="427706009709857238">"Разрешить Google Ассистенту распознавать голосовую активацию"</translation>
 <translation id="4285674129118156176">Разрешение неаффилированным пользователям запускать ARC</translation>
 <translation id="4298509794364745131">Определяет список приложений для заметок, которые могут работать на заблокированном экране <ph name="PRODUCT_OS_NAME" />.
 
@@ -2799,10 +2799,6 @@
 
       Если вы укажете значение False или не станете настраивать правило, то использование <ph name="TLS_FALSE_START" /> будет разрешено. Если вы укажете значение True, использование <ph name="TLS_FALSE_START" /> будет запрещено.</translation>
 <translation id="7433714841194914373">Включить Живой поиск</translation>
-<translation id="7443061725198440541">Если правило не настроено или включено, пользователь может выполнять проверку правописания.
-
-      Если правило отключено, проверка правописания недоступна, а правило SpellcheckLanguage игнорируется.
-      </translation>
 <translation id="7443616896860707393">Встречные запросы базовой аутентификации HTTP</translation>
 <translation id="7458437477941640506">Не выполнять откат к целевой версии, если на устройстве уже установлена более поздняя версия OC (обновления также будут отключены)</translation>
 <translation id="7464991223784276288">Файлы cookie, сохраненные сайтами с URL из списка, удаляются после окончания сеанса</translation>
@@ -2824,10 +2820,10 @@
           Если для правила задано значение, яркость экрана будет устанавливаться исходя из него. Пользователь сможет изменить эти настройки позже. Функция адаптивной яркости будет отключена.
           Если значение не задано, пользовательские настройки экрана и функция адаптивной яркости не будут изменены.
           Значение яркости устанавливается в процентах, в диапазоне от 0 до 100.</translation>
-<translation id="7517846421386644905">Позволяет администратору выбрать, будут ли данные телеметрии и диагностики собираться, обрабатываться и передаваться в Wilco DTC (контролер телеметрии и диагностики Wilco).
+<translation id="7517846421386644905">Позволяет администратору выбрать, будут ли данные телеметрии и диагностики собираться, обрабатываться и передаваться Wilco DTC (контроллер телеметрии и диагностики Wilco).
 
-      Если правило не настроено или для него задано значение false, данные c устройства не будут собираться, обрабатываться и передаваться в DTC.
-      Если на устройстве есть ПО Wilco DTC и для правила задано значение true, данные с устройства будут собираться, обрабатываться и передаваться в DTC.</translation>
+      Если правило не настроено или для него задано значение false, данные c устройства не будут собираться, обрабатываться и передаваться DTC.
+      Если на устройстве есть Wilco DTC и для правила задано значение true, данные с устройства будут собираться, обрабатываться и передаваться DTC.</translation>
 <translation id="7519251620064708155">Разрешить этим сайтам создавать ключи</translation>
 <translation id="7529100000224450960">Задает список шаблонов URL для сайтов, которым разрешено показывать всплывающие окна. Если это правило не настроено, для всех сайтов используется глобальное значение по умолчанию на основе правила DefaultPopupsSetting (если оно настроено, в противном случае – на основе пользовательской конфигурации).</translation>
 <translation id="7529144158022474049">Максимальная задержка автообновления</translation>
@@ -3385,15 +3381,6 @@
 <translation id="8870318296973696995">Главная страница</translation>
 <translation id="8876188741456358123">Переопределяет двустороннюю печать по умолчанию. Если этот режим недоступен, правило не действует.</translation>
 <translation id="8882006618241293596">Заблокировать плагин <ph name="FLASH_PLUGIN_NAME" /> на этих сайтах</translation>
-<translation id="890403179930035128">Позволяет указать языки, для которых нужно включить принудительную проверку правописания. Неподдерживаемые языки будут игнорироваться.
-
-      Если вы включите правило, проверка правописания будет выполняться для языков, выбранных и пользователем, и вами.
-
-      Если вы не станете настраивать правило или отключите его, то заданные пользователем настройки правописания не изменятся.
-
-      SpellcheckLanguage не работает, когда отключено правило SpellcheckEnabled.
-
-      Поддерживаются следующие языки: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Включить гостевой режим</translation>
 <translation id="8908294717014659003">Позволяет указать, разрешен ли сайтам доступ к записывающим устройствам. Вы можете разрешить доступ по умолчанию либо задать настройки, при которых каждый раз, когда сайт пытается использовать камеру или микрофон, будет отображаться запрос.
 
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb
index 0ef83f2d..0a43032 100644
--- a/components/policy/resources/policy_templates_sk.xtb
+++ b/components/policy/resources/policy_templates_sk.xtb
@@ -2873,10 +2873,6 @@
 
       Ak toto pravidlo nenastavíte alebo nastavíte na hodnotu False, bude povolená funkcia <ph name="TLS_FALSE_START" />. Ak ho nastavíte na hodnotu True, funkcia <ph name="TLS_FALSE_START" /> bude zakázaná.</translation>
 <translation id="7433714841194914373">Povoliť Dynamické vyhľadávanie</translation>
-<translation id="7443061725198440541">Ak toto pravidlo povolíte alebo nenastavíte, používateľ bude môcť používať kontrolu pravopisu.
-
-      Ak toto pravidlo zakážete, používateľ kontrolu pravopisu nebude môcť používať. Pravidlo SpellcheckLanguage sa bude tiež ignorovať, keď toto pravidlo zakážete.
-      </translation>
 <translation id="7443616896860707393">Požiadavky typu cross-origin štandardu HTTP Basic Auth</translation>
 <translation id="7458437477941640506">Nevracajte sa späť na cieľovú verziu, ak je verzia operačného systému novšia ako cieľová. Vypnuté sú aj aktualizácie.</translation>
 <translation id="7464991223784276288">Obmedzenie súborov cookie zo zodpovedajúcich webových adries na aktuálnu reláciu</translation>
@@ -3466,15 +3462,6 @@
 <translation id="8870318296973696995">Domovská stránka</translation>
 <translation id="8876188741456358123">Prepíše predvolený režim obojstrannej tlače. Ak daný režim nie je k dispozícii, toto pravidlo je ignorované.</translation>
 <translation id="8882006618241293596">Blokovať doplnok <ph name="FLASH_PLUGIN_NAME" /> na týchto weboch</translation>
-<translation id="890403179930035128">Vynucuje povolenie jazykov kontroly pravopisu. Nerozpoznané jazyky sa budú v danom zozname ignorovať.
-
-      Ak toto pravidlo povolíte, kontrola pravopisu sa povolí nielen pre jazyky, ktoré nastavil používateľ, ale aj pre tieto špecifikované jazyky.
-
-      Ak toto pravidlo zakážete alebo ho nenastavíte, predvoľby kontroly pravopisu používateľa sa nezmenia.
-
-      Ak je zakázané pravidlo SpellcheckEnabled, toto pravidlo nebude účinné.
-
-      Momentálne podporované jazyky: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Povoliť režim hosťa</translation>
 <translation id="8908294717014659003">Umožňuje nastaviť, či webové stránky budú môcť používať zariadenia na zaznamenávanie médií. Prístup k zariadeniam na zaznamenávanie médií môže byť povolený v predvolenom nastavení alebo sa používateľovi môže zobraziť dopyt zakaždým, keď nejaké webové stránky budú chcieť použiť zariadenie na zaznamenávanie médií.
 
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb
index 2431844..0c6f004 100644
--- a/components/policy/resources/policy_templates_sl.xtb
+++ b/components/policy/resources/policy_templates_sl.xtb
@@ -2907,10 +2907,6 @@
 
       Če ta pravilnik ni nastavljen ali je onemogočen, je funkcija <ph name="TLS_FALSE_START" /> omogočena. Če je omogočen, je funkcija <ph name="TLS_FALSE_START" /> onemogočena.</translation>
 <translation id="7433714841194914373">Omogoči Dinamično iskanje</translation>
-<translation id="7443061725198440541">Če ta pravilnik ni nastavljen ali omogočen, uporabnik lahko uporablja preverjanje črkovanja.
-
-      Če je ta pravilnik onemogočen, uporabnik ne more uporabljati preverjanja črkovanja. Pri tem je prezrt tudi pravilnik SpellcheckLanguage.
-      </translation>
 <translation id="7443616896860707393">Ukazni pozivi HTTP Basic Auth iz več izvorov</translation>
 <translation id="7458437477941640506">Brez povrnitve na ciljno različico, če je različica operacijskega sistema novejša kot ciljna. Onemogočene so tudi posodobitve.</translation>
 <translation id="7464991223784276288">Omejitev piškotkov z ujemajočih se URL-jev na trenutno sejo</translation>
@@ -3513,15 +3509,6 @@
 <translation id="8870318296973696995">Domača stran</translation>
 <translation id="8876188741456358123">Preglasi privzeti način obojestranskega tiskanja. Če način ni na voljo, je ta pravilnik prezrt.</translation>
 <translation id="8882006618241293596">Blokiraj vtičnik <ph name="FLASH_PLUGIN_NAME" /> na teh spletnih mestih</translation>
-<translation id="890403179930035128">Vsili preverjanja črkovanja jezikov. Neprepoznani jeziki na tem seznamu so prezrti.
-
-      Če omogočite ta pravilnik, je preverjanje črkovanja omogočeno za navedene jezike poleg jezikov, za katere je uporabnik omogočil preverjanje črkovanja.
-
-      Če ne nastavite tega pravilnika ali ga onemogočite, ni sprememb uporabnikovih nastavitev preverjanja črkovanja.
-
-      Če je pravilnik SpellcheckEnabled onemogočen, ta pravilnik nima učinka.
-
-      Za zdaj so podprti ti jeziki: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Omogoči način gosta</translation>
 <translation id="8908294717014659003">Omogoča nastavitev, ali je spletnim mestom dovoljen dostop do naprav za snemanje predstavnosti. Dostop do naprav za snemanje predstavnosti je lahko privzeto dovoljen ali pa uporabnik dobi poziv, kadar koli spletno mesto želi dostop do naprav za snemanje predstavnosti.
 
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb
index 1fed433..155de0c 100644
--- a/components/policy/resources/policy_templates_sr.xtb
+++ b/components/policy/resources/policy_templates_sr.xtb
@@ -2898,10 +2898,6 @@
 
       Ако не подесите ове смернице или их подесите на Нетачно, функција <ph name="TLS_FALSE_START" /> ће бити омогућена. Ако подесите смернице на Тачно, функција <ph name="TLS_FALSE_START" /> ће бити онемогућена.</translation>
 <translation id="7433714841194914373">Омогући Инстант</translation>
-<translation id="7443061725198440541">Ако не подесите ове смернице или их омогућите, корисник ће моћи да користи проверу правописа.
-
-      Ако онемогућите ове смернице, корисник неће моћи да користи проверу правописа. Смернице SpellcheckLanguage ће такође бити игнорисане када се ове смернице онемогуће.
-      </translation>
 <translation id="7443616896860707393">Cross-origin HTTP Basic Auth упити</translation>
 <translation id="7458437477941640506">Не враћај на циљану верзију ако је верзија ОС-а новија од циљне. И ажурирања су онемогућена.</translation>
 <translation id="7464991223784276288">Онемогућавају упоређивање URL-ова са тренутном сесијом које обављају колачићи</translation>
@@ -3517,15 +3513,6 @@
 <translation id="8870318296973696995">Почетна страница</translation>
 <translation id="8876188741456358123">Замењују подразумевани режим обостраног штампања. Ако режим није доступан, ове смернице се занемарују.</translation>
 <translation id="8882006618241293596">Блокира додатну компоненту <ph name="FLASH_PLUGIN_NAME" /> на овим сајтовима</translation>
-<translation id="890403179930035128">Принудно омогућавају језике за проверу правописа. Непознати језици са те листе ће бити игнорисани.
-
-      Ако омогућите ове смернице, провера правописа ће бити омогућена за наведене језике поред језика за које је корисник омогућио проверу правописа.
-
-      Ако не подесите ове смернице или их онемогућите, корисникова подешавања провере правописа се неће променити.
-
-      Ако онемогућите смернице SpellcheckEnabled, ове смернице неће имати никакав ефекат.
-
-      Тренутно подржани језици су: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Омогућавање режима госта</translation>
 <translation id="8908294717014659003">Дозвољава вам да подесите да ли веб-сајтови могу да приступају медијским уређајима за снимање. Приступ медијским уређајима за снимање може да буде подразумевано омогућен или можемо да поставимо питање кориснику сваки пут када веб-сајт жели да приступи медијским уређајима за снимање.
 
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb
index 74537fc1..6fa7ff33 100644
--- a/components/policy/resources/policy_templates_sv.xtb
+++ b/components/policy/resources/policy_templates_sv.xtb
@@ -438,6 +438,7 @@
       Om den här inställningen är aktiverad registrerar tjänsten för lösenordsskydd fingeravtryck för lösenord på dessa webbadresser för att identifiera återanvändning av lösenord.
       Om inställningen är inaktiverad eller inte inställd registrerar tjänsten för lösenordsskydd bara fingeravtryck för lösenord på https://accounts.google.com.
       Den här principen är bara tillgänglig i Windows-instanser som är kopplade till en <ph name="MS_AD_NAME" />-domän, eller i Windows 10 Pro- eller Enterprise-instanser som är registrerade i enhetshantering.</translation>
+<translation id="1919802376548418720">Använd KDC-princip för att delegera uppgifter.</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.
 
@@ -596,6 +597,15 @@
 <translation id="2240879329269430151">Gör att du kan ange om webbplatser får visa popup-fönster. Du kan tillåta popup-fönster för alla webbplatser eller blockera popup-fönster för alla webbplatser.
 
           Om du inte anger policyn används BlockPopups och inställningen kan ändras av användaren.</translation>
+<translation id="2265214338421787313">Med den här principen kan administratören ange att en sida får visa popupfönster när den tas bort.
+
+      När principen är aktiverad får sidor visa popupfönster när de tas bort.
+
+      När principen är inaktiverad eller inte har angetts får sidor inte visa popupfönster när de tas bort, enligt specifikationen (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name).
+
+      Den här principen tas bort i Chrome 82.
+
+      Se https://www.chromestatus.com/feature/5989473649164288 .</translation>
 <translation id="2269319728625047531">Aktivera visning av samtycke till synkronisering vid inloggning</translation>
 <translation id="2274864612594831715">Denna policy konfigurerar aktiveringen av det virtuella tangentbordet som en inmatningsenhet i Chrome OS. Användare kan inte åsidosätta denna policy.
 
@@ -2231,6 +2241,7 @@
 <translation id="602728333950205286">Dynamisk webbadress för standardsökleverantör</translation>
 <translation id="603410445099326293">Parametrar för föreslagen webbadress som använder POST</translation>
 <translation id="6034341625190551415">Styr offentliga sessioner och konton för offentlig miljö.</translation>
+<translation id="6034603289689965535">Tillåter att en sida visar popup-fönster när den tas bort</translation>
 <translation id="6036523166753287175">Aktivera brandväggspassage från fjärråtkomstsvärd</translation>
 <translation id="6070667616071269965">Tangentbordslayouter för enhetens inloggningsskärm</translation>
 <translation id="6074963268421707432">Tillåt inte att någon webbplats visar aviseringar på skrivbordet</translation>
@@ -2897,10 +2908,6 @@
 
       Om principen inte har konfigurerats eller har ställts in på falskt aktiveras f<ph name="TLS_FALSE_START" />. Om principen har ställts in på sant inaktiveras <ph name="TLS_FALSE_START" />.</translation>
 <translation id="7433714841194914373">Aktivera Instant</translation>
-<translation id="7443061725198440541">Om den här principen har lämnats utan inställning eller aktiverats är stavningskontroll tillgänglig för användaren.
-
-      Om principen har inaktiverats är stavningskontroll inte tillgänglig för användaren. Dessutom ignoreras principen SpellcheckLanguage när den här principen har inaktiverats.
-      </translation>
 <translation id="7443616896860707393">Frågor vid korsursprungs-HTTP med basauktorisering</translation>
 <translation id="7458437477941640506">Återställ inte till målversionen om versionen av operativsystemet är nyare. Uppdateringar har även inaktiverats.</translation>
 <translation id="7464991223784276288">Begränsa cookies från matchande webbadresser till den aktuella sessionen</translation>
@@ -3504,15 +3511,6 @@
 <translation id="8870318296973696995">Startsida</translation>
 <translation id="8876188741456358123">Åsidosätter standardinställningen för dubbelsidig utskrift. Om alternativet inte är tillgängligt ignoreras principen.</translation>
 <translation id="8882006618241293596">Blockera pluginprogrammet för <ph name="FLASH_PLUGIN_NAME" /> på dessa webbplatser</translation>
-<translation id="890403179930035128">Aktivera alltid språk för stavningskontroll. Okända språk i listan ignoreras.
-
-      När principen är aktiverad aktiveras stavningskontroll på de angivna språken, utöver de språk som användaren har aktiverat stavningskontroll på.
-
-      Om principen lämnas utan inställning eller inaktiveras gäller användarens inställningar för stavningskontroll som de är.
-
-      Om principen SpellcheckEnabled har inaktiverats har den här principen ingen funktion.
-
-      För närvarande stöds följande språk: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Aktivera gästläge</translation>
 <translation id="8908294717014659003">Gör att du kan ange om webbplatser ska kunna komma åt medieenheter. Åtkomst till medieenheter kan tillåtas som standard eller så kan användaren få en fråga varje gång en webbplats vill komma åt dem.
 
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb
index 11a14c4..6887cae 100644
--- a/components/policy/resources/policy_templates_sw.xtb
+++ b/components/policy/resources/policy_templates_sw.xtb
@@ -2858,10 +2858,6 @@
 
       Sera hii isipowekwa, au ikiwekwa kuwa sivyo, basi kipengee cha <ph name="TLS_FALSE_START" /> kitawashwa. Ikiwekwa kuwa ndivyo, kipengee cha <ph name="TLS_FALSE_START" /> kitazimwa.</translation>
 <translation id="7433714841194914373">Wezesha Papo hapo</translation>
-<translation id="7443061725198440541">Kama sera hii haijawekwa au haijawashwa, mtumiaji anaruhsuiwa kutumia kikagua tahajia.
-
-      Kama sera hii imezimwa, mtumiaji haruhusiwi kutumia kikagua tahajia. Sera ya SpellcheckLanguage pia haitatumiwa wakati sera hii imezimwa.
-      </translation>
 <translation id="7443616896860707393">Vishtuo vya Cross-origin HTTP Basic Auth</translation>
 <translation id="7458437477941640506">Usirejee kwenye toleo lengwa ikiwa toleo la Mfumo wa Uendeshaji ni la hivi karibuni zaidi kuliko toleo lengwa. Masasisho pia huzimwa.</translation>
 <translation id="7464991223784276288">Dhibiti vidakuzi visilinganishe URL kwa kipindi cha sasa</translation>
@@ -3436,15 +3432,6 @@
 <translation id="8870318296973696995">Ukurasa wa Kwanza</translation>
 <translation id="8876188741456358123">Inabatilisha hali chaguomsingi ya kuchapisha kwenye pande mbili. Ikiwa hali haipatikani, sera hii haizingatiwi.</translation>
 <translation id="8882006618241293596">Zuia programu jalizi ya <ph name="FLASH_PLUGIN_NAME" /> kwenye tovuti hizi</translation>
-<translation id="890403179930035128">Lazimisha kuwasha kikagua tahajia cha lugha. Lugha ambazo hazitambuliki katika orodha hii hazitakaguliwa.
-
-      Kama utawasha sera hii, kikagua tahajia kitawashwa kwa lugha zilizobainishwa, mbali na lugha ambazo mtumiaji amewasha ukaguaji tahajia.  
-
-      Usipoweka sera hii au ukiizima, hakutakuwa na mabadiliko kwenye mapendeleo ya mtumiaji ya ukaguaji tahajia.
-
-      Kama sera ya SpellcheckEnabled imezimwa, sera hii haitakuwa na athari.
-
-   Lugha ambazo zinatumika kwa sasa: Kiafrikana, Kibulgaria, Kikatalani, Kicheki, Kiholanzi, Kigiriki, Kiingereza-Astralia, Kiingereza-Kanada, Kiingereza-Uingereza, Kiingereza-Marekani, Kihispanai, Kihispania-Marekani Kusini, Kihispania-Argentina, Kihispania-Uhispania, Kihispani-Meksiko, Kihispania-Marekani, Kiestonia, Kiajemi, Kifarosi, Kifaransa, Kiyahudi, Kihindi, Kikoreshia, Kihungari, Kiindonesia, Kiitaliano, Kikorea, Kiluksembagi, Kiflemil, Kibokmali cha Norwe, Kiholanzi, Kipolandi, Kireno cha Brazil, Kireno cha Ulaya, Kiromania, Kirusi, Kislovakia, Kislovenia, Kialbania, Kiserbia, Kiswidi, Kitamili, Kitajiki, Kiturukiri, Kiukreni, Kivietinamu.</translation>
 <translation id="8906768759089290519">Wezesha modi ya wageni</translation>
 <translation id="8908294717014659003">Inakuruhusu kuweka ikiwa tovuti zinaruhusiwa kufikia vifaa vya media vya kunasa. Ufikivu wa vifaa vya media vya kunasa unaweza kuruhusiwa kwa chaguomsingi, au mtumiaji anaweza kuulizwa kila wakati  tovuti inapotaka kufikia vifaa vya media vya kunasa.
 
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb
index c47d136d..f17a118e 100644
--- a/components/policy/resources/policy_templates_ta.xtb
+++ b/components/policy/resources/policy_templates_ta.xtb
@@ -411,6 +411,7 @@
       இந்த அமைப்பு இயக்கப்பட்டால், கடவுச்சொல் மீண்டும் பயன்படுத்தப்படுவதைக் கண்டறிவதற்காக இந்த URLகளில் கடவுச்சொல்லின் கைரேகையைக் கடவுச்சொல் பாதுகாப்புச் சேவை பதிவுசெய்யும்.
       இந்த அமைப்பு முடக்கப்பட்டிருந்தாலோ அமைக்கப்படவில்லை என்றாலோ, https://accounts.google.com பக்கத்தில் மட்டும் கடவுச்சொல் கைரேகையை கடவுச்சொல் பாதுகாப்புச் சேவை பதிவுசெய்யும்.
       <ph name="MS_AD_NAME" /> டொமைனுடன் இணைக்கப்பட்ட Windows நேர்வுகளின்போதும் சாதன நிர்வாகத்திற்காகப் பதிவுசெய்யப்பட்ட Windows 10 Pro அல்லது Enterprise நேர்வுகளின்போதும் மட்டுமே இந்தக் கொள்கை பயன்படுத்தப்படும்.</translation>
+<translation id="1919802376548418720">அனுமதிச் சான்றுகளைப் பகிர்ந்தளிக்க KDC கொள்கையைப் பயன்படுத்தும்.</translation>
 <translation id="1920046221095339924">சாதனத்தில், நிர்வகிக்கப்பட்ட அமர்வை அனுமதிக்கும்</translation>
 <translation id="1929709556673267855">சாதனங்களில் இணைக்கப்பட்டிருக்கும் நிறுவனப் பிரிண்டர்களுக்கு உள்ளமைவுகளை வழங்கும்.
 
@@ -568,6 +569,15 @@
 <translation id="2231817271680715693">முதல் இயக்கத்தின்போதே இயல்புநிலை உலாவலிருந்து உலாவல் வரலாற்றை இறக்குமதி செய்</translation>
 <translation id="2236488539271255289">அக தரவை அமைப்பதற்கு, எந்த தளத்தையும் அனுமதிக்க வேண்டாம்</translation>
 <translation id="2240879329269430151">பாப்-அப்களைக் காண்பிக்க வலைத் தளங்கள் அனுமதிக்கப்படுகின்றனவா என்பதை அமைக்க உங்களை அனுமதிக்கிறது. காண்பிக்கப்படும் பாப் அப்கள் எல்லா வலைத்தளங்களுக்கும் அனுமதிக்கப்படும் அல்லது எல்லா வலைத்தளங்களுக்கும் மறுக்கப்படும். இந்தக் கொள்கையை அமைக்காமல் விட்டால், 'BlockPopups' பயன்படுத்தப்படும், பயனர் அதை மாற்றலாம்.</translation>
+<translation id="2265214338421787313">ஒரு பக்கம் மூடப்படும்போது பாப் அப்களைக் காண்பிப்பதைக் குறிப்பிடுவதற்கு நிர்வாகிக்கு இந்தக் கொள்கை அனுமதியளிக்கிறது.
+
+      இந்தக் கொள்கை இயக்கப்படுவதற்கு அமைக்கப்பட்டால், பக்கங்கள் மூடப்படும்போது பாப் அப்களைக் காண்பிக்க அனுமதிக்கப்படும்.
+
+      இந்தக் கொள்கை முடக்கப்படுவதற்கு அமைக்கப்பட்டாலோ அமைக்காமலேயே விடப்பட்டாலோ, இந்தக் குறிப்பின்படி (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name) பக்கங்கள் மூடப்படும்போது பாப் அப்களைக் காண்பிக்க அனுமதிக்கப்படாது.
+
+      Chrome 82 இல் இந்தக் கொள்கை அகற்றப்படும்.
+
+      பார்க்கவும்: https://www.chromestatus.com/feature/5989473649164288 .</translation>
 <translation id="2269319728625047531">உள்நுழைவின் போது, ஒத்திசைவிற்கான ஒப்புதலைக் காட்டுவதை இயக்கும்</translation>
 <translation id="2274864612594831715">ChromeOS இல் விர்ச்சுவல் கீபோர்டை உள்ளீட்டுச் சாதனமாக இயக்குவதை இந்தக் கொள்கை உள்ளமைக்கிறது. பயனர்களால் இந்தக் கொள்கையில் மேலெழுத முடியாது.
 
@@ -2171,6 +2181,7 @@
 <translation id="602728333950205286">இயல்புநிலை தேடல் வழங்குநர் உடனடி URL</translation>
 <translation id="603410445099326293">POST ஐப் பயன்படுத்தும் பரிந்துரை URL க்கான அளவுருக்கள்</translation>
 <translation id="6034341625190551415">பொது அமர்வு மற்றும் கியாஸ்க் கணக்கு வகைகளைக் கட்டுப்படுத்தும்.</translation>
+<translation id="6034603289689965535">பக்கம் மூடப்படும்போது பாப் அப்களைக் காண்பிக்க அனுமதிக்கிறது</translation>
 <translation id="6036523166753287175">தொலைநிலை அணுகல் ஹோஸ்ட்டில் இருந்து கடந்துவர, ஃபயர்வாலைச் செயல்படுத்து</translation>
 <translation id="6070667616071269965">சாதன உள்நுழைவுத் திரையின் விசைப்பலகைத் தளவமைப்புகள்</translation>
 <translation id="6074963268421707432">டெஸ்க்டாப் அறிவிக்கைகளைக் காண்பிக்க எந்த தளத்தையும் அனுமதிக்காதே</translation>
@@ -2806,10 +2817,6 @@
 
       கொள்கை அமைக்கப்படாவிட்டால், அல்லது false என அமைக்கப்பட்டால், <ph name="TLS_FALSE_START" /> இயக்கப்படும். இது true என அமைக்கப்பட்டால், <ph name="TLS_FALSE_START" /> முடக்கப்படும்.</translation>
 <translation id="7433714841194914373">'உடனடி' அம்சத்தை இயக்கும்</translation>
-<translation id="7443061725198440541">இந்தக் கொள்கை அமைக்கப்படாமல் இருந்தாலோ அல்லது இயக்கியிருந்தாலோ, எழுத்துச்சரிபார்ப்பைப் பயன்படுத்த பயனர் அனுமதிக்கப்படுவார்.
-
-      இந்தக் கொள்கை முடக்கப்பட்டிருந்தால், எழுத்துச்சரிபார்ப்பைப் பயன்படுத்த பயனர் அனுமதிக்கப்பட மாட்டார். இந்தக் கொள்கை முடக்கப்பட்டிருக்கும் போது, SpellcheckLanguage கொள்கையும் புறக்கணிக்கப்படும்.
-      </translation>
 <translation id="7443616896860707393">கிராஸ் ஒரிஜின் HTTP அடிப்படை அங்கீகரிப்பை குறிப்பிடுகிறது</translation>
 <translation id="7458437477941640506">OS பதிப்பு இலக்கை விடப் புதியதாக இருந்தால், இலக்குப் பதிப்புக்கு மீட்டமைக்க வேண்டாம். புதுப்பிப்புகளும் முடக்கப்பட்டுள்ளன.</translation>
 <translation id="7464991223784276288">நடப்பு அமர்வில் URLகளைப் பொருத்துவதிலிருந்து குக்கீகளை வரம்பிடும்</translation>
@@ -3371,15 +3378,6 @@
 <translation id="8870318296973696995">முகப்புப் பக்கம்</translation>
 <translation id="8876188741456358123">இயல்புநிலையில் டூப்ளெக்ஸ் பயன்முறையில் அச்சிடுவதை மேலெழுதும். பயன்முறை கிடைக்காவிட்டால், இந்தக் கொள்கை புறக்கணிக்கப்படும்.</translation>
 <translation id="8882006618241293596">இந்தத் தளங்களில் <ph name="FLASH_PLUGIN_NAME" /> செருகுநிரலைத் தடு</translation>
-<translation id="890403179930035128">மொழிகளுக்கான எழுத்துச்சரிபார்ப்பைக் கட்டாயப்படுத்தி இயக்கும். அந்தப் பட்டியலில் உள்ள தெரியாத மொழிகள் புறக்கணிக்கப்படும்.
-
-      இந்தக் கொள்கையை இயக்கினால், பயனர் எழுத்துச்சரிபார்ப்பை இயக்கியுள்ள மொழிகளுடன் சேர்த்து, குறிப்பிட்டுள்ள மொழிகளுக்கும் எழுத்துச்சரிபார்ப்பு இயக்கப்படும்.
-
-      இந்தக் கொள்கையை அமைக்கவில்லை எனில் அல்லது முடக்கியிருந்தால், பயனரின் எழுத்துச்சரிபார்ப்பு விருப்பத்தேர்வுகளில் எந்த மாற்றமும் செய்யப்படாது.
-
-      SpellcheckEnabled கொள்கையை முடக்கியிருந்தால், இந்தக் கொள்கை எந்த விளைவையும் ஏற்படுத்தாது
-
-      தற்போது ஆதரிக்கப்படும் மொழிகள்: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">விருந்தினர் பயன்முறையை இயக்குதல்</translation>
 <translation id="8908294717014659003">இணையதளங்கள் மீடியா பிடிப்பு சாதனங்களை அணுக அனுமதி உள்ளதா என்பதை அமைக்க உங்களை அனுமதிக்கிறது. மீடியா பிடிப்பு சாதனங்களுக்கான அணுகல் இயல்பாக அனுமதிக்கப்படும் அல்லது இணையதளம் மீடியா பிடிப்பு சாதனங்களுக்கு அணுகலைப் பெற விரும்பும் ஒவ்வொரு முறையும் பயனர் கேட்கப்படுவார்.
 
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb
index 61ae5fb..3325c0f 100644
--- a/components/policy/resources/policy_templates_te.xtb
+++ b/components/policy/resources/policy_templates_te.xtb
@@ -471,6 +471,7 @@
 <translation id="1914840757300882918">ఈ విధానాన్ని సెట్ చేస్తే, హోస్ట్ RemoteAccessHostTokenValidationUrlకు ప్రామాణీకరించడానికి ఇచ్చిన జారీదారు CNతో క్లయింట్ ప్రమాణపత్రాన్ని ఉపయోగిస్తుంది. ఏదైనా అందుబాటులో ఉన్న క్లయింట్ ప్రమాణపత్రాన్ని ఉపయోగించడానికి దాన్ని "*"కి సెట్ చేయండి.
 
 ఈ ఫీచర్ ప్రస్తుతం సర్వర్ తరపున నిలిపివేయబడింది.</translation>
+<translation id="1919802376548418720">ఆధారాలను కేటాయించడం కోసం KDC విధానాన్ని ఉపయోగిస్తుంది.</translation>
 <translation id="1920046221095339924">పరికరంలో నిర్వహించబడిన సెషన్‌ను అనుమతించండి</translation>
 <translation id="1929709556673267855">పరికరాలకు అనుకూలంగా ఉండే ఎంటర్‌ప్రైజ్ ప్రింటర్‌ల కోసం కాన్ఫిగరేషన్‌లను అందిస్తుంది.
 
@@ -659,6 +660,15 @@
 ఈ సెట్టింగ్‌ను ఆపివేయడం లేదా సెట్ చేయకుండా వ‌దిలేస్తే, WebGL APIని ఉపయోగించడానికి వెబ్ పేజీల‌ను, పెప్పర్ 3డి APIని ఉపయోగించడానికి ప్లగిన్‌ల‌ను అనుమ‌తించే అవ‌కాశం ఉంది. ఈ APIలను ఉపయోగించడానికి అనుమ‌తించేందుకు బ్రౌజర్‌ యొక్క డిఫాల్ట్ సెట్టింగ్‌లకు క‌మాండ్ లైన్ ఆర్గ్యుమెంట్స్ పాస్ కావ‌డం ఇప్పటికీ అవసరం.
 
 HardwareAccelerationModeEnabledను తప్పుగా సెట్ చేస్తే, Disable3DAPIs విస్మరించబడుతుంది మరియు ఇది Disable3DAPIsను ఒప్పున‌కు సెట్ చేయడంతో సమానం అవుతుంది.</translation>
+<translation id="2265214338421787313">పేజీని అన్‌లోడ్ చేస్తున్నప్పుడు పాప్అప్‌లను చూపడానికి దానిని అనుమతించాలని పేర్కొడానికి నిర్వాహకులను ఈ విధానం అనుమతిస్తుంది.
+
+      విధానాన్ని ప్రారంభించినప్పుడు, పేజీలను అన్‌లోడ్ చేసే సమయంలో పాప్అప్‌లను చూపడానికి అవి అనుమతించబడతాయి.
+
+      విధానాన్ని నిలిపివేసినప్పుడు లేదా తప్పు అని సెట్ చేసినప్పుడు, పేజీలను అన్‌లోడ్ చేసే సమయంలో పాప్అప్‌లను చూపడానికి అవి అనుమతించబడవు, స్పెక్ (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name) ఆధారంగా అది జరుగుతుంది.
+
+      Chrome 82 నుండి ఈ విధానం తీసివేయబడుతుంది.
+
+      https://www.chromestatus.com/feature/5989473649164288ని చూడండి.</translation>
 <translation id="2269319728625047531">సైన్-ఇన్ చేస్తున్న సమయంలో సింక్ సమ్మతిని ప్రదర్శించడం ప్రారంభిస్తుంది</translation>
 <translation id="2274864612594831715">ఈ విధానం వర్చువల్ కీబోర్డ్‌ను ప్రారంభించడాన్ని ChromeOSలో ఇన్‌పుట్ పరికరం లాగా కాన్ఫిగర్ చేస్తుంది. వినియోగదారులు ఈ విధానాన్ని అధిగ‌మించ‌లేరు.
 
@@ -2399,6 +2409,7 @@
 <translation id="602728333950205286">డిఫాల్ట్ శోధన ప్రదాత తక్షణ URL</translation>
 <translation id="603410445099326293">POSTని ఉపయోగించే సూచన URL కోసం పరామితులు</translation>
 <translation id="6034341625190551415">పబ్లిక్ సెషన్, కియోస్క్ ఖాతా రకాలను నియంత్రిస్తుంది.</translation>
+<translation id="6034603289689965535">పేజీని అన్‌లోడ్ చేస్తున్నప్పుడు పాప్అప్‌లను చూపడానికి దానిని అనుమతిస్తుంది</translation>
 <translation id="6036523166753287175">రిమోట్ యాక్సెస్ హోస్ట్ నుండి ఫైర్‌వాల్ ట్రావెర్సల్‌ను ప్రారంభించండి</translation>
 <translation id="6070667616071269965">పరికర సైన్-ఇన్ స్క్రీన్ కీబోర్డ్ లేఅవుట్‌లు</translation>
 <translation id="6074963268421707432">డెస్క్‌టాప్ నోటిఫికేషన్‌లను చూపించడానికి ఏ సైట్‌నూ అనుమతించవద్దు</translation>
@@ -3067,10 +3078,6 @@
       విధానాన్ని సెట్ చేయకుంటే లేదా తప్పుకు సెట్ చేస్తే, <ph name="TLS_FALSE_START" /> ప్రారంభించబడుతుంది. దీన్ని ఒప్పుకు సెట్ చేస్తే, <ph name="TLS_FALSE_START" /> నిలిపివేయబడుతుంది.</translation>
 <translation id="7433714841194914373">'క్రోమ్ త‌క్ష‌ణం' ప్రారంభించు</translation>
 <translation id="7434202861148928348">రిమోట్ యాక్సెస్ క్లయింట్‌ల కోసం అవసరమైన డొమైన్ పేర్లను కాన్ఫిగర్ చేయండి</translation>
-<translation id="7443061725198440541">ఒకవేళ ఈ విధానాన్ని సెట్ చేయకున్నా లేదా ప్రారంభించినా, వినియోగదారు స్పెల్‌చెక్‌ను ఉపయోగించడానికి అనుమతించబడతారు.
-
-      ఒకవేళ ఈ విధానాన్ని నిలిపివేసినట్లయితే, వినియోగదారు స్పెల్‌చెక్‌ను ఉపయోగించడానికి అనుమతించబడరు. ఈ విధానాన్ని నిలిపివేసినప్పుడు SpellcheckLanguage విధానం కూడా విస్మరించబడుతుంది.
-      </translation>
 <translation id="7443616896860707393">క్రాస్-ఆరిజిన్ HTTP ప్రాథమిక ప్రామాణీకరణ ప్రాంప్ట్‌లు</translation>
 <translation id="7458437477941640506">OS వెర్షన్, టార్గెట్‌ కన్నా కొత్తదైతే, టార్గెట్‌ వెర్షన్‌కు తిరిగి వెళ్ల‌దు. అప్‌డేట్‌లు కూడా నిలిపివేయబడ్డాయి.</translation>
 <translation id="7464991223784276288">ప్రస్తుత సెషన్‌కు URLలను సరిపోల్చకుండా కుక్కీలను పరిమితం చేస్తుంది</translation>
@@ -3718,15 +3725,6 @@
 <translation id="8870318296973696995">హోమ్ పేజీ</translation>
 <translation id="8876188741456358123">డిఫాల్ట్ ప్రింటింగ్ డ్యూప్లెక్స్ మోడ్‌ను భర్తీ చేస్తుంది. మోడ్ అందుబాటులో లేనట్లయితే ఈ విధానం విస్మరించబడుతుంది.</translation>
 <translation id="8882006618241293596">ఈ సైట్‌లలో <ph name="FLASH_PLUGIN_NAME" /> ప్లగ్ఇన్‌‌ను బ్లాక్ చేస్తుంది</translation>
-<translation id="890403179930035128">స్పెల్‌చెక్‌ భాషలను నిర్బంధంగా ప్రారంభిస్తుంది. ఆ జాబితాలో ఉండే గుర్తించబడని భాషలు విస్మరించబడతాయి.
-
-      మీరు ఈ విధానాన్ని ప్రారంభిస్తే, పేర్కొనబడిన భాషలకు స్పెల్‌చెక్‌ ప్రారంభించబడుతుంది, దానితోపాటుగా వినియోగదారు స్పెల్‌చెక్‌ ఎంచుకున్న భాషలకు ప్రారంభించబడుతుంది.
-
-      ఒకవేళ మీరు ఈ విధానాన్ని సెట్ చేయకపోతే లేదా దీనిని నిలిపివేస్తే, వినియోగదారు స్పెల్‌చెక్‌ ప్రాధాన్యతలకు ఏవిధమైన మార్పు ఉండదు.
-
-      ఒకవేళ SpellcheckEnabled విధానాన్ని నిలిపివేసేలా సెట్ చేస్తే, ఈ విధానం ఎటువంటి ప్రభావం చూపదు.
-
-      ప్రస్తుతం మద్దతు ఇస్తున్న భాషలు: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">అతిథి మోడ్‌ని ప్రారంభించు</translation>
 <translation id="8908294717014659003">మీడియా క్యాప్చర్ పరికరాలకు యాక్సెస్‌ను పొందడానికి వెబ్‌సైట్‌లు అనుమతించబడ్డాయో లేదో సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. మీడియా క్యాప్చర్ పరికరాలకు యాక్సెస్‌ డిఫాల్ట్‌గా అనుమతించబడుతుంది లేదా వెబ్‌సైట్ మీడియా క్యాప్చర్ పరికరాలకు యాక్సెస్‌ను పొందాలనుకునే ప్రతిసారి వినియోగదారును అడుగుతుంది.
 
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 9f38da4..75d49f92 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -422,6 +422,7 @@
       หากเปิดใช้การตั้งค่านี้ บริการปกป้องรหัสผ่านก็จะบันทึกลายนิ้วมือของรหัสผ่านใน URL เหล่านี้เพื่อตรวจหาการใช้รหัสผ่านซ้ำ
       หากปิดใช้หรือไม่ได้ตั้งค่า บริการปกป้องรหัสผ่านก็จะบันทึกลายนิ้วมือของรหัสผ่านใน https://accounts.google.com เท่านั้น
       นโยบายนี้ใช้ได้เฉพาะในอินสแตนซ์ Windows ซึ่งเข้าร่วมโดเมน <ph name="MS_AD_NAME" /> หรืออินสแตนซ์ Windows 10 Pro หรือ Enterprise ที่เข้าร่วมการจัดการอุปกรณ์</translation>
+<translation id="1919802376548418720">ใช้นโยบาย KDC เพื่อมอบอำนาจข้อมูลเข้าสู่ระบบ</translation>
 <translation id="1920046221095339924">อนุญาตเซสชันที่จัดการในอุปกรณ์</translation>
 <translation id="1929709556673267855">ระบุการกำหนดค่าสำหรับเครื่องพิมพ์ขององค์กรที่เชื่อมโยงกับอุปกรณ์ต่างๆ
 
@@ -578,6 +579,15 @@
 <translation id="2231817271680715693">นำเข้าประวัติการเรียกดูจากเบราว์เซอร์เริ่มต้นในการเรียกใช้งานครั้งแรก</translation>
 <translation id="2236488539271255289">ไม่อนุญาตให้ไซต์ใดๆ ตั้งค่าข้อมูลในตัวเครื่อง</translation>
 <translation id="2240879329269430151">ช่วยให้คุณกำหนดว่าเว็บไซต์จะได้รับอนุญาตให้แสดงป๊อปอัปหรือไม่ การแสดงป๊อปอัปสามารถจะได้รับอนุญาตสำหรับเว็บไซต์ทั้งหมดหรือปฏิเสธสำหรับเว็บไซต์ทั้งหมดก็ได้ หากนโยบายนี้ไม่มีการตั้งค่าไว้ จะมีการใช้ "BlockPopups" และผู้ใช้สามารถที่จะเปลี่ยนแปลงได้</translation>
+<translation id="2265214338421787313">นโยบายนี้อนุญาตให้ผู้ดูแลระบบระบุว่าหน้าเว็บอาจแสดงป๊อปอัประหว่างยกเลิกการโหลด
+
+      เมื่อตั้งค่านโยบายนี้เป็นเปิดใช้อยู่ หน้าเว็บจะแสดงป๊อปอัประหว่างยกเลิกการโหลดได้
+
+      เมื่อตั้งค่านโยบายเป็นปิดใช้อยู่หรือไม่ได้ตั้งค่า หน้าเว็บจะไม่ได้รับอนุญาตให้แสดงป๊อปอัประหว่างยกเลิกการโหลดตามข้อกำหนดเฉพาะ (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name)
+
+      เราจะนำนโยบายนี้ออกใน Chrome 82
+
+      โปรดดู https://www.chromestatus.com/feature/5989473649164288</translation>
 <translation id="2269319728625047531">เปิดใช้การแสดงการขอคำยินยอมให้ซิงค์ในระหว่างการลงชื่อเข้าใช้</translation>
 <translation id="2274864612594831715">นโยบายนี้กำหนดค่าการเปิดใช้แป้นพิมพ์เสมือนเป็นอุปกรณ์ป้อนข้อมูลใน ChromeOS ผู้ใช้ไม่สามารถแทนที่นโยบายนี้ได้
 
@@ -2140,6 +2150,7 @@
 <translation id="602728333950205286">URL ค้นหาทันใจของผู้ให้บริการการค้นหาเริ่มต้น</translation>
 <translation id="603410445099326293">พารามิเตอร์สำหรับการแนะนำ URL ที่ใช้ POST</translation>
 <translation id="6034341625190551415">ควบคุมเซสชันสาธารณะและประเภทบัญชีคีออสก์</translation>
+<translation id="6034603289689965535">อนุญาตให้หน้าเว็บแสดงป๊อปอัประหว่างยกเลิกการโหลด</translation>
 <translation id="6036523166753287175">เปิดใช้งานไฟร์วอลล์ Traversal จากโฮสต์สำหรับการเข้าถึงระยะไกล</translation>
 <translation id="6070667616071269965">รูปแบบแป้นพิมพ์ในหน้าจอการลงชื่อเข้าใช้อุปกรณ์</translation>
 <translation id="6074963268421707432">ไม่อนุญาตให้ไซต์ใดๆ แสดงการแจ้งเตือนของเดสก์ท็อป</translation>
@@ -2782,10 +2793,6 @@
 
       หากไม่ตั้งค่านโยบายนี้ หรือตั้งค่าเป็น False ระบบจะเปิดใช้ <ph name="TLS_FALSE_START" /> หากตั้งค่าเป็น True ระบบจะปิดใช้ <ph name="TLS_FALSE_START" /></translation>
 <translation id="7433714841194914373">เปิดใช้งานค้นหาทันใจ</translation>
-<translation id="7443061725198440541">หากไม่ได้ตั้งค่าหรือเปิดใช้นโยบายนี้ ผู้ใช้จะใช้การตรวจการสะกดได้
-
-      หากปิดใช้นโยบายนี้ ผู้ใช้จะใช้การตรวจการสะกดไม่ได้ ระบบจะยังเพิกเฉยต่อนโยบาย SpellcheckLanguage ด้วยหากปิดใช้นโยบายนี้
-      </translation>
 <translation id="7443616896860707393">ข้อความแจ้งการตรวจสอบสิทธิ์พื้นฐาน HTTP ข้ามจุด</translation>
 <translation id="7458437477941640506">อย่าย้อนกลับไปเวอร์ชันเป้าหมายหากใช้ระบบปฏิบัติการเวอร์ชันที่ใหม่กว่า การอัปเดตต่างๆ จะถูกปิดการใช้งานเช่นกัน</translation>
 <translation id="7464991223784276288">จำกัดคุกกี้จาก URL ที่ตรงกันให้อยู่ในเซสชันปัจจุบัน</translation>
@@ -3372,15 +3379,6 @@
 <translation id="8870318296973696995">หน้าแรก</translation>
 <translation id="8876188741456358123">ลบล้างโหมดการพิมพ์ 2 ด้านเริ่มต้น ระบบจะเพิกเฉยนโยบายนี้หากไม่มีโหมด</translation>
 <translation id="8882006618241293596">บล็อกปลั๊กอิน <ph name="FLASH_PLUGIN_NAME" /> ในเว็บไซต์เหล่านี้</translation>
-<translation id="890403179930035128">บังคับเปิดใช้การตรวจการสะกดของภาษาต่างๆ ระบบจะเพิกเฉยต่อภาษาที่ไม่รู้จักในรายการนั้น
-
-      หากคุณเปิดใช้นโยบายนี้ ระบบจะเปิดใช้การตรวจการสะกดสำหรับภาษาที่ระบุ เพิ่มเติมจากภาษาที่ผู้ใช้ได้เปิดใช้การตรวจการสะกดไปแล้ว
-
-      หากคุณไม่ได้ตั้งค่าหรือปิดใช้นโยบายนี้ จะไม่มีการเปลี่ยนแปลงในค่ากำหนดการตรวจการสะกดของผู้ใช้
-
-      หากมีการปิดใช้นโยบาย SpellcheckEnabled นโยบายนี้จะไม่ได้รับผลกระทบ
-
-      ภาษาที่รองรับในขณะนี้ ได้แก่ af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi</translation>
 <translation id="8906768759089290519">เปิดใช้งานโหมดผู้มาเยือน</translation>
 <translation id="8908294717014659003">อนุญาตให้คุณตั้งค่าว่าจะอนุญาตให้เว็บไซต์เข้าถึงอุปกรณ์จับสื่อภาพ/เสียงหรือไม่ การเข้าถึงอุปกรณ์จับสื่อภาพ/เสียงอาจได้รับอนุญาตโดยค่าเริ่มต้น หรือผู้ใช้สามารถรับข้อความสอบถามทุกๆ ครั้งที่เว็บไซต์ต้องการเข้าถึงอุปกรณ์จับสื่อภาพ/เสียง
 
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index d5540e93..ccc7962 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -427,6 +427,7 @@
       Bu ayar etkinleştirilirse şifre koruma hizmeti, şifre yeniden kullanımı algılaması için bu URL'lerdeki şifrelerin dijital parmak izlerini yakalar.
       Bu ayar devre dışı bırakılırsa veya ayarlanmazsa, şifre koruma hizmeti yalnızca https://accounts.google.com adresindeki şifrelerin dijital parmak izlerini yakalar.
       Bu politika yalnızca bir <ph name="MS_AD_NAME" /> alan adına katılmış Windows örneklerinde veya cihaz yönetimine kaydolmuş Windows 10 Pro ya da Enterprise örneklerinde kullanılabilir.</translation>
+<translation id="1919802376548418720">Kimlik bilgilerine yetki vermek için KDC politikasını kullan.</translation>
 <translation id="1920046221095339924">Cihazda yönetilen oturuma izin ver</translation>
 <translation id="1929709556673267855">Cihazlara bağlı kurumsal yazıcılar için yapılandırmalar sağlar.
 
@@ -585,6 +586,15 @@
 <translation id="2240879329269430151">Web sitelerinin pop-up göstermesine izin verilip verilmeyeceğini ayarlamanıza olanak tanır. Tüm web siteleri için pop-up'ların gösterilmesine izin verilebilir veya tüm web sitelerinin pop-up göstermesi reddedilebilir.
 
           Bu politika ayarlanmadan bırakılırsa, 'BlockPopups' kullanılır ve kullanıcı bu ayarı değiştirebilir.</translation>
+<translation id="2265214338421787313">Bu politika, bir yöneticinin, bir sayfanın yüklemesi kaldırılırken pop-up gösterebileceğini belirtmesini sağlar.
+
+      Bu politika etkin olarak ayarlanırsa, sayfaların yüklemeleri kaldırılırken pop-up göstermelerine izin verilir.
+
+      Bu politika devre dışı olarak ayarlanırsa veya ayarlanmazsa, spesifikasyon (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name) gereği, sayfaların yüklemeleri kaldırılırken pop-up göstermelerine izin verilmez.
+
+      Bu politika, Chrome 82 sürümünde kaldırılacaktır.
+
+      https://www.chromestatus.com/feature/5989473649164288 adresine bakın.</translation>
 <translation id="2269319728625047531">Oturum açma sırasında Senkronizasyon İzni'nin görüntülenmesini etkinleştir</translation>
 <translation id="2274864612594831715">Bu politika, ChromeOS'de sanal klavyenin bir giriş cihazı olarak etkinleştirilmesini yapılandırır. Kullanıcılar bu politikayı geçersiz kılamaz.
 
@@ -2206,6 +2216,7 @@
 <translation id="602728333950205286">Varsayılan arama sağlayıcı anında arama URL'si</translation>
 <translation id="603410445099326293">POST kullanan öneri URL'si parametreleri</translation>
 <translation id="6034341625190551415">Herkese açık oturum ve kiosk hesap türlerini kontrol eder.</translation>
+<translation id="6034603289689965535">Sayfanın yüklemesi kaldırılırken pop-up göstermesine olanak tanır</translation>
 <translation id="6036523166753287175">Uzaktan erişim ana makinesinden güvenlik duvarı geçişini etkinleştir</translation>
 <translation id="6070667616071269965">Cihaz oturum açma ekranı klavye düzenleri</translation>
 <translation id="6074963268421707432">Hiçbir sitenin masaüstü bildirimi göstermesine izin verme</translation>
@@ -2857,10 +2868,6 @@
 
       Bu politika ayarlanmazsa veya yanlış seçeneğine ayarlanırsa <ph name="TLS_FALSE_START" /> özelliği etkinleştirilir. Doğru seçeneğine ayarlanırsa <ph name="TLS_FALSE_START" /> özelliği devre dışı olur.</translation>
 <translation id="7433714841194914373">Anında Arama'yı etkinleştir</translation>
-<translation id="7443061725198440541">Bu politika ayarlanmazsa veya etkinleştirilmezse kullanıcının yazım denetimini kullanmasına izin verilir.
-
-      Bu politika devre dışı bırakılırsa kullanıcının yazım denetimini kullanmasına izin verilmez. Bu politika devre dışı bırakıldığında SpellcheckLanguage politikası da yoksayılır.
-      </translation>
 <translation id="7443616896860707393">Çapraz kökenli HTTP Basic Auth bilgi istemleri</translation>
 <translation id="7458437477941640506">OS sürümü hedeften daha yeniyse hedef sürüme geri dönmeyin. Güncellemeler de devre dışı bırakılır.</translation>
 <translation id="7464991223784276288">Eşleşen URL'lerden çerezleri geçerli oturumla sınırlama</translation>
@@ -3447,15 +3454,6 @@
 <translation id="8870318296973696995">Ana sayfa</translation>
 <translation id="8876188741456358123">Varsayılan dupleks yazdırma modunu geçersiz kılar. Mod mevcut değilse bu politika yoksayılır.</translation>
 <translation id="8882006618241293596">Bu sitelerde <ph name="FLASH_PLUGIN_NAME" /> eklentisini engelle</translation>
-<translation id="890403179930035128">Yazım denetimi dillerini etkinleştirmeye zorlar. Söz konusu listedeki tanınmayan diller yoksayılır.
-
-      Bu politikayı etkinleştirirseniz yazım denetimi, hem belirtilen diller için hem de kullanıcının yazım denetimini etkinleştirdiği diller için etkinleştirilir.
-
-      Bu politikayı ayarlamazsanız veya devre dışı bırakırsanız kullanıcının yazım denetimi tercihlerinde hiçbir değişiklik olmaz.
-
-      SpellcheckEnabled politikası devre dışı bırakılırsa bu politikanın hükmü olmaz.
-
-      Şu an için desteklenen diller şunlardır: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Misafir modunu etkinleştir</translation>
 <translation id="8908294717014659003">Web sitelerinin medya yakalama cihazlarına erişmelerine izin verilip verilmeyeceğini ayarlamanıza olanak sağlar. Medya yakalama cihazlarına erişime varsayılan olarak izin verilebilir veya bir web sitesinin medya yakalama cihazlarına erişmek istediği her defasında kullanıcıya sorulabilir.
 
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index 59170ce9..39882d2 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -433,6 +433,7 @@
       Якщо цей параметр увімкнено, сервіс захисту паролів збереже відбиток пароля для цих URL-адрес, щоб виявляти його повторне введення.
       Якщо його вимкнено або не налаштовано, сервіс захисту паролів збереже відбиток пароля лише на сторінці https://accounts.google.com.
       Це правило доступне лише у версіях Windows, зареєстрованих у домені <ph name="MS_AD_NAME" />, або Windows 10 Pro чи Enterprise, зареєстрованих для керування пристроєм.</translation>
+<translation id="1919802376548418720">Використовує правило KDC, щоб делегувати облікові дані.</translation>
 <translation id="1920046221095339924">Дозволити керований сеанс на пристрої</translation>
 <translation id="1929709556673267855">Указує налаштування принтерів підприємства, зв’язаних із пристроями.
 
@@ -590,6 +591,15 @@
 <translation id="2231817271680715693">Імпорт історії веб-перегляду з веб-переглядача за умовчанням під час першого запуску</translation>
 <translation id="2236488539271255289">Забороняти всім сайтам установлювати локальні дані</translation>
 <translation id="2240879329269430151">Дозволяє вказувати, чи можуть веб-сайти показувати спливаючі вікна. Показ спливаючих вікон можна дозволити чи заборонити для всіх веб-сайтів. Якщо це правило не встановлено, використовується правило "BlockPopups", але користувач може змінювати це налаштування.</translation>
+<translation id="2265214338421787313">Це правило дозволяє адміністратору вказувати, що під час завантаження сторінки може з’являтися спливаюча реклама.
+
+      Якщо це правило ввімкнено, під час завантаження сторінок може з’являтися спливаюча реклама.
+
+      Якщо це правило вимкнено або не налаштовано, відповідно до специфікації (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name) під час завантаження сторінок не може з’являтися спливаюча реклама.
+
+      У Chrome 82 це правило буде вилучено.
+
+      Перегляньте сторінку https://www.chromestatus.com/feature/5989473649164288.</translation>
 <translation id="2269319728625047531">Вмикає запит згоди на синхронізацію під час входу</translation>
 <translation id="2274864612594831715">Це правило налаштовує вмикання віртуальної клавіатури як пристрою для введення на пристроях з ОС Chrome. Користувачі не можуть замінити це правило.
 
@@ -2158,6 +2168,7 @@
 <translation id="602728333950205286">URL-адреса для миттєвого пошуку пошукової служби за умовчанням</translation>
 <translation id="603410445099326293">Параметри URL-адреси пропозицій, яка використовує метод POST</translation>
 <translation id="6034341625190551415">Керує загальнодоступним сеансом і типами облікових записів термінала.</translation>
+<translation id="6034603289689965535">Дозволяє показувати спливаючу рекламу під час завантаження сторінки</translation>
 <translation id="6036523166753287175">Увімкнення обходу брандмауера з хосту віддаленого доступу</translation>
 <translation id="6070667616071269965">Розкладка клавіатури на екрані входу на пристрої</translation>
 <translation id="6074963268421707432">Забороняти всім сайтам показувати сповіщення на робочому столі</translation>
@@ -2803,10 +2814,6 @@
 
       Якщо це правило не налаштовано або має значення "false", функцію <ph name="TLS_FALSE_START" /> буде ввімкнено. Якщо вибрано значення "true", <ph name="TLS_FALSE_START" /> буде вимкнено.</translation>
 <translation id="7433714841194914373">Увімкнути миттєвий пошук</translation>
-<translation id="7443061725198440541">Якщо це правило не налаштовано або ввімкнено, користувач може запускати перевірку правопису.
-
-      Якщо це правило вимкнено, користувач не може запускати перевірку правопису. Правило SpellcheckLanguage також ігноруватиметься, коли це правило вимкнено.
-      </translation>
 <translation id="7443616896860707393">Міждоменні запити базової автентифікації HTTP</translation>
 <translation id="7458437477941640506">Не відкочуватися до цільової версії, якщо версія ОС новіша. Оновлення також вимкнено.</translation>
 <translation id="7464991223784276288">Не дозволяє файлам cookie зіставляти URL-адреси з поточним сеансом</translation>
@@ -3388,15 +3395,6 @@
 <translation id="8870318296973696995">Домашня сторінка</translation>
 <translation id="8876188741456358123">Замінює стандартні параметри двостороннього друку. Якщо такий режим недоступний, це правило ігнорується.</translation>
 <translation id="8882006618241293596">Блокувати плагін <ph name="FLASH_PLUGIN_NAME" /> на цих сайтах</translation>
-<translation id="890403179930035128">Примусово вмикає мови перевірки правопису. Нерозпізнані мови в цьому списку ігноруються.
-
-      Якщо ввімкнути це правило, перевірка правопису активується для вибраних користувачем і вказаних мов.
-
-      Якщо не налаштувати або вимкнути це правило, указані користувачем параметри перевірки правопису не зміняться.
-
-      Якщо правило SpellcheckEnabled вимкнено, воно не діятиме.
-
-      Підтримувані мови: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Увімкнути режим гостя</translation>
 <translation id="8908294717014659003">Дозволяє встановлювати, чи можуть веб-сайти отримувати доступ до пристроїв запису медіаданих. Доступ до пристроїв запису медіаданих може надаватися за умовчанням або користувач може бачити запит щоразу, коли веб-сайт хоче отримати доступ до пристроїв запису медіаданих.
 
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index 5a98a83..e87ca8c 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -432,6 +432,7 @@
       Nếu bạn bật tùy chọn cài đặt này, thì dịch vụ bảo vệ mật khẩu sẽ ghi lại vân tay số của mật khẩu trên các URL này cho mục đích phát hiện trường hợp sử dụng lại mật khẩu.
       Nếu bạn tắt hoặc không đặt tùy chọn cài đặt này, thì dịch vụ bảo vệ mật khẩu sẽ ghi lại vân tay số của mật khẩu trên trang web https://accounts.google.com.
       Chính sách này chỉ có trên các phiên bản Windows liên kết với miền <ph name="MS_AD_NAME" /> hoặc phiên bản Windows 10 Pro hay Enterprise đã đăng ký quản lý thiết bị.</translation>
+<translation id="1919802376548418720">Sử dụng chính sách KDC để ủy quyền thông tin xác thực.</translation>
 <translation id="1920046221095339924">Cho phép phiên được quản lý trên thiết bị</translation>
 <translation id="1929709556673267855">Cung cấp cấu hình máy in dành cho doanh nghiệp được kết nối với các thiết bị.
 
@@ -597,6 +598,15 @@
 <translation id="2240879329269430151">Cho phép bạn đặt liệu các trang web có được phép hiển thị cửa sổ bật lên hay không. Bạn có thể cho phép hoặc từ chối hiển thị cửa sổ bật lên đối với tất cả các trang web.
 
           Nếu không thiết lập chính sách này, 'BlockPopups' sẽ được sử dụng và người dùng có thể thay đổi cài đặt này.</translation>
+<translation id="2265214338421787313">Chính sách này cho phép quản trị viên chỉ định một trang có thể hiển thị cửa sổ bật lên khi đang hủy tải trang.
+
+      Khi bạn đặt chính sách này thành bật, các trang sẽ được phép hiển thị cửa sổ bật lên khi đang hủy tải trang.
+
+      Khi bạn không đặt chính sách này hoặc đặt chính sách thành tắt, các trang sẽ không được phép hiển thị cửa sổ bật lên khi đang hủy tải trang, như theo thông số kỹ thuật (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name).
+
+      Chính sách này sẽ bị xóa trong Chrome 82.
+
+      Xem tại https://www.chromestatus.com/feature/5989473649164288 .</translation>
 <translation id="2269319728625047531">Cho phép hiển thị màn hình Đồng ý đồng bộ hóa trong khi đăng nhập</translation>
 <translation id="2274864612594831715">Chính sách này định cấu hình bật bàn phím ảo làm thiết bị nhập liệu trên ChromeOS. Người dùng không thể ghi đè chính sách này.
 
@@ -2226,6 +2236,7 @@
 <translation id="602728333950205286">URL instant của nhà cung cấp dịch vụ tìm kiếm mặc định</translation>
 <translation id="603410445099326293">Tham số cho URL đề xuất sử dụng POST</translation>
 <translation id="6034341625190551415">Kiểm soát phiên công khai và loại tài khoản kiosk.</translation>
+<translation id="6034603289689965535">Cho phép trang hiển thị cửa sổ bật lên khi đang hủy tải trang</translation>
 <translation id="6036523166753287175">Bật tính năng chặn tường lửa từ máy chủ truy cập từ xa</translation>
 <translation id="6070667616071269965">Bố cục bàn phím màn hình đăng nhập thiết bị</translation>
 <translation id="6074963268421707432">Không cho phép bất kỳ trang web nào hiển thị thông báo trên màn hình</translation>
@@ -2890,10 +2901,6 @@
 
       Nếu chính sách này chưa được đặt hoặc được đặt thành false, <ph name="TLS_FALSE_START" /> sẽ được bật. Nếu chính sách này được đặt thành true, <ph name="TLS_FALSE_START" /> sẽ bị tắt.</translation>
 <translation id="7433714841194914373">Bật chế độ Instant</translation>
-<translation id="7443061725198440541">Nếu bạn không đặt hoặc bật chính sách này thì người dùng được phép sử dụng tính năng kiểm tra chính tả.
-
-      Nếu bạn tắt chính sách này thì người dùng không được phép sử dụng tính năng kiểm tra chính tả. Chính sách SpellcheckLanguage cũng sẽ bị bỏ qua khi bạn tắt chính sách này.
-      </translation>
 <translation id="7443616896860707393">Lời nhắc xác thực cơ bản HTTP giữa các gốc</translation>
 <translation id="7458437477941640506">Không thể khôi phục về phiên bản đích nếu phiên bản hệ điều hành mới hơn phiên bản đích. Các bản cập nhật cũng sẽ bị tắt.</translation>
 <translation id="7464991223784276288">Hạn chế cookie so khớp các URL với phiên hiện tại</translation>
@@ -3486,15 +3493,6 @@
 <translation id="8870318296973696995">Trang chủ</translation>
 <translation id="8876188741456358123">Ghi đè chế độ in hai mặt mặc định. Nếu không có chế độ này thì chính sách sẽ bị bỏ qua.</translation>
 <translation id="8882006618241293596">Chặn plugin <ph name="FLASH_PLUGIN_NAME" /> trên các trang web này</translation>
-<translation id="890403179930035128">Buộc bật tính năng kiểm tra chính tả ngôn ngữ. Các ngôn ngữ không xác định được trong danh sách đó sẽ bị bỏ qua.
-
-      Nếu bạn bật chính sách này, tính năng kiểm tra chính tả sẽ được bật cho ngôn ngữ đã chỉ định ngoài ngôn ngữ mà người dùng đã bật tính năng kiểm tra chính tả.
-
-      Nếu bạn không đặt hoặc bạn tắt chính sách này thì sẽ không có thay đổi nào đối với tùy chọn kiểm tra chính tả của người dùng.
-
-      Nếu bạn đặt chính sách SpellcheckEnabled thành tắt thì chính sách này sẽ không có hiệu lực.
-
-      Các ngôn ngữ hiện đang được hỗ trợ là: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="8906768759089290519">Bật chế độ khách</translation>
 <translation id="8908294717014659003">Cho phép bạn đặt liệu trang web có được phép truy cập vào thiết bị thu dữ liệu truyền thông hay không. Quyền truy cập vào thiết bị thu dữ liệu truyền thông có thể được phép theo mặc định hoặc người dùng có thể được hỏi mỗi lần trang web muốn có quyền truy cập vào thiết bị thu dữ liệu truyền thông.
 
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 24cea60..1973bf41 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -2723,10 +2723,6 @@
 
       如果此政策未设置或设为 false,系统将启用 <ph name="TLS_FALSE_START" />。如果此政策设为 true,系统将停用 <ph name="TLS_FALSE_START" />。</translation>
 <translation id="7433714841194914373">启用“即搜即得”</translation>
-<translation id="7443061725198440541">如果此政策未设置或已启用,用户将能够使用拼写检查。
-
-      如果此政策已停用,用户将无法使用拼写检查。停用此政策后,系统也会忽略 SpellcheckLanguage 政策。
-      </translation>
 <translation id="7443616896860707393">跨域 HTTP 基本身份验证提示</translation>
 <translation id="7458437477941640506">如果操作系统版本比目标版本新,则不会回滚到目标版本。相应更新也会被停用。</translation>
 <translation id="7464991223784276288">仅在当前会话中使用来自相符网址的 Cookie</translation>
@@ -3280,15 +3276,6 @@
 <translation id="8870318296973696995">主页</translation>
 <translation id="8876188741456358123">替换默认双面打印模式。如果这种模式不适用,则忽略此政策。</translation>
 <translation id="8882006618241293596">禁止这些网站运行 <ph name="FLASH_PLUGIN_NAME" /> 插件</translation>
-<translation id="890403179930035128">强制检查语言拼写。未在下方列表中列出的语言将被忽略。
-
-      如果您启用了此政策,那么除了已由用户启用拼写检查的语言之外,系统还将为您所指定的语言启用拼写检查。
-
-      如果您停用了或未设置此政策,则不会更改用户的拼写检查偏好设置。
-
-      如果停用了 SpellcheckEnabled 政策,此政策将不会产生任何效果。
-
-      目前支持的语言包括:af、bg、ca、cs、da、de、el、en-AU、en-CA、en-GB、en-US、es、es-419、es-AR、es-ES、es-MX、es-US、et、fa、fo、fr、he、hi、hr、hu、id、it、ko、lt、lv、nb、nl、pl、pt-BR、pt-PT、ro、ru、sh、sk、sl、sq、sr、sv、ta、tg、tr、uk、vi。</translation>
 <translation id="8906768759089290519">启用访客模式</translation>
 <translation id="8908294717014659003">允许您设置是否允许网站访问媒体捕获设备。系统默认为允许访问媒体捕获设备,否则,每次有网站要访问媒体捕获设备时都要征询用户同意。
 
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index 9aee6bf5..26822bf 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -418,6 +418,7 @@
       如果啟用這項設定,密碼保護服務會針對這些網址擷取密碼指紋,並使用這些指紋偵測密碼重複使用情形。
       如果停用這項設定或不予設定,密碼保護服務就只會針對 https://accounts.google.com 擷取密碼指紋。
       這項政策僅適用於已加入 <ph name="MS_AD_NAME" /> 網域的 Windows 執行個體,或是已註冊裝置管理服務的 Windows 10 專業版或企業版執行個體。</translation>
+<translation id="1919802376548418720">使用 KDC 政策來委派憑證。</translation>
 <translation id="1920046221095339924">允許在裝置上進入受管理的工作階段</translation>
 <translation id="1929709556673267855">為繫結至裝置的企業印表機進行設定。
 
@@ -574,6 +575,15 @@
 <translation id="2231817271680715693">第一次執行時從預設瀏覽器匯入瀏覽記錄</translation>
 <translation id="2236488539271255289">不允許任何網站設定本機資料</translation>
 <translation id="2240879329269430151">允許你設定是否要讓網站顯示彈出式視窗。你可以允許或禁止所有網站顯示彈出式視窗。如果未設定這項政策,系統會使用「BlockPopups」,不過使用者可以變更設定。</translation>
+<translation id="2265214338421787313">這項政策可讓管理員指定頁面是否要在卸載時顯示彈出式視窗。
+
+      如果將這項政策設為啟用,系統會允許頁面在卸載時顯示彈出式視窗。
+
+      如果將這項政策設為停用或不設定,系統會根據規格 (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name) 中的規定,禁止頁面在卸載時顯示彈出式視窗。
+
+      這項政策將在 Chrome 第 82 版中遭到移除。
+
+      請參閱 https://www.chromestatus.com/feature/5989473649164288。</translation>
 <translation id="2269319728625047531">在登入期間允許顯示同步處理同意聲明</translation>
 <translation id="2274864612594831715">這項政策可設定在 Chrome 作業系統中啟用虛擬鍵盤做為輸入裝置。使用者無法覆寫這項政策。
 
@@ -2123,6 +2133,7 @@
 <translation id="602728333950205286">預設搜尋引擎互動智慧搜尋網址</translation>
 <translation id="603410445099326293">使用 POST 的建議網址參數</translation>
 <translation id="6034341625190551415">控管公開工作階段和資訊站帳戶類型。</translation>
+<translation id="6034603289689965535">允許網頁在卸載時顯示彈出式視窗。</translation>
 <translation id="6036523166753287175">允許遠端存取主機穿越防火牆</translation>
 <translation id="6070667616071269965">裝置登入畫面鍵盤配置</translation>
 <translation id="6074963268421707432">不允許任何網站顯示桌面通知</translation>
@@ -2744,10 +2755,6 @@
 
       如未設定這項政策,或設為 False,系統將會啟用 <ph name="TLS_FALSE_START" />。如已設為 True,系統將會停用 <ph name="TLS_FALSE_START" />。</translation>
 <translation id="7433714841194914373">啟用互動智慧搜尋</translation>
-<translation id="7443061725198440541">如果將這項政策設為 true 或不予設定,使用者將可使用拼字檢查。
-
-      如果停用這項政策,使用者將無法使用拼字檢查,且系統會忽略 SpellcheckLanguage 政策。
-      </translation>
 <translation id="7443616896860707393">跨原始來源的 HTTP 基本驗證提示</translation>
 <translation id="7458437477941640506">如果作業系統版本比目標版本還新,則不復原至目標版本,且一併停用更新。</translation>
 <translation id="7464991223784276288">將來自相符網址的 Cookie 限制在目前的工作階段中</translation>
@@ -3305,15 +3312,6 @@
 <translation id="8870318296973696995">首頁</translation>
 <translation id="8876188741456358123">覆寫預設的雙面列印模式。如果設定的模式不適用,系統會忽略這項政策。</translation>
 <translation id="8882006618241293596">禁止在這些網站上執行 <ph name="FLASH_PLUGIN_NAME" /> 外掛程式</translation>
-<translation id="890403179930035128">強制執行拼字檢查的語言。系統會忽略該清單中無法辨識的語言。
-
-      如果啟用這項政策,那麼除了使用者已啟用拼字檢查功能的語言以外,系統還會針對指定的語言執行拼字檢查。
-
-      如果停用這項政策或不予設定,使用者的拼字檢查偏好設定就不會受到任何影響。
-
-      如果停用 SpellcheckEnabled 政策,這項政策就不會有任何效果。
-
-      目前支援的語言如下:af、bg、ca、cs、da、de、el、en-AU、en-CA、en-GB、en-US、es、es-419、es-AR、es-ES、es-MX、es-US、et、fa、fo、fr、he、hi、hr、hu、id、it、ko、lt、lv、nb、nl、pl、pt-BR、pt-PT、ro、ru、sh、sk、sl、sq、sr、sv、ta、tg、tr、uk、vi。</translation>
 <translation id="8906768759089290519">啟用訪客模式</translation>
 <translation id="8908294717014659003">讓你設定網站是否允許網站存取媒體擷取裝置。根據預設,系統允許網站存取媒體擷取裝置,你也可設為每當網站要存取媒體擷取裝置時詢問使用者。
 
diff --git a/components/safe_browsing/features.cc b/components/safe_browsing/features.cc
index fc733ad..026613f 100644
--- a/components/safe_browsing/features.cc
+++ b/components/safe_browsing/features.cc
@@ -38,6 +38,10 @@
 const base::Feature kForceEnableResetPasswordWebUI{
     "ForceEnableResetPasswordWebUI", base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kPasswordProtectionForSignedInUsers{
+    "SafeBrowsingPasswordProtectionForSignedInUsers",
+    base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kSuspiciousSiteTriggerQuotaFeature{
     "SafeBrowsingSuspiciousSiteTriggerQuota", base::FEATURE_ENABLED_BY_DEFAULT};
 
@@ -73,6 +77,7 @@
     {&kCheckByURLLoaderThrottle, true},
     {&kCommittedSBInterstitials, true},
     {&kForceEnableResetPasswordWebUI, true},
+    {&kPasswordProtectionForSignedInUsers, true},
     {&kSuspiciousSiteTriggerQuotaFeature, true},
     {&kTelemetryForApkDownloads, true},
     {&kThreatDomDetailsTagAndAttributeFeature, false},
diff --git a/components/safe_browsing/features.h b/components/safe_browsing/features.h
index 8400860..568bf0b6 100644
--- a/components/safe_browsing/features.h
+++ b/components/safe_browsing/features.h
@@ -31,6 +31,9 @@
 // purpose.
 extern const base::Feature kForceEnableResetPasswordWebUI;
 
+// Enable GAIA password protection for signed-in users.
+extern const base::Feature kPasswordProtectionForSignedInUsers;
+
 // Controls the daily quota for the suspicious site trigger.
 extern const base::Feature kSuspiciousSiteTriggerQuotaFeature;
 
diff --git a/components/safe_browsing/web_ui/resources/safe_browsing.html b/components/safe_browsing/web_ui/resources/safe_browsing.html
index 0eac83a6..cf480e6 100644
--- a/components/safe_browsing/web_ui/resources/safe_browsing.html
+++ b/components/safe_browsing/web_ui/resources/safe_browsing.html
@@ -86,7 +86,7 @@
             <input type="submit" value="Get Chain">
           </form>
           <div class="content">
-            <p id="referrer-chain"></p>
+            <p id="referrer-chain-content"></p>
           </div>
         </tabpanel>
         <tabpanel>
diff --git a/components/safe_browsing/web_ui/resources/safe_browsing.js b/components/safe_browsing/web_ui/resources/safe_browsing.js
index 3e0f2765..b9ce3266 100644
--- a/components/safe_browsing/web_ui/resources/safe_browsing.js
+++ b/components/safe_browsing/web_ui/resources/safe_browsing.js
@@ -233,7 +233,7 @@
 
     cr.sendWithPromise('getReferrerChain', $('referrer-chain-url').value)
         .then((response) => {
-          $('referrer-chain').innerHTML = response;
+          $('referrer-chain-content').innerHTML = response;
         });
   }
 
diff --git a/components/send_tab_to_self/send_tab_to_self_bridge.cc b/components/send_tab_to_self/send_tab_to_self_bridge.cc
index ac7c5e4..3e2d56f 100644
--- a/components/send_tab_to_self/send_tab_to_self_bridge.cc
+++ b/components/send_tab_to_self/send_tab_to_self_bridge.cc
@@ -205,11 +205,20 @@
     return nullptr;
   }
 
+  if (!url.is_valid()) {
+    return nullptr;
+  }
+
   std::string guid = base::GenerateGUID();
 
   // Assure that we don't have a guid collision.
   DCHECK_EQ(GetEntryByGUID(guid), nullptr);
-  std::string trimmed_title = base::CollapseWhitespaceASCII(title, false);
+
+  std::string trimmed_title = "";
+
+  if (base::IsStringUTF8(title)) {
+    trimmed_title = base::CollapseWhitespaceASCII(title, false);
+  }
 
   // TODO(crbug.com/938102) Use history service to find most recent navigation
   // time for url.
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index 5b649d07f..f9660d4 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">Aquest lloc web conté aplicacions perilloses</translation>
 <translation id="1348779747280417563">Confirma el nom</translation>
 <translation id="1357195169723583938">Qui ha utilitzat el dispositiu recentment i quan</translation>
+<translation id="1364822246244961190">Aquesta política està bloquejada i, per tant, se n'ignorarà el valor.</translation>
 <translation id="1374468813861204354">suggeriments</translation>
 <translation id="1374692235857187091">Index-4x6 (postal)</translation>
 <translation id="1375198122581997741">Quan a la versió</translation>
@@ -103,6 +104,7 @@
 <translation id="1472675084647422956">Mostra'n més</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">Tria l'adreça d'enviament</translation>
+<translation id="1492194039220927094">Tramesa automàtica de les polítiques:</translation>
 <translation id="1501859676467574491">Mostra les targetes del Compte de Google</translation>
 <translation id="1507202001669085618">&lt;p&gt;Aquest error es mostra si utilitzeu un portal Wi-Fi en què cal que inicieu la sessió per connectar-vos a Internet.&lt;/p&gt;
     &lt;p&gt;Per solucionar l'error, feu clic a &lt;strong&gt;Connecta&lt;/strong&gt; a la pàgina que proveu d'obrir.</translation>
@@ -123,6 +125,7 @@
 <translation id="1559572115229829303">&lt;p&gt;No es pot establir una connexió privada amb <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> perquè la data i l'hora (<ph name="DATE_AND_TIME" />) del vostre dispositiu no són correctes.&lt;/p&gt;
 
       &lt;p&gt;Canvieu la data i l'hora a la secció &lt;strong&gt;General&lt;/strong&gt; de l'aplicació &lt;strong&gt;Configuració&lt;/strong&gt;.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">Introdueix la data de caducitat</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">S'ha produït un error en mostrar aquesta pàgina web.</translation>
 <translation id="1592005682883173041">Accés a les dades locals</translation>
@@ -487,6 +490,7 @@
 <translation id="3658742229777143148">Revisió</translation>
 <translation id="366077651725703012">Actualitza la targeta de crèdit</translation>
 <translation id="3676592649209844519">Identificador del dispositiu:</translation>
+<translation id="3677008721441257057">Volies dir &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt;?</translation>
 <translation id="3678029195006412963">La sol·licitud no s'ha pogut signar</translation>
 <translation id="3678529606614285348">Obre la pàgina en una finestra d'incògnit nova (Ctrl+Maj+N)</translation>
 <translation id="3679803492151881375">Informe d'error generat el <ph name="CRASH_TIME" /> i enviat el <ph name="UPLOAD_TIME" /></translation>
@@ -1093,6 +1097,7 @@
 <translation id="7220786058474068424">S'està processant</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Aquest lloc web conté programari maliciós</translation>
+<translation id="724766306220616965">Advertiments i conflictes</translation>
 <translation id="724975217298816891">Introdueix la data de caducitat i el CVC de la targeta <ph name="CREDIT_CARD" /> per actualitzar-ne els detalls. Un cop confirmada, els detalls de la targeta es compartiran amb aquest lloc.</translation>
 <translation id="7251437084390964440">La configuració de la xarxa no compleix l'estàndard ONC. Pot ser que algunes opcions de configuració no s'hagin importat.
 Detalls addicionals:
@@ -1105,6 +1110,7 @@
 <translation id="7300012071106347854">Blau elèctric</translation>
 <translation id="7302712225291570345">"<ph name="TEXT" />"</translation>
 <translation id="7309308571273880165">S'ha capturat un informe d'error (<ph name="CRASH_TIME" />) (pujada sol·licitada per l'usuari, encara no s'ha dut a terme)</translation>
+<translation id="7313965965371928911">Advertiments de <ph name="BEGIN_LINK" />Navegació segura<ph name="END_LINK" /></translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Ajuda amb la connexió</translation>
 <translation id="7334320624316649418">&amp;Refés el canvi d'ordre</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb
index 9c5415d..45aa382 100644
--- a/components/strings/components_strings_cs.xtb
+++ b/components/strings/components_strings_cs.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">Web, na který se chystáte přejít, obsahuje nebezpečné aplikace</translation>
 <translation id="1348779747280417563">Potvrdit jméno</translation>
 <translation id="1357195169723583938">Kdo zařízení v poslední době používal a kdy</translation>
+<translation id="1364822246244961190">Tato zásada je blokována, její hodnota bude ignorována.</translation>
 <translation id="1374468813861204354">návrhy</translation>
 <translation id="1374692235857187091">Index-4x6 (pohlednice)</translation>
 <translation id="1375198122581997741">O verzi aplikace</translation>
@@ -103,6 +104,7 @@
 <translation id="1472675084647422956">Zobrazit více</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">Vybrat dodací adresu</translation>
+<translation id="1492194039220927094">Přenesení zásad:</translation>
 <translation id="1501859676467574491">Zobrazit karty z vašeho účtu Google</translation>
 <translation id="1507202001669085618">&lt;p&gt;Tato chyba se zobrazí při použití portálu Wi-Fi, na kterém je třeba se před přístupem na internet přihlásit.&lt;/p&gt;
     &lt;p&gt;Chybu odstraníte tím, že na stránce, kterou se snažíte otevřít, kliknete na &lt;strong&gt;Připojení&lt;/strong&gt;.&lt;/p&gt;</translation>
@@ -123,6 +125,7 @@
 <translation id="1559572115229829303">&lt;p&gt;Soukromé připojení k doméně <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> nelze navázat, protože máte v zařízení nastaveno chybné datum a čas (<ph name="DATE_AND_TIME" />).&lt;/p&gt;
 
       &lt;p&gt;Datum a čas upravte v aplikaci &lt;strong&gt;Nastavení&lt;/strong&gt; v sekci &lt;strong&gt;Obecné&lt;/strong&gt;.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">Zadejte datum vypršení platnosti</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">Při zobrazování této webové stránky došlo k chybě.</translation>
 <translation id="1592005682883173041">Přístup k místním datům</translation>
@@ -483,6 +486,7 @@
 <translation id="3658742229777143148">Verze</translation>
 <translation id="366077651725703012">Aktualizace platební karty</translation>
 <translation id="3676592649209844519">ID zařízení:</translation>
+<translation id="3677008721441257057">Měli jste na mysli &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt;?</translation>
 <translation id="3678029195006412963">Požadavek nebylo možné podepsat</translation>
 <translation id="3678529606614285348">Otevřete stránku v novém anonymním okně (Ctrl-Shift-N)</translation>
 <translation id="3679803492151881375">Zpráva o selhání pořízená <ph name="CRASH_TIME" /> byla nahrána <ph name="UPLOAD_TIME" /></translation>
@@ -1088,6 +1092,7 @@
 <translation id="7220786058474068424">Zpracovávání</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />, <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Webové stránky, které chcete otevřít, obsahují malware</translation>
+<translation id="724766306220616965">Upozornění, konflikt</translation>
 <translation id="724975217298816891">Chcete-li aktualizovat údaje o kartě, zadejte datum vypršení platnosti a kód CVC karty <ph name="CREDIT_CARD" />. Po ověření budou údaje o kartě sdíleny s tímto webem.</translation>
 <translation id="7251437084390964440">Konfigurace sítě neodpovídá standardu ONC. Může se stát, že některé části konfigurace nebudou importovány. Další podrobnosti:
 <ph name="DEBUG_INFO" /></translation>
@@ -1099,6 +1104,7 @@
 <translation id="7300012071106347854">Sytě modrá</translation>
 <translation id="7302712225291570345">„<ph name="TEXT" />“</translation>
 <translation id="7309308571273880165">Zpráva o selhání pořízená <ph name="CRASH_TIME" /> (o nahrání požádal uživatel, dosud nenahrána)</translation>
+<translation id="7313965965371928911">Upozornění <ph name="BEGIN_LINK" />Bezpečného prohlížení<ph name="END_LINK" /></translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Pomoc s připojením</translation>
 <translation id="7334320624316649418">&amp;Opakovat změnu uspořádání</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index 908ebfc..2abce28 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">El sitio web al que vas a acceder contiene aplicaciones peligrosas</translation>
 <translation id="1348779747280417563">Confirmar nombre</translation>
 <translation id="1357195169723583938">Quién ha utilizado este dispositivo recientemente y cuándo</translation>
+<translation id="1364822246244961190">Esta política está bloqueada, su valor será ignorado.</translation>
 <translation id="1374468813861204354">sugerencias</translation>
 <translation id="1374692235857187091">Index-4x6 (Postcard)</translation>
 <translation id="1375198122581997741">Información de la versión</translation>
@@ -103,6 +104,7 @@
 <translation id="1472675084647422956">Mostrar más</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">Seleccionar dirección de envío</translation>
+<translation id="1492194039220927094">Envío de políticas:</translation>
 <translation id="1501859676467574491">Mostrar las tarjetas de tu cuenta de Google</translation>
 <translation id="1507202001669085618">&lt;p&gt;Este error se muestra si utilizas un portal Wi‑Fi en el que debes iniciar sesión antes de conectarte a Internet.&lt;/p&gt;
     &lt;p&gt;Para solucionar el problema, haz clic en &lt;strong&gt;Conectar&lt;/strong&gt; en la página que intentas abrir.&lt;/p&gt;</translation>
@@ -123,6 +125,7 @@
 <translation id="1559572115229829303">&lt;p&gt;No se puede establecer una conexión privada con <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> porque la fecha y la hora de tu dispositivo (<ph name="DATE_AND_TIME" />) no son correctas.&lt;/p&gt;
 
       &lt;p&gt;Ajusta la fecha y la hora en la sección &lt;strong&gt;General&lt;/strong&gt; de la aplicación &lt;strong&gt;Configuración&lt;/strong&gt;.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">Introducir fecha de vencimiento</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">Se ha producido un error al mostrar esta página web.</translation>
 <translation id="1592005682883173041">Acceso a datos locales</translation>
@@ -487,6 +490,7 @@
 <translation id="3658742229777143148">Revisión</translation>
 <translation id="366077651725703012">Actualizar tarjeta de crédito</translation>
 <translation id="3676592649209844519">ID del dispositivo:</translation>
+<translation id="3677008721441257057">Quizás quisiste decir: &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt;</translation>
 <translation id="3678029195006412963">No se ha podido firmar la solicitud</translation>
 <translation id="3678529606614285348">Abre una página en una nueva ventana de incógnito (Ctrl + Mayús + N).</translation>
 <translation id="3679803492151881375">Informe sobre fallos registrado el <ph name="CRASH_TIME" /> y subido el <ph name="UPLOAD_TIME" /></translation>
@@ -1093,6 +1097,7 @@
 <translation id="7220786058474068424">Procesando pago</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">El sitio web al que vas a acceder contiene software malicioso</translation>
+<translation id="724766306220616965">Advertencias, conflicto</translation>
 <translation id="724975217298816891">Introduce la fecha de caducidad y el código CVC de la tarjeta <ph name="CREDIT_CARD" /> para actualizar sus detalles. Cuando la confirmes, su información se compartirá con este sitio web.</translation>
 <translation id="7251437084390964440">La configuración de red no cumple el estándar ONC. Es posible que no se importen algunas partes de la configuración.
 Más información:
@@ -1105,6 +1110,7 @@
 <translation id="7300012071106347854">Azul cobalto</translation>
 <translation id="7302712225291570345">"<ph name="TEXT" />"</translation>
 <translation id="7309308571273880165">Informe sobre fallos registrado el <ph name="CRASH_TIME" /> (el usuario ha solicitado que se suba, pero aún no se ha hecho)</translation>
+<translation id="7313965965371928911">Advertencias de <ph name="BEGIN_LINK" />Navegación Segura<ph name="END_LINK" /></translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Ayuda de conexión</translation>
 <translation id="7334320624316649418">&amp;Rehacer reorganización</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb
index 37f312d..4a9d812 100644
--- a/components/strings/components_strings_fi.xtb
+++ b/components/strings/components_strings_fi.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">Sivusto sisältää vaarallisia sovelluksia</translation>
 <translation id="1348779747280417563">Vahvista nimi</translation>
 <translation id="1357195169723583938">Kuka on äskettäin käyttänyt laitetta ja milloin</translation>
+<translation id="1364822246244961190">Tämä käytäntö on estetty, sen arvo jätetään huomiotta.</translation>
 <translation id="1374468813861204354">ehdotuksia</translation>
 <translation id="1374692235857187091">Index-4x6 (postikortti)</translation>
 <translation id="1375198122581997741">Tietoja versiosta</translation>
@@ -105,6 +106,7 @@
 <translation id="1472675084647422956">Näytä enemmän</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">Valitse toimitusosoite</translation>
+<translation id="1492194039220927094">Käytäntöjen kehotusviestit:</translation>
 <translation id="1501859676467574491">Näytä Google-tilin kortit</translation>
 <translation id="1507202001669085618">&lt;p&gt;Näet tämän virheen, jos käyttämäsi Wi-Fi-portaali edellyttää kirjautumista ennen verkon käyttöä.&lt;/p&gt;
     &lt;p&gt;Korjaa virhe valitsemalla &lt;strong&gt;Yhdistä&lt;/strong&gt; sivulla, jota yrität avata.&lt;/p&gt;</translation>
@@ -125,6 +127,7 @@
 <translation id="1559572115229829303">&lt;p&gt;Verkkotunnukseen <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> ei voi muodostaa salattua yhteyttä, koska laitteesi aika ja päivämäärä (<ph name="DATE_AND_TIME" />) ovat virheelliset.&lt;/p&gt;
 
           &lt;p&gt;Muokkaa aikaa ja päivämäärää &lt;strong&gt;Asetukset&lt;/strong&gt;‑sovelluksen  &lt;strong&gt;Yleistä&lt;/strong&gt;‑osiossa.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">Lisää viimeinen voimassaolopäivä</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">Jokin meni vikaan tätä verkkosivua näytettäessä.</translation>
 <translation id="1592005682883173041">Tietojen paikallinen käyttö</translation>
@@ -496,6 +499,7 @@
 <translation id="3658742229777143148">Päivitetty versio</translation>
 <translation id="366077651725703012">Päivitä luottokortti</translation>
 <translation id="3676592649209844519">Laitteen tunnus:</translation>
+<translation id="3677008721441257057">Tarkoititko &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt;?</translation>
 <translation id="3678029195006412963">Pyynnön allekirjoittaminen epäonnistui.</translation>
 <translation id="3678529606614285348">Avaa sivu uudessa incognito-ikkunassa (Ctrl + Vaihto + N).</translation>
 <translation id="3679803492151881375">Kaatumisraportti tallennettu <ph name="CRASH_TIME" />, lähetetty <ph name="UPLOAD_TIME" /></translation>
@@ -1105,6 +1109,7 @@
 <translation id="7220786058474068424">Käsitellään.</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />, <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Seuraava verkkosivusto sisältää haittaohjelmia</translation>
+<translation id="724766306220616965">Varoituksia, ristiriita</translation>
 <translation id="724975217298816891">Päivitä kortin <ph name="CREDIT_CARD" /> tiedot antamalla sen CVC ja vanhenemispäivämäärä. Vahvistamisen jälkeen korttisi tiedot jaetaan sivuston kanssa.</translation>
 <translation id="7251437084390964440">Verkkoasetukset eivät noudata ONC-standardia. Kaikkia asetuksia ei välttämättä tuoda.
 Lisätietoja:
@@ -1117,6 +1122,7 @@
 <translation id="7300012071106347854">Koboltinsininen</translation>
 <translation id="7302712225291570345"><ph name="TEXT" /></translation>
 <translation id="7309308571273880165">Kaatumisraportti tallennettu <ph name="CRASH_TIME" /> (käyttäjä pyysi latausta, ei vielä ladattu)</translation>
+<translation id="7313965965371928911"><ph name="BEGIN_LINK" />Selaussuojan<ph name="END_LINK" /> varoitukset</translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Yhteysohjeet</translation>
 <translation id="7334320624316649418">&amp;Toista uudelleenjärjestely</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 667e0de9..4474b1ce 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">Naglalaman ng mga mapanganib na app ang pupuntahang site</translation>
 <translation id="1348779747280417563">Kumpirmahin ang pangalan</translation>
 <translation id="1357195169723583938">Sino ang gumamit sa device kamakailan at kailan</translation>
+<translation id="1364822246244961190">Naka-block ang patakarang ito, babalewalain ang value nito.</translation>
 <translation id="1374468813861204354">mga suhestiyon</translation>
 <translation id="1374692235857187091">Index-4x6 (Postcard)</translation>
 <translation id="1375198122581997741">Tungkol sa Bersyon</translation>
@@ -105,6 +106,7 @@
 <translation id="1472675084647422956">Magpakita ng higit pa</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">Pumili ng Address sa Pagpapadala</translation>
+<translation id="1492194039220927094">Pag-push ng mga patakaran:</translation>
 <translation id="1501859676467574491">Ipakita ang mga card mula sa iyong Google Account</translation>
 <translation id="1507202001669085618">&lt;p&gt;Makikita mo ang error na ito kung gumagamit ka ng Wi-Fi portal kung saan kailangan mong mag-sign in bago ka makapag-online.&lt;/p&gt;
     &lt;p&gt;Para maayos ang error, i-click ang &lt;strong&gt;Kumonekta&lt;/strong&gt; sa page na sinusubukan mong buksan.&lt;/p&gt;</translation>
@@ -125,6 +127,7 @@
 <translation id="1559572115229829303">&lt;p&gt;Hindi makapagtatag ng pribadong koneksyon sa <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> dahil mali ang petsa at oras ng iyong device (<ph name="DATE_AND_TIME" />).&lt;/p&gt;
 
       &lt;p&gt;Mangyaring isaayos ang petsa at oras mula sa seksyong &lt;strong&gt;Pangkalahatan&lt;/strong&gt; ng app na &lt;strong&gt;Mga Setting&lt;/strong&gt;.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">Ilagay ang petsa ng pag-expire</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">Nagkaroon ng problema habang ipinapakita ang webpage na ito.</translation>
 <translation id="1592005682883173041">Access sa Lokal na Data</translation>
@@ -495,6 +498,7 @@
 <translation id="3658742229777143148">Rebisyon</translation>
 <translation id="366077651725703012">I-update ang Credit Card</translation>
 <translation id="3676592649209844519">Device ID:</translation>
+<translation id="3677008721441257057">Ang ibig mo bang sabihin ay &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt;?</translation>
 <translation id="3678029195006412963">Hindi malagdaan ang kahilingan</translation>
 <translation id="3678529606614285348">Buksan ang page sa bagong Incognito window (Ctrl-Shift-N)</translation>
 <translation id="3679803492151881375">Nakuha ang ulat ng pag-crash noong <ph name="CRASH_TIME" />, na-upload noong <ph name="UPLOAD_TIME" /></translation>
@@ -1104,6 +1108,7 @@
 <translation id="7220786058474068424">Pinoproseso</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Naglalaman ng malware ang site</translation>
+<translation id="724766306220616965">Mga Babala, Pagsasalungat</translation>
 <translation id="724975217298816891">Ilagay ang petsa ng expiration at CVC para sa <ph name="CREDIT_CARD" /> upang i-update ang mga detalye ng iyong card. Kapag nagkumpirma ka na, ibabahagi ang mga detalye ng iyong card sa site na ito.</translation>
 <translation id="7251437084390964440">Hindi sumusunod ang configuration ng network sa pamantayan ng ONC. Hindi maaaring i-import ang mga bahagi ng configuration.
 Mga karagdagang detalye:
@@ -1116,6 +1121,7 @@
 <translation id="7300012071106347854">Cobalt Blue</translation>
 <translation id="7302712225291570345">"<ph name="TEXT" />"</translation>
 <translation id="7309308571273880165">Ulat ng pag-crash na nakuha noong <ph name="CRASH_TIME" /> (humiling ng pag-upload ang user, hindi pa naa-upload)</translation>
+<translation id="7313965965371928911">Mga babala sa <ph name="BEGIN_LINK" />Ligtas na Pag-browse<ph name="END_LINK" /></translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Tulong sa Koneksyon</translation>
 <translation id="7334320624316649418">&amp;Gawing muli ang pagbabago sa ayos</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index f26e4bcd..75d6d97 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">Ce site contient des applications dangereuses</translation>
 <translation id="1348779747280417563">Confirmer le nom</translation>
 <translation id="1357195169723583938">Utilisateurs récents de l'appareil et dates d'utilisation</translation>
+<translation id="1364822246244961190">Cette règle est bloquée. Sa valeur sera ignorée.</translation>
 <translation id="1374468813861204354">suggestions</translation>
 <translation id="1374692235857187091">Index-4x6 (carte postale)</translation>
 <translation id="1375198122581997741">À propos de la version</translation>
@@ -103,6 +104,7 @@
 <translation id="1472675084647422956">Plus</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">Sélectionner l'adresse de livraison</translation>
+<translation id="1492194039220927094">Diffusion push des règles :</translation>
 <translation id="1501859676467574491">Afficher les cartes de votre compte Google</translation>
 <translation id="1507202001669085618">&lt;p&gt;Ce message s'affiche si vous utilisez un portail Wi-Fi auquel vous devez vous connecter pour accéder à Internet.&lt;/p&gt;
     &lt;p&gt;Pour corriger cette erreur, cliquez sur &lt;strong&gt;Se connecter&lt;/strong&gt; sur la page que vous essayez d'ouvrir.&lt;/p&gt;</translation>
@@ -123,6 +125,7 @@
 <translation id="1559572115229829303">&lt;p&gt;Impossible d'établir une connexion privée à <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> : la date et l'heure de votre appareil (<ph name="DATE_AND_TIME" />) sont incorrectes.&lt;/p&gt;
 
       &lt;p&gt;Veuillez ajuster la date et l'heure dans la section &lt;strong&gt;Général&lt;/strong&gt; de l'application &lt;strong&gt;Réglages&lt;/strong&gt;.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">Saisir la date d'expiration</translation>
 <translation id="1581080074034554886">Code CVC :</translation>
 <translation id="1583429793053364125">Une erreur s'est produite lors de l'affichage de la page Web.</translation>
 <translation id="1592005682883173041">Accès aux données locales</translation>
@@ -487,6 +490,7 @@
 <translation id="3658742229777143148">Révision</translation>
 <translation id="366077651725703012">Mettre à jour la carte de crédit</translation>
 <translation id="3676592649209844519">ID de l'appareil :</translation>
+<translation id="3677008721441257057">Vouliez-vous accéder à &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt; ?</translation>
 <translation id="3678029195006412963">Impossible de signer la demande</translation>
 <translation id="3678529606614285348">Ouvrir la page dans une nouvelle fenêtre de navigation privée (Ctrl+Maj+N)</translation>
 <translation id="3679803492151881375">Rapport d'erreur enregistré le <ph name="CRASH_TIME" /> et importé le <ph name="UPLOAD_TIME" /></translation>
@@ -1093,6 +1097,7 @@
 <translation id="7220786058474068424">Traitement en cours</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" /> ; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Le site que vous allez ouvrir contient des logiciels malveillants</translation>
+<translation id="724766306220616965">Avertissements, conflit</translation>
 <translation id="724975217298816891">Saisissez la date d'expiration et le code CVC de la carte <ph name="CREDIT_CARD" /> pour mettre à jour les informations relatives à celle-ci. Une fois la validation effectuée, les informations seront partagées avec ce site.</translation>
 <translation id="7251437084390964440">La configuration du réseau ne respecte pas les normes de l'ONC. Il est possible que des parties de la configuration ne soient pas importées.
 Informations supplémentaires :
@@ -1105,6 +1110,7 @@
 <translation id="7300012071106347854">Bleu cobalt</translation>
 <translation id="7302712225291570345">"<ph name="TEXT" />"</translation>
 <translation id="7309308571273880165">Rapport d'erreur enregistré le <ph name="CRASH_TIME" /> (importation demandée par l'utilisateur, mais non effectuée)</translation>
+<translation id="7313965965371928911">Avertissements relatifs à la <ph name="BEGIN_LINK" />navigation sécurisée<ph name="END_LINK" /></translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Aide à la connexion</translation>
 <translation id="7334320624316649418">&amp;Rétablir la réorganisation</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb
index d977429..3302260 100644
--- a/components/strings/components_strings_iw.xtb
+++ b/components/strings/components_strings_iw.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">האתר שאתה עומד לעבור אליו מכיל יישומים מסוכנים</translation>
 <translation id="1348779747280417563">אישור השם</translation>
 <translation id="1357195169723583938">מי השתמש במכשיר לאחרונה ומתי</translation>
+<translation id="1364822246244961190">המדיניות הזו חסומה והמערכת תתעלם מהערך שלה.</translation>
 <translation id="1374468813861204354">הצעות</translation>
 <translation id="1374692235857187091">Index-4x6 (Postcard)‎</translation>
 <translation id="1375198122581997741">מידע על הגרסה</translation>
@@ -103,6 +104,7 @@
 <translation id="1472675084647422956">הצג יותר</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">בחירת כתובת למשלוח</translation>
+<translation id="1492194039220927094">דחיפת מדיניות:</translation>
 <translation id="1501859676467574491">‏הצגת כרטיסים מחשבון Google שלך</translation>
 <translation id="1507202001669085618">‏&lt;p&gt;השגיאה הזו תוצג אם אתם משתמשים בפורטל Wi-Fi שבו צריך להיכנס לחשבון לפני התחברות לרשת.&lt;/p&gt;
     &lt;p&gt;כדי לפתור את השגיאה, צריך ללחוץ על &lt;strong&gt;התחברות&lt;/strong&gt; בדף שמנסים לפתוח.&lt;/p&gt;</translation>
@@ -123,6 +125,7 @@
 <translation id="1559572115229829303">‏&lt;p&gt;לא ניתן ליצור חיבור פרטי אל <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> משום שהתאריך והשעה במכשיר שלך (<ph name="DATE_AND_TIME" />) שגויים.&lt;/p&gt;
 
       &lt;p&gt;שנה את התאריך והשעה בקטע &lt;strong&gt;כללי&lt;/strong&gt; באפליקציה &lt;strong&gt;הגדרות&lt;/strong&gt;‏.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">יש להזין תאריך תפוגה</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">משהו השתבש בעת הצגת דף אינטרנט זה.</translation>
 <translation id="1592005682883173041">גישה לנתונים מקומיים</translation>
@@ -487,6 +490,7 @@
 <translation id="3658742229777143148">גרסה קודמת</translation>
 <translation id="366077651725703012">עדכון כרטיס אשראי</translation>
 <translation id="3676592649209844519">מזהה מכשיר:</translation>
+<translation id="3677008721441257057">‏התכוונת לכתובת &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt;?</translation>
 <translation id="3678029195006412963">לא ניתן היה לחתום על הבקשה</translation>
 <translation id="3678529606614285348">‏פתח את הדף בחלון חדש של גלישה בסתר (Ctrl-Shift-N)</translation>
 <translation id="3679803492151881375">דוח קריסה תועד ב-<ph name="CRASH_TIME" />, הועלה ב-<ph name="UPLOAD_TIME" /></translation>
@@ -1098,6 +1102,7 @@
 <translation id="7220786058474068424">מעבד</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">האתר שלפניך מכיל תוכנה זדונית</translation>
+<translation id="724766306220616965">אזהרות, סתירה</translation>
 <translation id="724975217298816891">הזן את תאריך התפוגה ואת קוד האימות של <ph name="CREDIT_CARD" /> כדי לעדכן את פרטי הכרטיס. ברגע שתאשר, פרטי הכרטיס שלך ישותפו עם האתר הזה.</translation>
 <translation id="7251437084390964440">‏תצורת הרשת אינה תואמת לתקן ONC. ייתכן שחלקים מהתצורה לא ייכללו בייבוא.
 פרטים נוספים:
@@ -1110,6 +1115,7 @@
 <translation id="7300012071106347854">כחול קובלט</translation>
 <translation id="7302712225291570345">"<ph name="TEXT" />"</translation>
 <translation id="7309308571273880165">דוח הקריסה תועד ב<ph name="CRASH_TIME" /> (המשתמש ביקש העלאה, הדוח עדיין לא הועלה)</translation>
+<translation id="7313965965371928911">אזהרות <ph name="BEGIN_LINK" />גלישה בטוחה<ph name="END_LINK" /></translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">עזרה בחיבור</translation>
 <translation id="7334320624316649418">&amp;ביצוע מחדש של שינוי סדר</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index a29a84b3..be46ef29a 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">방문하려는 사이트에 위험한 앱이 있습니다.</translation>
 <translation id="1348779747280417563">이름 확인</translation>
 <translation id="1357195169723583938">최근에 기기를 사용한 사용자와 사용 시간</translation>
+<translation id="1364822246244961190">차단된 정책이므로 값이 무시됩니다.</translation>
 <translation id="1374468813861204354">제안사항</translation>
 <translation id="1374692235857187091">Index-4x6(엽서)</translation>
 <translation id="1375198122581997741">버전 정보</translation>
@@ -105,6 +106,7 @@
 <translation id="1472675084647422956">자세히 보기</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">배송지 주소 선택</translation>
+<translation id="1492194039220927094">정책 푸시:</translation>
 <translation id="1501859676467574491">Google 계정에 저장된 카드 표시</translation>
 <translation id="1507202001669085618">&lt;p&gt;온라인에 접속하기 위해 로그인해야 하는 Wi-Fi 포털을 사용하면 이 오류가 표시됩니다.&lt;/p&gt;
     &lt;p&gt;오류를 수정하려면 열려는 페이지에서 &lt;strong&gt;연결&lt;/strong&gt;을 클릭하세요.&lt;/p&gt;</translation>
@@ -125,6 +127,7 @@
 <translation id="1559572115229829303">&lt;p&gt;기기의 날짜와 시간(<ph name="DATE_AND_TIME" />)이 잘못되어 <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />에 비공개로 연결할 수 없습니다.&lt;/p&gt;
 
       &lt;p&gt;&lt;strong&gt;설정&lt;/strong&gt; 앱의 &lt;strong&gt;일반&lt;/strong&gt; 섹션에서 날짜와 시간을 맞추세요.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">만료일 입력</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">이 웹페이지를 표시하는 도중 문제가 발생했습니다.</translation>
 <translation id="1592005682883173041">로컬 데이터 액세스</translation>
@@ -495,6 +498,7 @@
 <translation id="3658742229777143148">개정</translation>
 <translation id="366077651725703012">신용카드 정보 업데이트</translation>
 <translation id="3676592649209844519">기기 ID:</translation>
+<translation id="3677008721441257057">&lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt;을(를) 찾으셨나요?</translation>
 <translation id="3678029195006412963">요청을 서명할 수 없음</translation>
 <translation id="3678529606614285348">새 시크릿 창에서 페이지 열기(Ctrl-Shift-N)</translation>
 <translation id="3679803492151881375"><ph name="CRASH_TIME" />에 캡처된 비정상 종료 보고서가 <ph name="UPLOAD_TIME" />에 업로드됨</translation>
@@ -1104,6 +1108,7 @@
 <translation id="7220786058474068424">처리 중</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">다음 사이트에 멀웨어가 있습니다.</translation>
+<translation id="724766306220616965">경고, 충돌</translation>
 <translation id="724975217298816891">카드 세부정보를 업데이트하려면 <ph name="CREDIT_CARD" /> 카드의 만료일과 CVC를 입력하세요. 카드를 확인하면 카드 세부정보가 이 사이트와 공유됩니다.</translation>
 <translation id="7251437084390964440">네트워크 설정이 ONC 표준을 준수하지 않습니다. 일부 설정을 가져오지 못했을 수도 있습니다.
 추가 세부정보:
@@ -1116,6 +1121,7 @@
 <translation id="7300012071106347854">코발트 녹색</translation>
 <translation id="7302712225291570345">‘<ph name="TEXT" />’</translation>
 <translation id="7309308571273880165"><ph name="CRASH_TIME" />에 캡처된 비정상 종료 보고서(사용자가 업로드를 요청했으나 아직 업로드되지 않음)</translation>
+<translation id="7313965965371928911"><ph name="BEGIN_LINK" />세이프 브라우징<ph name="END_LINK" /> 경고</translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">연결 도움말</translation>
 <translation id="7334320624316649418">재정렬 다시 실행(&amp;R)</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index c60d8f4..a7ad503 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">Nettstedet du er på vei til, inneholder farlige apper</translation>
 <translation id="1348779747280417563">Bekreft navnet</translation>
 <translation id="1357195169723583938">Personer som har brukt enheten i det siste, og når de har gjort det</translation>
+<translation id="1364822246244961190">Denne regelen er blokkert. Regelens verdi ignoreres.</translation>
 <translation id="1374468813861204354">forslagene</translation>
 <translation id="1374692235857187091">Index-4x6 (postkort)</translation>
 <translation id="1375198122581997741">Om versjon</translation>
@@ -105,6 +106,7 @@
 <translation id="1472675084647422956">Vis mer</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">Velg leveringsadresse</translation>
+<translation id="1492194039220927094">Push-levering av regler:</translation>
 <translation id="1501859676467574491">Vis kredittkort fra Google-kontoen din</translation>
 <translation id="1507202001669085618">&lt;p&gt;Du ser denne feilmeldingen hvis du bruker en Wi-Fi-portal hvor du må logge på før du kommer deg på nettet.&lt;/p&gt;
     &lt;p&gt;For å fikse feilen, klikk på &lt;strong&gt;Koble til&lt;/strong&gt; på siden du prøver å åpne.&lt;/p&gt;</translation>
@@ -125,6 +127,7 @@
 <translation id="1559572115229829303">&lt;p&gt;Vi kan ikke opprette noen privat tilkobling til <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />, fordi datoen og klokkeslettet (<ph name="DATE_AND_TIME" />) på enheten din er feil.&lt;/p&gt;
 
       &lt;p&gt;Juster datoen og klokkeslettet under &lt;strong&gt;Generelt&lt;/strong&gt; i &lt;strong&gt;Innstillinger&lt;/strong&gt;-appen.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">Oppgi utløpsdato</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">Noe gikk galt under åpningen av denne nettsiden.</translation>
 <translation id="1592005682883173041">Tilgang til lokale data</translation>
@@ -495,6 +498,7 @@
 <translation id="3658742229777143148">Versjon</translation>
 <translation id="366077651725703012">Oppdater kredittkortet</translation>
 <translation id="3676592649209844519">Enhets-ID:</translation>
+<translation id="3677008721441257057">Mente du &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt;?</translation>
 <translation id="3678029195006412963">Forespørselen kunne ikke undertegnes</translation>
 <translation id="3678529606614285348">Åpne siden i et nytt inkognitovindu (Ctrl + Shift + N)</translation>
 <translation id="3679803492151881375">Programstopprapport generert <ph name="CRASH_TIME" /> og lastet opp <ph name="UPLOAD_TIME" /></translation>
@@ -1104,6 +1108,7 @@
 <translation id="7220786058474068424">Behandler</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Nettstedet du er på vei til, inneholder skadelig programvare</translation>
+<translation id="724766306220616965">Advarsler, konflikt</translation>
 <translation id="724975217298816891">Skriv inn utløpsdatoen og verifiseringskoden for <ph name="CREDIT_CARD" /> for å oppdatere kortinformasjonen din. Når du bekrefter, deles denne informasjonen med dette nettstedet.</translation>
 <translation id="7251437084390964440">Nettverkskonfigurasjonen overholder ikke ONC-standarden. Deler av konfigurasjonen kan muligens ikke importeres. Mer informasjon:
 <ph name="DEBUG_INFO" /></translation>
@@ -1115,6 +1120,7 @@
 <translation id="7300012071106347854">Koboltblå</translation>
 <translation id="7302712225291570345">«<ph name="TEXT" />»</translation>
 <translation id="7309308571273880165">Programstopprapport opprettet <ph name="CRASH_TIME" /> (opplasting er forespurt av brukeren, men den har ikke blitt utført ennå)</translation>
+<translation id="7313965965371928911"><ph name="BEGIN_LINK" />Safe Browsing<ph name="END_LINK" />-advarsler</translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Tilkoblingshjelp</translation>
 <translation id="7334320624316649418">&amp;Omorganiser likevel</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index 698a9cb..3960e24 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -522,7 +522,7 @@
 <translation id="3810973564298564668">Настроить</translation>
 <translation id="382518646247711829">Если вы используете прокси-сервер...</translation>
 <translation id="3828924085048779000">Пустые кодовые фразы запрещены.</translation>
-<translation id="3831915413245941253">Администратор <ph name="ENROLLMENT_DOMAIN" /> установил расширения для браузера, у которых есть доступ к некоторым вашим данным.</translation>
+<translation id="3831915413245941253">Администратор <ph name="ENROLLMENT_DOMAIN" /> установил расширения с дополнительными функциями для браузера. У расширений есть доступ к некоторым вашим данным.</translation>
 <translation id="385051799172605136">Назад</translation>
 <translation id="3858027520442213535">Обновить дату и время</translation>
 <translation id="3884278016824448484">Конфликт идентификаторов устройств</translation>
@@ -844,7 +844,7 @@
 <translation id="563324245173044180">Мошеннический контент заблокирован</translation>
 <translation id="5659593005791499971">Электронная почта</translation>
 <translation id="5663614846592581799">9x11 (конверт)</translation>
-<translation id="5663955426505430495">Администратор устройства установил дополнительные расширения, у которых есть доступ к некоторым вашим данным.</translation>
+<translation id="5663955426505430495">Администратор устройства установил расширения с дополнительными функциями для браузера. У расширений есть доступ к некоторым вашим данным.</translation>
 <translation id="5675650730144413517">Страница недоступна</translation>
 <translation id="5684874026226664614">Не удалось перевести страницу</translation>
 <translation id="5685654322157854305">Добавить адрес доставки посылок</translation>
@@ -1171,7 +1171,7 @@
 <translation id="7554791636758816595">Новая вкладка</translation>
 <translation id="7564049878696755256">Кто-то посторонний мог получить доступ к вашим личным данным или аккаунту в домене <ph name="ORG_NAME" />. Рекомендуем немедленно сменить пароль.</translation>
 <translation id="7567204685887185387">Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Его сертификат безопасности мог быть выдан обманным путем. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.</translation>
-<translation id="7568105740864181217">Этим браузером управляет администратор компании, учебного заведения или другой организации. Администратор может удаленно менять настройки браузера и выполнять другие действия вне Chrome на этом устройстве. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
+<translation id="7568105740864181217">Этим браузером управляет компания, учебное заведение или другая организация. Администратор может удаленно менять настройки браузера и выполнять другие действия вне браузера Chrome на этом устройстве. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
 <translation id="7569952961197462199">Удалить кредитную карту из Chrome?</translation>
 <translation id="7569983096843329377">Черный</translation>
 <translation id="7578104083680115302">Быстро оплачивайте покупки на сайтах и в приложениях с помощью карт, сохраненных в Google Payments. Настройка будет действовать на всех ваших устройствах.</translation>
@@ -1277,7 +1277,7 @@
 <translation id="8100588592594801589">Недействительные карты удалены.</translation>
 <translation id="8103161714697287722">Способ оплаты</translation>
 <translation id="8118489163946903409">Способ оплаты</translation>
-<translation id="8123836779274890062">Устройство <ph name="DEVICE_TYPE" /> управляется администратором <ph name="ENROLLMENT_DOMAIN" /></translation>
+<translation id="8123836779274890062">Устройство <ph name="DEVICE_TYPE" /> управляется <ph name="ENROLLMENT_DOMAIN" /></translation>
 <translation id="8127301229239896662">Программа "<ph name="SOFTWARE_NAME" />" была установлена неправильно. Обратитесь за помощью к системному администратору.</translation>
 <translation id="8131740175452115882">Подтвердить</translation>
 <translation id="8149426793427495338">Ваш компьютер перешел в спящий режим.</translation>
@@ -1304,7 +1304,7 @@
 <translation id="825929999321470778">Показать все сохраненные пароли</translation>
 <translation id="8261506727792406068">Удалить</translation>
 <translation id="8267698848189296333">Вход в аккаунт <ph name="USERNAME" /></translation>
-<translation id="8278457561961988242">У администратора <ph name="ENROLLMENT_DOMAIN" /> есть право удаленно менять настройки этого браузера и выполнять другие действия вне Chrome на этом устройстве. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
+<translation id="8278457561961988242">У администратора <ph name="ENROLLMENT_DOMAIN" /> есть право удаленно менять настройки этого браузера и выполнять другие действия вне браузера Chrome на этом устройстве. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
 <translation id="8281084378435768645">Large-Photo</translation>
 <translation id="8286036467436129157">Вход</translation>
 <translation id="8288807391153049143">Показать сертификат</translation>
@@ -1427,7 +1427,7 @@
 <translation id="9065745800631924235">Поисковый запрос "<ph name="TEXT" />" из истории</translation>
 <translation id="9069693763241529744">Заблокировано расширением</translation>
 <translation id="9076283476770535406">Может содержать контент для взрослых</translation>
-<translation id="9076630408993835509">Администратор компании или организации не управляет этим браузером, но ему могут быть доступны другие действия вне Chrome на этом устройстве. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
+<translation id="9076630408993835509">Компания или организация не управляет этим браузером. Действиями на этом устройстве можно управлять вне браузера Chrome. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
 <translation id="9078964945751709336">Информации недостаточно</translation>
 <translation id="9080712759204168376">Информация о заказе</translation>
 <translation id="9103872766612412690">На сайте <ph name="SITE" /> для защиты ваших данных обычно используется шифрование. Однако учетные данные, которые мы получили от сайта <ph name="SITE" /> сейчас, отличаются от тех, которые он отправляет обычно. Вероятно, вредоносный сайт пытается выдать себя за <ph name="SITE" />, либо страница подключения к сети Wi-Fi прервала соединение. Ваша информация по-прежнему в безопасности, так как браузер Chromium разорвал соединение до того, как произошел обмен данными.</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb
index 7e80080f..5ee7265 100644
--- a/components/strings/components_strings_sv.xtb
+++ b/components/strings/components_strings_sv.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">Det finns farliga appar på webbplatsen du är på väg till</translation>
 <translation id="1348779747280417563">Bekräfta namn</translation>
 <translation id="1357195169723583938">Vem har använt enheten nyligen och när</translation>
+<translation id="1364822246244961190">Den här principen är blockerad. Dess värde ignoreras.</translation>
 <translation id="1374468813861204354">förslag</translation>
 <translation id="1374692235857187091">Index-4x6 (vykort)</translation>
 <translation id="1375198122581997741">Om version</translation>
@@ -105,6 +106,7 @@
 <translation id="1472675084647422956">Visa fler</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">Välj leveransadress</translation>
+<translation id="1492194039220927094">Skicka principer:</translation>
 <translation id="1501859676467574491">Visa kort från ditt Google-konto</translation>
 <translation id="1507202001669085618">&lt;p&gt;Felmeddelandet visas om du använder en Wi-Fi-portal där du måste logga in innan du kommer ut på internet.&lt;/p&gt;
     &lt;p&gt;Åtgärda problemet genom att klicka på &lt;strong&gt;Anslut&lt;/strong&gt; på sidan du försöker öppna.&lt;/p&gt;</translation>
@@ -125,6 +127,7 @@
 <translation id="1559572115229829303">&lt;p&gt;Det gick inte att upprätta en privat anslutning till <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> eftersom enhetens datum och tid (<ph name="DATE_AND_TIME" />) inte stämmer.&lt;/p&gt;
 
       &lt;p&gt;Ändra datumet och tiden under &lt;strong&gt;Allmänt&lt;/strong&gt; i appen &lt;strong&gt;Inställningar&lt;/strong&gt;.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">Ange sista giltighetsdatum</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">Ett fel uppstod när webbsidan skulle visas.</translation>
 <translation id="1592005682883173041">Lokal dataåtkomst</translation>
@@ -495,6 +498,7 @@
 <translation id="3658742229777143148">Version</translation>
 <translation id="366077651725703012">Uppdatera kreditkortet</translation>
 <translation id="3676592649209844519">Enhets-id:</translation>
+<translation id="3677008721441257057">Menade du &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt;?</translation>
 <translation id="3678029195006412963">Begäran kunde inte signeras</translation>
 <translation id="3678529606614285348">Öppna sidan i ett nytt inkognitofönster (Ctrl-Skift-N)</translation>
 <translation id="3679803492151881375">Kraschrapporten skapades den <ph name="CRASH_TIME" /> och laddades upp den <ph name="UPLOAD_TIME" /></translation>
@@ -1104,6 +1108,7 @@
 <translation id="7220786058474068424">Bearbetning pågår</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Det förekommer skadlig programvara på följande sida</translation>
+<translation id="724766306220616965">Varningar, konflikt</translation>
 <translation id="724975217298816891">Ange utgångsdatum och CVC-kod för <ph name="CREDIT_CARD" /> om du vill uppdatera kortinformationen. När du bekräftar delas kortinformationen med den här webbplatsen.</translation>
 <translation id="7251437084390964440">Nätverkskonfigurationen uppfyller inte ONC-standarden. Det kan hända att delar av konfigurationen inte kan importeras.
 Mer information.
@@ -1116,6 +1121,7 @@
 <translation id="7300012071106347854">Koboltblå</translation>
 <translation id="7302712225291570345"><ph name="TEXT" /></translation>
 <translation id="7309308571273880165">Felrapport som skapades <ph name="CRASH_TIME" /> (uppladdning begärdes av användaren, har ännu inte laddats upp)</translation>
+<translation id="7313965965371928911">Varningar från <ph name="BEGIN_LINK" />Säker webbsökning<ph name="END_LINK" /></translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Anslutningshjälp</translation>
 <translation id="7334320624316649418">&amp;Gör om Ändra ordning</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index bcb3ae7a..d2558e7 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">தளத்தில் ஆபத்தான பயன்பாடுகள் உள்ளன</translation>
 <translation id="1348779747280417563">பெயரை உறுதிப்படுத்தவும்</translation>
 <translation id="1357195169723583938">சமீபத்தில் சாதனத்தை யார், எப்போது பயன்படுத்தியது</translation>
+<translation id="1364822246244961190">இந்தக் கொள்கை தடைசெய்யப்பட்டுள்ளது, இதன் மதிப்பு புறக்கணிக்கப்படும்.</translation>
 <translation id="1374468813861204354">பரிந்துரைகள்</translation>
 <translation id="1374692235857187091">Index-4x6 (போஸ்ட்கார்டு)</translation>
 <translation id="1375198122581997741">பதிப்பைப் பற்றி</translation>
@@ -105,6 +106,7 @@
 <translation id="1472675084647422956">மேலும் காண்பி</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">ஷிப்பிங் முகவரியைத் தேர்வு செய்</translation>
+<translation id="1492194039220927094">கொள்கைகள் புஷ்:</translation>
 <translation id="1501859676467574491">எனது Google கணக்கிலிருந்து கார்டுகளைக் காண்பி</translation>
 <translation id="1507202001669085618">&lt;p&gt;சில வைஃபை போர்ட்டல்களில், இணையத்தைப் பயன்படுத்தும் முன்பு நீங்கள் உள்நுழைய வேண்டியிருக்கும். அதுபோன்ற போர்ட்டல்களைப் பயன்படுத்தினால், இந்தப் பிழையைப் பார்ப்பீர்கள்.&lt;/p&gt;
     &lt;p&gt;பிழையைச் சரிசெய்ய, நீங்கள் திறக்க முயலும் பக்கத்தில் உள்ள &lt;strong&gt;இணை&lt;/strong&gt; என்பதைக் கிளிக் செய்யவும்.&lt;/p&gt;</translation>
@@ -125,6 +127,7 @@
 <translation id="1559572115229829303">&lt;p&gt;உங்கள் சாதனத்தின் தேதி மற்றும் நேரம் (<ph name="DATE_AND_TIME" />) தவறாக இருப்பதால் <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> என்கிற டொமைனிற்குத் தனிப்பட்ட இணைப்பை ஏற்படுத்த முடியவில்லை.&lt;/p&gt;
 
       &lt;p&gt;தேதி மற்றும் நேரத்தை &lt;strong&gt;அமைப்புகள்&lt;/strong&gt; பயன்பாட்டின் &lt;strong&gt;பொது&lt;/strong&gt; என்கிற பகுதியில் மாற்றவும்.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">காலாவதித் தேதியை உள்ளிடவும்</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">இந்த இணையப்பக்கத்தைக் காட்டும்போது ஏதோ தவறு ஏற்பட்டது.</translation>
 <translation id="1592005682883173041">அகத் தரவு அணுகல்</translation>
@@ -492,6 +495,7 @@
 <translation id="3658742229777143148">மீள்திருத்தங்கள்</translation>
 <translation id="366077651725703012">கிரெடிட் கார்டைப் புதுப்பி</translation>
 <translation id="3676592649209844519">சாதன ஐடி:</translation>
+<translation id="3677008721441257057">இதைக் குறிப்பிட்டீர்களா: &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt;?</translation>
 <translation id="3678029195006412963">கோரிக்கையில் கையொப்பமிட முடியவில்லை</translation>
 <translation id="3678529606614285348">புதிய மறைநிலைச் சாளரத்தில் பக்கத்தைத் திறக்கவும் (Ctrl-Shift-N)</translation>
 <translation id="3679803492151881375"><ph name="CRASH_TIME" /> அன்று சிதைவு அறிக்கை பதிவுசெய்யப்பட்டு, <ph name="UPLOAD_TIME" /> அன்று பதிவேற்றப்பட்டது</translation>
@@ -1100,6 +1104,7 @@
 <translation id="7220786058474068424">செயல்படுத்துகிறது</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">தளத்தில் தீம்பொருள் உள்ளது</translation>
+<translation id="724766306220616965">எச்சரிக்கைகள், முரண்பாடு</translation>
 <translation id="724975217298816891">கார்டு விவரங்களைப் புதுப்பிக்க, <ph name="CREDIT_CARD" /> இன் காலாவதி தேதியையும் CVC எண்ணையும் உள்ளிடவும். உறுதிசெய்த பின்னர், உங்கள் கார்டு விவரங்கள் இந்தத் தளத்திற்குப் பகிரப்படும்.</translation>
 <translation id="7251437084390964440">நெட்வொர்க் உள்ளமைவானது ONC தரத்துடன் இணங்கவில்லை. உள்ளமைவின் பகுதிகள் இறக்குமதியாகாமல் போகக்கூடும்.
 கூடுதல் விவரங்கள்:
@@ -1112,6 +1117,7 @@
 <translation id="7300012071106347854">அடர் நீலம்</translation>
 <translation id="7302712225291570345">"<ph name="TEXT" />"</translation>
 <translation id="7309308571273880165"><ph name="CRASH_TIME" /> அன்று சிதைவு அறிக்கை பெறப்பட்டது (பயனர் பதிவேற்றக் கோரியுள்ளார், இன்னும் பதிவேற்றப்படவில்லை)</translation>
+<translation id="7313965965371928911"><ph name="BEGIN_LINK" />பாதுகாப்பு உலாவல்<ph name="END_LINK" /> எச்சரிக்கைகள்</translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">இணைப்பிற்கான உதவி</translation>
 <translation id="7334320624316649418">&amp;மறுவரிசைப்படுத்தலை மீண்டும் செய்</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index 37b4282..23681188 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -85,6 +85,7 @@
 <translation id="1348198688976932919">రాబోయే సైట్‌లో హానికరమైన యాప్‌లు ఉన్నాయి</translation>
 <translation id="1348779747280417563">పేరును నిర్ధారించండి</translation>
 <translation id="1357195169723583938">పరికరాన్ని ఇటీవల ఎవరెవరు, ఏయే సమయాలలో ఉపయోగించారు</translation>
+<translation id="1364822246244961190">ఈ విధానాన్ని బ్లాక్ చేస్తే, దీని విలువ విస్మరించబడుతుంది.</translation>
 <translation id="1374468813861204354">సూచనలు</translation>
 <translation id="1374692235857187091">సూచిక-4x6 (పోస్ట్‌కార్డ్)</translation>
 <translation id="1375198122581997741">వెర్షన్ గురించి</translation>
@@ -105,6 +106,7 @@
 <translation id="1472675084647422956">మరిన్ని చూపించు</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">షిప్పింగ్ చిరునామాను ఎంచుకోండి</translation>
+<translation id="1492194039220927094">విధానాలను పుష్ చేయి:</translation>
 <translation id="1501859676467574491">మీ Google ఖాతా నుండి కార్డ్‌లను చూపండి</translation>
 <translation id="1507202001669085618">&lt;p&gt;ఆన్‌లైన్‌కు వెళ్లగలిగే ముందు సైన్ ఇన్ చేయాల్సిన అవసరం ఉన్న Wi-Fi పోర్టల్‌ను మీరు ఉపయోగిస్తున్నట్లయితే మీకు ఈ ఎర్రర్ కనిపిస్తుంది.&lt;/p&gt;
     &lt;p&gt;ఎర్రర్‌ను పరిష్కరించడానికి, మీరు తెరవాలనుకుంటున్న పేజీలో &lt;strong&gt;కనెక్ట్ చేయి&lt;/strong&gt;ని నొక్కండి.&lt;/p&gt;</translation>
@@ -125,6 +127,7 @@
 <translation id="1559572115229829303">&lt;p&gt;మీ పరికరం తేదీ మరియు సమయం తప్పుగా (<ph name="DATE_AND_TIME" />) ఉన్నందున, <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />కు ప్రైవేట్ కనెక్షన్ ఏర్పాటు చేయడం సాధ్యపడలేదు.&lt;/p&gt;
 
       &lt;p&gt;&lt;strong&gt;సెట్టింగ్‌లు&lt;/strong&gt; యాప్ యొక్క &lt;strong&gt;సాధారణం&lt;/strong&gt; విభాగంలో తేదీ మరియు సమయాన్ని దయచేసి సర్దుబాటు చేయండి.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">గడువు ముగింపు తేదీని నమోదు చేయండి</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">ఈ వెబ్ పేజీని ప్రదర్శిస్తున్నప్పుడు ఏదో తప్పు జరిగింది.</translation>
 <translation id="1592005682883173041">స్థానిక డేటా యాక్సెస్</translation>
@@ -489,6 +492,7 @@
 <translation id="3658742229777143148">పునర్విమర్శ</translation>
 <translation id="366077651725703012">క్రెడిట్ కార్డ్‌ని అప్‌డేట్ చేయి</translation>
 <translation id="3676592649209844519">పరికర ID:</translation>
+<translation id="3677008721441257057">మీరు &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt; గురించి అభ్యర్థిస్తున్నారా?</translation>
 <translation id="3678029195006412963">అభ్యర్థనకు సంతకం అందించడం సాధ్యపడలేదు</translation>
 <translation id="3678529606614285348">కొత్త అజ్ఞాత విండోలో పేజీని తెరవండి (Ctrl-Shift-N)</translation>
 <translation id="3679803492151881375">క్రాష్ నివేదిక <ph name="CRASH_TIME" />కి క్యాప్చర్ చేయబడింది, <ph name="UPLOAD_TIME" />కి అప్‌లోడ్ చేయబడింది</translation>
@@ -1095,6 +1099,7 @@
 <translation id="7220786058474068424">ప్రాసెస్ చేస్తోంది</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">ముందున్న సైట్‌లో మాల్వేర్ ఉంది</translation>
+<translation id="724766306220616965">హెచ్చరికలు, వైరుధ్యం</translation>
 <translation id="724975217298816891">మీ కార్డ్ వివరాలను అప్‌డేట్ చేయడానికి <ph name="CREDIT_CARD" /> కార్డ్ గడువు ముగింపు తేదీ మరియు CVCని నమోదు చేయండి. మీరు నిర్ధారించిన తర్వాత, మీ కార్డ్ వివరాలు ఈ సైట్‌తో షేర్ చేయబడతాయి.</translation>
 <translation id="7251437084390964440">నెట్‌వర్క్ కాన్ఫిగరేషన్ ONC ప్రమాణానికి అనుకూలంగా లేదు. కాన్ఫిగరేషన్‌లోని భాగాలు దిగుమతి కాకపోయి ఉండకపోవచ్చు.
 అదనపు వివరాలు:
@@ -1107,6 +1112,7 @@
 <translation id="7300012071106347854">నల్ల కావిరాయి నీలం</translation>
 <translation id="7302712225291570345">"<ph name="TEXT" />"</translation>
 <translation id="7309308571273880165"><ph name="CRASH_TIME" /> తేదీన క్యాప్చర్ చేసిన క్రాష్ నివేదిక (అప్‌లోడ్ చేయాల్సిందిగా వినియోగదారుకు అభ్యర్థన, ఇంకా అప్‌లోడ్ చేయలేదు)</translation>
+<translation id="7313965965371928911"><ph name="BEGIN_LINK" />సురక్షిత బ్రౌజింగ్<ph name="END_LINK" /> హెచ్చరికలు</translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">కనెక్షన్ సహాయం</translation>
 <translation id="7334320624316649418">&amp;మళ్లీ క్రమం చేయడాన్ని పునరావృతం చేయి</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index e159fdd..8a4cec5a 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">ไซต์ที่จะเปิดมีแอปอันตราย</translation>
 <translation id="1348779747280417563">ยืนยันชื่อ</translation>
 <translation id="1357195169723583938">ผู้ใดใช้อุปกรณ์เมื่อเร็วๆ นี้และใช้เมื่อใด</translation>
+<translation id="1364822246244961190">นโยบายนี้ถูกล็อกอยู่ ระบบจะไม่สนใจค่าของนโยบายนี้</translation>
 <translation id="1374468813861204354">คำแนะนำ</translation>
 <translation id="1374692235857187091">Index-4x6 (โปสการ์ด)</translation>
 <translation id="1375198122581997741">เกี่ยวกับรุ่น</translation>
@@ -105,6 +106,7 @@
 <translation id="1472675084647422956">แสดงเพิ่มเติม</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">เลือกที่อยู่สำหรับจัดส่ง</translation>
+<translation id="1492194039220927094">การพุชนโยบาย:</translation>
 <translation id="1501859676467574491">แสดงบัตรจากบัญชี Google ของคุณ</translation>
 <translation id="1507202001669085618">&lt;p&gt;คุณจะเห็นข้อผิดพลาดนี้ หากใช้พอร์ทัล Wi-Fi ที่คุณต้องลงชื่อเข้าใช้ก่อนจึงจะสามารถออนไลน์ได้&lt;/p&gt;
     &lt;p&gt;ในการแก้ไขข้อผิดพลาด ให้คลิก&lt;strong&gt;เชื่อมต่อ&lt;/strong&gt;บนหน้าเว็บที่คุณพยายามจะเปิด&lt;/p&gt;</translation>
@@ -125,6 +127,7 @@
 <translation id="1559572115229829303">&lt;p&gt;ไม่สามารถสร้างการเชื่อมต่อส่วนตัวไปที่ <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> เนื่องจากวันที่และเวลา (<ph name="DATE_AND_TIME" />) ในอุปกรณ์ไม่ถูกต้อง&lt;/p&gt;
 
       &lt;p&gt;โปรดปรับวันที่และเวลาจากหัวข้อ&lt;strong&gt;ทั่วไป&lt;/strong&gt;ในแอป&lt;strong&gt;การตั้งค่า&lt;/strong&gt;&lt;/p&gt;</translation>
+<translation id="1569487616857761740">ป้อนวันที่หมดอายุ</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">มีสิ่งผิดปกติเกิดขึ้นในขณะที่แสดงหน้าเว็บนี้</translation>
 <translation id="1592005682883173041">การเข้าถึงข้อมูลในเครื่อง</translation>
@@ -494,6 +497,7 @@
 <translation id="3658742229777143148">การแก้ไข</translation>
 <translation id="366077651725703012">อัปเดตบัตรเครดิต</translation>
 <translation id="3676592649209844519">รหัสอุปกรณ์:</translation>
+<translation id="3677008721441257057">คุณหมายถึง &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt; ใช่ไหม</translation>
 <translation id="3678029195006412963">ไม่สามารถลงนามคำขอ</translation>
 <translation id="3678529606614285348">เปิดหน้าเว็บในหน้าต่างที่ไม่ระบุตัวตนใหม่ (Ctrl-Shift-N)</translation>
 <translation id="3679803492151881375">รายงานข้อขัดข้องเมื่อ <ph name="CRASH_TIME" /> อัปโหลดเมื่อ <ph name="UPLOAD_TIME" /></translation>
@@ -1103,6 +1107,7 @@
 <translation id="7220786058474068424">กำลังดำเนินการ</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" /> <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">ไซต์ที่จะเปิดมีมัลแวร์</translation>
+<translation id="724766306220616965">คำเตือนและความขัดแย้ง</translation>
 <translation id="724975217298816891">ป้อนวันหมดอายุและ CVC สำหรับ <ph name="CREDIT_CARD" /> เพื่ออัปเดตรายละเอียดของบัตร เมื่อคุณยืนยันแล้ว รายละเอียดบัตรของคุณจะแชร์กับเว็บไซต์นี้</translation>
 <translation id="7251437084390964440">การกำหนดค่าเครือข่ายไม่เป็นไปตามมาตรฐาน ONC ระบบอาจไม่นำเข้าการกำหนดค่าบางส่วน
 รายละเอียดเพิ่มเติม:
@@ -1115,6 +1120,7 @@
 <translation id="7300012071106347854">น้ำเงินเข้ม</translation>
 <translation id="7302712225291570345">"<ph name="TEXT" />"</translation>
 <translation id="7309308571273880165">รายงานข้อขัดข้องเมื่อ <ph name="CRASH_TIME" /> (ผู้ใช้ขอการอัปโหลด ยังไม่ได้อัปโหลด)</translation>
+<translation id="7313965965371928911">คำเตือน <ph name="BEGIN_LINK" />Google Safe Browsing<ph name="END_LINK" /></translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">ความช่วยเหลือเกี่ยวกับการเชื่อมต่อ</translation>
 <translation id="7334320624316649418">&amp;ทำซ้ำการจัดลำดับใหม่</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb
index 74fa1fe1..b0383a4d 100644
--- a/components/strings/components_strings_tr.xtb
+++ b/components/strings/components_strings_tr.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">Girmekte olduğunuz site tehlikeli uygulamalar içeriyor</translation>
 <translation id="1348779747280417563">Adı onaylayın</translation>
 <translation id="1357195169723583938">Cihazı son zamanlarda kimin ne zaman kullandığı</translation>
+<translation id="1364822246244961190">Bu politika engellendiği için politikanın değeri yoksayılacak.</translation>
 <translation id="1374468813861204354">öneriler</translation>
 <translation id="1374692235857187091">Index-4x6 (Kartpostal)</translation>
 <translation id="1375198122581997741">Sürüm Hakkında</translation>
@@ -105,6 +106,7 @@
 <translation id="1472675084647422956">Daha fazla göster</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">Gönderim Adresi Seç</translation>
+<translation id="1492194039220927094">Politikalar aktarılabilir:</translation>
 <translation id="1501859676467574491">Google Hesabımdaki kartları göster</translation>
 <translation id="1507202001669085618">&lt;p&gt;İnternete girmek için oturum açmanızı gerektiren bir kablosuz portal kullanıyorsanız bu hatayı görürsünüz.&lt;/p&gt;
     &lt;p&gt;Hatayı gidermek için, açmaya çalıştığınız sayfada &lt;strong&gt;Bağlan&lt;/strong&gt;'ı tıklayın.&lt;/p&gt;</translation>
@@ -125,6 +127,7 @@
 <translation id="1559572115229829303">&lt;p&gt;Cihazınızın tarih ve saati (<ph name="DATE_AND_TIME" />) yanlış olduğundan <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> alan adına gizli bir bağlantı kurulamadı.&lt;/p&gt;
 
       &lt;p&gt;Lütfen &lt;strong&gt;Ayarlar&lt;/strong&gt; uygulamasının &lt;strong&gt;Genel&lt;/strong&gt; bölümünden tarih ve saati ayarlayın.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">Son kullanma tarihi girin</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">Bu web sayfasını görüntülerken bir hata oluştu.</translation>
 <translation id="1592005682883173041">Yerel Veri Erişimi</translation>
@@ -495,6 +498,7 @@
 <translation id="3658742229777143148">Düzeltme</translation>
 <translation id="366077651725703012">Kredi Kartını Güncelle</translation>
 <translation id="3676592649209844519">Cihaz kimliği:</translation>
+<translation id="3677008721441257057">&lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt; adresine gitmek mi istemiştiniz?</translation>
 <translation id="3678029195006412963">İstek imzalanamadı</translation>
 <translation id="3678529606614285348">Sayfayı yeni Gizli pencerede açın (Ctrl-Üst Karakter-N)</translation>
 <translation id="3679803492151881375">Kilitlenme raporunun oluşturulma zamanı: <ph name="CRASH_TIME" />, raporun yüklenme zamanı: <ph name="UPLOAD_TIME" /></translation>
@@ -1104,6 +1108,7 @@
 <translation id="7220786058474068424">İşleme koyuluyor</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Gideceğiniz site kötü amaçlı yazılım içeriyor</translation>
+<translation id="724766306220616965">Uyarılar, Çakışma</translation>
 <translation id="724975217298816891">Kart ayrıntılarınızı güncellemek için <ph name="CREDIT_CARD" /> numaralı karta ilişkin son kullanma tarihini ve CVC kodunu girin. Onayladığınızda kart ayrıntılarınız bu siteyle paylaşılacaktır.</translation>
 <translation id="7251437084390964440">Ağ yapılandırması ONC standardına uymuyor. Yapılandırmanın bazı bölümleri içe aktarılamaz.
 Ek ayrıntılar:
@@ -1116,6 +1121,7 @@
 <translation id="7300012071106347854">Çini Mavisi</translation>
 <translation id="7302712225291570345">"<ph name="TEXT" />"</translation>
 <translation id="7309308571273880165">Kilitlenme raporu yakalandı (<ph name="CRASH_TIME" />) (yükleme kullanıcı tarafından istendi, ancak henüz yüklenmedi)</translation>
+<translation id="7313965965371928911"><ph name="BEGIN_LINK" />Güvenli Tarama<ph name="END_LINK" /> uyarıları</translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Bağlantı Yardımı</translation>
 <translation id="7334320624316649418">Sıralama değişikliğini &amp;yeniden yap</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb
index cdab5a7..fe8a4b46 100644
--- a/components/strings/components_strings_uk.xtb
+++ b/components/strings/components_strings_uk.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">Сайт містить небезпечні додатки</translation>
 <translation id="1348779747280417563">Підтвердити назву</translation>
 <translation id="1357195169723583938">Хто й коли нещодавно користувався пристроєм</translation>
+<translation id="1364822246244961190">Це правило заблоковано. Його значення ігноруватиметься.</translation>
 <translation id="1374468813861204354">пропозиції</translation>
 <translation id="1374692235857187091">Index-4x6 (листівка)</translation>
 <translation id="1375198122581997741">Про версію</translation>
@@ -105,6 +106,7 @@
 <translation id="1472675084647422956">Показати більше</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">Вибрати адресу доставки</translation>
+<translation id="1492194039220927094">Сповіщення про правила:</translation>
 <translation id="1501859676467574491">Показує картки з облікового запису Google</translation>
 <translation id="1507202001669085618">&lt;p&gt;Це повідомлення про помилку з’являється, якщо ви користуєтеся порталом Wi-Fi, на який потрібно ввійти, перш ніж підключитися до мережі.&lt;/p&gt;
     &lt;p&gt;Щоб виправити цю помилку, натисніть &lt;strong&gt;Підключитися&lt;/strong&gt; на сторінці, яку ви намагаєтеся відкрити.&lt;/p&gt;</translation>
@@ -125,6 +127,7 @@
 <translation id="1559572115229829303">&lt;p&gt;Не вдається встановити конфіденційне з’єднання із сайтом <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />, оскільки на вашому пристрої неправильно налаштовано дату й час (<ph name="DATE_AND_TIME" />).&lt;/p&gt;
 
       &lt;p&gt;Налаштуйте дату й час у розділі &lt;strong&gt;Загальні&lt;/strong&gt; додатка &lt;strong&gt;Налаштування&lt;/strong&gt;.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">Введіть дату закінчення терміну дії</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">Під час показу цієї сторінки сталася помилка.</translation>
 <translation id="1592005682883173041">Доступ до локальних даних</translation>
@@ -495,6 +498,7 @@
 <translation id="3658742229777143148">Редакція</translation>
 <translation id="366077651725703012">Оновити кредитну картку</translation>
 <translation id="3676592649209844519">Ідентифікатор пристрою:</translation>
+<translation id="3677008721441257057">Ви мали на увазі &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt;?</translation>
 <translation id="3678029195006412963">Не вдалося підписати запит</translation>
 <translation id="3678529606614285348">Відкрийте сторінку в анонімному вікні (Ctrl+Shift+N)</translation>
 <translation id="3679803492151881375">Звіт про аварійне завершення роботи створено: <ph name="CRASH_TIME" />, завантажено: <ph name="UPLOAD_TIME" /></translation>
@@ -1104,6 +1108,7 @@
 <translation id="7220786058474068424">Обробка</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Сайт містить зловмисне програмне забезпечення</translation>
+<translation id="724766306220616965">Застереження, конфлікт</translation>
 <translation id="724975217298816891">Введіть термін дії та код CVC картки <ph name="CREDIT_CARD" />, щоб оновити її дані. Щойно ви підтвердите дані картки, цей сайт отримає доступ до них.</translation>
 <translation id="7251437084390964440">Конфігурація мережі не відповідає стандарту ONC. Вона може імпортуватися частково.
 Додаткові відомості:
@@ -1116,6 +1121,7 @@
 <translation id="7300012071106347854">Кобальтовий</translation>
 <translation id="7302712225291570345">"<ph name="TEXT" />"</translation>
 <translation id="7309308571273880165">Звіт про аварійне завершення роботи створено <ph name="CRASH_TIME" /> (ще не завантажено)</translation>
+<translation id="7313965965371928911">Застереження <ph name="BEGIN_LINK" />Безпечного перегляду<ph name="END_LINK" /></translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Довідка щодо з’єднання</translation>
 <translation id="7334320624316649418">&amp;Повторити перевпорядкування</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb
index e3b4678..bae4559 100644
--- a/components/strings/components_strings_vi.xtb
+++ b/components/strings/components_strings_vi.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">Trang web bạn sắp truy cập chứa ứng dụng nguy hiểm</translation>
 <translation id="1348779747280417563">Xác nhận tên</translation>
 <translation id="1357195169723583938">Người đã sử dụng thiết bị này gần đây và thời điểm sử dụng</translation>
+<translation id="1364822246244961190">Chính sách này đã bị chặn nên giá trị của chính sách sẽ bị bỏ qua.</translation>
 <translation id="1374468813861204354">đề xuất</translation>
 <translation id="1374692235857187091">Index-4x6 (Bưu thiếp)</translation>
 <translation id="1375198122581997741">Giới thiệu Phiên bản</translation>
@@ -105,6 +106,7 @@
 <translation id="1472675084647422956">Hiển thị thêm</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">Chọn địa chỉ giao hàng</translation>
+<translation id="1492194039220927094">Gửi thông báo đẩy khi có chính sách:</translation>
 <translation id="1501859676467574491">Hiển thị các thẻ trong Tài khoản Google của bạn</translation>
 <translation id="1507202001669085618">&lt;p&gt;Bạn sẽ gặp lỗi này nếu đang sử dụng cổng Wi-Fi yêu cầu bạn đăng nhập để có thể vào mạng.&lt;/p&gt;
     &lt;p&gt;Để khắc phục lỗi này, hãy nhấp vào &lt;strong&gt;Kết nối&lt;/strong&gt; trên trang mà bạn đang cố mở.&lt;/p&gt;</translation>
@@ -125,6 +127,7 @@
 <translation id="1559572115229829303">&lt;p&gt;Không thể thiết lập kết nối riêng tư với <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> vì ngày và giờ (<ph name="DATE_AND_TIME" />) trên thiết bị của bạn không chính xác.&lt;/p&gt;
 
       &lt;p&gt;Hãy điều chỉnh ngày và giờ từ phần &lt;strong&gt;Chung&lt;/strong&gt; của ứng dụng &lt;strong&gt;Cài đặt&lt;/strong&gt;.&lt;/p&gt;</translation>
+<translation id="1569487616857761740">Nhập ngày hết hạn</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">Đã xảy ra lỗi khi hiển thị trang web này.</translation>
 <translation id="1592005682883173041">Quyền truy cập dữ liệu cục bộ</translation>
@@ -495,6 +498,7 @@
 <translation id="3658742229777143148">Bản sửa đổi</translation>
 <translation id="366077651725703012">Cập nhật thẻ tín dụng</translation>
 <translation id="3676592649209844519">ID thiết bị:</translation>
+<translation id="3677008721441257057">Ý bạn là &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt;?</translation>
 <translation id="3678029195006412963">Không thể ký yêu cầu</translation>
 <translation id="3678529606614285348">Mở trang trong cửa sổ Ẩn danh mới (Ctrl-Shift-N)</translation>
 <translation id="3679803492151881375">Báo cáo sự cố được ghi lại vào <ph name="CRASH_TIME" />, được tải lên vào <ph name="UPLOAD_TIME" /></translation>
@@ -1104,6 +1108,7 @@
 <translation id="7220786058474068424">Đang xử lý</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Trang web bạn sắp truy cập chứa phần mềm độc hại</translation>
+<translation id="724766306220616965">Cảnh báo, xung đột</translation>
 <translation id="724975217298816891">Nhập ngày hết hạn và CVC cho <ph name="CREDIT_CARD" /> để cập nhật chi tiết thẻ của bạn. Sau khi bạn xác nhận, chi tiết thẻ của bạn sẽ được chia sẻ với trang web này.</translation>
 <translation id="7251437084390964440">Cấu hình mạng này không tuân thủ tiêu chuẩn ONC. Một số phần của cấu hình có thể không nhập được.
 Thông tin chi tiết bổ sung:
@@ -1116,6 +1121,7 @@
 <translation id="7300012071106347854">Xanh thẩm</translation>
 <translation id="7302712225291570345">"<ph name="TEXT" />"</translation>
 <translation id="7309308571273880165">Báo cáo sự cố được ghi lại vào <ph name="CRASH_TIME" /> (người dùng yêu cầu tải lên, nhưng chưa được tải lên)</translation>
+<translation id="7313965965371928911">Cảnh báo <ph name="BEGIN_LINK" />Duyệt web an toàn<ph name="END_LINK" /></translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Trợ giúp kết nối</translation>
 <translation id="7334320624316649418">&amp;Làm lại sắp xếp lại</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index 790fc926..81c19eb 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -83,6 +83,7 @@
 <translation id="1348198688976932919">你要造訪的網站含有不安全的應用程式</translation>
 <translation id="1348779747280417563">確認姓名</translation>
 <translation id="1357195169723583938">最近使用過裝置的使用者及其使用時間</translation>
+<translation id="1364822246244961190">這項政策遭到封鎖,系統會忽略其設定值。</translation>
 <translation id="1374468813861204354">建議</translation>
 <translation id="1374692235857187091">Index-4x6 (明信片)</translation>
 <translation id="1375198122581997741">關於版本</translation>
@@ -105,6 +106,7 @@
 <translation id="1472675084647422956">顯示更多</translation>
 <translation id="147358896496811705">2A0</translation>
 <translation id="1484290072879560759">選擇運送地址</translation>
+<translation id="1492194039220927094">政策推送:</translation>
 <translation id="1501859676467574491">顯示你 Google 帳戶中的卡片</translation>
 <translation id="1507202001669085618">&lt;p&gt;如果您使用的 Wi-Fi 入口網站必須先登入才能連上網路,系統就會顯示這則錯誤訊息。&lt;/p&gt;
     &lt;p&gt;如要修正這個錯誤,請在您要嘗試開啟的網頁上按一下 [連線]&lt;strong&gt;&lt;/strong&gt;。&lt;/p&gt;</translation>
@@ -125,6 +127,7 @@
 <translation id="1559572115229829303">&lt;p&gt;您裝置的日期和時間 (<ph name="DATE_AND_TIME" />) 不正確,因此無法與 <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> 建立私人連線。&lt;/p&gt;
 
       &lt;p&gt;請前往「設定」應用程式的「一般設定」專區調整日期和時間。&lt;strong&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;</translation>
+<translation id="1569487616857761740">輸入到期日</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">顯示這個網頁時發生錯誤。</translation>
 <translation id="1592005682883173041">本機資料存取權</translation>
@@ -495,6 +498,7 @@
 <translation id="3658742229777143148">修訂版本</translation>
 <translation id="366077651725703012">更新信用卡</translation>
 <translation id="3676592649209844519">裝置 ID:</translation>
+<translation id="3677008721441257057">你是否要前往 &lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt;?</translation>
 <translation id="3678029195006412963">無法簽署要求</translation>
 <translation id="3678529606614285348">在新的無痕式視窗中開啟網頁 (Ctrl + Shift + N 鍵)</translation>
 <translation id="3679803492151881375">當機報告擷取時間:<ph name="CRASH_TIME" />,報告上傳時間:<ph name="UPLOAD_TIME" /></translation>
@@ -1104,6 +1108,7 @@
 <translation id="7220786058474068424">處理中</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />,<ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">你要造訪的網站含有惡意軟體</translation>
+<translation id="724766306220616965">警告和衝突</translation>
 <translation id="724975217298816891">請輸入 <ph name="CREDIT_CARD" /> 的有效日期和信用卡安全碼,更新您的信用卡詳細資訊。完成驗證後,這個網站就會取得您的信用卡詳細資訊。</translation>
 <translation id="7251437084390964440">網路設定未遵循 ONC 標準,系統可能無法匯入部分設定。
 其他詳細資料:
@@ -1116,6 +1121,7 @@
 <translation id="7300012071106347854">鈷藍色</translation>
 <translation id="7302712225291570345">「<ph name="TEXT" />」</translation>
 <translation id="7309308571273880165">當機報告擷取時間:<ph name="CRASH_TIME" /> (使用者要求上傳,但尚未上傳)</translation>
+<translation id="7313965965371928911"><ph name="BEGIN_LINK" />安全瀏覽<ph name="END_LINK" />警告</translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">連線說明</translation>
 <translation id="7334320624316649418">重做重新排序(&amp;R)</translation>
diff --git a/components/viz/client/client_resource_provider.cc b/components/viz/client/client_resource_provider.cc
index 2c59c0b..efca8bb 100644
--- a/components/viz/client/client_resource_provider.cc
+++ b/components/viz/client/client_resource_provider.cc
@@ -364,7 +364,6 @@
 
 ClientResourceProvider::ScopedSkSurface::ScopedSkSurface(
     GrContext* gr_context,
-    sk_sp<SkColorSpace> color_space,
     GLuint texture_id,
     GLenum texture_target,
     const gfx::Size& size,
@@ -382,7 +381,7 @@
   bool gpu_compositing = true;
   surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget(
       gr_context, backend_texture, kTopLeft_GrSurfaceOrigin, msaa_sample_count,
-      ResourceFormatToClosestSkColorType(gpu_compositing, format), color_space,
+      ResourceFormatToClosestSkColorType(gpu_compositing, format), nullptr,
       &surface_props);
 }
 
diff --git a/components/viz/client/client_resource_provider.h b/components/viz/client/client_resource_provider.h
index b5d8c1d..f3965af 100644
--- a/components/viz/client/client_resource_provider.h
+++ b/components/viz/client/client_resource_provider.h
@@ -113,7 +113,6 @@
   class VIZ_CLIENT_EXPORT ScopedSkSurface {
    public:
     ScopedSkSurface(GrContext* gr_context,
-                    sk_sp<SkColorSpace> color_space,
                     GLuint texture_id,
                     GLenum texture_target,
                     const gfx::Size& size,
diff --git a/content/app/strings/translations/content_strings_ca.xtb b/content/app/strings/translations/content_strings_ca.xtb
index 93df74c..2d095c9 100644
--- a/content/app/strings/translations/content_strings_ca.xtb
+++ b/content/app/strings/translations/content_strings_ca.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">cloenda</translation>
 <translation id="6209276755895393898">Sembla el següent: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glossari</translation>
+<translation id="628938136236500310">El vídeo s'està reproduint en mode de pantalla en pantalla</translation>
 <translation id="6398862346408813489">Mostra el tauler de la selecció de mes</translation>
 <translation id="6404546809543547843">barra de moment de l'àudio</translation>
 <translation id="6443871981718447451">mostra el menú de subtítols</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">Tria un fitxer</translation>
 <translation id="739024184232394898">Altres...</translation>
 <translation id="7405738980073107433">notes finals</translation>
+<translation id="7410239719251593705">Sembla que inclou contingut per a adults. No hi ha cap descripció disponible.</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> TB</translation>
 <translation id="7491962110804786152">pestanya</translation>
 <translation id="7514365320538308">Baixa</translation>
diff --git a/content/app/strings/translations/content_strings_cs.xtb b/content/app/strings/translations/content_strings_cs.xtb
index 87dd81a5..b6d4db4 100644
--- a/content/app/strings/translations/content_strings_cs.xtb
+++ b/content/app/strings/translations/content_strings_cs.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">doslov</translation>
 <translation id="6209276755895393898">Vypadá jako: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glosář</translation>
+<translation id="628938136236500310">Přehrávání v režimu obraz v obraze</translation>
 <translation id="6398862346408813489">Zobrazit panel pro výběr měsíců</translation>
 <translation id="6404546809543547843">posuvník času zvuku</translation>
 <translation id="6443871981718447451">zobrazit nabídku skrytých titulků</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">Vybrat soubor</translation>
 <translation id="739024184232394898">Jiné…</translation>
 <translation id="7405738980073107433">koncové poznámky</translation>
+<translation id="7410239719251593705">Zřejmě zahrnuje obsah pro dospělé. Popis není k dispozici.</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> TB</translation>
 <translation id="7491962110804786152">karta</translation>
 <translation id="7514365320538308">Stáhnout</translation>
diff --git a/content/app/strings/translations/content_strings_es.xtb b/content/app/strings/translations/content_strings_es.xtb
index 2d92e15..456c654 100644
--- a/content/app/strings/translations/content_strings_es.xtb
+++ b/content/app/strings/translations/content_strings_es.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">epílogo</translation>
 <translation id="6209276755895393898">Parece que es: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glosario</translation>
+<translation id="628938136236500310">Reproduciendo en modo imagen en imagen</translation>
 <translation id="6398862346408813489">Mostrar panel para seleccionar el mes</translation>
 <translation id="6404546809543547843">control deslizante de duración de audio</translation>
 <translation id="6443871981718447451">mostrar menú de subtítulos</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">Seleccionar archivo</translation>
 <translation id="739024184232394898">Otra...</translation>
 <translation id="7405738980073107433">notas finales</translation>
+<translation id="7410239719251593705">Parece que incluye contenido para adultos. No hay ninguna descripción disponible.</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> TB</translation>
 <translation id="7491962110804786152">tabulador</translation>
 <translation id="7514365320538308">Descargar</translation>
diff --git a/content/app/strings/translations/content_strings_fi.xtb b/content/app/strings/translations/content_strings_fi.xtb
index 91dcc352..c752339 100644
--- a/content/app/strings/translations/content_strings_fi.xtb
+++ b/content/app/strings/translations/content_strings_fi.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">jälkipuhe</translation>
 <translation id="6209276755895393898">Näkyy olevan: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">sanasto</translation>
+<translation id="628938136236500310">Toistetaan kuva kuvassa ‑tilassa</translation>
 <translation id="6398862346408813489">Näytä kuukaudenvalintapaneeli</translation>
 <translation id="6404546809543547843">äänen ajan liukusäädin</translation>
 <translation id="6443871981718447451">näytä tekstitysvalikko</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">Valitse tiedosto</translation>
 <translation id="739024184232394898">Muu...</translation>
 <translation id="7405738980073107433">loppuhuomautukset</translation>
+<translation id="7410239719251593705">Vaikuttaa sisältävän aikuisille suunnattua sisältöä Ei kuvausta saatavilla</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> Tt</translation>
 <translation id="7491962110804786152">sarkain</translation>
 <translation id="7514365320538308">Lataa</translation>
diff --git a/content/app/strings/translations/content_strings_fil.xtb b/content/app/strings/translations/content_strings_fil.xtb
index 036f940b..14636d0 100644
--- a/content/app/strings/translations/content_strings_fil.xtb
+++ b/content/app/strings/translations/content_strings_fil.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">afterword</translation>
 <translation id="6209276755895393898">Mukhang: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glosaryo</translation>
+<translation id="628938136236500310">Nagpe-play sa picture-in-picture mode</translation>
 <translation id="6398862346408813489">Ipakita ang panel ng pagpipilian ng buwan</translation>
 <translation id="6404546809543547843">scrubber ng oras ng audio</translation>
 <translation id="6443871981718447451">Ipakita ang menu ng mga nakasarang caption</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">Pumili ng File</translation>
 <translation id="739024184232394898">Iba pa...</translation>
 <translation id="7405738980073107433">mga endnote</translation>
+<translation id="7410239719251593705">Mukhang may lamang pang-adult na content. Walang available na paglalarawan.</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> (na) TB</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7514365320538308">I-download</translation>
diff --git a/content/app/strings/translations/content_strings_fr.xtb b/content/app/strings/translations/content_strings_fr.xtb
index e1baade..2ea126f6 100644
--- a/content/app/strings/translations/content_strings_fr.xtb
+++ b/content/app/strings/translations/content_strings_fr.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">postface</translation>
 <translation id="6209276755895393898">L'image représente probablement : <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glossaire</translation>
+<translation id="628938136236500310">Lecture en mode Picture-in-picture</translation>
 <translation id="6398862346408813489">Afficher le panneau de sélection du mois</translation>
 <translation id="6404546809543547843">curseur durée audio</translation>
 <translation id="6443871981718447451">afficher le menu des sous-titres</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">Choisir un fichier</translation>
 <translation id="739024184232394898">Autre…</translation>
 <translation id="7405738980073107433">notes de fin</translation>
+<translation id="7410239719251593705">Semble être du contenu réservé aux adultes. Aucune description disponible.</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> To</translation>
 <translation id="7491962110804786152">tabulation</translation>
 <translation id="7514365320538308">Télécharger</translation>
diff --git a/content/app/strings/translations/content_strings_iw.xtb b/content/app/strings/translations/content_strings_iw.xtb
index 28760aa5..9c26f18e 100644
--- a/content/app/strings/translations/content_strings_iw.xtb
+++ b/content/app/strings/translations/content_strings_iw.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">אחרית דבר</translation>
 <translation id="6209276755895393898">נראה כמו: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">מילון מונחים</translation>
+<translation id="628938136236500310">פועל במצב תמונה בתוך תמונה</translation>
 <translation id="6398862346408813489">הצג חלונית לבחירת חודש</translation>
 <translation id="6404546809543547843">מסתיר משך אודיו</translation>
 <translation id="6443871981718447451">הצגת תפריט כתוביות</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">בחירת קובץ</translation>
 <translation id="739024184232394898">אחר...</translation>
 <translation id="7405738980073107433">הערות סיום</translation>
+<translation id="7410239719251593705">נראה שהתמונה כוללת תוכן למבוגרים בלבד. אין תיאור זמין.</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> TB</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7514365320538308">הורד</translation>
diff --git a/content/app/strings/translations/content_strings_ko.xtb b/content/app/strings/translations/content_strings_ko.xtb
index e50b40296..c3f6c35 100644
--- a/content/app/strings/translations/content_strings_ko.xtb
+++ b/content/app/strings/translations/content_strings_ko.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">후기</translation>
 <translation id="6209276755895393898"><ph name="DESCRIPTION" /> 같습니다</translation>
 <translation id="6213469881011901533">용어설명</translation>
+<translation id="628938136236500310">PIP 모드로 재생 중</translation>
 <translation id="6398862346408813489">월 선택 패널 표시</translation>
 <translation id="6404546809543547843">오디오 시간 스크러버</translation>
 <translation id="6443871981718447451">자막 메뉴 표시</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">파일 선택</translation>
 <translation id="739024184232394898">다른 주...</translation>
 <translation id="7405738980073107433">미주</translation>
+<translation id="7410239719251593705">성인용 콘텐츠가 포함된 것으로 보입니다. 설명이 없습니다.</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" />TB</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7514365320538308">다운로드</translation>
diff --git a/content/app/strings/translations/content_strings_no.xtb b/content/app/strings/translations/content_strings_no.xtb
index a5489b75..ede5fe6 100644
--- a/content/app/strings/translations/content_strings_no.xtb
+++ b/content/app/strings/translations/content_strings_no.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">etterord</translation>
 <translation id="6209276755895393898">Dette ser ut til å være <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">ordliste</translation>
+<translation id="628938136236500310">Spilles av i bilde-i-bilde-modus</translation>
 <translation id="6398862346408813489">Se panelet for valg av måned</translation>
 <translation id="6404546809543547843">lydtidslinje</translation>
 <translation id="6443871981718447451">vis menyen for teksting for hørselshemmede</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">Velg fil</translation>
 <translation id="739024184232394898">Andre</translation>
 <translation id="7405738980073107433">sluttnoter</translation>
+<translation id="7410239719251593705">Ser ut til å inneholde seksuelt innhold. Ingen beskrivelse er tilgjengelig.</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> TB</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7514365320538308">Last ned</translation>
diff --git a/content/app/strings/translations/content_strings_sv.xtb b/content/app/strings/translations/content_strings_sv.xtb
index 633cc0c..7806511 100644
--- a/content/app/strings/translations/content_strings_sv.xtb
+++ b/content/app/strings/translations/content_strings_sv.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">efterord</translation>
 <translation id="6209276755895393898">Det verkar vara: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">ordlista</translation>
+<translation id="628938136236500310">Spelar upp i bild-i-bild-läge</translation>
 <translation id="6398862346408813489">Visa panelen för val av månad</translation>
 <translation id="6404546809543547843">tidsreglage för ljud</translation>
 <translation id="6443871981718447451">visa textningsmenyn</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">Välj fil</translation>
 <translation id="739024184232394898">Annat ...</translation>
 <translation id="7405738980073107433">slutnoter</translation>
+<translation id="7410239719251593705">Verkar innehålla barnförbjudet innehåll. Det finns ingen tillgänglig beskrivning.</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> TB</translation>
 <translation id="7491962110804786152">tabb</translation>
 <translation id="7514365320538308">Ladda ned</translation>
diff --git a/content/app/strings/translations/content_strings_ta.xtb b/content/app/strings/translations/content_strings_ta.xtb
index 014028f6..11d3be78 100644
--- a/content/app/strings/translations/content_strings_ta.xtb
+++ b/content/app/strings/translations/content_strings_ta.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">பின்னுரை</translation>
 <translation id="6209276755895393898"><ph name="DESCRIPTION" /> போலத் தோன்றுகிறது.</translation>
 <translation id="6213469881011901533">அருஞ்சொல் திரட்டு</translation>
+<translation id="628938136236500310">பிக்ச்சர்-இன்-பிக்ச்சர் பயன்முறையில் இயக்குகிறது</translation>
 <translation id="6398862346408813489">மாதம் தேர்ந்தெடுப்புப் பலகத்தைக் காட்டு</translation>
 <translation id="6404546809543547843">ஆடியோ நேர ஸ்கிரப்பர்</translation>
 <translation id="6443871981718447451">விரிவான வசனங்கள் மெனுவைக் காட்டும்</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">கோப்பைத் தேர்வு செய்க</translation>
 <translation id="739024184232394898">மற்றவை…</translation>
 <translation id="7405738980073107433">முடிவுக்குறிப்புகள்</translation>
+<translation id="7410239719251593705">வயதுவந்தோருக்கான உள்ளடக்கம் இருக்கலாம். விவரம் இல்லை.</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> டெ.பை</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7514365320538308">பதிவிறக்கு</translation>
diff --git a/content/app/strings/translations/content_strings_te.xtb b/content/app/strings/translations/content_strings_te.xtb
index b9278ef..1f2daae 100644
--- a/content/app/strings/translations/content_strings_te.xtb
+++ b/content/app/strings/translations/content_strings_te.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">చివరిమాట</translation>
 <translation id="6209276755895393898">వీరిలా కనిపిస్తున్నారు: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">పదకోశం</translation>
+<translation id="628938136236500310">చిత్రంలో చిత్రం మోడ్‌లో ప్లే చేస్తోంది</translation>
 <translation id="6398862346408813489">నెల ఎంపిక ప్యానెల్‌ను చూపుతుంది</translation>
 <translation id="6404546809543547843">ఆడియో సమయ స్క్రబ్బర్</translation>
 <translation id="6443871981718447451">ఉపశీర్షికల మెనూని చూపు</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">ఫైల్‌ను ఎంచుకోండి</translation>
 <translation id="739024184232394898">ఇతర...</translation>
 <translation id="7405738980073107433">ఎండ్‌నోట్‌లు</translation>
+<translation id="7410239719251593705">పెద్దలకు మాత్రమే విషయాలను కలిగి ఉండవచ్చు. వివరణ అందుబాటులో లేదు.</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> TB</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7514365320538308">డౌన్‌లోడ్ చేయి</translation>
diff --git a/content/app/strings/translations/content_strings_th.xtb b/content/app/strings/translations/content_strings_th.xtb
index cf61086..f8792c2 100644
--- a/content/app/strings/translations/content_strings_th.xtb
+++ b/content/app/strings/translations/content_strings_th.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">คำแถลงท้ายเล่ม</translation>
 <translation id="6209276755895393898">ดูเหมือนเป็น<ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">อภิธานศัพท์</translation>
+<translation id="628938136236500310">กำลังเล่นในโหมดการแสดงภาพซ้อนภาพ</translation>
 <translation id="6398862346408813489">แสดงแผงการเลือกเดือน</translation>
 <translation id="6404546809543547843">ตัวควบคุมเวลาของเสียง</translation>
 <translation id="6443871981718447451">แสดงเมนูคำอธิบายภาพ</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">เลือกไฟล์</translation>
 <translation id="739024184232394898">อื่นๆ...</translation>
 <translation id="7405738980073107433">อ้างอิงท้ายเรื่อง</translation>
+<translation id="7410239719251593705">ดูเหมือนจะมีเนื้อหาสำหรับผู้ใหญ่ ไม่มีคำอธิบาย</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> TB</translation>
 <translation id="7491962110804786152">แท็บ</translation>
 <translation id="7514365320538308">ดาวน์โหลด</translation>
diff --git a/content/app/strings/translations/content_strings_tr.xtb b/content/app/strings/translations/content_strings_tr.xtb
index cc6dbfb..5270fcc 100644
--- a/content/app/strings/translations/content_strings_tr.xtb
+++ b/content/app/strings/translations/content_strings_tr.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">sonsöz</translation>
 <translation id="6209276755895393898">Resimdeki şu olabilir: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">terimler sözlüğü</translation>
+<translation id="628938136236500310">Pencere içinde pencere modunda oynatılıyor</translation>
 <translation id="6398862346408813489">Ay seçim panelini göster</translation>
 <translation id="6404546809543547843">ses zaman çizelgesi temizleyici</translation>
 <translation id="6443871981718447451">altyazı menüsünü göster</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">Dosya Seç</translation>
 <translation id="739024184232394898">Diğer...</translation>
 <translation id="7405738980073107433">son notlar</translation>
+<translation id="7410239719251593705">Yetişkinlere uygun içerik barındırdığı anlaşılıyor. Açıklama yok.</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> TB</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7514365320538308">İndir</translation>
diff --git a/content/app/strings/translations/content_strings_uk.xtb b/content/app/strings/translations/content_strings_uk.xtb
index 17e7b9d..709dbf8 100644
--- a/content/app/strings/translations/content_strings_uk.xtb
+++ b/content/app/strings/translations/content_strings_uk.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">післямова</translation>
 <translation id="6209276755895393898">Схоже, на цьому зображенні <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">глосарій</translation>
+<translation id="628938136236500310">Відтворення в режимі "картинка в картинці"</translation>
 <translation id="6398862346408813489">Показати панель вибору місяців</translation>
 <translation id="6404546809543547843">повзунок часу відтворення аудіо</translation>
 <translation id="6443871981718447451">показати меню субтитрів</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">Вибрати файл</translation>
 <translation id="739024184232394898">Інші...</translation>
 <translation id="7405738980073107433">кінцеві виноски</translation>
+<translation id="7410239719251593705">Схоже, це вміст для дорослих. Немає опису.</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> ТБ</translation>
 <translation id="7491962110804786152">вкладка</translation>
 <translation id="7514365320538308">Завантажити</translation>
diff --git a/content/app/strings/translations/content_strings_vi.xtb b/content/app/strings/translations/content_strings_vi.xtb
index cc57768..44b572f 100644
--- a/content/app/strings/translations/content_strings_vi.xtb
+++ b/content/app/strings/translations/content_strings_vi.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">lời bạt</translation>
 <translation id="6209276755895393898">Có vẻ như là: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">bảng thuật ngữ</translation>
+<translation id="628938136236500310">Đang phát ở chế độ hình trong hình</translation>
 <translation id="6398862346408813489">Hiển thị bảng lựa chọn tháng</translation>
 <translation id="6404546809543547843">trình kiểm soát thời gian âm thanh</translation>
 <translation id="6443871981718447451">hiển thị menu phụ đề chi tiết</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">Chọn tệp</translation>
 <translation id="739024184232394898">Khác...</translation>
 <translation id="7405738980073107433">chú thích cuối</translation>
+<translation id="7410239719251593705">Có vẻ chứa nội dung người lớn. Không có nội dung mô tả.</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> TB</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7514365320538308">Tải xuống</translation>
diff --git a/content/app/strings/translations/content_strings_zh-TW.xtb b/content/app/strings/translations/content_strings_zh-TW.xtb
index e1701a3..34b276026 100644
--- a/content/app/strings/translations/content_strings_zh-TW.xtb
+++ b/content/app/strings/translations/content_strings_zh-TW.xtb
@@ -150,6 +150,7 @@
 <translation id="6166809985690652833">後記</translation>
 <translation id="6209276755895393898">圖片內容似乎是:<ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">詞彙解釋</translation>
+<translation id="628938136236500310">正在以子母畫面模式播放影片</translation>
 <translation id="6398862346408813489">顯示月份選取面板</translation>
 <translation id="6404546809543547843">音訊時間點拖曳工具</translation>
 <translation id="6443871981718447451">顯示隱藏式輔助字幕選單</translation>
@@ -184,6 +185,7 @@
 <translation id="7364796246159120393">選擇檔案</translation>
 <translation id="739024184232394898">其他...</translation>
 <translation id="7405738980073107433">章節附註</translation>
+<translation id="7410239719251593705">圖片似乎含有成人內容。目前沒有說明。</translation>
 <translation id="7460907917090416791"><ph name="QUANTITY" /> TB</translation>
 <translation id="7491962110804786152">分頁</translation>
 <translation id="7514365320538308">下載</translation>
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 3d6d1cd..5408e38e 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -186,7 +186,6 @@
     "//third_party/boringssl",
     "//third_party/brotli:dec",
     "//third_party/icu",
-    "//third_party/inspector_protocol:encoding",
     "//third_party/libyuv",
     "//third_party/re2",
     "//third_party/sqlite",
@@ -663,8 +662,6 @@
     "devtools/devtools_renderer_channel.h",
     "devtools/devtools_session.cc",
     "devtools/devtools_session.h",
-    "devtools/devtools_session_encoding.cc",
-    "devtools/devtools_session_encoding.h",
     "devtools/devtools_stream_blob.cc",
     "devtools/devtools_stream_blob.h",
     "devtools/devtools_stream_file.cc",
diff --git a/content/browser/devtools/BUILD.gn b/content/browser/devtools/BUILD.gn
index 2250166..f14e719 100644
--- a/content/browser/devtools/BUILD.gn
+++ b/content/browser/devtools/BUILD.gn
@@ -129,16 +129,3 @@
     "devtools_background_services.proto",
   ]
 }
-
-source_set("inspector_protocol_encoding_test") {
-  testonly = true
-  sources = [
-    "../../../third_party/inspector_protocol/encoding/encoding_test.cc",
-  ]
-  deps = [
-    "//base",
-    "//testing/gmock",
-    "//testing/gtest",
-    "//third_party/inspector_protocol:encoding",
-  ]
-}
diff --git a/content/browser/devtools/DEPS b/content/browser/devtools/DEPS
index 962e548..93bf7150 100644
--- a/content/browser/devtools/DEPS
+++ b/content/browser/devtools/DEPS
@@ -3,7 +3,4 @@
   "+content/shell/browser/shell.h", # for access to web contents from devtools_protocol_test_support.cc
   # V8 version info
   "+v8/include/v8-version-string.h",
-
-  # For converting between JSON and CBOR in devtools_session_encoding.cc.
-  "+third_party/inspector_protocol/encoding",
 ]
diff --git a/content/browser/devtools/browser_devtools_agent_host.cc b/content/browser/devtools/browser_devtools_agent_host.cc
index e491560..2862801 100644
--- a/content/browser/devtools/browser_devtools_agent_host.cc
+++ b/content/browser/devtools/browser_devtools_agent_host.cc
@@ -88,7 +88,7 @@
         socket_callback_, tethering_task_runner_));
   }
   session->AddHandler(std::make_unique<protocol::TracingHandler>(
-      nullptr, GetIOContext(), session->UsesBinaryProtocol()));
+      nullptr, GetIOContext(), session->client()->UsesBinaryProtocol()));
   return true;
 }
 
diff --git a/content/browser/devtools/devtools_session.cc b/content/browser/devtools/devtools_session.cc
index c88086c..75d2d42 100644
--- a/content/browser/devtools/devtools_session.cc
+++ b/content/browser/devtools/devtools_session.cc
@@ -4,11 +4,10 @@
 
 #include "content/browser/devtools/devtools_session.h"
 
-#include <vector>
-
 #include "base/bind.h"
+#include "base/json/json_reader.h"
+#include "base/strings/stringprintf.h"
 #include "content/browser/devtools/devtools_manager.h"
-#include "content/browser/devtools/devtools_session_encoding.h"
 #include "content/browser/devtools/protocol/devtools_domain_handler.h"
 #include "content/browser/devtools/protocol/protocol.h"
 #include "content/browser/devtools/render_frame_devtools_agent_host.h"
@@ -35,6 +34,7 @@
 static const char kMethod[] = "method";
 static const char kResumeMethod[] = "Runtime.runIfWaitingForDebugger";
 static const char kSessionId[] = "sessionId";
+
 }  // namespace
 
 DevToolsSession::DevToolsSession(DevToolsAgentHostClient* client)
@@ -73,11 +73,6 @@
   return root_session_ ? root_session_ : this;
 }
 
-bool DevToolsSession::UsesBinaryProtocol() const {
-  return client_->UsesBinaryProtocol() ||
-         EnableInternalDevToolsBinaryProtocol();
-}
-
 void DevToolsSession::AddHandler(
     std::unique_ptr<protocol::DevToolsDomainHandler> handler) {
   DCHECK(agent_host_);
@@ -138,27 +133,10 @@
   io_session_ptr_.reset();
 }
 
-// The client of the devtools session will call this method to send a message
-// to handlers / agents that the session is connected with.
 bool DevToolsSession::DispatchProtocolMessage(const std::string& message) {
-  std::string converted_cbor_message;
-  const std::string* message_to_send = &message;
-  if (EnableInternalDevToolsBinaryProtocol()) {
-    if (client_->UsesBinaryProtocol()) {
-      // If the client uses the binary protocol, then |message| is already
-      // CBOR (it comes from the client).
-      DCHECK(IsCBOR(message));
-    } else {
-      converted_cbor_message = ConvertJSONToCBOR(message);
-      message_to_send = &converted_cbor_message;
-    }
-  }
   if (proxy_delegate_) {
-    // TODO(dgozman): revisit the proxy delegate.
-    // TODO(johannes): Should we send CBOR to an external backend? Maybe not!
-    // Revisit this when EnableInternalDevToolsBinaryProtocol() is on
-    // unconditionally.  Note: we assume that child sessions are not forwarding.
-    proxy_delegate_->SendMessageToBackend(this, *message_to_send);
+    // Note: we assume that child sessions are not forwarding.
+    proxy_delegate_->SendMessageToBackend(this, message);
     return true;
   }
 
@@ -168,15 +146,14 @@
 
   std::string session_id;
   if (!value || !value->getString(kSessionId, &session_id))
-    return DispatchProtocolMessageInternal(*message_to_send, std::move(value));
+    return DispatchProtocolMessageInternal(message, std::move(value));
 
   auto it = child_sessions_.find(session_id);
   if (it == child_sessions_.end())
     return false;
   DevToolsSession* session = it->second;
   DCHECK(!session->proxy_delegate_);
-  return session->DispatchProtocolMessageInternal(*message_to_send,
-                                                  std::move(value));
+  return session->DispatchProtocolMessageInternal(message, std::move(value));
 }
 
 bool DevToolsSession::DispatchProtocolMessageInternal(
@@ -265,73 +242,34 @@
   suspended_messages_.clear();
 }
 
-// The following methods handle responses or notifications coming from
-// the browser to the client.
-static void SendProtocolResponseOrNotification(
-    DevToolsAgentHostClient* client,
-    DevToolsAgentHostImpl* agent_host,
-    std::unique_ptr<protocol::Serializable> message) {
-  if (!EnableInternalDevToolsBinaryProtocol()) {
-    bool binary = client->UsesBinaryProtocol();
-    client->DispatchProtocolMessage(agent_host, message->serialize(binary));
-    return;
-  }
-  std::string cbor = message->serialize(/*binary=*/true);
-  DCHECK(IsCBOR(cbor));
-  client->DispatchProtocolMessage(agent_host, client->UsesBinaryProtocol()
-                                                  ? cbor
-                                                  : ConvertCBORToJSON(cbor));
-}
-
 void DevToolsSession::sendProtocolResponse(
     int call_id,
     std::unique_ptr<protocol::Serializable> message) {
-  SendProtocolResponseOrNotification(client_, agent_host_, std::move(message));
+  bool binary = client_->UsesBinaryProtocol();
+  client_->DispatchProtocolMessage(agent_host_, message->serialize(binary));
   // |this| may be deleted at this point.
 }
 
 void DevToolsSession::sendProtocolNotification(
     std::unique_ptr<protocol::Serializable> message) {
-  SendProtocolResponseOrNotification(client_, agent_host_, std::move(message));
+  bool binary = client_->UsesBinaryProtocol();
+  client_->DispatchProtocolMessage(agent_host_, message->serialize(binary));
   // |this| may be deleted at this point.
 }
 
 void DevToolsSession::flushProtocolNotifications() {
 }
 
-// The following methods handle responses or notifications coming from
-// the renderer (blink) to the client.
-static void DispatchProtocolResponseOrNotification(
-    DevToolsAgentHostClient* client,
-    DevToolsAgentHostImpl* agent_host,
-    blink::mojom::DevToolsMessagePtr message) {
-  // TODO(johannes): When eliminating the
-  // --enable-internal-devtools-binary-protocol flag, reconsider the similarity
-  // with SendProtocolResponseOrNotification above and either merge the methods
-  // or inline them again.
-  if (!EnableInternalDevToolsBinaryProtocol()) {
-    client->DispatchProtocolMessage(
-        agent_host,
-        std::string(reinterpret_cast<const char*>(message->data.data()),
-                    message->data.size()));
-    return;
-  }
-  std::string cbor(reinterpret_cast<const char*>(message->data.data()),
-                   message->data.size());
-  DCHECK(IsCBOR(cbor));
-  client->DispatchProtocolMessage(agent_host, client->UsesBinaryProtocol()
-                                                  ? cbor
-                                                  : ConvertCBORToJSON(cbor));
-}
-
 void DevToolsSession::DispatchProtocolResponse(
     blink::mojom::DevToolsMessagePtr message,
     int call_id,
     blink::mojom::DevToolsSessionStatePtr updates) {
   ApplySessionStateUpdates(std::move(updates));
   waiting_for_response_messages_.erase(call_id);
-  DispatchProtocolResponseOrNotification(client_, agent_host_,
-                                         std::move(message));
+  client_->DispatchProtocolMessage(
+      agent_host_,
+      std::string(reinterpret_cast<const char*>(message->data.data()),
+                  message->data.size()));
   // |this| may be deleted at this point.
 }
 
@@ -339,8 +277,10 @@
     blink::mojom::DevToolsMessagePtr message,
     blink::mojom::DevToolsSessionStatePtr updates) {
   ApplySessionStateUpdates(std::move(updates));
-  DispatchProtocolResponseOrNotification(client_, agent_host_,
-                                         std::move(message));
+  client_->DispatchProtocolMessage(
+      agent_host_,
+      std::string(reinterpret_cast<const char*>(message->data.data()),
+                  message->data.size()));
   // |this| may be deleted at this point.
 }
 
diff --git a/content/browser/devtools/devtools_session.h b/content/browser/devtools/devtools_session.h
index 619c96e..413d757 100644
--- a/content/browser/devtools/devtools_session.h
+++ b/content/browser/devtools/devtools_session.h
@@ -42,11 +42,6 @@
   DevToolsAgentHostClient* client() { return client_; }
   DevToolsSession* GetRootSession();
 
-  // Whether this session uses binary protocol. This is true if
-  // |client()->UsesBinaryProtocol()| or if the
-  // --enable-devtools-binary-protocol flag is set.
-  bool UsesBinaryProtocol() const;
-
   // Browser-only sessions do not talk to mojom::DevToolsAgent, but instead
   // handle all protocol messages locally in the browser process.
   void SetBrowserOnly(bool browser_only);
diff --git a/content/browser/devtools/devtools_session_encoding.cc b/content/browser/devtools/devtools_session_encoding.cc
deleted file mode 100644
index a297b78e0..0000000
--- a/content/browser/devtools/devtools_session_encoding.cc
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/devtools/devtools_session_encoding.h"
-
-#include <memory>
-#include <vector>
-
-#include "base/command_line.h"
-#include "base/strings/string_number_conversions.h"
-#include "content/public/common/content_switches.h"
-#include "third_party/inspector_protocol/encoding/encoding.h"
-
-using inspector_protocol_encoding::span;
-using inspector_protocol_encoding::Status;
-using inspector_protocol_encoding::StreamingParserHandler;
-using inspector_protocol_encoding::cbor::NewCBOREncoder;
-using inspector_protocol_encoding::cbor::ParseCBOR;
-using inspector_protocol_encoding::json::NewJSONEncoder;
-using inspector_protocol_encoding::json::ParseJSON;
-using inspector_protocol_encoding::json::Platform;
-
-namespace content {
-namespace {
-// ContentShellPlatform allows us to inject the string<->double conversion
-// routines from base:: into the inspector_protocol JSON parser / serializer.
-class ContentShellPlatform : public Platform {
- public:
-  bool StrToD(const char* str, double* result) const override {
-    return base::StringToDouble(str, result);
-  }
-
-  // Prints |value| in a format suitable for JSON.
-  std::unique_ptr<char[]> DToStr(double value) const override {
-    std::string str = base::NumberToString(value);
-    std::unique_ptr<char[]> result(new char[str.size() + 1]);
-    memcpy(result.get(), str.c_str(), str.size() + 1);
-    return result;
-  }
-};
-}  // namespace
-bool EnableInternalDevToolsBinaryProtocol() {
-  static bool enabled = base::CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kEnableInternalDevToolsBinaryProtocol);
-  return enabled;
-}
-
-// TODO(johannes): Move this into the cbor library. Don't want to
-// do this just yet to first gain more experience about the most
-// appropriate API, including how to propagate errors.
-std::string ConvertCBORToJSON(const std::string& cbor) {
-  ContentShellPlatform platform;
-  std::string json_message;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(&platform, &json_message, &status);
-  ParseCBOR(
-      span<uint8_t>(reinterpret_cast<const uint8_t*>(cbor.data()), cbor.size()),
-      json_writer.get());
-  if (!status.ok()) {
-    LOG(ERROR) << "ConvertCBORToJSON error "
-               << static_cast<uint32_t>(status.error) << " position "
-               << static_cast<uint32_t>(status.pos);
-    return "";
-  }
-  return json_message;
-}
-
-std::string ConvertJSONToCBOR(const std::string& json) {
-  ContentShellPlatform platform;
-  std::vector<uint8_t> cbor;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> encoder =
-      NewCBOREncoder(&cbor, &status);
-  ParseJSON(
-      &platform,
-      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
-      encoder.get());
-  if (!status.ok()) {
-    LOG(ERROR) << "ConvertJSONToCBOR error "
-               << static_cast<uint32_t>(status.error) << " position "
-               << static_cast<uint32_t>(status.pos);
-    return "";
-  }
-  return std::string(cbor.begin(), cbor.end());
-}
-
-bool IsCBOR(const std::string& serialized) {
-  return serialized.size() >= 6 &&
-         reinterpret_cast<const uint8_t&>(serialized[0]) == 0xd8 &&
-         reinterpret_cast<const uint8_t&>(serialized[1]) == 0x5a;
-}
-}  // namespace content
diff --git a/content/browser/devtools/devtools_session_encoding.h b/content/browser/devtools/devtools_session_encoding.h
deleted file mode 100644
index f4bb1ef..0000000
--- a/content/browser/devtools/devtools_session_encoding.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_SESSION_ENCODING_H_
-#define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_SESSION_ENCODING_H_
-
-#include <string>
-
-namespace content {
-
-// Whether --enable-internal-devtools-binary-parotocol was passed on the command
-// line.  If so, the DevtoolsSession will convert all outgoing traffic to agents
-// / handlers / etc. to the CBOR-based binary protocol.
-bool EnableInternalDevToolsBinaryProtocol();
-
-// Conversion routines between the inspector protocol binary wire format
-// (based on CBOR RFC 7049) and JSON.
-std::string ConvertCBORToJSON(const std::string& cbor);
-std::string ConvertJSONToCBOR(const std::string& json);
-
-// Whether |serialized| is CBOR produced by the inspector protocol.
-// We always enclose messages with an envelope, that is, the 0xd8 tag
-// followed by the indicator for the byte string, followed by a 32 bit
-// length value (4 bytes).
-bool IsCBOR(const std::string& serialized);
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_SESSION_ENCODING_H_
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc
index b4d72bc..d88e0a5 100644
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -306,7 +306,8 @@
   session->AddHandler(std::make_unique<protocol::SecurityHandler>());
   if (!frame_tree_node_ || !frame_tree_node_->parent()) {
     session->AddHandler(std::make_unique<protocol::TracingHandler>(
-        frame_tree_node_, GetIOContext(), session->UsesBinaryProtocol()));
+        frame_tree_node_, GetIOContext(),
+        session->client()->UsesBinaryProtocol()));
   }
 
   if (sessions().empty()) {
diff --git a/content/browser/download/mhtml_generation_browsertest.cc b/content/browser/download/mhtml_generation_browsertest.cc
index c62e936..38ea178 100644
--- a/content/browser/download/mhtml_generation_browsertest.cc
+++ b/content/browser/download/mhtml_generation_browsertest.cc
@@ -18,7 +18,7 @@
 #include "base/threading/thread_restrictions.h"
 #include "components/download/public/common/download_task_runner.h"
 #include "content/browser/renderer_host/render_process_host_impl.h"
-#include "content/common/mhtml_file_writer.mojom.h"
+#include "content/common/download/mhtml_file_writer.mojom.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/mhtml_extra_parts.h"
@@ -180,7 +180,7 @@
 
     std::vector<std::string> dummy_digests;
     base::TimeDelta dummy_time_delta = base::TimeDelta::Max();
-    std::move(callback).Run(mojom::MhtmlSaveStatus::SUCCESS, dummy_digests,
+    std::move(callback).Run(mojom::MhtmlSaveStatus::kSuccess, dummy_digests,
                             dummy_time_delta);
 
     // Close the message pipe connection to invoke the connection error
@@ -373,7 +373,7 @@
   // Checks that the final status reported to UMA is correct.
   histogram_tester()->ExpectUniqueSample(
       "PageSerialization.MhtmlGeneration.FinalSaveStatus",
-      static_cast<int>(MhtmlSaveStatus::SUCCESS), 1);
+      static_cast<int>(mojom::MhtmlSaveStatus::kSuccess), 1);
 }
 
 // Regression test for the crash/race from https://crbug.com/612098.
@@ -417,7 +417,7 @@
   // Checks that the final status reported to UMA is correct.
   histogram_tester()->ExpectUniqueSample(
       "PageSerialization.MhtmlGeneration.FinalSaveStatus",
-      static_cast<int>(MhtmlSaveStatus::FILE_CREATION_ERROR), 1);
+      static_cast<int>(mojom::MhtmlSaveStatus::kFileCreationError), 1);
 }
 
 // Tests that MHTML generated using the default 'quoted-printable' encoding does
diff --git a/content/browser/download/mhtml_generation_manager.cc b/content/browser/download/mhtml_generation_manager.cc
index d87df05..b529f36 100644
--- a/content/browser/download/mhtml_generation_manager.cc
+++ b/content/browser/download/mhtml_generation_manager.cc
@@ -25,7 +25,7 @@
 #include "content/browser/download/mhtml_extra_parts_impl.h"
 #include "content/browser/frame_host/frame_tree_node.h"
 #include "content/browser/frame_host/render_frame_host_impl.h"
-#include "content/common/mhtml_file_writer.mojom.h"
+#include "content/common/download/mhtml_file_writer.mojom.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/mhtml_extra_parts.h"
 #include "content/public/browser/render_frame_host.h"
@@ -41,9 +41,9 @@
 const char kContentType[] = "Content-Type: ";
 int kInvalidFileSize = -1;
 struct CloseFileResult {
-  CloseFileResult(content::MhtmlSaveStatus status, int64_t size)
+  CloseFileResult(content::mojom::MhtmlSaveStatus status, int64_t size)
       : save_status(status), file_size(size) {}
-  content::MhtmlSaveStatus save_status;
+  content::mojom::MhtmlSaveStatus save_status;
   int64_t file_size;
 };
 }  // namespace
@@ -80,7 +80,7 @@
   // the header, parts and footer -- that belong to the same MHTML document (see
   // also rfc1341, section 7.2.1, "boundary" description).
   static CloseFileResult FinalizeAndCloseFileOnFileThread(
-      MhtmlSaveStatus save_status,
+      mojom::MhtmlSaveStatus save_status,
       const std::string& boundary,
       base::File file,
       const std::vector<MHTMLExtraDataPart>& extra_data_parts);
@@ -111,15 +111,15 @@
   // Handler for the Mojo interface callback (a notification from the
   // renderer that the MHTML generation for previous frame has finished).
   void SerializeAsMHTMLResponse(
-      mojom::MhtmlSaveStatus mojo_save_status,
+      mojom::MhtmlSaveStatus save_status,
       const std::vector<std::string>& digests_of_uris_of_serialized_resources,
       base::TimeDelta renderer_main_thread_time);
 
   // Records newly serialized resource digests into
   // |digests_of_already_serialized_uris_|, and continues sending serialization
   // requests to the next frame if there are more frames to be serialized.
-  // Returns MhtmlSaveStatus::SUCCESS or a specific error status.
-  MhtmlSaveStatus RecordDigestsAndContinue(
+  // Returns MhtmlSaveStatus::kSuccess or a specific error status.
+  mojom::MhtmlSaveStatus RecordDigestsAndContinue(
       const std::vector<std::string>& digests_of_uris_of_serialized_resources);
 
   // Packs up the current status of the MHTML file saving into a Mojo
@@ -127,9 +127,9 @@
   mojom::SerializeAsMHTMLParamsPtr CreateMojoParams();
 
   // Sends Mojo interface call to the renderer, asking for MHTML
-  // generation of the next frame. Returns MhtmlSaveStatus::SUCCESS or a
+  // generation of the next frame. Returns MhtmlSaveStatus::kSuccess or a
   // specific error status.
-  MhtmlSaveStatus SendToNextRenderFrame();
+  mojom::MhtmlSaveStatus SendToNextRenderFrame();
 
   // Indicates if more calls to SendToNextRenderFrame are needed.
   // This check is necessary to prevent a race condition between the
@@ -138,12 +138,12 @@
   bool IsDone() const;
 
   // Called on the UI thread when a job has been finished.
-  void Finalize(MhtmlSaveStatus save_status);
+  void Finalize(mojom::MhtmlSaveStatus save_status);
 
   // Write the MHTML footer and close the file on the file thread and respond
   // back on the UI thread with the updated status and file size (which will be
   // negative in case of errors).
-  void CloseFile(MhtmlSaveStatus save_status);
+  void CloseFile(mojom::MhtmlSaveStatus save_status);
 
   void MarkAsFinished();
 
@@ -265,7 +265,7 @@
   return mojo_params;
 }
 
-MhtmlSaveStatus MHTMLGenerationManager::Job::SendToNextRenderFrame() {
+mojom::MhtmlSaveStatus MHTMLGenerationManager::Job::SendToNextRenderFrame() {
   DCHECK(browser_file_.IsValid());
   DCHECK(!pending_frame_tree_node_ids_.empty());
 
@@ -274,7 +274,7 @@
 
   FrameTreeNode* ftn = FrameTreeNode::GloballyFindByID(frame_tree_node_id);
   if (!ftn)  // The contents went away.
-    return MhtmlSaveStatus::FRAME_NO_LONGER_EXISTS;
+    return mojom::MhtmlSaveStatus::kFrameNoLongerExists;
   RenderFrameHost* rfh = ftn->current_frame_host();
 
   // Bind Mojo interface to the RenderFrame
@@ -298,13 +298,14 @@
                                     frame_tree_node_id);
   DCHECK(wait_on_renderer_start_time_.is_null());
   wait_on_renderer_start_time_ = base::TimeTicks::Now();
-  return MhtmlSaveStatus::SUCCESS;
+  return mojom::MhtmlSaveStatus::kSuccess;
 }
 
 void MHTMLGenerationManager::Job::OnConnectionError() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  // If message pipe end closes, then it is an unexpected crash.
   DLOG(ERROR) << "Message pipe to renderer closed while expecting response";
-  Finalize(MhtmlSaveStatus::RENDER_PROCESS_EXITED);
+  Finalize(mojom::MhtmlSaveStatus::kRenderProcessExited);
 }
 
 void MHTMLGenerationManager::Job::OnFileAvailable(base::File browser_file) {
@@ -312,33 +313,32 @@
 
   if (!browser_file.IsValid()) {
     DLOG(ERROR) << "Failed to create file";
-    Finalize(MhtmlSaveStatus::FILE_CREATION_ERROR);
+    Finalize(mojom::MhtmlSaveStatus::kFileCreationError);
     return;
   }
 
   browser_file_ = std::move(browser_file);
 
-  MhtmlSaveStatus save_status = SendToNextRenderFrame();
-  if (save_status != MhtmlSaveStatus::SUCCESS)
+  mojom::MhtmlSaveStatus save_status = SendToNextRenderFrame();
+  if (save_status != mojom::MhtmlSaveStatus::kSuccess)
     Finalize(save_status);
 }
 
 void MHTMLGenerationManager::Job::OnFinished(
     const CloseFileResult& close_file_result) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  MhtmlSaveStatus save_status = close_file_result.save_status;
+  mojom::MhtmlSaveStatus save_status = close_file_result.save_status;
   int64_t file_size = close_file_result.file_size;
 
-  TRACE_EVENT_NESTABLE_ASYNC_END2(
-      "page-serialization", "SavingMhtmlJob", this, "job save status",
-      GetMhtmlSaveStatusLabel(save_status), "file size", file_size);
+  TRACE_EVENT_NESTABLE_ASYNC_END2("page-serialization", "SavingMhtmlJob", this,
+                                  "job save status", save_status, "file size",
+                                  file_size);
   UMA_HISTOGRAM_TIMES("PageSerialization.MhtmlGeneration.FullPageSavingTime",
                       base::TimeTicks::Now() - creation_time_);
   UMA_HISTOGRAM_ENUMERATION("PageSerialization.MhtmlGeneration.FinalSaveStatus",
-                            static_cast<int>(save_status),
-                            static_cast<int>(MhtmlSaveStatus::LAST));
-  std::move(callback_).Run(save_status == MhtmlSaveStatus::SUCCESS ? file_size
-                                                                   : -1);
+                            save_status);
+  std::move(callback_).Run(
+      save_status == mojom::MhtmlSaveStatus::kSuccess ? file_size : -1);
   delete this;  // This is the last time the Job is referenced.
 }
 
@@ -399,14 +399,15 @@
   pending_frame_tree_node_ids_.push(frame_tree_node_id);
 }
 
-void MHTMLGenerationManager::Job::CloseFile(MhtmlSaveStatus save_status) {
+void MHTMLGenerationManager::Job::CloseFile(
+    mojom::MhtmlSaveStatus save_status) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(!mhtml_boundary_marker_.empty());
 
   if (!browser_file_.IsValid()) {
     // Only update the status if that won't hide an earlier error.
-    if (save_status == MhtmlSaveStatus::SUCCESS)
-      save_status = MhtmlSaveStatus::FILE_WRITTING_ERROR;
+    if (save_status == mojom::MhtmlSaveStatus::kSuccess)
+      save_status = mojom::MhtmlSaveStatus::kFileWritingError;
     OnFinished(CloseFileResult(save_status, -1));
     return;
   }
@@ -417,14 +418,15 @@
       base::BindOnce(
           &MHTMLGenerationManager::Job::FinalizeAndCloseFileOnFileThread,
           save_status,
-          (save_status == MhtmlSaveStatus::SUCCESS ? mhtml_boundary_marker_
-                                                   : std::string()),
+          (save_status == mojom::MhtmlSaveStatus::kSuccess
+               ? mhtml_boundary_marker_
+               : std::string()),
           std::move(browser_file_), std::move(extra_data_parts_)),
       base::BindOnce(&Job::OnFinished, weak_factory_.GetWeakPtr()));
 }
 
 void MHTMLGenerationManager::Job::SerializeAsMHTMLResponse(
-    mojom::MhtmlSaveStatus mojo_save_status,
+    mojom::MhtmlSaveStatus save_status,
     const std::vector<std::string>& digests_of_uris_of_serialized_resources,
     base::TimeDelta renderer_main_thread_time) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -435,28 +437,25 @@
 
   frame_tree_node_id_of_busy_frame_ = FrameTreeNode::kFrameTreeNodeInvalidId;
 
-  // TODO(crbug.com/915966): Remove this statement once enums are dedupped.
-  MhtmlSaveStatus save_status = static_cast<MhtmlSaveStatus>(mojo_save_status);
-
   // If the renderer succeeded, update the status.
-  if (save_status == MhtmlSaveStatus::SUCCESS) {
+  if (save_status == mojom::MhtmlSaveStatus::kSuccess) {
     save_status =
         RecordDigestsAndContinue(digests_of_uris_of_serialized_resources);
   }
 
   // If there was a failure (either from the renderer or from the job) then
   // terminate the job and return.
-  if (save_status != MhtmlSaveStatus::SUCCESS) {
+  if (save_status != mojom::MhtmlSaveStatus::kSuccess) {
     Finalize(save_status);
     return;
   }
 
   // Otherwise report completion if the job is done.
   if (IsDone())
-    Finalize(MhtmlSaveStatus::SUCCESS);
+    Finalize(mojom::MhtmlSaveStatus::kSuccess);
 }
 
-MhtmlSaveStatus MHTMLGenerationManager::Job::RecordDigestsAndContinue(
+mojom::MhtmlSaveStatus MHTMLGenerationManager::Job::RecordDigestsAndContinue(
     const std::vector<std::string>& digests_of_uris_of_serialized_resources) {
   DCHECK(!wait_on_renderer_start_time_.is_null());
   base::TimeDelta renderer_wait_time =
@@ -481,7 +480,7 @@
 
   // Report success if all frames have been processed.
   if (pending_frame_tree_node_ids_.empty())
-    return MhtmlSaveStatus::SUCCESS;
+    return mojom::MhtmlSaveStatus::kSuccess;
 
   return SendToNextRenderFrame();
 }
@@ -494,7 +493,7 @@
   return !waiting_for_response_from_renderer && no_more_requests_to_send;
 }
 
-void MHTMLGenerationManager::Job::Finalize(MhtmlSaveStatus save_status) {
+void MHTMLGenerationManager::Job::Finalize(mojom::MhtmlSaveStatus save_status) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   MarkAsFinished();
   CloseFile(save_status);
@@ -513,27 +512,27 @@
 
 // static
 CloseFileResult MHTMLGenerationManager::Job::FinalizeAndCloseFileOnFileThread(
-    MhtmlSaveStatus save_status,
+    mojom::MhtmlSaveStatus save_status,
     const std::string& boundary,
     base::File file,
     const std::vector<MHTMLExtraDataPart>& extra_data_parts) {
   DCHECK(download::GetDownloadTaskRunner()->RunsTasksInCurrentSequence());
 
   // If no previous error occurred the boundary should have been provided.
-  if (save_status == MhtmlSaveStatus::SUCCESS) {
+  if (save_status == mojom::MhtmlSaveStatus::kSuccess) {
     TRACE_EVENT0("page-serialization",
                  "MHTMLGenerationManager::Job MHTML footer writing");
     DCHECK(!boundary.empty());
 
     // Write the extra data into a part of its own, if we have any.
     if (!WriteExtraDataParts(boundary, file, extra_data_parts)) {
-      save_status = MhtmlSaveStatus::FILE_WRITTING_ERROR;
+      save_status = mojom::MhtmlSaveStatus::kFileWritingError;
     }
 
     // Write out the footer at the bottom of the file.
-    if (save_status == MhtmlSaveStatus::SUCCESS &&
+    if (save_status == mojom::MhtmlSaveStatus::kSuccess &&
         !WriteFooter(boundary, file)) {
-      save_status = MhtmlSaveStatus::FILE_WRITTING_ERROR;
+      save_status = mojom::MhtmlSaveStatus::kFileWritingError;
     }
   }
 
@@ -541,8 +540,8 @@
   // won't hide an earlier error.
   int64_t file_size = kInvalidFileSize;
   if (!CloseFileIfValid(file, &file_size) &&
-      save_status == MhtmlSaveStatus::SUCCESS) {
-    save_status = MhtmlSaveStatus::FILE_CLOSING_ERROR;
+      save_status == mojom::MhtmlSaveStatus::kSuccess) {
+    save_status = mojom::MhtmlSaveStatus::kFileClosingError;
   }
 
   return CloseFileResult(save_status, file_size);
diff --git a/content/browser/download/mhtml_generation_manager.h b/content/browser/download/mhtml_generation_manager.h
index 72c259bf..9cfa5c1 100644
--- a/content/browser/download/mhtml_generation_manager.h
+++ b/content/browser/download/mhtml_generation_manager.h
@@ -14,7 +14,6 @@
 #include "base/macros.h"
 #include "base/memory/singleton.h"
 #include "base/process/process.h"
-#include "content/common/download/mhtml_save_status.h"
 #include "content/public/common/mhtml_generation_params.h"
 
 namespace base {
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 7a9ec90..1e834cc 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -530,6 +530,10 @@
 
   void OpenFileChooser(blink::mojom::FileChooserParamsPtr params,
                        OpenFileChooserCallback callback) override {
+    if (proxy_) {
+      std::move(callback).Run(nullptr);
+      return;
+    }
     callback_ = std::move(callback);
     auto listener = std::make_unique<ListenerProxy>(this);
     proxy_ = listener.get();
@@ -549,6 +553,10 @@
   void EnumerateChosenDirectory(
       const base::FilePath& directory_path,
       EnumerateChosenDirectoryCallback callback) override {
+    if (proxy_) {
+      std::move(callback).Run(nullptr);
+      return;
+    }
     callback_ = std::move(callback);
     auto listener = std::make_unique<ListenerProxy>(this);
     proxy_ = listener.get();
diff --git a/content/browser/indexed_db/database_impl.cc b/content/browser/indexed_db/database_impl.cc
index 4d4b450..3b3501a 100644
--- a/content/browser/indexed_db/database_impl.cc
+++ b/content/browser/indexed_db/database_impl.cc
@@ -4,6 +4,7 @@
 
 #include "content/browser/indexed_db/database_impl.h"
 
+#include <set>
 #include <utility>
 
 #include "base/bind.h"
@@ -81,129 +82,6 @@
   SEQUENCE_CHECKER(sequence_checker_);
 };
 
-// Expect to be created/called/destroyed on IDB sequence.
-// TODO(cmp): Flatten calls / remove this class once IDB task runner CL settles.
-class DatabaseImpl::IDBSequenceHelper {
- public:
-  IDBSequenceHelper(base::WeakPtr<IndexedDBDispatcherHost> dispatcher_host,
-                    std::unique_ptr<IndexedDBConnection> connection,
-                    const url::Origin& origin,
-                    scoped_refptr<IndexedDBContextImpl> indexed_db_context);
-  ~IDBSequenceHelper();
-
-  void ConnectionOpened();
-
-  void CreateObjectStore(int64_t transaction_id,
-                         int64_t object_store_id,
-                         const base::string16& name,
-                         const blink::IndexedDBKeyPath& key_path,
-                         bool auto_increment);
-  void DeleteObjectStore(int64_t transaction_id, int64_t object_store_id);
-  void RenameObjectStore(int64_t transaction_id,
-                         int64_t object_store_id,
-                         const base::string16& new_name);
-  void CreateTransaction(int64_t transaction_id,
-                         const std::vector<int64_t>& object_store_ids,
-                         blink::mojom::IDBTransactionMode mode);
-  void Close();
-  void VersionChangeIgnored();
-  void AddObserver(int64_t transaction_id,
-                   int32_t observer_id,
-                   bool include_transaction,
-                   bool no_records,
-                   bool values,
-                   uint32_t operation_types);
-  void RemoveObservers(const std::vector<int32_t>& observers);
-  void Get(int64_t transaction_id,
-           int64_t object_store_id,
-           int64_t index_id,
-           const blink::IndexedDBKeyRange& key_range,
-           bool key_only,
-           scoped_refptr<IndexedDBCallbacks> callbacks);
-  void GetAll(int64_t transaction_id,
-              int64_t object_store_id,
-              int64_t index_id,
-              const blink::IndexedDBKeyRange& key_range,
-              bool key_only,
-              int64_t max_count,
-              scoped_refptr<IndexedDBCallbacks> callbacks);
-  void Put(int64_t transaction_id,
-           int64_t object_store_id,
-           const blink::IndexedDBKey& key,
-           blink::mojom::IDBPutMode mode,
-           const std::vector<blink::IndexedDBIndexKeys>& index_keys,
-           blink::mojom::IDBCallbacksAssociatedPtrInfo callbacks_info,
-           blink::mojom::IDBValuePtr value,
-           std::vector<IndexedDBBlobInfo> blob_info);
-  void SetIndexKeys(int64_t transaction_id,
-                    int64_t object_store_id,
-                    const blink::IndexedDBKey& primary_key,
-                    const std::vector<blink::IndexedDBIndexKeys>& index_keys);
-  void SetIndexesReady(int64_t transaction_id,
-                       int64_t object_store_id,
-                       const std::vector<int64_t>& index_ids);
-  void OpenCursor(int64_t transaction_id,
-                  int64_t object_store_id,
-                  int64_t index_id,
-                  const blink::IndexedDBKeyRange& key_range,
-                  blink::mojom::IDBCursorDirection direction,
-                  bool key_only,
-                  blink::mojom::IDBTaskType task_type,
-                  scoped_refptr<IndexedDBCallbacks> callbacks);
-  void Count(int64_t transaction_id,
-             int64_t object_store_id,
-             int64_t index_id,
-             const blink::IndexedDBKeyRange& key_range,
-             scoped_refptr<IndexedDBCallbacks> callbacks);
-  void DeleteRange(int64_t transaction_id,
-                   int64_t object_store_id,
-                   const blink::IndexedDBKeyRange& key_range,
-                   scoped_refptr<IndexedDBCallbacks> callbacks);
-  void GetKeyGeneratorCurrentNumber(
-      int64_t transaction_id,
-      int64_t object_store_id,
-      scoped_refptr<IndexedDBCallbacks> callbacks);
-  void Clear(int64_t transaction_id,
-             int64_t object_store_id,
-             scoped_refptr<IndexedDBCallbacks> callbacks);
-  void CreateIndex(int64_t transaction_id,
-                   int64_t object_store_id,
-                   int64_t index_id,
-                   const base::string16& name,
-                   const blink::IndexedDBKeyPath& key_path,
-                   bool unique,
-                   bool multi_entry);
-  void DeleteIndex(int64_t transaction_id,
-                   int64_t object_store_id,
-                   int64_t index_id);
-  void RenameIndex(int64_t transaction_id,
-                   int64_t object_store_id,
-                   int64_t index_id,
-                   const base::string16& new_name);
-  void Abort(int64_t transaction_id);
-  void AbortWithError(
-      int64_t transaction_id,
-      const IndexedDBDatabaseError& error,
-      blink::mojom::IDBCallbacksAssociatedPtrInfo callbacks_info);
-  void Commit(int64_t transaction_id, int64_t num_errors_handled);
-  void OnGotUsageAndQuotaForCommit(int64_t transaction_id,
-                                   blink::mojom::QuotaStatusCode status,
-                                   int64_t usage,
-                                   int64_t quota);
-
-  base::WeakPtr<IDBSequenceHelper> AsWeakPtr() {
-    return weak_factory_.GetWeakPtr();
-  }
-
- private:
-  base::WeakPtr<IndexedDBDispatcherHost> dispatcher_host_;
-  scoped_refptr<IndexedDBContextImpl> indexed_db_context_;
-  std::unique_ptr<IndexedDBConnection> connection_;
-  const url::Origin origin_;
-  SEQUENCE_CHECKER(sequence_checker_);
-  base::WeakPtrFactory<IDBSequenceHelper> weak_factory_;
-};
-
 DatabaseImpl::DatabaseImpl(std::unique_ptr<IndexedDBConnection> connection,
                            const url::Origin& origin,
                            IndexedDBDispatcherHost* dispatcher_host,
@@ -212,19 +90,22 @@
                               dispatcher_host->blob_storage_context(),
                               dispatcher_host->ipc_process_id())),
       dispatcher_host_(dispatcher_host),
+      indexed_db_context_(dispatcher_host->context()),
+      connection_(std::move(connection)),
       origin_(origin),
-      idb_runner_(std::move(idb_runner)) {
+      idb_runner_(std::move(idb_runner)),
+      weak_factory_(this) {
   DCHECK(idb_runner_->RunsTasksInCurrentSequence());
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(connection);
-  helper_ = base::WrapUnique(new IDBSequenceHelper(
-      dispatcher_host_->AsWeakPtr(), std::move(connection), origin,
-      dispatcher_host->context()));
-  helper_->ConnectionOpened();
+  DCHECK(connection_);
+  indexed_db_context_->ConnectionOpened(origin_, connection_.get());
 }
 
 DatabaseImpl::~DatabaseImpl() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (connection_->IsConnected())
+    connection_->Close();
+  indexed_db_context_->ConnectionClosed(origin_, connection_.get());
 }
 
 void DatabaseImpl::CreateObjectStore(int64_t transaction_id,
@@ -233,21 +114,46 @@
                                      const IndexedDBKeyPath& key_path,
                                      bool auto_increment) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->CreateObjectStore(transaction_id, object_store_id, name, key_path,
-                             auto_increment);
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->CreateObjectStore(transaction, object_store_id, name,
+                                             key_path, auto_increment);
 }
 
 void DatabaseImpl::DeleteObjectStore(int64_t transaction_id,
                                      int64_t object_store_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->DeleteObjectStore(transaction_id, object_store_id);
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->DeleteObjectStore(transaction, object_store_id);
 }
 
 void DatabaseImpl::RenameObjectStore(int64_t transaction_id,
                                      int64_t object_store_id,
                                      const base::string16& new_name) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->RenameObjectStore(transaction_id, object_store_id, new_name);
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->RenameObjectStore(transaction, object_store_id,
+                                             new_name);
 }
 
 void DatabaseImpl::CreateTransaction(
@@ -255,17 +161,36 @@
     const std::vector<int64_t>& object_store_ids,
     blink::mojom::IDBTransactionMode mode) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->CreateTransaction(transaction_id, object_store_ids, mode);
+  if (!connection_->IsConnected())
+    return;
+
+  if (connection_->GetTransaction(transaction_id)) {
+    mojo::ReportBadMessage(kTransactionAlreadyExists);
+    return;
+  }
+
+  IndexedDBTransaction* transaction = connection_->CreateTransaction(
+      transaction_id,
+      std::set<int64_t>(object_store_ids.begin(), object_store_ids.end()), mode,
+      new IndexedDBBackingStore::Transaction(
+          connection_->database()->backing_store()));
+  connection_->database()->RegisterAndScheduleTransaction(transaction);
 }
 
 void DatabaseImpl::Close() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->Close();
+  if (!connection_->IsConnected())
+    return;
+
+  connection_->Close();
 }
 
 void DatabaseImpl::VersionChangeIgnored() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->VersionChangeIgnored();
+  if (!connection_->IsConnected())
+    return;
+
+  connection_->VersionChangeIgnored();
 }
 
 void DatabaseImpl::AddObserver(int64_t transaction_id,
@@ -275,13 +200,26 @@
                                bool values,
                                uint32_t operation_types) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->AddObserver(transaction_id, observer_id, include_transaction,
-                       no_records, values, operation_types);
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  IndexedDBObserver::Options options(include_transaction, no_records, values,
+                                     operation_types);
+  connection_->database()->AddPendingObserver(transaction, observer_id,
+                                              options);
 }
 
 void DatabaseImpl::RemoveObservers(const std::vector<int32_t>& observers) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->RemoveObservers(observers);
+  if (!connection_->IsConnected())
+    return;
+
+  connection_->RemoveObservers(observers);
 }
 
 void DatabaseImpl::Get(
@@ -295,8 +233,17 @@
   scoped_refptr<IndexedDBCallbacks> callbacks(
       new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_,
                              std::move(callbacks_info), idb_runner_));
-  helper_->Get(transaction_id, object_store_id, index_id, key_range, key_only,
-               std::move(callbacks));
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->Get(transaction, object_store_id, index_id,
+                               std::make_unique<IndexedDBKeyRange>(key_range),
+                               key_only, callbacks);
 }
 
 void DatabaseImpl::GetAll(
@@ -311,14 +258,24 @@
   scoped_refptr<IndexedDBCallbacks> callbacks(
       new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_,
                              std::move(callbacks_info), idb_runner_));
-  helper_->GetAll(transaction_id, object_store_id, index_id, key_range,
-                  key_only, max_count, std::move(callbacks));
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->GetAll(
+      transaction, object_store_id, index_id,
+      std::make_unique<IndexedDBKeyRange>(key_range), key_only, max_count,
+      std::move(callbacks));
 }
 
 void DatabaseImpl::Put(
     int64_t transaction_id,
     int64_t object_store_id,
-    blink::mojom::IDBValuePtr value,
+    blink::mojom::IDBValuePtr value_ptr,
     const IndexedDBKey& key,
     blink::mojom::IDBPutMode mode,
     const std::vector<IndexedDBIndexKeys>& index_keys,
@@ -327,11 +284,11 @@
   CHECK(dispatcher_host_);
 
   IOHelper::LoadResult result;
-  if (value->blob_or_file_info.empty()) {
+  if (value_ptr->blob_or_file_info.empty()) {
     // If there are no blobs to process, we don't need to hop to the IO thread
     // to load blobs.
     result.code = IOHelper::LoadResultCode::kSuccess;
-    result.value = std::move(value);
+    result.value = std::move(value_ptr);
     result.blob_info = std::vector<IndexedDBBlobInfo>();
     LogUMAPutBlobCount(result.blob_info.size());
   } else {
@@ -345,7 +302,7 @@
     base::PostTaskWithTraits(
         FROM_HERE, {BrowserThread::IO},
         base::BindOnce(&DatabaseImpl::IOHelper::LoadBlobsOnIOThread,
-                       base::Unretained(io_helper_.get()), std::move(value),
+                       base::Unretained(io_helper_.get()), std::move(value_ptr),
                        &signal_when_finished, &result));
     signal_when_finished.Wait();
   }
@@ -354,11 +311,23 @@
     case IOHelper::LoadResultCode::kNoop:
       return;
     case IOHelper::LoadResultCode::kAbort: {
-      helper_->AbortWithError(
-          transaction_id,
-          IndexedDBDatabaseError(blink::kWebIDBDatabaseExceptionUnknownError,
-                                 kInvalidBlobUuid),
-          std::move(callbacks_info));
+      IndexedDBDatabaseError error(blink::kWebIDBDatabaseExceptionUnknownError,
+                                   kInvalidBlobUuid);
+      scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks(
+          dispatcher_host_->AsWeakPtr(), origin_, std::move(callbacks_info),
+          dispatcher_host_->context()->TaskRunner()));
+
+      callbacks->OnError(error);
+
+      if (!connection_->IsConnected())
+        return;
+
+      IndexedDBTransaction* transaction =
+          connection_->GetTransaction(transaction_id);
+      if (!transaction)
+        return;
+
+      connection_->AbortTransaction(transaction, error);
       return;
     }
     case IOHelper::LoadResultCode::kInvalidBlobPath: {
@@ -366,9 +335,38 @@
       return;
     }
     case IOHelper::LoadResultCode::kSuccess: {
-      helper_->Put(transaction_id, object_store_id, key, mode, index_keys,
-                   std::move(callbacks_info), std::move(result.value),
-                   std::move(result.blob_info));
+      if (!connection_->IsConnected())
+        return;
+
+      IndexedDBTransaction* transaction =
+          connection_->GetTransaction(transaction_id);
+      if (!transaction)
+        return;
+
+      // Value size recorded in IDBObjectStore before we can auto-wrap in a
+      // blob. 1KB to 10MB.
+      UMA_HISTOGRAM_COUNTS_10000("WebCore.IndexedDB.PutKeySize",
+                                 key.size_estimate() / 1024);
+
+      uint64_t commit_size = result.value->bits.size() + key.size_estimate();
+      IndexedDBValue value;
+      // TODO(crbug.com/902498): Use mojom traits to map directly to
+      // std::string.
+      value.bits =
+          std::string(result.value->bits.begin(), result.value->bits.end());
+      // Release result.value->bits std::vector.
+      result.value->bits.clear();
+      swap(value.blob_info, result.blob_info);
+      scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks(
+          dispatcher_host_->AsWeakPtr(), origin_, std::move(callbacks_info),
+          dispatcher_host_->context()->TaskRunner()));
+      connection_->database()->Put(transaction, object_store_id, &value,
+                                   std::make_unique<IndexedDBKey>(key), mode,
+                                   std::move(callbacks), index_keys);
+
+      // Size can't be big enough to overflow because it represents the
+      // actual bytes passed through IPC.
+      transaction->set_size(transaction->size() + commit_size);
       return;
     }
     default:
@@ -383,15 +381,33 @@
     const IndexedDBKey& primary_key,
     const std::vector<IndexedDBIndexKeys>& index_keys) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->SetIndexKeys(transaction_id, object_store_id, primary_key,
-                        index_keys);
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->SetIndexKeys(
+      transaction, object_store_id, std::make_unique<IndexedDBKey>(primary_key),
+      index_keys);
 }
 
 void DatabaseImpl::SetIndexesReady(int64_t transaction_id,
                                    int64_t object_store_id,
                                    const std::vector<int64_t>& index_ids) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->SetIndexesReady(transaction_id, object_store_id, index_ids);
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->SetIndexesReady(transaction, object_store_id,
+                                           index_ids);
 }
 
 void DatabaseImpl::OpenCursor(
@@ -407,8 +423,18 @@
   scoped_refptr<IndexedDBCallbacks> callbacks(
       new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_,
                              std::move(callbacks_info), idb_runner_));
-  helper_->OpenCursor(transaction_id, object_store_id, index_id, key_range,
-                      direction, key_only, task_type, std::move(callbacks));
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->OpenCursor(
+      transaction, object_store_id, index_id,
+      std::make_unique<IndexedDBKeyRange>(key_range), direction, key_only,
+      task_type, std::move(callbacks));
 }
 
 void DatabaseImpl::Count(
@@ -421,8 +447,17 @@
   scoped_refptr<IndexedDBCallbacks> callbacks(
       new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_,
                              std::move(callbacks_info), idb_runner_));
-  helper_->Count(transaction_id, object_store_id, index_id, key_range,
-                 std::move(callbacks));
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->Count(transaction, object_store_id, index_id,
+                                 std::make_unique<IndexedDBKeyRange>(key_range),
+                                 std::move(callbacks));
 }
 
 void DatabaseImpl::DeleteRange(
@@ -434,8 +469,17 @@
   scoped_refptr<IndexedDBCallbacks> callbacks(
       new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_,
                              std::move(callbacks_info), idb_runner_));
-  helper_->DeleteRange(transaction_id, object_store_id, key_range,
-                       std::move(callbacks));
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->DeleteRange(
+      transaction, object_store_id,
+      std::make_unique<IndexedDBKeyRange>(key_range), std::move(callbacks));
 }
 
 void DatabaseImpl::GetKeyGeneratorCurrentNumber(
@@ -446,8 +490,16 @@
   scoped_refptr<IndexedDBCallbacks> callbacks(
       new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_,
                              std::move(callbacks_info), idb_runner_));
-  helper_->GetKeyGeneratorCurrentNumber(transaction_id, object_store_id,
-                                        std::move(callbacks));
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->GetKeyGeneratorCurrentNumber(
+      transaction, object_store_id, std::move(callbacks));
 }
 
 void DatabaseImpl::Clear(
@@ -458,7 +510,15 @@
   scoped_refptr<IndexedDBCallbacks> callbacks(
       new IndexedDBCallbacks(dispatcher_host_->AsWeakPtr(), origin_,
                              std::move(callbacks_info), idb_runner_));
-  helper_->Clear(transaction_id, object_store_id, std::move(callbacks));
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->Clear(transaction, object_store_id, callbacks);
 }
 
 void DatabaseImpl::CreateIndex(int64_t transaction_id,
@@ -469,15 +529,31 @@
                                bool unique,
                                bool multi_entry) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->CreateIndex(transaction_id, object_store_id, index_id, name,
-                       key_path, unique, multi_entry);
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->CreateIndex(transaction, object_store_id, index_id,
+                                       name, key_path, unique, multi_entry);
 }
 
 void DatabaseImpl::DeleteIndex(int64_t transaction_id,
                                int64_t object_store_id,
                                int64_t index_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->DeleteIndex(transaction_id, object_store_id, index_id);
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->DeleteIndex(transaction, object_store_id, index_id);
 }
 
 void DatabaseImpl::RenameIndex(int64_t transaction_id,
@@ -485,17 +561,57 @@
                                int64_t index_id,
                                const base::string16& new_name) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->RenameIndex(transaction_id, object_store_id, index_id, new_name);
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->database()->RenameIndex(transaction, object_store_id, index_id,
+                                       new_name);
 }
 
 void DatabaseImpl::Abort(int64_t transaction_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->Abort(transaction_id);
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  connection_->AbortTransaction(
+      transaction,
+      IndexedDBDatabaseError(blink::kWebIDBDatabaseExceptionAbortError,
+                             "Transaction aborted by user."));
 }
 
 void DatabaseImpl::Commit(int64_t transaction_id, int64_t num_errors_handled) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  helper_->Commit(transaction_id, num_errors_handled);
+  if (!connection_->IsConnected())
+    return;
+
+  IndexedDBTransaction* transaction =
+      connection_->GetTransaction(transaction_id);
+  if (!transaction)
+    return;
+
+  transaction->SetNumErrorsHandled(num_errors_handled);
+
+  // Always allow empty or delete-only transactions.
+  if (transaction->size() == 0) {
+    connection_->database()->Commit(transaction);
+    return;
+  }
+
+  indexed_db_context_->quota_manager_proxy()->GetUsageAndQuota(
+      indexed_db_context_->TaskRunner(), origin_,
+      blink::mojom::StorageType::kTemporary,
+      base::BindOnce(&DatabaseImpl::OnGotUsageAndQuotaForCommit,
+                     weak_factory_.GetWeakPtr(), transaction_id));
 }
 
 DatabaseImpl::IOHelper::IOHelper(
@@ -584,489 +700,7 @@
   result->blob_info = std::move(blob_info);
 }
 
-DatabaseImpl::IDBSequenceHelper::IDBSequenceHelper(
-    base::WeakPtr<IndexedDBDispatcherHost> dispatcher_host,
-    std::unique_ptr<IndexedDBConnection> connection,
-    const url::Origin& origin,
-    scoped_refptr<IndexedDBContextImpl> indexed_db_context)
-    : dispatcher_host_(dispatcher_host),
-      indexed_db_context_(indexed_db_context),
-      connection_(std::move(connection)),
-      origin_(origin),
-      weak_factory_(this) {
-  DCHECK(indexed_db_context_->TaskRunner()->RunsTasksInCurrentSequence());
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-}
-
-DatabaseImpl::IDBSequenceHelper::~IDBSequenceHelper() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (connection_->IsConnected())
-    connection_->Close();
-  indexed_db_context_->ConnectionClosed(origin_, connection_.get());
-}
-
-void DatabaseImpl::IDBSequenceHelper::ConnectionOpened() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  indexed_db_context_->ConnectionOpened(origin_, connection_.get());
-}
-
-void DatabaseImpl::IDBSequenceHelper::CreateObjectStore(
-    int64_t transaction_id,
-    int64_t object_store_id,
-    const base::string16& name,
-    const IndexedDBKeyPath& key_path,
-    bool auto_increment) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->CreateObjectStore(transaction, object_store_id, name,
-                                             key_path, auto_increment);
-}
-
-void DatabaseImpl::IDBSequenceHelper::DeleteObjectStore(
-    int64_t transaction_id,
-    int64_t object_store_id) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->DeleteObjectStore(transaction, object_store_id);
-}
-
-void DatabaseImpl::IDBSequenceHelper::RenameObjectStore(
-    int64_t transaction_id,
-    int64_t object_store_id,
-    const base::string16& new_name) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->RenameObjectStore(transaction, object_store_id,
-                                             new_name);
-}
-
-void DatabaseImpl::IDBSequenceHelper::CreateTransaction(
-    int64_t transaction_id,
-    const std::vector<int64_t>& object_store_ids,
-    blink::mojom::IDBTransactionMode mode) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  if (connection_->GetTransaction(transaction_id)) {
-    mojo::ReportBadMessage(kTransactionAlreadyExists);
-    return;
-  }
-
-  IndexedDBTransaction* transaction = connection_->CreateTransaction(
-      transaction_id,
-      std::set<int64_t>(object_store_ids.begin(), object_store_ids.end()), mode,
-      new IndexedDBBackingStore::Transaction(
-          connection_->database()->backing_store()));
-  connection_->database()->RegisterAndScheduleTransaction(transaction);
-}
-
-void DatabaseImpl::IDBSequenceHelper::Close() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  connection_->Close();
-}
-
-void DatabaseImpl::IDBSequenceHelper::VersionChangeIgnored() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  connection_->VersionChangeIgnored();
-}
-
-void DatabaseImpl::IDBSequenceHelper::AddObserver(int64_t transaction_id,
-                                                  int32_t observer_id,
-                                                  bool include_transaction,
-                                                  bool no_records,
-                                                  bool values,
-                                                  uint32_t operation_types) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  IndexedDBObserver::Options options(include_transaction, no_records, values,
-                                     operation_types);
-  connection_->database()->AddPendingObserver(transaction, observer_id,
-                                              options);
-}
-
-void DatabaseImpl::IDBSequenceHelper::RemoveObservers(
-    const std::vector<int32_t>& observers) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  connection_->RemoveObservers(observers);
-}
-
-void DatabaseImpl::IDBSequenceHelper::Get(
-    int64_t transaction_id,
-    int64_t object_store_id,
-    int64_t index_id,
-    const IndexedDBKeyRange& key_range,
-    bool key_only,
-    scoped_refptr<IndexedDBCallbacks> callbacks) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->Get(transaction, object_store_id, index_id,
-                               std::make_unique<IndexedDBKeyRange>(key_range),
-                               key_only, callbacks);
-}
-
-void DatabaseImpl::IDBSequenceHelper::GetAll(
-    int64_t transaction_id,
-    int64_t object_store_id,
-    int64_t index_id,
-    const IndexedDBKeyRange& key_range,
-    bool key_only,
-    int64_t max_count,
-    scoped_refptr<IndexedDBCallbacks> callbacks) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->GetAll(
-      transaction, object_store_id, index_id,
-      std::make_unique<IndexedDBKeyRange>(key_range), key_only, max_count,
-      std::move(callbacks));
-}
-
-void DatabaseImpl::IDBSequenceHelper::Put(
-    int64_t transaction_id,
-    int64_t object_store_id,
-    const IndexedDBKey& key,
-    blink::mojom::IDBPutMode mode,
-    const std::vector<IndexedDBIndexKeys>& index_keys,
-    blink::mojom::IDBCallbacksAssociatedPtrInfo callbacks_info,
-    blink::mojom::IDBValuePtr mojo_value,
-    std::vector<IndexedDBBlobInfo> blob_info) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  // Value size recorded in IDBObjectStore before we can auto-wrap in a blob.
-  // 1KB to 10MB.
-  UMA_HISTOGRAM_COUNTS_10000("WebCore.IndexedDB.PutKeySize",
-                             key.size_estimate() / 1024);
-
-  uint64_t commit_size = mojo_value->bits.size() + key.size_estimate();
-  IndexedDBValue value;
-  // TODO(crbug.com/902498): Use mojom traits to map directly to std::string.
-  value.bits = std::string(mojo_value->bits.begin(), mojo_value->bits.end());
-  // Release mojo_value->bits std::vector.
-  mojo_value->bits.clear();
-  swap(value.blob_info, blob_info);
-  scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks(
-      dispatcher_host_, origin_, std::move(callbacks_info),
-      dispatcher_host_->context()->TaskRunner()));
-  connection_->database()->Put(transaction, object_store_id, &value,
-                               std::make_unique<IndexedDBKey>(key), mode,
-                               std::move(callbacks), index_keys);
-
-  // Size can't be big enough to overflow because it represents the
-  // actual bytes passed through IPC.
-  transaction->set_size(transaction->size() + commit_size);
-}
-
-void DatabaseImpl::IDBSequenceHelper::SetIndexKeys(
-    int64_t transaction_id,
-    int64_t object_store_id,
-    const IndexedDBKey& primary_key,
-    const std::vector<IndexedDBIndexKeys>& index_keys) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->SetIndexKeys(
-      transaction, object_store_id, std::make_unique<IndexedDBKey>(primary_key),
-      index_keys);
-}
-
-void DatabaseImpl::IDBSequenceHelper::SetIndexesReady(
-    int64_t transaction_id,
-    int64_t object_store_id,
-    const std::vector<int64_t>& index_ids) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->SetIndexesReady(transaction, object_store_id,
-                                           index_ids);
-}
-
-void DatabaseImpl::IDBSequenceHelper::OpenCursor(
-    int64_t transaction_id,
-    int64_t object_store_id,
-    int64_t index_id,
-    const IndexedDBKeyRange& key_range,
-    blink::mojom::IDBCursorDirection direction,
-    bool key_only,
-    blink::mojom::IDBTaskType task_type,
-    scoped_refptr<IndexedDBCallbacks> callbacks) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->OpenCursor(
-      transaction, object_store_id, index_id,
-      std::make_unique<IndexedDBKeyRange>(key_range), direction, key_only,
-      task_type, std::move(callbacks));
-}
-
-void DatabaseImpl::IDBSequenceHelper::Count(
-    int64_t transaction_id,
-    int64_t object_store_id,
-    int64_t index_id,
-    const IndexedDBKeyRange& key_range,
-    scoped_refptr<IndexedDBCallbacks> callbacks) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->Count(transaction, object_store_id, index_id,
-                                 std::make_unique<IndexedDBKeyRange>(key_range),
-                                 std::move(callbacks));
-}
-
-void DatabaseImpl::IDBSequenceHelper::DeleteRange(
-    int64_t transaction_id,
-    int64_t object_store_id,
-    const IndexedDBKeyRange& key_range,
-    scoped_refptr<IndexedDBCallbacks> callbacks) {
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->DeleteRange(
-      transaction, object_store_id,
-      std::make_unique<IndexedDBKeyRange>(key_range), std::move(callbacks));
-}
-
-void DatabaseImpl::IDBSequenceHelper::GetKeyGeneratorCurrentNumber(
-    int64_t transaction_id,
-    int64_t object_store_id,
-    scoped_refptr<IndexedDBCallbacks> callbacks) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->GetKeyGeneratorCurrentNumber(
-      transaction, object_store_id, std::move(callbacks));
-}
-
-void DatabaseImpl::IDBSequenceHelper::Clear(
-    int64_t transaction_id,
-    int64_t object_store_id,
-    scoped_refptr<IndexedDBCallbacks> callbacks) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->Clear(transaction, object_store_id, callbacks);
-}
-
-void DatabaseImpl::IDBSequenceHelper::CreateIndex(
-    int64_t transaction_id,
-    int64_t object_store_id,
-    int64_t index_id,
-    const base::string16& name,
-    const IndexedDBKeyPath& key_path,
-    bool unique,
-    bool multi_entry) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->CreateIndex(transaction, object_store_id, index_id,
-                                       name, key_path, unique, multi_entry);
-}
-
-void DatabaseImpl::IDBSequenceHelper::DeleteIndex(int64_t transaction_id,
-                                                  int64_t object_store_id,
-                                                  int64_t index_id) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->DeleteIndex(transaction, object_store_id, index_id);
-}
-
-void DatabaseImpl::IDBSequenceHelper::RenameIndex(
-    int64_t transaction_id,
-    int64_t object_store_id,
-    int64_t index_id,
-    const base::string16& new_name) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->database()->RenameIndex(transaction, object_store_id, index_id,
-                                       new_name);
-}
-
-void DatabaseImpl::IDBSequenceHelper::Abort(int64_t transaction_id) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->AbortTransaction(
-      transaction,
-      IndexedDBDatabaseError(blink::kWebIDBDatabaseExceptionAbortError,
-                             "Transaction aborted by user."));
-}
-
-void DatabaseImpl::IDBSequenceHelper::AbortWithError(
-    int64_t transaction_id,
-    const IndexedDBDatabaseError& error,
-    blink::mojom::IDBCallbacksAssociatedPtrInfo callbacks_info) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!dispatcher_host_)
-    return;
-
-  scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks(
-      dispatcher_host_, origin_, std::move(callbacks_info),
-      dispatcher_host_->context()->TaskRunner()));
-
-  callbacks->OnError(error);
-
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  connection_->AbortTransaction(transaction, error);
-}
-
-void DatabaseImpl::IDBSequenceHelper::Commit(int64_t transaction_id,
-                                             int64_t num_errors_handled) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!connection_->IsConnected())
-    return;
-
-  IndexedDBTransaction* transaction =
-      connection_->GetTransaction(transaction_id);
-  if (!transaction)
-    return;
-
-  transaction->SetNumErrorsHandled(num_errors_handled);
-
-  // Always allow empty or delete-only transactions.
-  if (transaction->size() == 0) {
-    connection_->database()->Commit(transaction);
-    return;
-  }
-
-  indexed_db_context_->quota_manager_proxy()->GetUsageAndQuota(
-      indexed_db_context_->TaskRunner(), origin_,
-      blink::mojom::StorageType::kTemporary,
-      base::BindOnce(&IDBSequenceHelper::OnGotUsageAndQuotaForCommit,
-                     this->AsWeakPtr(), transaction_id));
-}
-
-void DatabaseImpl::IDBSequenceHelper::OnGotUsageAndQuotaForCommit(
+void DatabaseImpl::OnGotUsageAndQuotaForCommit(
     int64_t transaction_id,
     blink::mojom::QuotaStatusCode status,
     int64_t usage,
diff --git a/content/browser/indexed_db/database_impl.h b/content/browser/indexed_db/database_impl.h
index 454a92a1..3c17ea0 100644
--- a/content/browser/indexed_db/database_impl.h
+++ b/content/browser/indexed_db/database_impl.h
@@ -25,8 +25,8 @@
 }
 
 namespace content {
-
 class IndexedDBConnection;
+class IndexedDBContextImpl;
 class IndexedDBDispatcherHost;
 
 class DatabaseImpl : public blink::mojom::IDBDatabase {
@@ -131,21 +131,28 @@
   void Abort(int64_t transaction_id) override;
   void Commit(int64_t transaction_id, int64_t num_errors_handled) override;
 
+  void OnGotUsageAndQuotaForCommit(int64_t transaction_id,
+                                   blink::mojom::QuotaStatusCode status,
+                                   int64_t usage,
+                                   int64_t quota);
+
  private:
-  class IDBSequenceHelper;
   class IOHelper;
 
-  std::unique_ptr<IDBSequenceHelper> helper_;
   std::unique_ptr<IOHelper, BrowserThread::DeleteOnIOThread> io_helper_;
 
   // This raw pointer is safe because all DatabaseImpl instances are owned by
   // an IndexedDBDispatcherHost.
   IndexedDBDispatcherHost* dispatcher_host_;
+  scoped_refptr<IndexedDBContextImpl> indexed_db_context_;
+  std::unique_ptr<IndexedDBConnection> connection_;
   const url::Origin origin_;
   scoped_refptr<base::SequencedTaskRunner> idb_runner_;
 
   SEQUENCE_CHECKER(sequence_checker_);
 
+  base::WeakPtrFactory<DatabaseImpl> weak_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(DatabaseImpl);
 };
 
diff --git a/content/browser/indexed_db/indexed_db_callbacks.cc b/content/browser/indexed_db/indexed_db_callbacks.cc
index cf5e87f..ac86581 100644
--- a/content/browser/indexed_db/indexed_db_callbacks.cc
+++ b/content/browser/indexed_db/indexed_db_callbacks.cc
@@ -149,11 +149,6 @@
                          const std::vector<IndexedDBBlobInfo>& blob_info);
   void SendSuccessValue(blink::mojom::IDBReturnValuePtr value,
                         const std::vector<IndexedDBBlobInfo>& blob_info);
-  void SendSuccessCursorPrefetch(
-      const std::vector<IndexedDBKey>& keys,
-      const std::vector<IndexedDBKey>& primary_keys,
-      std::vector<blink::mojom::IDBValuePtr> mojo_values,
-      const std::vector<IndexedDBValue>& values);
   void SendSuccessArray(
       std::vector<blink::mojom::IDBReturnValuePtr> mojo_values,
       const std::vector<IndexedDBReturnValue>& values);
@@ -387,28 +382,6 @@
   complete_ = true;
 }
 
-void IndexedDBCallbacks::OnSuccessWithPrefetch(
-    const std::vector<IndexedDBKey>& keys,
-    const std::vector<IndexedDBKey>& primary_keys,
-    std::vector<IndexedDBValue>* values) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(!complete_);
-  DCHECK(helper_);
-  DCHECK_EQ(keys.size(), primary_keys.size());
-  DCHECK_EQ(keys.size(), values->size());
-
-  DCHECK_EQ(blink::mojom::IDBDataLoss::None, data_loss_);
-
-  std::vector<blink::mojom::IDBValuePtr> mojo_values;
-  mojo_values.reserve(values->size());
-  for (size_t i = 0; i < values->size(); ++i)
-    mojo_values.push_back(IndexedDBValue::ConvertAndEraseValue(&(*values)[i]));
-
-  helper_->SendSuccessCursorPrefetch(keys, primary_keys, std::move(mojo_values),
-                                     *values);
-  complete_ = true;
-}
-
 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!complete_);
@@ -674,36 +647,6 @@
   callbacks_->SuccessArray(std::move(mojo_values));
 }
 
-void IndexedDBCallbacks::Helper::SendSuccessCursorPrefetch(
-    const std::vector<IndexedDBKey>& keys,
-    const std::vector<IndexedDBKey>& primary_keys,
-    std::vector<blink::mojom::IDBValuePtr> mojo_values,
-    const std::vector<IndexedDBValue>& values) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_EQ(mojo_values.size(), values.size());
-
-  if (!callbacks_)
-    return;
-  if (!dispatcher_host_) {
-    OnConnectionError();
-    return;
-  }
-
-  std::vector<IndexedDBValueBlob> value_blobs;
-  for (size_t i = 0; i < mojo_values.size(); ++i) {
-    IndexedDBValueBlob::GetIndexedDBValueBlobs(
-        &value_blobs, values[i].blob_info, &mojo_values[i]->blob_or_file_info);
-  }
-
-  if (!IndexedDBCallbacks::CreateAllBlobs(
-          dispatcher_host_->blob_storage_context(), idb_runner_,
-          std::move(value_blobs))) {
-    return;
-  }
-
-  callbacks_->SuccessCursorPrefetch(keys, primary_keys, std::move(mojo_values));
-}
-
 void IndexedDBCallbacks::Helper::SendSuccessKey(const IndexedDBKey& value) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!callbacks_)
diff --git a/content/browser/indexed_db/indexed_db_callbacks.h b/content/browser/indexed_db/indexed_db_callbacks.h
index 68a7b14e..c64914e 100644
--- a/content/browser/indexed_db/indexed_db_callbacks.h
+++ b/content/browser/indexed_db/indexed_db_callbacks.h
@@ -116,12 +116,6 @@
                          const blink::IndexedDBKey& primary_key,
                          IndexedDBValue* value);
 
-  // IndexedDBCursor::PrefetchContinue
-  virtual void OnSuccessWithPrefetch(
-      const std::vector<blink::IndexedDBKey>& keys,
-      const std::vector<blink::IndexedDBKey>& primary_keys,
-      std::vector<IndexedDBValue>* values);
-
   // IndexedDBDatabase::Get
   // IndexedDBCursor::Advance
   virtual void OnSuccess(IndexedDBReturnValue* value);
diff --git a/content/browser/indexed_db/indexed_db_database.cc b/content/browser/indexed_db/indexed_db_database.cc
index 6b5787a5..42c6e06 100644
--- a/content/browser/indexed_db/indexed_db_database.cc
+++ b/content/browser/indexed_db/indexed_db_database.cc
@@ -1949,10 +1949,10 @@
     request->AbortForForceClose();
   }
 
-  auto it = connections_.begin();
-  while (it != connections_.end()) {
-    IndexedDBConnection* connection = *it++;
+  while (!connections_.empty()) {
+    IndexedDBConnection* connection = *connections_.begin();
     connection->ForceClose();
+    connections_.erase(connection);
   }
   DCHECK(connections_.empty());
   DCHECK(!active_request_);
diff --git a/content/browser/indexed_db/indexed_db_database_unittest.cc b/content/browser/indexed_db/indexed_db_database_unittest.cc
index ae68224..7afd674 100644
--- a/content/browser/indexed_db/indexed_db_database_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_database_unittest.cc
@@ -315,6 +315,45 @@
   EXPECT_TRUE(request2->success_called());
 }
 
+TEST_F(IndexedDBDatabaseTest, ForceCloseWhileOpenPending) {
+  // Verify that pending connection requests are handled correctly during a
+  // ForceClose.
+  scoped_refptr<MockIndexedDBCallbacks> request1(new MockIndexedDBCallbacks());
+  scoped_refptr<MockIndexedDBDatabaseCallbacks> callbacks1(
+      new MockIndexedDBDatabaseCallbacks());
+  const int64_t transaction_id1 = 1;
+  std::unique_ptr<IndexedDBPendingConnection> connection(
+      std::make_unique<IndexedDBPendingConnection>(
+          request1, callbacks1, kFakeChildProcessId, transaction_id1,
+          IndexedDBDatabaseMetadata::DEFAULT_VERSION));
+  db_->OpenConnection(std::move(connection));
+
+  EXPECT_EQ(db_->ConnectionCount(), 1UL);
+  EXPECT_EQ(db_->ActiveOpenDeleteCount(), 0UL);
+  EXPECT_EQ(db_->PendingOpenDeleteCount(), 0UL);
+  EXPECT_FALSE(backing_store_->HasOneRef());  // local and db
+
+  scoped_refptr<MockIndexedDBCallbacks> request2(
+      new MockIndexedDBCallbacks(false));
+  scoped_refptr<MockIndexedDBDatabaseCallbacks> callbacks2(
+      new MockIndexedDBDatabaseCallbacks());
+  const int64_t transaction_id2 = 2;
+  std::unique_ptr<IndexedDBPendingConnection> connection2(
+      std::make_unique<IndexedDBPendingConnection>(
+          request1, callbacks1, kFakeChildProcessId, transaction_id2, 3));
+  db_->OpenConnection(std::move(connection2));
+
+  EXPECT_EQ(db_->ConnectionCount(), 1UL);
+  EXPECT_EQ(db_->ActiveOpenDeleteCount(), 1UL);
+  EXPECT_EQ(db_->PendingOpenDeleteCount(), 0UL);
+  EXPECT_FALSE(backing_store_->HasOneRef());  // local and db
+
+  db_->ForceClose();
+  EXPECT_EQ(db_->ConnectionCount(), 0UL);
+  EXPECT_EQ(db_->ActiveOpenDeleteCount(), 0UL);
+  EXPECT_EQ(db_->PendingOpenDeleteCount(), 0UL);
+}
+
 leveldb::Status DummyOperation(IndexedDBTransaction* transaction) {
   return leveldb::Status::OK();
 }
diff --git a/content/browser/indexed_db/mock_mojo_indexed_db_callbacks.h b/content/browser/indexed_db/mock_mojo_indexed_db_callbacks.h
index bea7ed3..bb48207 100644
--- a/content/browser/indexed_db/mock_mojo_indexed_db_callbacks.h
+++ b/content/browser/indexed_db/mock_mojo_indexed_db_callbacks.h
@@ -82,18 +82,6 @@
     MockedSuccessValue(&value);
   }
 
-  MOCK_METHOD3(MockedSuccessCursorPrefetch,
-               void(const std::vector<blink::IndexedDBKey>& keys,
-                    const std::vector<blink::IndexedDBKey>& primary_keys,
-                    std::vector<blink::mojom::IDBValuePtr>* values));
-
-  void SuccessCursorPrefetch(
-      const std::vector<blink::IndexedDBKey>& keys,
-      const std::vector<blink::IndexedDBKey>& primary_keys,
-      std::vector<blink::mojom::IDBValuePtr> values) override {
-    MockedSuccessCursorPrefetch(keys, primary_keys, &values);
-  }
-
   MOCK_METHOD1(MockedSuccessArray,
                void(std::vector<blink::mojom::IDBReturnValuePtr>* values));
   void SuccessArray(
diff --git a/content/browser/process_internals/process_internals_handler_impl.cc b/content/browser/process_internals/process_internals_handler_impl.cc
index 9ba70f4..cf430dd5 100644
--- a/content/browser/process_internals/process_internals_handler_impl.cc
+++ b/content/browser/process_internals/process_internals_handler_impl.cc
@@ -67,6 +67,12 @@
   if (SiteIsolationPolicy::AreIsolatedOriginsEnabled())
     modes.push_back("Isolate Origins");
 
+  // Retrieve any additional site isolation modes controlled by the embedder.
+  std::vector<std::string> additional_modes =
+      GetContentClient()->browser()->GetAdditionalSiteIsolationModes();
+  std::move(additional_modes.begin(), additional_modes.end(),
+            std::back_inserter(modes));
+
   std::move(callback).Run(modes.empty() ? "Disabled"
                                         : base::JoinString(modes, ", "));
 }
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index 4afd0dbb..2f83d404 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -33,6 +33,7 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/content_browser_client.h"
+#include "content/public/browser/file_select_listener.h"
 #include "content/public/browser/interstitial_page.h"
 #include "content/public/browser/interstitial_page_delegate.h"
 #include "content/public/browser/resource_context.h"
@@ -210,6 +211,43 @@
   GURL target_url_;
 };
 
+// Constructs a WebContentsDelegate that mocks a file dialog.
+// Unlike content::FileChooserDelegate, this class doesn't make a response in
+// RunFileChooser(), and a user needs to call Choose().
+class DelayedFileChooserDelegate : public WebContentsDelegate {
+ public:
+  void Choose(const base::FilePath& file) {
+    auto file_info = blink::mojom::FileChooserFileInfo::NewNativeFile(
+        blink::mojom::NativeFileInfo::New(file, base::string16()));
+    std::vector<blink::mojom::FileChooserFileInfoPtr> files;
+    files.push_back(std::move(file_info));
+    listener_->FileSelected(std::move(files), base::FilePath(),
+                            blink::mojom::FileChooserParams::Mode::kOpen);
+    listener_.reset();
+  }
+
+  // WebContentsDelegate overrides
+  void RunFileChooser(RenderFrameHost* render_frame_host,
+                      std::unique_ptr<FileSelectListener> listener,
+                      const blink::mojom::FileChooserParams& params) override {
+    listener_ = std::move(listener);
+  }
+
+  void EnumerateDirectory(WebContents* web_contents,
+                          std::unique_ptr<FileSelectListener> listener,
+                          const base::FilePath& directory_path) override {
+    listener->FileSelectionCanceled();
+  }
+
+ private:
+  std::unique_ptr<FileSelectListener> listener_;
+};
+
+void FileChooserCallback(base::RunLoop* run_loop,
+                         blink::mojom::FileChooserResultPtr result) {
+  run_loop->Quit();
+}
+
 }  // namespace
 
 // The goal of these tests will be to "simulate" exploited renderer processes,
@@ -419,6 +457,36 @@
 #endif
 }
 
+// A test for crbug.com/941008.
+// Calling OpenFileChooser() and EnumerateChosenDirectory() for a single
+// FileChooser instance had a problem.
+IN_PROC_BROWSER_TEST_F(SecurityExploitBrowserTest, UnexpectedMethodsSequence) {
+  NavigateToURL(shell(), GURL("http://foo.com/simple_page.html"));
+  RenderFrameHost* compromised_renderer =
+      shell()->web_contents()->GetMainFrame();
+  auto delegate = std::make_unique<DelayedFileChooserDelegate>();
+  shell()->web_contents()->SetDelegate(delegate.get());
+
+  blink::mojom::FileChooserPtr chooser =
+      static_cast<RenderFrameHostImpl*>(compromised_renderer)
+          ->BindFileChooserForTesting();
+  base::RunLoop run_loop1;
+  base::RunLoop run_loop2;
+  chooser->OpenFileChooser(blink::mojom::FileChooserParams::New(),
+                           base::BindOnce(FileChooserCallback, &run_loop2));
+  // The following EnumerateChosenDirectory() runs the specified callback
+  // immediately regardless of the content of the first argument FilePath.
+  chooser->EnumerateChosenDirectory(
+      base::FilePath(FILE_PATH_LITERAL(":*?\"<>|")),
+      base::BindOnce(FileChooserCallback, &run_loop1));
+  run_loop1.Run();
+
+  delegate->Choose(base::FilePath(FILE_PATH_LITERAL("foo.txt")));
+  run_loop2.Run();
+
+  // The test passes if it doesn't crash.
+}
+
 class SecurityExploitTestInterstitialPage : public InterstitialPageDelegate {
  public:
   explicit SecurityExploitTestInterstitialPage(WebContents* contents) {
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index 482dd3e..573ac8a 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -97,8 +97,6 @@
     "dom_storage/dom_storage_map.h",
     "dom_storage/dom_storage_messages.h",
     "dom_storage/dom_storage_types.h",
-    "download/mhtml_save_status.cc",
-    "download/mhtml_save_status.h",
     "drag_event_source_info.h",
     "drag_messages.h",
     "drag_traits.h",
@@ -470,6 +468,7 @@
     "child.mojom",
     "child_control.mojom",
     "document_scoped_interface_bundle.mojom",
+    "download/mhtml_file_writer.mojom",
     "field_trial_recorder.mojom",
     "frame.mojom",
     "frame_messages.mojom",
@@ -484,7 +483,6 @@
     "media/peer_connection_tracker.mojom",
     "media/renderer_audio_input_stream_factory.mojom",
     "media/renderer_audio_output_stream_factory.mojom",
-    "mhtml_file_writer.mojom",
     "native_types.mojom",
     "navigation_client.mojom",
     "navigation_params.mojom",
diff --git a/content/common/content_param_traits_macros.h b/content/common/content_param_traits_macros.h
index d042e38..e5663ef 100644
--- a/content/common/content_param_traits_macros.h
+++ b/content/common/content_param_traits_macros.h
@@ -11,7 +11,6 @@
 #include "components/viz/common/quads/selection.h"
 #include "content/common/content_export.h"
 #include "content/common/content_param_traits.h"
-#include "content/common/download/mhtml_save_status.h"
 #include "content/common/render_widget_surface_properties.h"
 #include "content/public/common/input_event_ack_state.h"
 #include "content/public/common/resource_type.h"
@@ -34,8 +33,6 @@
                           blink::mojom::RequestContextType::kMaxValue)
 IPC_ENUM_TRAITS_MAX_VALUE(content::ResourceType,
                           content::RESOURCE_TYPE_LAST_TYPE - 1)
-IPC_ENUM_TRAITS_MAX_VALUE(content::MhtmlSaveStatus,
-                          content::MhtmlSaveStatus::LAST)
 IPC_ENUM_TRAITS_MAX_VALUE(blink::WebContentSecurityPolicySource,
                           blink::kWebContentSecurityPolicySourceLast)
 IPC_ENUM_TRAITS_MAX_VALUE(blink::mojom::ContentSecurityPolicyType,
diff --git a/content/common/download/OWNERS b/content/common/download/OWNERS
new file mode 100644
index 0000000..61b5e28
--- /dev/null
+++ b/content/common/download/OWNERS
@@ -0,0 +1,2 @@
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
\ No newline at end of file
diff --git a/content/common/mhtml_file_writer.mojom b/content/common/download/mhtml_file_writer.mojom
similarity index 72%
rename from content/common/mhtml_file_writer.mojom
rename to content/common/download/mhtml_file_writer.mojom
index a245732..619f02a 100644
--- a/content/common/mhtml_file_writer.mojom
+++ b/content/common/download/mhtml_file_writer.mojom
@@ -7,16 +7,33 @@
 import "mojo/public/mojom/base/file.mojom";
 import "mojo/public/mojom/base/time.mojom";
 
-// TODO(crbug/915966): This is currently mapped from mhtml_save_status.h.
-// We should consolidate these sources later to prevent duplicate enums.
+// Status result enum for MHTML generation.
+// Changes to this enum must be reflected in the respective metrics enum named
+// MhtmlGenerationFinalSaveStatus in enums.xml.
 enum MhtmlSaveStatus {
-  SUCCESS = 0,
-  FILE_CLOSING_ERROR,
-  FILE_CREATION_ERROR,
-  FILE_WRITTING_ERROR,
-  FRAME_NO_LONGER_EXISTS,
-  FRAME_SERIALIZATION_FORBIDDEN,
-  RENDER_PROCESS_EXITED,
+  kSuccess = 0,
+
+  // Could not properly close the file where data was written to. Determined by
+  // the browser.
+  kFileClosingError,
+
+  // Could not create the file that would be written to. Determined by the
+  // browser.
+  kFileCreationError,
+
+  // Could not write serialized data to the file. Determined by the renderer.
+  kFileWritingError,
+
+  // The DOM changed and a previously existing frame is no more. Determined by
+  // the browser.
+  kFrameNoLongerExists,
+
+  // No longer used.
+  kDeprecatedFrameSerializationForbidden,
+
+  // A render process needed for the serialization of one of the page's frame is
+  // no more. Determined by the browser.
+  kRenderProcessExited
 };
 
 struct SerializeAsMHTMLParams {
diff --git a/content/common/download/mhtml_save_status.cc b/content/common/download/mhtml_save_status.cc
deleted file mode 100644
index 2fbf080..0000000
--- a/content/common/download/mhtml_save_status.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/common/download/mhtml_save_status.h"
-
-#include "base/logging.h"
-
-namespace content {
-
-const char* GetMhtmlSaveStatusLabel(MhtmlSaveStatus save_status) {
-  switch (save_status) {
-    case MhtmlSaveStatus::SUCCESS:
-      return "Success";
-    case MhtmlSaveStatus::FILE_CLOSING_ERROR:
-      return "File closing error";
-    case MhtmlSaveStatus::FILE_CREATION_ERROR:
-      return "File creation error";
-    case MhtmlSaveStatus::FILE_WRITTING_ERROR:
-      return "File writing error";
-    case MhtmlSaveStatus::FRAME_NO_LONGER_EXISTS:
-      return "Frame no longer exists";
-    case MhtmlSaveStatus::DEPRECATED_FRAME_SERIALIZATION_FORBIDDEN:
-      NOTREACHED();
-      return "";
-    case MhtmlSaveStatus::RENDER_PROCESS_EXITED:
-      return "Render process no longer exists";
-  }
-  NOTREACHED();
-  return "<Invalid status>";
-}
-
-}  // namespace content
diff --git a/content/common/download/mhtml_save_status.h b/content/common/download/mhtml_save_status.h
deleted file mode 100644
index cd090e2..0000000
--- a/content/common/download/mhtml_save_status.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_COMMON_DOWNLOAD_MHTML_SAVE_STATUS_H_
-#define CONTENT_COMMON_DOWNLOAD_MHTML_SAVE_STATUS_H_
-
-namespace content {
-
-// Status result enum for MHTML generation.
-// Changes to this enum must be reflected in the respective metrics enum named
-// MhtmlGenerationFinalSaveStatus in enums.xml.
-enum class MhtmlSaveStatus {
-  SUCCESS = 0,
-
-  // Could not properly close the file where data was written to. Determined by
-  // the browser.
-  FILE_CLOSING_ERROR,
-
-  // Could not create the file that would be written to. Determined by the
-  // browser.
-  FILE_CREATION_ERROR,
-
-  // Could not write serialized data to the file. Determined by the renderer.
-  FILE_WRITTING_ERROR,
-
-  // The DOM changed and a previously existing frame is no more. Determined by
-  // the browser.
-  FRAME_NO_LONGER_EXISTS,
-
-  // No longer used.
-  DEPRECATED_FRAME_SERIALIZATION_FORBIDDEN,
-
-  // A render process needed for the serialization of one of the page's frame is
-  // no more. Determined by the browser.
-  RENDER_PROCESS_EXITED,
-
-  // NOTE: always keep this entry at the end and add new status types only
-  // immediately above this line. Set LAST to the new last value and update the
-  // implementation of GetMhtmlSaveStatusLabel. Make sure to update the
-  // corresponding histogram enum accordingly.
-  LAST = RENDER_PROCESS_EXITED,
-};
-
-// Gets a textual representation of the provided MhtmlSaveStatus value.
-const char* GetMhtmlSaveStatusLabel(MhtmlSaveStatus save_status);
-
-}  // namespace content
-
-#endif  // CONTENT_COMMON_DOWNLOAD_MHTML_SAVE_STATUS_H_
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index c6e2f95..f71cc86 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -254,6 +254,11 @@
   return false;
 }
 
+std::vector<std::string>
+ContentBrowserClient::GetAdditionalSiteIsolationModes() {
+  return std::vector<std::string>();
+}
+
 bool ContentBrowserClient::IsFileAccessAllowed(
     const base::FilePath& path,
     const base::FilePath& absolute_path,
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 7d52e8e..bf74558 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -481,6 +481,9 @@
   // Note that for correctness, the same value should be consistently returned.
   virtual bool ShouldDisableSiteIsolation();
 
+  // Retrieves names of any additional site isolation modes from the embedder.
+  virtual std::vector<std::string> GetAdditionalSiteIsolationModes();
+
   // Indicates whether a file path should be accessible via file URL given a
   // request from a browser context which lives within |profile_path|.
   virtual bool IsFileAccessAllowed(const base::FilePath& path,
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index 6f34b5b..a6e748b 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -220,12 +220,6 @@
 // the use of persistent gpu memory buffers.
 const char kDisablePartialRaster[] = "disable-partial-raster";
 
-// Internally (in devtools_session.cc) switches the protocol to binary format
-// (CBOR). This setting is temporary; we plan to remove it after transition to
-// binary is sufficiently complete (2019-04-01).
-const char kEnableInternalDevToolsBinaryProtocol[] =
-    "enable-internal-devtools-binary-protocol";
-
 // Enable partial raster in the renderer.
 const char kEnablePartialRaster[] = "enable-partial-raster";
 
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index 69ad632..b298c312 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -75,7 +75,6 @@
 CONTENT_EXPORT extern const char kDisableNotifications[];
 CONTENT_EXPORT extern const char kDisableOriginTrialControlledBlinkFeatures[];
 CONTENT_EXPORT extern const char kDisablePartialRaster[];
-CONTENT_EXPORT extern const char kEnableInternalDevToolsBinaryProtocol[];
 CONTENT_EXPORT extern const char kEnablePartialRaster[];
 extern const char kDisablePepper3d[];
 CONTENT_EXPORT extern const char kDisablePepper3DImageChromium[];
diff --git a/content/renderer/media/webrtc/rtc_video_encoder.cc b/content/renderer/media/webrtc/rtc_video_encoder.cc
index 5d5ce77..6724b35 100644
--- a/content/renderer/media/webrtc/rtc_video_encoder.cc
+++ b/content/renderer/media/webrtc/rtc_video_encoder.cc
@@ -911,8 +911,7 @@
 
 int32_t RTCVideoEncoder::Encode(
     const webrtc::VideoFrame& input_image,
-    const webrtc::CodecSpecificInfo* codec_specific_info,
-    const std::vector<webrtc::FrameType>* frame_types) {
+    const std::vector<webrtc::VideoFrameType>* frame_types) {
   DVLOG(3) << __func__;
   if (!impl_.get()) {
     DVLOG(3) << "Encoder is not initialized";
diff --git a/content/renderer/media/webrtc/rtc_video_encoder.h b/content/renderer/media/webrtc/rtc_video_encoder.h
index a6c06a5..bf33b7c2 100644
--- a/content/renderer/media/webrtc/rtc_video_encoder.h
+++ b/content/renderer/media/webrtc/rtc_video_encoder.h
@@ -52,8 +52,7 @@
                      size_t max_payload_size) override;
   int32_t Encode(
       const webrtc::VideoFrame& input_image,
-      const webrtc::CodecSpecificInfo* codec_specific_info,
-      const std::vector<webrtc::FrameType>* frame_types) override;
+      const std::vector<webrtc::VideoFrameType>* frame_types) override;
   int32_t RegisterEncodeCompleteCallback(
       webrtc::EncodedImageCallback* callback) override;
   int32_t Release() override;
diff --git a/content/renderer/media/webrtc/rtc_video_encoder_unittest.cc b/content/renderer/media/webrtc/rtc_video_encoder_unittest.cc
index e91672d5b..2128596 100644
--- a/content/renderer/media/webrtc/rtc_video_encoder_unittest.cc
+++ b/content/renderer/media/webrtc/rtc_video_encoder_unittest.cc
@@ -251,18 +251,18 @@
   const rtc::scoped_refptr<webrtc::I420Buffer> buffer =
       webrtc::I420Buffer::Create(kInputFrameWidth, kInputFrameHeight);
   FillFrameBuffer(buffer);
-  std::vector<webrtc::FrameType> frame_types;
+  std::vector<webrtc::VideoFrameType> frame_types;
   EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
             rtc_encoder_->Encode(
                 webrtc::VideoFrame(buffer, 0, 0, webrtc::kVideoRotation_0),
-                nullptr, &frame_types));
+                &frame_types));
   RunUntilIdle();
 
   // Expect the next frame to return SW fallback.
   EXPECT_EQ(WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE,
             rtc_encoder_->Encode(
                 webrtc::VideoFrame(buffer, 0, 0, webrtc::kVideoRotation_0),
-                nullptr, &frame_types));
+                &frame_types));
 }
 
 TEST_F(RTCVideoEncoderTest, EncodeScaledFrame) {
@@ -278,11 +278,11 @@
   const rtc::scoped_refptr<webrtc::I420Buffer> buffer =
       webrtc::I420Buffer::Create(kInputFrameWidth, kInputFrameHeight);
   FillFrameBuffer(buffer);
-  std::vector<webrtc::FrameType> frame_types;
+  std::vector<webrtc::VideoFrameType> frame_types;
   EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
             rtc_encoder_->Encode(
                 webrtc::VideoFrame(buffer, 0, 0, webrtc::kVideoRotation_0),
-                nullptr, &frame_types));
+                &frame_types));
 
   const rtc::scoped_refptr<webrtc::I420Buffer> upscaled_buffer =
       webrtc::I420Buffer::Create(2 * kInputFrameWidth, 2 * kInputFrameHeight);
@@ -290,7 +290,7 @@
   webrtc::VideoFrame rtc_frame(upscaled_buffer, 0, 0, webrtc::kVideoRotation_0);
   rtc_frame.set_ntp_time_ms(123456);
   EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            rtc_encoder_->Encode(rtc_frame, nullptr, &frame_types));
+            rtc_encoder_->Encode(rtc_frame, &frame_types));
 }
 
 TEST_F(RTCVideoEncoderTest, PreserveTimestamps) {
@@ -310,7 +310,7 @@
   const rtc::scoped_refptr<webrtc::I420Buffer> buffer =
       webrtc::I420Buffer::Create(kInputFrameWidth, kInputFrameHeight);
   FillFrameBuffer(buffer);
-  std::vector<webrtc::FrameType> frame_types;
+  std::vector<webrtc::VideoFrameType> frame_types;
   webrtc::VideoFrame rtc_frame(buffer, rtp_timestamp, 0,
                                webrtc::kVideoRotation_0);
   rtc_frame.set_timestamp_us(capture_time_ms * rtc::kNumMicrosecsPerMillisec);
@@ -318,7 +318,7 @@
   // media::VideoFrame timestamp.
   rtc_frame.set_ntp_time_ms(4567891);
   EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            rtc_encoder_->Encode(rtc_frame, nullptr, &frame_types));
+            rtc_encoder_->Encode(rtc_frame, &frame_types));
 }
 
 }  // namespace content
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 10eddb02..cae65621 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -52,7 +52,6 @@
 #include "content/common/content_constants_internal.h"
 #include "content/common/content_security_policy/content_security_policy.h"
 #include "content/common/content_security_policy_header.h"
-#include "content/common/download/mhtml_save_status.h"
 #include "content/common/edit_command.h"
 #include "content/common/frame_messages.h"
 #include "content/common/frame_owner_properties.h"
@@ -695,17 +694,18 @@
 
 // Writes to file the serialized and encoded MHTML data from WebThreadSafeData
 // instances.
-MhtmlSaveStatus WriteMHTMLToDisk(std::vector<WebThreadSafeData> mhtml_contents,
-                                 base::File file) {
+mojom::MhtmlSaveStatus WriteMHTMLToDisk(
+    std::vector<WebThreadSafeData> mhtml_contents,
+    base::File file) {
   TRACE_EVENT0("page-serialization", "WriteMHTMLToDisk (RenderFrameImpl)");
   SCOPED_UMA_HISTOGRAM_TIMER(
       "PageSerialization.MhtmlGeneration.WriteToDiskTime.SingleFrame");
   DCHECK(!RenderThread::Get()) << "Should not run in the main renderer thread";
-  MhtmlSaveStatus save_status = MhtmlSaveStatus::SUCCESS;
+  mojom::MhtmlSaveStatus save_status = mojom::MhtmlSaveStatus::kSuccess;
   for (const WebThreadSafeData& data : mhtml_contents) {
     if (!data.IsEmpty() &&
         file.WriteAtCurrentPos(data.Data(), data.size()) < 0) {
-      save_status = MhtmlSaveStatus::FILE_WRITTING_ERROR;
+      save_status = mojom::MhtmlSaveStatus::kFileWritingError;
       break;
     }
   }
@@ -5147,6 +5147,10 @@
 }
 
 void RenderFrameImpl::WillSendRequest(blink::WebURLRequest& request) {
+  WillSendRequestInternal(request);
+}
+
+void RenderFrameImpl::WillSendRequestInternal(blink::WebURLRequest& request) {
   if (render_view_->renderer_preferences_.enable_do_not_track)
     request.SetHTTPHeaderField(blink::WebString::FromUTF8(kDoNotTrackHeader),
                                "1");
@@ -6538,7 +6542,7 @@
   MHTMLPartsGenerationDelegate delegate(*params,
                                         &serialized_resources_uri_digests);
 
-  MhtmlSaveStatus save_status = MhtmlSaveStatus::SUCCESS;
+  mojom::MhtmlSaveStatus save_status = mojom::MhtmlSaveStatus::kSuccess;
   bool has_some_data = false;
 
   // Generate MHTML header if needed.
@@ -6555,7 +6559,7 @@
   // Generate MHTML parts.  Note that if this is not the main frame, then even
   // skipping the whole parts generation step is not an error - it simply
   // results in an omitted resource in the final file.
-  if (save_status == MhtmlSaveStatus::SUCCESS) {
+  if (save_status == mojom::MhtmlSaveStatus::kSuccess) {
     TRACE_EVENT0("page-serialization",
                  "RenderFrameImpl::SerializeAsMHTML parts serialization");
     // The returned data can be empty if the frame should be skipped, but this
@@ -6576,7 +6580,7 @@
       "PageSerialization.MhtmlGeneration.RendererMainThreadTime.SingleFrame",
       main_thread_use_time);
 
-  if (save_status == MhtmlSaveStatus::SUCCESS && has_some_data) {
+  if (save_status == mojom::MhtmlSaveStatus::kSuccess && has_some_data) {
     base::PostTaskWithTraitsAndReplyWithResult(
         FROM_HERE, {base::MayBlock()},
         base::BindOnce(&WriteMHTMLToDisk, std::move(mhtml_contents),
@@ -6597,10 +6601,10 @@
     SerializeAsMHTMLCallback callback,
     std::unordered_set<std::string> serialized_resources_uri_digests,
     base::TimeDelta main_thread_use_time,
-    MhtmlSaveStatus save_status) {
+    mojom::MhtmlSaveStatus save_status) {
   TRACE_EVENT1("page-serialization",
                "RenderFrameImpl::OnWriteMHTMLToDiskComplete",
-               "frame save status", GetMhtmlSaveStatusLabel(save_status));
+               "frame save status", save_status);
   DCHECK(RenderThread::Get()) << "Must run in the main renderer thread";
 
   // Convert the set into a vector for transport.
@@ -6611,9 +6615,8 @@
   // Notify the browser process about completion using the callback.
   // Note: we assume this method is fast enough to not need to be accounted for
   // in PageSerialization.MhtmlGeneration.RendererMainThreadTime.SingleFrame.
-  std::move(callback).Run(
-      static_cast<content::mojom::MhtmlSaveStatus>(save_status),
-      std::move(digests_of_new_parts), main_thread_use_time);
+  std::move(callback).Run(save_status, std::move(digests_of_new_parts),
+                          main_thread_use_time);
 }
 
 #ifndef STATIC_ASSERT_ENUM
@@ -7018,14 +7021,14 @@
   // Note: At this stage, the goal is to apply all the modifications the
   // renderer wants to make to the request, and then send it to the browser, so
   // that the actual network request can be started. Ideally, all such
-  // modifications should take place in willSendRequest, and in the
+  // modifications should take place in WillSendRequestInternal, and in the
   // implementation of willSendRequest for the various InspectorAgents
   // (devtools).
   //
   // TODO(clamy): Apply devtools override.
   // TODO(clamy): Make sure that navigation requests are not modified somewhere
   // else in blink.
-  WillSendRequest(request);
+  WillSendRequestInternal(request);
 
   // Update the transition type of the request for client side redirects.
   if (!info->url_request.GetExtraData())
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 2287fa0..479181d 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -32,12 +32,11 @@
 #include "base/values.h"
 #include "build/build_config.h"
 #include "content/common/buildflags.h"
-#include "content/common/download/mhtml_save_status.h"
+#include "content/common/download/mhtml_file_writer.mojom.h"
 #include "content/common/frame.mojom.h"
 #include "content/common/frame_message_enums.h"
 #include "content/common/host_zoom.mojom.h"
 #include "content/common/media/renderer_audio_input_stream_factory.mojom.h"
-#include "content/common/mhtml_file_writer.mojom.h"
 #include "content/common/possibly_associated_interface_ptr.h"
 #include "content/common/renderer.mojom.h"
 #include "content/common/unique_name_helper.h"
@@ -1161,7 +1160,7 @@
       SerializeAsMHTMLCallback callback,
       std::unordered_set<std::string> serialized_resources_uri_digests,
       base::TimeDelta main_thread_use_time,
-      MhtmlSaveStatus save_status);
+      mojom::MhtmlSaveStatus save_status);
 
   // Requests that the browser process navigates to |url|. If
   // |is_history_navigation_in_new_child| is true, the browser process should
@@ -1274,6 +1273,8 @@
   bool ShouldDisplayErrorPageForFailedLoad(int error_code,
                                            const GURL& unreachable_url);
 
+  void WillSendRequestInternal(blink::WebURLRequest& request);
+
   // Returns the URL being loaded by the |frame_|'s request.
   GURL GetLoadingUrl() const;
 
diff --git a/content/shell/test_runner/web_frame_test_client.cc b/content/shell/test_runner/web_frame_test_client.cc
index feea07d2..ccf1365 100644
--- a/content/shell/test_runner/web_frame_test_client.cc
+++ b/content/shell/test_runner/web_frame_test_client.cc
@@ -542,27 +542,48 @@
 }
 
 bool WebFrameTestClient::ShouldContinueNavigation(
-    const blink::WebNavigationInfo& info) {
+    blink::WebNavigationInfo* info) {
   if (test_runner()->shouldDumpNavigationPolicy()) {
     delegate_->PrintMessage(
         "Default policy for navigation to '" +
-        URLDescription(info.url_request.Url()) + "' is '" +
-        WebNavigationPolicyToString(info.navigation_policy) + "'\n");
+        URLDescription(info->url_request.Url()) + "' is '" +
+        WebNavigationPolicyToString(info->navigation_policy) + "'\n");
   }
 
-  if (!test_runner()->policyDelegateEnabled())
-    return true;
-
-  delegate_->PrintMessage(
-      std::string("Policy delegate: attempt to load ") +
-      URLDescription(info.url_request.Url()) + " with navigation type '" +
-      WebNavigationTypeToString(info.navigation_type) + "'\n");
-
-  bool should_continue = test_runner()->policyDelegateIsPermissive();
-  if (test_runner()->policyDelegateShouldNotifyDone()) {
-    test_runner()->policyDelegateDone();
-    should_continue = false;
+  if (test_runner()->shouldDumpFrameLoadCallbacks()) {
+    GURL url = info->url_request.Url();
+    WebFrameTestClient::PrintFrameDescription(
+        delegate_, web_frame_test_proxy_->GetWebFrame());
+    delegate_->PrintMessage(" - BeginNavigation request to '");
+    delegate_->PrintMessage(
+        DescriptionSuitableForTestResult(url.possibly_invalid_spec()));
+    delegate_->PrintMessage("', http method ");
+    delegate_->PrintMessage(info->url_request.HttpMethod().Utf8().data());
+    delegate_->PrintMessage("\n");
   }
+
+  bool should_continue = true;
+  if (test_runner()->policyDelegateEnabled()) {
+    delegate_->PrintMessage(
+        std::string("Policy delegate: attempt to load ") +
+        URLDescription(info->url_request.Url()) + " with navigation type '" +
+        WebNavigationTypeToString(info->navigation_type) + "'\n");
+    should_continue = test_runner()->policyDelegateIsPermissive();
+    if (test_runner()->policyDelegateShouldNotifyDone()) {
+      test_runner()->policyDelegateDone();
+      should_continue = false;
+    }
+  }
+
+  if (test_runner()->httpHeadersToClear()) {
+    for (const std::string& header : *test_runner()->httpHeadersToClear()) {
+      info->url_request.ClearHTTPHeaderField(
+          blink::WebString::FromUTF8(header));
+    }
+  }
+  info->url_request.SetURL(delegate_->RewriteWebTestsURL(
+      info->url_request.Url().GetString().Utf8(),
+      test_runner()->is_web_platform_tests_mode()));
   return should_continue;
 }
 
diff --git a/content/shell/test_runner/web_frame_test_client.h b/content/shell/test_runner/web_frame_test_client.h
index ef5d20c9..e63022eb 100644
--- a/content/shell/test_runner/web_frame_test_client.h
+++ b/content/shell/test_runner/web_frame_test_client.h
@@ -32,7 +32,7 @@
                      WebFrameTestProxy* web_frame_test_proxy);
 
   ~WebFrameTestClient() override;
-  bool ShouldContinueNavigation(const blink::WebNavigationInfo& info);
+  bool ShouldContinueNavigation(blink::WebNavigationInfo* info);
 
   static void PrintFrameDescription(WebTestDelegate* delegate,
                                     blink::WebLocalFrame* frame);
diff --git a/content/shell/test_runner/web_frame_test_proxy.cc b/content/shell/test_runner/web_frame_test_proxy.cc
index 948be5df..965c850 100644
--- a/content/shell/test_runner/web_frame_test_proxy.cc
+++ b/content/shell/test_runner/web_frame_test_proxy.cc
@@ -251,7 +251,7 @@
 
 void WebFrameTestProxy::BeginNavigation(
     std::unique_ptr<blink::WebNavigationInfo> info) {
-  if (test_client_->ShouldContinueNavigation(*info))
+  if (test_client_->ShouldContinueNavigation(info.get()))
     RenderFrameImpl::BeginNavigation(std::move(info));
 }
 
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 894bf91..2668744 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1923,7 +1923,6 @@
     "//content/browser/background_fetch:background_fetch_proto",
     "//content/browser/cache_storage:cache_storage_proto",
     "//content/browser/devtools:devtools_background_services_proto",
-    "//content/browser/devtools:inspector_protocol_encoding_test",
     "//content/browser/dom_storage:local_storage_proto",
     "//content/browser/notifications:notification_proto",
     "//content/browser/service_worker:service_worker_proto",
diff --git a/device/vr/buildflags/buildflags.gni b/device/vr/buildflags/buildflags.gni
index dddfd1ff..e5a7356 100644
--- a/device/vr/buildflags/buildflags.gni
+++ b/device/vr/buildflags/buildflags.gni
@@ -66,6 +66,9 @@
 
   # When true, portions of VR's native code are included in the VR DFM.
   modularize_vr_native = false
+
+  # Whether to create AR module as an asynchronous DFM.
+  async_ar = false
 }
 
 if (modularize_vr_native) {
diff --git a/extensions/browser/api/declarative_net_request/BUILD.gn b/extensions/browser/api/declarative_net_request/BUILD.gn
index ca30728b..024c4da 100644
--- a/extensions/browser/api/declarative_net_request/BUILD.gn
+++ b/extensions/browser/api/declarative_net_request/BUILD.gn
@@ -10,6 +10,8 @@
     "constants.h",
     "declarative_net_request_api.cc",
     "declarative_net_request_api.h",
+    "file_sequence_helper.cc",
+    "file_sequence_helper.h",
     "flat_ruleset_indexer.cc",
     "flat_ruleset_indexer.h",
     "indexed_rule.cc",
diff --git a/extensions/browser/api/declarative_net_request/file_sequence_helper.cc b/extensions/browser/api/declarative_net_request/file_sequence_helper.cc
new file mode 100644
index 0000000..1dad27d9
--- /dev/null
+++ b/extensions/browser/api/declarative_net_request/file_sequence_helper.cc
@@ -0,0 +1,141 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "extensions/browser/api/declarative_net_request/file_sequence_helper.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/logging.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/task/post_task.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/common/service_manager_connection.h"
+#include "extensions/browser/extension_file_task_runner.h"
+#include "services/service_manager/public/cpp/connector.h"
+
+namespace extensions {
+namespace declarative_net_request {
+
+RulesetInfo::RulesetInfo(RulesetSource source) : source_(std::move(source)) {}
+RulesetInfo::~RulesetInfo() = default;
+RulesetInfo::RulesetInfo(RulesetInfo&&) = default;
+RulesetInfo& RulesetInfo::operator=(RulesetInfo&&) = default;
+
+std::unique_ptr<RulesetMatcher> RulesetInfo::TakeMatcher() {
+  DCHECK(did_load_successfully());
+  return std::move(matcher_);
+}
+
+RulesetMatcher::LoadRulesetResult RulesetInfo::load_ruleset_result() const {
+  DCHECK(load_ruleset_result_);
+  // |matcher_| is valid only on success.
+  DCHECK_EQ(load_ruleset_result_ == RulesetMatcher::kLoadSuccess, !!matcher_);
+  return *load_ruleset_result_;
+}
+
+void RulesetInfo::CreateVerifiedMatcher() {
+  DCHECK(expected_checksum_);
+  DCHECK(GetExtensionFileTaskRunner()->RunsTasksInCurrentSequence());
+
+  load_ruleset_result_ = RulesetMatcher::CreateVerifiedMatcher(
+      source_, *expected_checksum_, &matcher_);
+
+  UMA_HISTOGRAM_ENUMERATION(
+      "Extensions.DeclarativeNetRequest.LoadRulesetResult",
+      load_ruleset_result(), RulesetMatcher::kLoadResultMax);
+}
+
+LoadRequestData::LoadRequestData(ExtensionId extension_id, RulesetInfo ruleset)
+    : extension_id(std::move(extension_id)), ruleset(std::move(ruleset)) {}
+LoadRequestData::~LoadRequestData() = default;
+LoadRequestData::LoadRequestData(LoadRequestData&&) = default;
+LoadRequestData& LoadRequestData::operator=(LoadRequestData&&) = default;
+
+FileSequenceHelper::FileSequenceHelper()
+    : connector_(content::ServiceManagerConnection::GetForProcess()
+                     ->GetConnector()
+                     ->Clone()),
+      weak_factory_(this) {}
+
+FileSequenceHelper::~FileSequenceHelper() {
+  DCHECK(GetExtensionFileTaskRunner()->RunsTasksInCurrentSequence());
+}
+
+void FileSequenceHelper::LoadRuleset(LoadRequestData load_data,
+                                     LoadRulesetUICallback ui_callback) const {
+  DCHECK(GetExtensionFileTaskRunner()->RunsTasksInCurrentSequence());
+
+  load_data.ruleset.CreateVerifiedMatcher();
+
+  if (load_data.ruleset.did_load_successfully()) {
+    base::PostTaskWithTraits(
+        FROM_HERE, {content::BrowserThread::UI},
+        base::BindOnce(std::move(ui_callback), std::move(load_data)));
+    return;
+  }
+
+  // Clone the RulesetSource before moving |load_data|.
+  RulesetSource source_copy = load_data.ruleset.source().Clone();
+
+  // Attempt to reindex the extension ruleset.
+  // Using a weak pointer here is safe since |ruleset_reindexed_callback| will
+  // be called on this sequence itself.
+  RulesetSource::IndexAndPersistRulesCallback ruleset_reindexed_callback =
+      base::BindOnce(&FileSequenceHelper::OnRulesetReindexed,
+                     weak_factory_.GetWeakPtr(), std::move(load_data),
+                     std::move(ui_callback));
+  source_copy.IndexAndPersistRules(connector_.get(),
+                                   base::nullopt /* decoder_batch_id */,
+                                   std::move(ruleset_reindexed_callback));
+}
+
+void FileSequenceHelper::OnRulesetReindexed(
+    LoadRequestData load_data,
+    LoadRulesetUICallback ui_callback,
+    IndexAndPersistRulesResult result) const {
+  DCHECK(GetExtensionFileTaskRunner()->RunsTasksInCurrentSequence());
+
+  // Only ruleset which can't be loaded are reindexed.
+  DCHECK(!load_data.ruleset.did_load_successfully());
+
+  // The checksum of the reindexed ruleset should have been the same as the
+  // expected checksum obtained from prefs, in all cases except when the
+  // ruleset version changes. If this is not the case, then there is some
+  // other issue (like the JSON rules file has been modified from the one used
+  // during installation or preferences are corrupted). But taking care of
+  // these is beyond our scope here, so simply signal a failure.
+  bool reindexing_success =
+      result.success &&
+      load_data.ruleset.expected_checksum() == result.ruleset_checksum;
+
+  // In case of updates to the ruleset version, the change of ruleset checksum
+  // is expected.
+  if (result.success &&
+      load_data.ruleset.load_ruleset_result() ==
+          RulesetMatcher::LoadRulesetResult::kLoadErrorVersionMismatch) {
+    load_data.ruleset.set_new_checksum(result.ruleset_checksum);
+    // Also change the |expected_checksum| so that the subsequent load
+    // succeeds.
+    load_data.ruleset.set_expected_checksum(result.ruleset_checksum);
+    reindexing_success = true;
+  }
+
+  UMA_HISTOGRAM_BOOLEAN(
+      "Extensions.DeclarativeNetRequest.RulesetReindexSuccessful",
+      reindexing_success);
+
+  // If the reindexing was successful, try to load the ruleset again.
+  if (reindexing_success)
+    load_data.ruleset.CreateVerifiedMatcher();
+
+  // The UI thread will handle success or failure.
+  base::PostTaskWithTraits(
+      FROM_HERE, {content::BrowserThread::UI},
+      base::BindOnce(std::move(ui_callback), std::move(load_data)));
+}
+
+}  // namespace declarative_net_request
+}  // namespace extensions
diff --git a/extensions/browser/api/declarative_net_request/file_sequence_helper.h b/extensions/browser/api/declarative_net_request/file_sequence_helper.h
new file mode 100644
index 0000000..3809f874
--- /dev/null
+++ b/extensions/browser/api/declarative_net_request/file_sequence_helper.h
@@ -0,0 +1,123 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef EXTENSIONS_BROWSER_API_DECLARATIVE_NET_REQUEST_FILE_SEQUENCE_HELPER_H_
+#define EXTENSIONS_BROWSER_API_DECLARATIVE_NET_REQUEST_FILE_SEQUENCE_HELPER_H_
+
+#include <memory>
+
+#include "base/callback_forward.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "extensions/browser/api/declarative_net_request/ruleset_matcher.h"
+#include "extensions/browser/api/declarative_net_request/ruleset_source.h"
+#include "extensions/common/extension_id.h"
+
+namespace service_manager {
+class Connector;
+}  // namespace service_manager
+
+namespace extensions {
+namespace declarative_net_request {
+
+// Holds the data relating to the loading of a single ruleset.
+class RulesetInfo {
+ public:
+  explicit RulesetInfo(RulesetSource source);
+  ~RulesetInfo();
+  RulesetInfo(RulesetInfo&&);
+  RulesetInfo& operator=(RulesetInfo&&);
+
+  const RulesetSource& source() const { return source_; }
+
+  // Returns the ownership of the ruleset matcher to the caller. Must only be
+  // called for a successful load.
+  std::unique_ptr<RulesetMatcher> TakeMatcher();
+
+  // Clients should set a new checksum if the checksum stored in prefs should
+  // be updated.
+  void set_new_checksum(int new_checksum) { new_checksum_ = new_checksum; }
+  base::Optional<int> new_checksum() const { return new_checksum_; }
+
+  // The expected checksum for the indexed ruleset.
+  void set_expected_checksum(int checksum) { expected_checksum_ = checksum; }
+  base::Optional<int> expected_checksum() const { return expected_checksum_; }
+
+  // Must be called after CreateVerifiedMatcher.
+  RulesetMatcher::LoadRulesetResult load_ruleset_result() const;
+
+  // Must be called after CreateVerifiedMatcher.
+  bool did_load_successfully() const {
+    return load_ruleset_result() == RulesetMatcher::kLoadSuccess;
+  }
+
+  // Must be invoked on the extension file task runner. Must only be called
+  // after the expected checksum is set.
+  void CreateVerifiedMatcher();
+
+ private:
+  RulesetSource source_;
+
+  // The expected checksum of the indexed ruleset.
+  base::Optional<int> expected_checksum_;
+
+  // Stores the result of creating a verified matcher from the |source_|.
+  std::unique_ptr<RulesetMatcher> matcher_;
+  base::Optional<RulesetMatcher::LoadRulesetResult> load_ruleset_result_;
+
+  // The new checksum to be persisted to prefs. A new checksum should only be
+  // set in case of flatbuffer version mismatch.
+  base::Optional<int> new_checksum_;
+
+  DISALLOW_COPY_AND_ASSIGN(RulesetInfo);
+};
+
+// Helper to pass information related to the ruleset being loaded.
+struct LoadRequestData {
+  LoadRequestData(ExtensionId extension_id, RulesetInfo ruleset);
+  ~LoadRequestData();
+  LoadRequestData(LoadRequestData&&);
+  LoadRequestData& operator=(LoadRequestData&&);
+
+  ExtensionId extension_id;
+  RulesetInfo ruleset;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(LoadRequestData);
+};
+
+//  Helper class to load indexed rulesets. Can be created on any sequence but
+//  must be used on the extension file task runner. Also tries to reindex the
+//  rulesets on failure.
+class FileSequenceHelper {
+ public:
+  FileSequenceHelper();
+  ~FileSequenceHelper();
+
+  // Loads ruleset for |load_data|. Invokes |ui_callback| on the UI thread once
+  // loading is done.
+  using LoadRulesetUICallback = base::OnceCallback<void(LoadRequestData)>;
+  void LoadRuleset(LoadRequestData load_data,
+                   LoadRulesetUICallback ui_callback) const;
+
+ private:
+  // Callback invoked when the JSON ruleset is reindexed.
+  void OnRulesetReindexed(LoadRequestData load_data,
+                          LoadRulesetUICallback ui_callback,
+                          IndexAndPersistRulesResult result) const;
+
+  const std::unique_ptr<service_manager::Connector> connector_;
+
+  // Must be the last member variable. See WeakPtrFactory documentation for
+  // details. Mutable to allow GetWeakPtr() usage from const methods.
+  mutable base::WeakPtrFactory<FileSequenceHelper> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(FileSequenceHelper);
+};
+
+}  // namespace declarative_net_request
+}  // namespace extensions
+
+#endif  // EXTENSIONS_BROWSER_API_DECLARATIVE_NET_REQUEST_FILE_SEQUENCE_HELPER_H_
diff --git a/extensions/browser/api/declarative_net_request/rules_monitor_service.cc b/extensions/browser/api/declarative_net_request/rules_monitor_service.cc
index 72bfb7f..424d5eae 100644
--- a/extensions/browser/api/declarative_net_request/rules_monitor_service.cc
+++ b/extensions/browser/api/declarative_net_request/rules_monitor_service.cc
@@ -11,13 +11,12 @@
 #include "base/lazy_instance.h"
 #include "base/location.h"
 #include "base/logging.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/common/service_manager_connection.h"
 #include "extensions/browser/api/declarative_net_request/composite_matcher.h"
+#include "extensions/browser/api/declarative_net_request/file_sequence_helper.h"
 #include "extensions/browser/api/declarative_net_request/ruleset_manager.h"
 #include "extensions/browser/api/declarative_net_request/ruleset_matcher.h"
 #include "extensions/browser/api/declarative_net_request/ruleset_source.h"
@@ -35,7 +34,6 @@
 #include "extensions/common/api/declarative_net_request/dnr_manifest_data.h"
 #include "extensions/common/api/declarative_net_request/utils.h"
 #include "extensions/common/extension_id.h"
-#include "services/service_manager/public/cpp/connector.h"
 
 namespace extensions {
 namespace declarative_net_request {
@@ -68,79 +66,6 @@
   info_map->GetRulesetManager()->RemoveRuleset(extension_id);
 }
 
-// A helper class to hold the data relating to the loading of a single ruleset.
-class RulesetInfo {
- public:
-  explicit RulesetInfo(RulesetSource source) : source_(std::move(source)) {}
-  ~RulesetInfo() = default;
-  RulesetInfo(RulesetInfo&&) = default;
-  RulesetInfo& operator=(RulesetInfo&&) = default;
-
-  const RulesetSource& source() const { return source_; }
-
-  // Returns the ownership of the ruleset matcher to the caller. Must only be
-  // called for a successful load.
-  std::unique_ptr<RulesetMatcher> TakeMatcher() {
-    DCHECK(did_load_successfully());
-    return std::move(matcher_);
-  }
-
-  // Clients should set a new checksum if the checksum stored in prefs should
-  // be updated.
-  void set_new_checksum(int new_checksum) { new_checksum_ = new_checksum; }
-  base::Optional<int> new_checksum() const { return new_checksum_; }
-
-  // The expected checksum for the indexed ruleset.
-  void set_expected_checksum(int checksum) { expected_checksum_ = checksum; }
-  int expected_checksum() const {
-    DCHECK(expected_checksum_);
-    return *expected_checksum_;
-  }
-
-  // Must be called after CreateVerifiedMatcher.
-  RulesetMatcher::LoadRulesetResult load_ruleset_result() const {
-    DCHECK(load_ruleset_result_);
-    // |matcher_| is valid only on success.
-    DCHECK_EQ(load_ruleset_result_ == RulesetMatcher::kLoadSuccess, !!matcher_);
-    return *load_ruleset_result_;
-  }
-
-  // Must be called after CreateVerifiedMatcher.
-  bool did_load_successfully() const {
-    return load_ruleset_result() == RulesetMatcher::kLoadSuccess;
-  }
-
-  // Must be invoked on the file sequence. Must only be called after the
-  // expected checksum is set.
-  void CreateVerifiedMatcher() {
-    DCHECK(expected_checksum_);
-    DCHECK(GetExtensionFileTaskRunner()->RunsTasksInCurrentSequence());
-
-    load_ruleset_result_ = RulesetMatcher::CreateVerifiedMatcher(
-        source_, *expected_checksum_, &matcher_);
-
-    UMA_HISTOGRAM_ENUMERATION(
-        "Extensions.DeclarativeNetRequest.LoadRulesetResult",
-        load_ruleset_result(), RulesetMatcher::kLoadResultMax);
-  }
-
- private:
-  RulesetSource source_;
-
-  // The expected checksum of the indexed ruleset.
-  base::Optional<int> expected_checksum_;
-
-  // Stores the result of creating a verified matcher from the |source_|.
-  std::unique_ptr<RulesetMatcher> matcher_;
-  base::Optional<RulesetMatcher::LoadRulesetResult> load_ruleset_result_;
-
-  // The new checksum to be persisted to prefs. A new checksum should only be
-  // set in case of flatbuffer version mismatch.
-  base::Optional<int> new_checksum_;
-
-  DISALLOW_COPY_AND_ASSIGN(RulesetInfo);
-};
-
 }  // namespace
 
 // static
@@ -169,144 +94,26 @@
   observers_.RemoveObserver(observer);
 }
 
-// Helper to pass information related to the ruleset being loaded.
-struct RulesMonitorService::LoadRequestData {
-  LoadRequestData(ExtensionId extension_id, RulesetInfo ruleset)
-      : extension_id(std::move(extension_id)), ruleset(std::move(ruleset)) {}
-
-  ~LoadRequestData() = default;
-  LoadRequestData(LoadRequestData&&) = default;
-  LoadRequestData& operator=(LoadRequestData&&) = default;
-
-  ExtensionId extension_id;
-  RulesetInfo ruleset;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(LoadRequestData);
-};
-
-// Maintains state needed on |file_task_runner_|. Created on the UI thread, but
-// should only be accessed on the extension file task runner.
-class RulesMonitorService::FileSequenceState {
- public:
-  FileSequenceState()
-      : connector_(content::ServiceManagerConnection::GetForProcess()
-                       ->GetConnector()
-                       ->Clone()),
-        weak_factory_(this) {
-    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  }
-
-  ~FileSequenceState() {
-    DCHECK(GetExtensionFileTaskRunner()->RunsTasksInCurrentSequence());
-  }
-
-  using LoadRulesetUICallback = base::OnceCallback<void(LoadRequestData)>;
-  // Loads ruleset for |load_data|. Invokes |ui_callback| with the
-  // RulesetMatcher instance created, passing null on failure.
-  void LoadRuleset(LoadRequestData load_data,
-                   LoadRulesetUICallback ui_callback) const {
-    DCHECK(GetExtensionFileTaskRunner()->RunsTasksInCurrentSequence());
-
-    load_data.ruleset.CreateVerifiedMatcher();
-
-    if (load_data.ruleset.did_load_successfully()) {
-      base::PostTaskWithTraits(
-          FROM_HERE, {content::BrowserThread::UI},
-          base::BindOnce(std::move(ui_callback), std::move(load_data)));
-      return;
-    }
-
-    // Clone the RulesetSource before moving |load_data|.
-    RulesetSource source_copy = load_data.ruleset.source().Clone();
-
-    // Attempt to reindex the extension ruleset.
-    // Using a weak pointer here is safe since |ruleset_reindexed_callback| will
-    // be called on this sequence itself.
-    RulesetSource::IndexAndPersistRulesCallback ruleset_reindexed_callback =
-        base::BindOnce(&FileSequenceState::OnRulesetReindexed,
-                       weak_factory_.GetWeakPtr(), std::move(load_data),
-                       std::move(ui_callback));
-    source_copy.IndexAndPersistRules(connector_.get(),
-                                     base::nullopt /* decoder_batch_id */,
-                                     std::move(ruleset_reindexed_callback));
-  }
-
- private:
-  // Callback invoked when the JSON ruleset is reindexed.
-  void OnRulesetReindexed(LoadRequestData load_data,
-                          LoadRulesetUICallback ui_callback,
-                          IndexAndPersistRulesResult result) const {
-    DCHECK(GetExtensionFileTaskRunner()->RunsTasksInCurrentSequence());
-
-    // Only ruleset which can't be loaded are reindexed.
-    DCHECK(!load_data.ruleset.did_load_successfully());
-
-    // The checksum of the reindexed ruleset should have been the same as the
-    // expected checksum obtained from prefs, in all cases except when the
-    // ruleset version changes. If this is not the case, then there is some
-    // other issue (like the JSON rules file has been modified from the one used
-    // during installation or preferences are corrupted). But taking care of
-    // these is beyond our scope here, so simply signal a failure.
-    bool reindexing_success =
-        result.success &&
-        load_data.ruleset.expected_checksum() == result.ruleset_checksum;
-
-    // In case of updates to the ruleset version, the change of ruleset checksum
-    // is expected.
-    if (result.success &&
-        load_data.ruleset.load_ruleset_result() ==
-            RulesetMatcher::LoadRulesetResult::kLoadErrorVersionMismatch) {
-      load_data.ruleset.set_new_checksum(result.ruleset_checksum);
-      // Also change the |expected_checksum| so that the subsequent load
-      // succeeds.
-      load_data.ruleset.set_expected_checksum(result.ruleset_checksum);
-      reindexing_success = true;
-    }
-
-    UMA_HISTOGRAM_BOOLEAN(
-        "Extensions.DeclarativeNetRequest.RulesetReindexSuccessful",
-        reindexing_success);
-
-    // If the reindexing was successful, try to load the ruleset again.
-    if (reindexing_success)
-      load_data.ruleset.CreateVerifiedMatcher();
-
-    // The UI thread will handle success or failure.
-    base::PostTaskWithTraits(
-        FROM_HERE, {content::BrowserThread::UI},
-        base::BindOnce(std::move(ui_callback), std::move(load_data)));
-  }
-
-  const std::unique_ptr<service_manager::Connector> connector_;
-
-  // Must be the last member variable. See WeakPtrFactory documentation for
-  // details. Mutable to allow GetWeakPtr() usage from const methods.
-  mutable base::WeakPtrFactory<FileSequenceState> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(FileSequenceState);
-};
-
-// Helper to bridge tasks to FileSequenceState. Lives on the UI thread.
+// Helper to bridge tasks to FileSequenceHelper. Lives on the UI thread.
 class RulesMonitorService::FileSequenceBridge {
  public:
   FileSequenceBridge()
       : file_task_runner_(GetExtensionFileTaskRunner()),
-        file_sequence_state_(std::make_unique<FileSequenceState>()) {}
+        file_sequence_helper_(std::make_unique<FileSequenceHelper>()) {}
 
   ~FileSequenceBridge() {
-    file_task_runner_->DeleteSoon(FROM_HERE, std::move(file_sequence_state_));
+    file_task_runner_->DeleteSoon(FROM_HERE, std::move(file_sequence_helper_));
   }
 
   void LoadRuleset(
       LoadRequestData load_data,
-      FileSequenceState::LoadRulesetUICallback load_ruleset_callback) const {
+      FileSequenceHelper::LoadRulesetUICallback load_ruleset_callback) const {
     // base::Unretained is safe here because we trigger the destruction of
-    // |file_sequence_state_| on |file_task_runner_| from our destructor. Hence
+    // |file_sequence_helper_| on |file_task_runner_| from our destructor. Hence
     // it is guaranteed to be alive when |load_ruleset_task| is run.
     base::OnceClosure load_ruleset_task =
-        base::BindOnce(&FileSequenceState::LoadRuleset,
-                       base::Unretained(file_sequence_state_.get()),
+        base::BindOnce(&FileSequenceHelper::LoadRuleset,
+                       base::Unretained(file_sequence_helper_.get()),
                        std::move(load_data), std::move(load_ruleset_callback));
     file_task_runner_->PostTask(FROM_HERE, std::move(load_ruleset_task));
   }
@@ -316,7 +123,7 @@
 
   // Created on the UI thread. Accessed and destroyed on |file_task_runner_|.
   // Maintains state needed on |file_task_runner_|.
-  std::unique_ptr<FileSequenceState> file_sequence_state_;
+  std::unique_ptr<FileSequenceHelper> file_sequence_helper_;
 
   DISALLOW_COPY_AND_ASSIGN(FileSequenceBridge);
 };
@@ -362,7 +169,7 @@
 
   LoadRequestData load_data(extension->id(), std::move(ruleset));
 
-  FileSequenceState::LoadRulesetUICallback load_ruleset_callback =
+  FileSequenceHelper::LoadRulesetUICallback load_ruleset_callback =
       base::BindOnce(&RulesMonitorService::OnRulesetLoaded,
                      weak_factory_.GetWeakPtr());
 
diff --git a/extensions/browser/api/declarative_net_request/rules_monitor_service.h b/extensions/browser/api/declarative_net_request/rules_monitor_service.h
index 3e2437cf..d062c56 100644
--- a/extensions/browser/api/declarative_net_request/rules_monitor_service.h
+++ b/extensions/browser/api/declarative_net_request/rules_monitor_service.h
@@ -27,6 +27,7 @@
 class WarningService;
 
 namespace declarative_net_request {
+struct LoadRequestData;
 
 // Observes loading and unloading of extensions to load and unload their
 // rulesets for the Declarative Net Request API. Lives on the UI thread. Note: A
@@ -59,8 +60,6 @@
   void RemoveObserver(Observer* observer);
 
  private:
-  struct LoadRequestData;
-  class FileSequenceState;
   class FileSequenceBridge;
 
   friend class BrowserContextKeyedAPIFactory<RulesMonitorService>;
diff --git a/extensions/browser/url_loader_factory_manager.cc b/extensions/browser/url_loader_factory_manager.cc
index fb4b1c3..c64516f0 100644
--- a/extensions/browser/url_loader_factory_manager.cc
+++ b/extensions/browser/url_loader_factory_manager.cc
@@ -71,6 +71,7 @@
     "177508B365CBF1610CC2B53707749D79272F2F0B",
     "1AB9CC404876117F49135E67BAD813F935AAE9BA",
     "1DB115A4344B58C0B7CC1595662E86C9E92C0848",
+    "1E37F1A19C1C528E616637B105CFC4838ECF52B4",
     "260871EABEDE6F2D07D0D9450096093EDAFCBF34",
     "29427534E31BB1820714C7CAEDF9C54B47BE154F",
     "2AA94E2D3F4DA33F0D3BCF5DD48F69B8BDB26F52",
@@ -117,6 +118,7 @@
     "A8FB3967ADE404B77AC3FB5815A399C0660C3C63",
     "A9A4B26C2387BA2A5861C790B0FF39F230427AC8",
     "A9F78610B717B3992F92F490E82FC63FFF46C5FA",
+    "AA3DE48E23B2465B21F5D33E993FD959F611DD10",
     "AEEDAC793F184240CFB800DA73EE6321E5145102",
     "B3CF6C01796E8D03378FAA77AF507E27BB847E9D",
     "B4782AE831D849EFCC2AF4BE2012816EDDF8D908",
diff --git a/extensions/renderer/resources/app_runtime_custom_bindings.js b/extensions/renderer/resources/app_runtime_custom_bindings.js
index 16759b4..d64e725 100644
--- a/extensions/renderer/resources/app_runtime_custom_bindings.js
+++ b/extensions/renderer/resources/app_runtime_custom_bindings.js
@@ -4,8 +4,6 @@
 
 // Custom binding for the chrome.app.runtime API.
 
-var binding = apiBridge || require('binding').Binding.create('app.runtime');
-
 var AppViewGuestInternal;
 // appViewGuestInternal isn't available in lock screen contexts.
 if (requireNative('v8_context').GetAvailability('appViewGuestInternal').
@@ -91,6 +89,3 @@
     dispatch([launchData]);
   }
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/extensions/renderer/resources/app_window_custom_bindings.js b/extensions/renderer/resources/app_window_custom_bindings.js
index 600d471..9d354c7 100644
--- a/extensions/renderer/resources/app_window_custom_bindings.js
+++ b/extensions/renderer/resources/app_window_custom_bindings.js
@@ -16,9 +16,6 @@
 var kSetBoundsFunction = 'setBounds';
 var kSetSizeConstraintsFunction = 'setSizeConstraints';
 
-if (!apiBridge)
-  var binding = require('binding').Binding;
-
 var jsEvent;
 function createAnonymousEvent() {
   if (bindingUtil) {
@@ -124,8 +121,7 @@
                         { maxWidth: maxWidth, maxHeight: maxHeight });
 };
 
-var appWindow = apiBridge || binding.create('app.window');
-appWindow.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   apiFunctions.setCustomCallback('create',
@@ -398,7 +394,5 @@
   currentWindowInternal.setSizeConstraints(boundsType, constraints);
 }
 
-if (!apiBridge)
-  exports.$set('binding', appWindow.generate());
 exports.$set('onAppWindowClosed', onAppWindowClosed);
 exports.$set('updateAppWindowProperties', updateAppWindowProperties);
diff --git a/extensions/renderer/resources/context_menus_custom_bindings.js b/extensions/renderer/resources/context_menus_custom_bindings.js
index 76620918..3213946 100644
--- a/extensions/renderer/resources/context_menus_custom_bindings.js
+++ b/extensions/renderer/resources/context_menus_custom_bindings.js
@@ -4,10 +4,9 @@
 
 // Custom binding for the contextMenus API.
 
-var binding = apiBridge || require('binding').Binding.create('contextMenus');
 var contextMenusHandlers = require('contextMenusHandlers');
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
 
   var handlers = contextMenusHandlers.create(false /* isWebview */);
@@ -21,6 +20,3 @@
   apiFunctions.setHandleRequest('removeAll',
                                 handlers.requestHandlers.removeAll);
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/extensions/renderer/resources/declarative_webrequest_custom_bindings.js b/extensions/renderer/resources/declarative_webrequest_custom_bindings.js
index 2727bc3..793c4d4 100644
--- a/extensions/renderer/resources/declarative_webrequest_custom_bindings.js
+++ b/extensions/renderer/resources/declarative_webrequest_custom_bindings.js
@@ -4,9 +4,6 @@
 
 // Custom binding for the declarativeWebRequest API.
 
-var binding =
-    apiBridge || require('binding').Binding.create('declarativeWebRequest');
-
 var utils = bindingUtil ? undefined : require('utils');
 var validate = bindingUtil ? undefined : require('schemaUtils').validate;
 
@@ -19,7 +16,7 @@
   }
 }
 
-binding.registerCustomHook(function(api) {
+apiBridge.registerCustomHook(function(api) {
   var declarativeWebRequest = api.compiledApi;
 
   // Helper function for the constructor of concrete datatypes of the
@@ -97,6 +94,3 @@
     setupInstance(this, parameters, 'SendMessageToExtension');
   };
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/extensions/renderer/resources/display_source_custom_bindings.js b/extensions/renderer/resources/display_source_custom_bindings.js
index 27111715..c4d285f 100644
--- a/extensions/renderer/resources/display_source_custom_bindings.js
+++ b/extensions/renderer/resources/display_source_custom_bindings.js
@@ -4,7 +4,6 @@
 
 // Custom binding for the Display Source API.
 
-var binding = apiBridge || require('binding').Binding.create('displaySource');
 var chrome = requireNative('chrome').GetChrome();
 var natives = requireNative('display_source');
 var logging = requireNative('logging');
@@ -48,7 +47,7 @@
   }
 }
 
-binding.registerCustomHook(function(bindingsAPI, extensionId) {
+apiBridge.registerCustomHook(function(bindingsAPI, extensionId) {
   var apiFunctions = bindingsAPI.apiFunctions;
   apiFunctions.setHandleRequest(
       'startSession', function(sessionInfo, callback) {
@@ -77,8 +76,5 @@
       });
 });
 
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
-
 // Called by C++.
 exports.$set('callCompletionCallback', callCompletionCallback);
diff --git a/extensions/renderer/resources/feedback_private_custom_bindings.js b/extensions/renderer/resources/feedback_private_custom_bindings.js
index 8463a697..ec41dcc 100644
--- a/extensions/renderer/resources/feedback_private_custom_bindings.js
+++ b/extensions/renderer/resources/feedback_private_custom_bindings.js
@@ -4,11 +4,9 @@
 
 // Custom bindings for the feedbackPrivate API.
 
-var binding = apiBridge || require('binding').Binding.create('feedbackPrivate');
-
 var blobNatives = requireNative('blob_natives');
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
   apiFunctions.setUpdateArgumentsPostValidate(
       "sendFeedback", function(feedbackInfo, callback) {
@@ -28,6 +26,3 @@
     return [feedbackInfo, callback];
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/extensions/renderer/resources/file_system_custom_bindings.js b/extensions/renderer/resources/file_system_custom_bindings.js
index 0d24cc3..8e8df44 100644
--- a/extensions/renderer/resources/file_system_custom_bindings.js
+++ b/extensions/renderer/resources/file_system_custom_bindings.js
@@ -4,7 +4,6 @@
 
 // Custom binding for the fileSystem API.
 
-var binding = apiBridge || require('binding').Binding.create('fileSystem');
 var sendRequest = bindingUtil ?
     $Function.bind(bindingUtil.sendRequest, bindingUtil) :
     require('sendRequest').sendRequest;
@@ -16,7 +15,7 @@
 var fileSystemNatives = requireNative('file_system_natives');
 var safeCallbackApply = require('uncaught_exception_handler').safeCallbackApply;
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
   var fileSystem = bindingsAPI.compiledApi;
 
@@ -106,6 +105,3 @@
     $Function.apply(fileSystem.chooseEntry, this, arguments);
   };
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/extensions/renderer/resources/guest_view/guest_view.js b/extensions/renderer/resources/guest_view/guest_view.js
index 68e809e9..5aeb3c2 100644
--- a/extensions/renderer/resources/guest_view/guest_view.js
+++ b/extensions/renderer/resources/guest_view/guest_view.js
@@ -370,9 +370,7 @@
 };
 
 // Exports
-if (!apiBridge) {
-  exports.$set('GuestView', GuestView);
-  // TODO(mcnee): Don't export GuestViewImpl once guest_view_iframe.js is gone.
-  exports.$set('GuestViewImpl', GuestViewImpl);
-  exports.$set('ResizeEvent', ResizeEvent);
-}
+exports.$set('GuestView', GuestView);
+// TODO(mcnee): Don't export GuestViewImpl once guest_view_iframe.js is gone.
+exports.$set('GuestViewImpl', GuestViewImpl);
+exports.$set('ResizeEvent', ResizeEvent);
diff --git a/extensions/renderer/resources/guest_view/web_view/web_view_request_custom_bindings.js b/extensions/renderer/resources/guest_view/web_view/web_view_request_custom_bindings.js
index 09cfa8c..affad634 100644
--- a/extensions/renderer/resources/guest_view/web_view/web_view_request_custom_bindings.js
+++ b/extensions/renderer/resources/guest_view/web_view/web_view_request_custom_bindings.js
@@ -4,8 +4,6 @@
 
 // Custom binding for the webViewRequest API.
 
-var binding = apiBridge || require('binding').Binding.create('webViewRequest');
-
 var declarativeWebRequestSchema =
     requireNative('schema_registry').GetSchema('declarativeWebRequest');
 
@@ -21,7 +19,7 @@
   }
 }
 
-binding.registerCustomHook(function(api) {
+apiBridge.registerCustomHook(function(api) {
   var webViewRequest = api.compiledApi;
 
   // Helper function for the constructor of concrete datatypes of the
@@ -54,6 +52,3 @@
     webViewRequest[typeId] = action;
   }
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/extensions/renderer/resources/mime_handler_private_custom_bindings.js b/extensions/renderer/resources/mime_handler_private_custom_bindings.js
index 80a6c8b1..947c9a9 100644
--- a/extensions/renderer/resources/mime_handler_private_custom_bindings.js
+++ b/extensions/renderer/resources/mime_handler_private_custom_bindings.js
@@ -6,8 +6,6 @@
  * Custom bindings for the mime handler API.
  */
 
-var binding =
-    apiBridge || require('binding').Binding.create('mimeHandlerPrivate');
 var utils = require('utils');
 
 var NO_STREAM_ERROR =
@@ -59,7 +57,7 @@
   };
 }
 
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   var apiFunctions = bindingsAPI.apiFunctions;
   utils.handleRequestWithPromiseDoNotUse(
       apiFunctions, 'mimeHandlerPrivate', 'getStreamInfo',
@@ -81,6 +79,3 @@
     return beforeUnloadControlPtr.setShowBeforeUnloadDialog(showDialog);
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/extensions/renderer/resources/mojo_private_custom_bindings.js b/extensions/renderer/resources/mojo_private_custom_bindings.js
index 794471b..528e59b 100644
--- a/extensions/renderer/resources/mojo_private_custom_bindings.js
+++ b/extensions/renderer/resources/mojo_private_custom_bindings.js
@@ -6,15 +6,10 @@
  * Custom bindings for the mojoPrivate API.
  */
 
-let binding = apiBridge || require('binding').Binding.create('mojoPrivate');
-
-binding.registerCustomHook(function(bindingsAPI) {
+apiBridge.registerCustomHook(function(bindingsAPI) {
   let apiFunctions = bindingsAPI.apiFunctions;
 
   apiFunctions.setHandleRequest('requireAsync', function(moduleName) {
     return Promise.resolve(require(moduleName).returnValue);
   });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/extensions/renderer/resources/permissions_custom_bindings.js b/extensions/renderer/resources/permissions_custom_bindings.js
index e973fe9..df7f766 100644
--- a/extensions/renderer/resources/permissions_custom_bindings.js
+++ b/extensions/renderer/resources/permissions_custom_bindings.js
@@ -4,8 +4,6 @@
 
 // Custom binding for the Permissions API.
 
-var binding = apiBridge || require('binding').Binding.create('permissions');
-
 var registerArgumentMassager = bindingUtil ?
     $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) :
     require('event_bindings').registerArgumentMassager;
@@ -37,7 +35,7 @@
 // https://code.google.com/p/chromium/issues/detail?id=162044
 // https://code.google.com/p/chromium/issues/detail?id=162042
 // TODO(bryeung): delete this file.
-binding.registerCustomHook(function(api) {
+apiBridge.registerCustomHook(function(api) {
   var apiFunctions = api.apiFunctions;
   var permissions = api.compiledApi;
 
@@ -87,6 +85,3 @@
           callback(response);
       });
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/extensions/renderer/resources/printer_provider_custom_bindings.js b/extensions/renderer/resources/printer_provider_custom_bindings.js
index 23bba9f..66c294bd 100644
--- a/extensions/renderer/resources/printer_provider_custom_bindings.js
+++ b/extensions/renderer/resources/printer_provider_custom_bindings.js
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-var binding = apiBridge || require('binding').Binding.create('printerProvider');
 var printerProviderInternal =
     getInternalApi ?
         getInternalApi('printerProviderInternal') :
@@ -127,6 +126,3 @@
 handleEvent('onGetUsbPrinterInfoRequested',
             function(args, callback) { callback(true); },
             printerProviderInternal.reportUsbPrinterInfo);
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/extensions/renderer/resources/test_custom_bindings.js b/extensions/renderer/resources/test_custom_bindings.js
index 0008a71..74b25c3 100644
--- a/extensions/renderer/resources/test_custom_bindings.js
+++ b/extensions/renderer/resources/test_custom_bindings.js
@@ -5,8 +5,6 @@
 // test_custom_bindings.js
 // mini-framework for ExtensionApiTest browser tests
 
-var binding = apiBridge || require('binding').Binding.create('test');
-
 var environmentSpecificBindings = require('test_environment_specific_bindings');
 var GetExtensionAPIDefinitionsForTest =
     requireNative('apiDefinitions').GetExtensionAPIDefinitionsForTest;
@@ -32,7 +30,7 @@
     jsExceptionHandler.handle(message, error);
 }
 
-binding.registerCustomHook(function(api) {
+apiBridge.registerCustomHook(function(api) {
   var chromeTest = api.compiledApi;
   var apiFunctions = api.apiFunctions;
 
@@ -386,6 +384,3 @@
 
   environmentSpecificBindings.registerHooks(api);
 });
-
-if (!apiBridge)
-  exports.$set('binding', binding.generate());
diff --git a/ios/build/bots/scripts/run.py b/ios/build/bots/scripts/run.py
index 142b9946..33450d2 100755
--- a/ios/build/bots/scripts/run.py
+++ b/ios/build/bots/scripts/run.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env vpython
 # Copyright 2016 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
diff --git a/ios/build/bots/scripts/test_runner.py b/ios/build/bots/scripts/test_runner.py
index b34c5fb0..0e832685 100644
--- a/ios/build/bots/scripts/test_runner.py
+++ b/ios/build/bots/scripts/test_runner.py
@@ -4,29 +4,32 @@
 
 """Test runners for iOS."""
 
-import collections
 import errno
+import signal
+import sys
+
+import collections
 import glob
 import json
 import logging
+from multiprocessing import pool
 import os
 import plistlib
+import psutil
 import re
 import shutil
-import signal
 import subprocess
-import sys
 import tempfile
+import threading
 import time
 
-from multiprocessing import pool
-
 import gtest_utils
 import xctest_utils
 
-
 LOGGER = logging.getLogger(__name__)
 DERIVED_DATA = os.path.expanduser('~/Library/Developer/Xcode/DerivedData')
+READLINE_TIMEOUT = 180
+
 
 class Error(Exception):
   """Base class for errors."""
@@ -144,6 +147,76 @@
       'Sharding has not been implemented!')
 
 
+def terminate_process(proc):
+  """Terminates the process.
+
+  If an error occurs ignore it, just print out a message.
+
+  Args:
+    proc: A subprocess to terminate.
+  """
+  try:
+    LOGGER.info('Killing hung process %s' % proc.pid)
+    proc.terminate()
+    attempts_to_kill = 3
+    ps = psutil.Process(proc.pid)
+    for _ in range(attempts_to_kill):
+      # Check whether proc.pid process is still alive.
+      if ps.is_running():
+        LOGGER.info(
+            'Process iossim is still alive! Xcodebuild process might block it.')
+        xcodebuild_processes = [
+            p for p in psutil.process_iter() if 'xcodebuild' == p.info['name']]
+        if not xcodebuild_processes:
+          LOGGER.debug('There are no running xcodebuild processes.')
+          break
+        LOGGER.debug('List of running xcodebuild processes:',
+                     xcodebuild_processes)
+        # Killing xcodebuild processes
+        for p in xcodebuild_processes:
+          p.send_signal(signal.SIGKILL)
+        psutil.wait_procs(xcodebuild_processes)
+      else:
+        LOGGER.info('Process was killed!')
+        break
+  except OSError as ex:
+    LOGGER.info('Error while killing a process: %s' % ex)
+
+
+def print_process_output(proc, parser, timeout=READLINE_TIMEOUT):
+  """Logs process messages in console and waits until process is done.
+
+  Method waits until no output message and if no message for timeout seconds,
+  process will be terminated.
+
+  Args:
+    proc: A running process.
+    Parser: A parser.
+    timeout: Timeout(in seconds) to subprocess.stdout.readline method.
+  """
+  out = []
+  while True:
+    # subprocess.stdout.readline() might be stuck from time to time
+    # and tests fail because of TIMEOUT.
+    # Try to fix the issue by adding timer-thread for `timeout` seconds
+    # that will kill `frozen` running process if no new line is read
+    # and will finish test attempt.
+    # If new line appears in timeout, just cancel timer.
+    timer = threading.Timer(timeout, terminate_process, [proc])
+    timer.start()
+    line = proc.stdout.readline()
+    timer.cancel()
+    if not line:
+      break
+    line = line.rstrip()
+    out.append(line)
+    parser.ProcessLine(line)
+    LOGGER.info(line)
+    sys.stdout.flush()
+  LOGGER.debug('Finished print_process_output.')
+  return out
+
+
 def get_kif_test_filter(tests, invert=False):
   """Returns the KIF test filter to filter the given test cases.
 
@@ -528,16 +601,8 @@
           stderr=subprocess.STDOUT,
       )
       old_handler = self.set_sigterm_handler(
-        lambda _signum, _frame: self.handle_sigterm(proc))
-
-      while True:
-        line = proc.stdout.readline()
-        if not line:
-          break
-        line = line.rstrip()
-        parser.ProcessLine(line)
-        LOGGER.info(line)
-        sys.stdout.flush()
+          lambda _signum, _frame: self.handle_sigterm(proc))
+      print_process_output(proc, parser)
 
       LOGGER.info('Waiting for test process to terminate.')
       proc.wait()
@@ -883,13 +948,7 @@
         stderr=subprocess.STDOUT,
     )
 
-    out = []
-    while True:
-      line = proc.stdout.readline()
-      if not line:
-        break
-      out.append(line.rstrip())
-
+    out = print_process_output(proc, xctest_utils.XCTestLogParser())
     self.deleteSimulator(udid)
     return (out, udid, proc.returncode)
 
@@ -1167,14 +1226,7 @@
     else:
       parser = gtest_utils.GTestLogParser()
 
-    while True:
-      line = proc.stdout.readline()
-      if not line:
-        break
-      line = line.rstrip()
-      parser.ProcessLine(line)
-      LOGGER.info(line)
-      sys.stdout.flush()
+    print_process_output(proc, parser)
 
     proc.wait()
     self.set_sigterm_handler(old_handler)
diff --git a/ios/build/bots/scripts/xcodebuild_runner.py b/ios/build/bots/scripts/xcodebuild_runner.py
index 6e4760be..251fa41 100644
--- a/ios/build/bots/scripts/xcodebuild_runner.py
+++ b/ios/build/bots/scripts/xcodebuild_runner.py
@@ -21,7 +21,6 @@
 import test_runner
 
 LOGGER = logging.getLogger(__name__)
-READLINE_TIMEOUT = 300
 
 
 class LaunchCommandCreationError(test_runner.TestRunnerError):
@@ -378,23 +377,24 @@
     while True:
       # It seems that subprocess.stdout.readline() is stuck from time to time
       # and tests fail because of TIMEOUT.
-      # Try to fix the issue by adding timer-thread for 5 mins
+      # Try to fix the issue by adding timer-thread for 3 mins
       # that will kill `frozen` running process if no new line is read
       # and will finish test attempt.
-      # If new line appears in 5 mins, just cancel timer.
-      timer = threading.Timer(READLINE_TIMEOUT, terminate_process, [proc])
+      # If new line appears in 3 mins, just cancel timer.
+      timer = threading.Timer(test_runner.READLINE_TIMEOUT,
+                              terminate_process, [proc])
       timer.start()
       line = proc.stdout.readline()
       timer.cancel()
       if not line:
         break
       line = line.rstrip()
-      print line
+      LOGGER.info(line)
       output.append(line)
       sys.stdout.flush()
 
     proc.wait()
-    print 'Command %s finished with %d' % (cmd, proc.returncode)
+    LOGGER.info('Command %s finished with %d' % (cmd, proc.returncode))
     return proc.returncode, output
 
   def launch(self):
@@ -426,8 +426,8 @@
             env_vars=self.egtests_app.env_vars)
 
       # TODO(crbug.com/914878): add heartbeat logging to xcodebuild_runner.
-      print 'Start test attempt #%d for command [%s]' % (
-          attempt, ' '.join(cmd_list))
+      LOGGER.info('Start test attempt #%d for command [%s]' % (
+          attempt, ' '.join(cmd_list)))
       _, output = self.launch_attempt(cmd_list, outdir_attempt)
       self.test_results['attempts'].append(
           collect_test_results(os.path.join(outdir_attempt, 'Info.plist'),
@@ -607,30 +607,34 @@
 
   def launch(self):
     """Launches tests using xcodebuild."""
-    destinaion_folder = lambda dest: dest.replace(
-        'platform=iOS Simulator,', '').replace(',name=', ' ').replace('OS=', '')
-    launch_commands = []
-    for params in self.sharding_data:
-      launch_commands.append(LaunchCommand(
-          EgtestsApp(params['app'], filtered_tests=params['test_cases'],
-                     env_vars=self.env_vars, test_args=self.test_args),
-          params['destination'],
-          shards=params['shards'],
-          retries=self.retries,
-          out_dir=os.path.join(self.out_dir,
-                               destinaion_folder(params['destination'])),
-          env=self.get_launch_env()))
+    try:
+      destinaion_folder = lambda dest: dest.replace(
+          'platform=iOS Simulator,', '').replace(
+              ',name=', ' ').replace('OS=', '')
+      launch_commands = []
+      for params in self.sharding_data:
+        launch_commands.append(LaunchCommand(
+            EgtestsApp(params['app'], filtered_tests=params['test_cases'],
+                       env_vars=self.env_vars, test_args=self.test_args),
+            params['destination'],
+            shards=params['shards'],
+            retries=self.retries,
+            out_dir=os.path.join(self.out_dir,
+                                 destinaion_folder(params['destination'])),
+            env=self.get_launch_env()))
 
-    pool = multiprocessing.pool.ThreadPool(len(launch_commands))
-    self.test_results['commands'] = []
-    for result in pool.imap_unordered(LaunchCommand.launch, launch_commands):
-      self.logs[' '.join(result['cmd'])] = result['test_results']
-      self.test_results['commands'].append(
-          {'cmd': ' '.join(result['cmd']), 'logs': result['logs']})
-    self.test_results['end_run'] = int(time.time())
-    LOGGER.debug('Test ended.')
-    # Test is failed if there are failures for the last run.
-    return not self.test_results['commands'][-1]['logs']['failed']
+      pool = multiprocessing.pool.ThreadPool(len(launch_commands))
+      self.test_results['commands'] = []
+      for result in pool.imap_unordered(LaunchCommand.launch, launch_commands):
+        self.logs[' '.join(result['cmd'])] = result['test_results']
+        self.test_results['commands'].append(
+            {'cmd': ' '.join(result['cmd']), 'logs': result['logs']})
+      self.test_results['end_run'] = int(time.time())
+      LOGGER.debug('Test ended.')
+      # Test is failed if there are failures for the last run.
+      return not self.test_results['commands'][-1]['logs']['failed']
+    finally:
+      self.tear_down()
 
   def erase_all_simulators(self):
     """Erases all simulator devices.
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
index aa19432..62ea9fa8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">Adreça 2</translation>
 <translation id="3329904751041170572">No s'ha pogut connectar amb el servidor.</translation>
 <translation id="3335947283844343239">Torna a obrir la pestanya tancada</translation>
+<translation id="3371831930909698441">El Traductor està disponible. Tens opcions a la part inferior de la pantalla</translation>
 <translation id="3393920035788932672">Finestres emergents permeses</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation>
 <translation id="3448016392200048164">Visualització dividida</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">País</translation>
 <translation id="6445981559479772097">Missatge enviat.</translation>
 <translation id="6464071786529933911">Obre en una pestanya d'incògnit</translation>
+<translation id="6476800141292307438">La pàgina s'està traduint a <ph name="LANGUAGE" />. Tens opcions disponibles a la part inferior de la pantalla.</translation>
 <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> elements suprimits</translation>
 <translation id="6513773942555305766">Contrasenya suggerida per Chrome: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">L'última hora</translation>
+<translation id="6610002944194042868">Opcions del Traductor</translation>
 <translation id="6642362222295953972">Canvia a la pestanya existent</translation>
 <translation id="6643016212128521049">Esborra</translation>
 <translation id="6656103420185847513">Edició de la carpeta</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">Activa la sincronització</translation>
 <translation id="6914583639806229067">Cerca la imatge que has copiat</translation>
 <translation id="6914783257214138813">Tothom que pugui veure el fitxer exportat podrà veure també les teves contrasenyes.</translation>
+<translation id="6944369514868857500">Tria un altre compte</translation>
 <translation id="6945221475159498467">Selecciona</translation>
 <translation id="6973630695168034713">Carpetes</translation>
 <translation id="6979158407327259162">Google Drive</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">Idioma predeterminat: <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">Tanca-ho tot</translation>
 <translation id="8381750437846184350">Controleu com utilitza Google el vostre historial de navegació per personalitzar la Cerca, els anuncis i altres serveis de Google</translation>
+<translation id="8407669440184693619">No s'ha trobat cap contrasenya per a aquest lloc web</translation>
 <translation id="842017693807136194">S'ha iniciat la sessió amb</translation>
 <translation id="8428045167754449968">Ciutat/població</translation>
 <translation id="8428213095426709021">Configuració</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
index adb31bc..4dc9c4b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">Druhý řádek adresy</translation>
 <translation id="3329904751041170572">Nelze se připojit k serveru.</translation>
 <translation id="3335947283844343239">Znovu otevřít zavřenou kartu</translation>
+<translation id="3371831930909698441">Je k dispozici Překladač. Možnosti jsou k dispozici ve spodní části obrazovky.</translation>
 <translation id="3393920035788932672">Vyskakovací okna povolena</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation>
 <translation id="3448016392200048164">Režim Split View</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">Země</translation>
 <translation id="6445981559479772097">Zpráva odeslána</translation>
 <translation id="6464071786529933911">Otevřít v nové anonymní kartě</translation>
+<translation id="6476800141292307438">Stránka se překládá do jazyka <ph name="LANGUAGE" />. Možnosti jsou k dispozici u dolního okraje obrazovky.</translation>
 <translation id="6482629121755362506">Počet smazaných položek: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation>
 <translation id="6513773942555305766">Heslo navrhované prohlížečem Chrome: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">Z uplynulé hodiny</translation>
+<translation id="6610002944194042868">Možnosti Překladače</translation>
 <translation id="6642362222295953972">Přepnout na existující kartu</translation>
 <translation id="6643016212128521049">Vymazat</translation>
 <translation id="6656103420185847513">Úprava složky</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">Zapnout synchronizaci</translation>
 <translation id="6914583639806229067">Vyhledat zkopírovaný obrázek</translation>
 <translation id="6914783257214138813">Vaše hesla uvidí každý, kdo může zobrazit exportovaný soubor.</translation>
+<translation id="6944369514868857500">Vybrat jiný účet</translation>
 <translation id="6945221475159498467">Vybrat</translation>
 <translation id="6973630695168034713">Složky</translation>
 <translation id="6979158407327259162">Disk Google</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">Výchozí – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">Zavřít vše</translation>
 <translation id="8381750437846184350">Nastavte, jak má Google využívat vaši historii procházení k personalizaci Vyhledávání, reklam a dalších služeb Google</translation>
+<translation id="8407669440184693619">Pro tento web nebyla nalezena žádná hesla</translation>
 <translation id="842017693807136194">Poskytovatel přihlášení</translation>
 <translation id="8428045167754449968">Město nebo obec</translation>
 <translation id="8428213095426709021">Nastavení</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index 39b0bf5..fe11d12 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">Dirección 2</translation>
 <translation id="3329904751041170572">No se ha podido establecer conexión con el servidor.</translation>
 <translation id="3335947283844343239">Volver a abrir pestaña cerrada</translation>
+<translation id="3371831930909698441">El Traductor está disponible. Opciones disponibles cerca de la parte inferior de la pantalla.</translation>
 <translation id="3393920035788932672">Pop-ups permitidos</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation>
 <translation id="3448016392200048164">Vista dividida</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">País</translation>
 <translation id="6445981559479772097">Mensaje enviado</translation>
 <translation id="6464071786529933911">Abrir en pestaña incógnito</translation>
+<translation id="6476800141292307438">La página se está traduciendo al <ph name="LANGUAGE" />. Encontrarás opciones disponibles cerca de la parte inferior de la pantalla.</translation>
 <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> elementos eliminados</translation>
 <translation id="6513773942555305766">Contraseña sugerida de Chrome: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">Hace una hora</translation>
+<translation id="6610002944194042868">Opciones del Traductor</translation>
 <translation id="6642362222295953972">Cambiar a la pestaña existente</translation>
 <translation id="6643016212128521049">Eliminar</translation>
 <translation id="6656103420185847513">Editar carpeta</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">Activar sincronización</translation>
 <translation id="6914583639806229067">Buscar la imagen que has copiado</translation>
 <translation id="6914783257214138813">Cualquier usuario que pueda ver el archivo exportado podrá ver tus contraseñas.</translation>
+<translation id="6944369514868857500">Elegir otra cuenta</translation>
 <translation id="6945221475159498467">Seleccionar</translation>
 <translation id="6973630695168034713">Carpetas</translation>
 <translation id="6979158407327259162">Google Drive</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">Predeterminada: <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">Cerrar todo</translation>
 <translation id="8381750437846184350">Controla cómo utiliza Google tu historial de navegación para personalizar la Búsqueda, los anuncios y otros servicios de Google</translation>
+<translation id="8407669440184693619">No se han encontrado contraseñas para este sitio web</translation>
 <translation id="842017693807136194">Has iniciado sesión como</translation>
 <translation id="8428045167754449968">Ciudad/Localidad</translation>
 <translation id="8428213095426709021">Configuración</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
index 395f6e1..bc9f4b0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">Osoite 2</translation>
 <translation id="3329904751041170572">Palvelimeen ei saada yhteyttä.</translation>
 <translation id="3335947283844343239">Avaa suljettu välilehti uudelleen</translation>
+<translation id="3371831930909698441">Kääntäjä on käytössä. Asetukset löytyvät näytön alalaidasta.</translation>
 <translation id="3393920035788932672">Ponnahdusikk. sallittu</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation>
 <translation id="3448016392200048164">Jaettu näkymä</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">Maa</translation>
 <translation id="6445981559479772097">Viesti lähetetty.</translation>
 <translation id="6464071786529933911">Avaa incognito-tilassa</translation>
+<translation id="6476800141292307438">Käännetään sivua kielelle <ph name="LANGUAGE" />. Vaihtoehdot näkyvät näytön alareunan lähellä.</translation>
 <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> kohdetta poistettu</translation>
 <translation id="6513773942555305766">Chromen salasanaehdotus: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">Viimeisen tunnin ajalta</translation>
+<translation id="6610002944194042868">Käännösasetukset</translation>
 <translation id="6642362222295953972">Siirry aiemmalle välilehdelle</translation>
 <translation id="6643016212128521049">Tyhjennä</translation>
 <translation id="6656103420185847513">Muokkaa kansiota</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">Ota synkronointi käyttöön</translation>
 <translation id="6914583639806229067">Hae kopioitua kuvaa</translation>
 <translation id="6914783257214138813">Salasanasi näkyvät kaikille, jotka näkevät viedyn tiedoston.</translation>
+<translation id="6944369514868857500">Valitse toinen tili</translation>
 <translation id="6945221475159498467">Valitse</translation>
 <translation id="6973630695168034713">Kansiot</translation>
 <translation id="6979158407327259162">Google Drive</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">Oletus – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">Sulje kaikki</translation>
 <translation id="8381750437846184350">Hallinnoi tapaa, jolla Google käyttää selaushistoriaasi haun, mainosten ja muiden Googlen palveluiden muokkaamiseen.</translation>
+<translation id="8407669440184693619">Tälle sivustolle ei löytynyt salasanoja</translation>
 <translation id="842017693807136194">Kirjauduttu palvelulla</translation>
 <translation id="8428045167754449968">Kaupunki</translation>
 <translation id="8428213095426709021">Asetukset</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index 27a6b64d..eab00bff 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">Address 2</translation>
 <translation id="3329904751041170572">Hindi makakonekta sa server.</translation>
 <translation id="3335947283844343239">Muling buksan ang Nakasarang Tab</translation>
+<translation id="3371831930909698441">Available ang pagsasalin. May mga opsyon malapit sa ibaba ng screen.</translation>
 <translation id="3393920035788932672">Pinapayagan ang Mga Pop-up</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> (na) min</translation>
 <translation id="3448016392200048164">Split View</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">Bansa</translation>
 <translation id="6445981559479772097">Napadala na ang mensahe.</translation>
 <translation id="6464071786529933911">Buksan sa Bagong Tab na Incognito</translation>
+<translation id="6476800141292307438">Isinasalin ang page sa <ph name="LANGUAGE" />. May mga opsyon malapit sa ibaba ng screen.</translation>
 <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> (na) item ang na-delete</translation>
 <translation id="6513773942555305766">Iminungkahing Password ng Chrome: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">Nakalipas na Oras</translation>
+<translation id="6610002944194042868">Mga Opsyon sa Pagsasalin</translation>
 <translation id="6642362222295953972">Lumipat sa kasalukuyang tab</translation>
 <translation id="6643016212128521049">I-clear</translation>
 <translation id="6656103420185847513">I-edit ang Folder</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">I-on ang pag-sync</translation>
 <translation id="6914583639806229067">Maghanap para sa Larawang Kinopya Mo</translation>
 <translation id="6914783257214138813">Makikita ng sinumang makakatingin sa na-export na file ang iyong mga password.</translation>
+<translation id="6944369514868857500">Pumili ng Ibang Account</translation>
 <translation id="6945221475159498467">Pumili</translation>
 <translation id="6973630695168034713">Mga Folder</translation>
 <translation id="6979158407327259162">Google Drive</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">Default - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">Isara Lahat</translation>
 <translation id="8381750437846184350">Kontrolin kung paano ginagamit ng Google ang iyong history ng pagba-browse upang i-personalize ang Search, mga ad at iba pang mga serbisyo ng Google</translation>
+<translation id="8407669440184693619">Walang nahanap na password para sa site na ito</translation>
 <translation id="842017693807136194">Naka-sign In Gamit ang</translation>
 <translation id="8428045167754449968">Lungsod / Bayan</translation>
 <translation id="8428213095426709021">Mga Setting</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index 73e6bb79..a4de16e2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">Adresse 2</translation>
 <translation id="3329904751041170572">Impossible de se connecter au serveur.</translation>
 <translation id="3335947283844343239">Rouvrir l'onglet fermé</translation>
+<translation id="3371831930909698441">La traduction est disponible. Options disponibles au bas de l'écran.</translation>
 <translation id="3393920035788932672">Pop-up autorisés</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation>
 <translation id="3448016392200048164">Vue fractionnée</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">Pays</translation>
 <translation id="6445981559479772097">Message envoyé.</translation>
 <translation id="6464071786529933911">Ouvrir nouvel onglet navigation privée</translation>
+<translation id="6476800141292307438">Traduction de la page en <ph name="LANGUAGE" />. Options disponibles au bas de l'écran.</translation>
 <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> éléments supprimés.</translation>
 <translation id="6513773942555305766">Mot de passe suggéré par Chrome : <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">Dernière heure</translation>
+<translation id="6610002944194042868">Options de traduction</translation>
 <translation id="6642362222295953972">Passer à un onglet existant</translation>
 <translation id="6643016212128521049">Effacer</translation>
 <translation id="6656103420185847513">Modifier le dossier</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">Activer la synchronisation</translation>
 <translation id="6914583639806229067">Rechercher l'image copiée</translation>
 <translation id="6914783257214138813">Toute personne ayant accès au fichier exporté pourra voir ces mots de passe.</translation>
+<translation id="6944369514868857500">Sélectionner un autre compte</translation>
 <translation id="6945221475159498467">Sélectionner</translation>
 <translation id="6973630695168034713">Dossiers</translation>
 <translation id="6979158407327259162">Google Drive</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">Par défaut : <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">Tout fermer</translation>
 <translation id="8381750437846184350">Contrôlez la façon dont Google utilise votre historique de navigation pour personnaliser la recherche, les annonces et d'autres services Google.</translation>
+<translation id="8407669440184693619">Aucun mot de passe trouvé pour ce site</translation>
 <translation id="842017693807136194">Connecté avec</translation>
 <translation id="8428045167754449968">Ville</translation>
 <translation id="8428213095426709021">Paramètres</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
index eca93237..5b76540 100644
--- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">כתובת, שורה 2</translation>
 <translation id="3329904751041170572">לא ניתן להתחבר לשרת.</translation>
 <translation id="3335947283844343239">פתח מחדש כרטיסייה שנסגרה</translation>
+<translation id="3371831930909698441">‏Translate זמין. האפשרויות מוצגות בחלק התחתון של המסך.</translation>
 <translation id="3393920035788932672">חלונות קופצים מותרים</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> דק'</translation>
 <translation id="3448016392200048164">תצוגה מפוצלת</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">ארץ</translation>
 <translation id="6445981559479772097">ההודעה נשלחה.</translation>
 <translation id="6464071786529933911">פתח בכרטיסיית גלישה בסתר חדשה</translation>
+<translation id="6476800141292307438">הדפדפן מתרגם את הדף ל<ph name="LANGUAGE" />. האפשרויות מוצגות בחלק התחתון של המסך.</translation>
 <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> פריטים נמחקו</translation>
 <translation id="6513773942555305766">‏הצעה לסיסמה מ-Chrome: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">מהשעה האחרונה</translation>
+<translation id="6610002944194042868">אפשרויות תרגום</translation>
 <translation id="6642362222295953972">מעבר אל כרטיסייה קיימת</translation>
 <translation id="6643016212128521049">נקה</translation>
 <translation id="6656103420185847513">ערוך תיקייה</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">הפעל סנכרון</translation>
 <translation id="6914583639806229067">חיפוש תמונה שהעתקת</translation>
 <translation id="6914783257214138813">כל מי שיוכל לגשת אל הקובץ המיוצא יוכל לראות את הסיסמאות שלך.</translation>
+<translation id="6944369514868857500">בחירת חשבון אחר</translation>
 <translation id="6945221475159498467">בחר</translation>
 <translation id="6973630695168034713">תיקיות</translation>
 <translation id="6979158407327259162">Google Drive</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">ברירת מחדל - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">סגור הכל</translation>
 <translation id="8381750437846184350">‏שלוט באופן שבו חברת Google משתמשת בהיסטוריית הגלישה שלך לצורך התאמה אישית של חיפוש Google, מודעות Google ושירותי Google אחרים</translation>
+<translation id="8407669440184693619">לא נמצאו סיסמאות בשביל האתר הזה</translation>
 <translation id="842017693807136194">מחובר באמצעות</translation>
 <translation id="8428045167754449968">עיר / יישוב</translation>
 <translation id="8428213095426709021">הגדרות</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index e7a5b94b..5aa5ea5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">주소 2</translation>
 <translation id="3329904751041170572">서버에 연결하지 못했습니다.</translation>
 <translation id="3335947283844343239">닫은 탭 다시 열기</translation>
+<translation id="3371831930909698441">번역을 사용할 수 있습니다. 화면 하단에서 옵션을 선택할 수 있습니다.</translation>
 <translation id="3393920035788932672">팝업 허용</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" />분</translation>
 <translation id="3448016392200048164">분할 보기</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">국가</translation>
 <translation id="6445981559479772097">메시지가 전송되었습니다.</translation>
 <translation id="6464071786529933911">새 시크릿 탭에서 열기</translation>
+<translation id="6476800141292307438">페이지를 <ph name="LANGUAGE" />로 번역합니다. 화면 하단에 옵션이 있습니다.</translation>
 <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" />개 항목 삭제함</translation>
 <translation id="6513773942555305766">Chrome 추천 비밀번호: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">지난 1시간</translation>
+<translation id="6610002944194042868">번역 옵션</translation>
 <translation id="6642362222295953972">기존 탭으로 전환</translation>
 <translation id="6643016212128521049">삭제</translation>
 <translation id="6656103420185847513">폴더 수정</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">동기화 사용 설정</translation>
 <translation id="6914583639806229067">복사한 이미지 검색</translation>
 <translation id="6914783257214138813">내보낸 파일을 볼 수 있는 모든 사용자에게 비밀번호가 표시됩니다.</translation>
+<translation id="6944369514868857500">다른 계정 선택</translation>
 <translation id="6945221475159498467">선택</translation>
 <translation id="6973630695168034713">폴더</translation>
 <translation id="6979158407327259162">Google 드라이브</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">기본값 - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">모두 닫기</translation>
 <translation id="8381750437846184350">Google이 검색, 광고 및 다른 Google 서비스를 맞춤설정하기 위하여 내 인터넷 사용 기록을 사용하는 방법을 제어하세요.</translation>
+<translation id="8407669440184693619">이 사이트의 비밀번호를 찾을 수 없음</translation>
 <translation id="842017693807136194">다음을 사용하여 로그인함</translation>
 <translation id="8428045167754449968">시/군/구</translation>
 <translation id="8428213095426709021">설정</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb
index 72153aae..caeb166 100644
--- a/ios/chrome/app/strings/resources/ios_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">Adresse 2</translation>
 <translation id="3329904751041170572">Kunne ikke koble til tjeneren.</translation>
 <translation id="3335947283844343239">Åpne lukkede faner igjen</translation>
+<translation id="3371831930909698441">Oversetter er tilgjengelig. Du finner alternativer på nedre del av skjermen.</translation>
 <translation id="3393920035788932672">Tillat forgrunnsvinduer</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation>
 <translation id="3448016392200048164">Delt visning</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">Land</translation>
 <translation id="6445981559479772097">Melding sendt.</translation>
 <translation id="6464071786529933911">Åpne i en ny inkognitofane</translation>
+<translation id="6476800141292307438">Oversetter siden til <ph name="LANGUAGE" />. Du finner alternativer på nedre del av skjermen.</translation>
 <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> elementer slettet</translation>
 <translation id="6513773942555305766">Passordforslag fra Chrome: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">Den siste timen</translation>
+<translation id="6610002944194042868">Alternativer for oversettelse</translation>
 <translation id="6642362222295953972">Bytt til den eksisterende fanen</translation>
 <translation id="6643016212128521049">Tøm</translation>
 <translation id="6656103420185847513">Mapperedigering</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">Slå på synkronisering</translation>
 <translation id="6914583639806229067">Søk etter bildet du kopierte</translation>
 <translation id="6914783257214138813">Passordene dine blir synlige for alle som kan se den eksporterte filen.</translation>
+<translation id="6944369514868857500">Velg en annen konto</translation>
 <translation id="6945221475159498467">Velg</translation>
 <translation id="6973630695168034713">Mapper</translation>
 <translation id="6979158407327259162">Google Disk</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">Standard – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">Lukk alle</translation>
 <translation id="8381750437846184350">Kontrollér hvordan Google bruker nettlesingsloggen din for å gi Søk, annonser og andre Google-tjenester et personlig preg</translation>
+<translation id="8407669440184693619">Fant ingen passord for dette nettstedet</translation>
 <translation id="842017693807136194">Logget på med</translation>
 <translation id="8428045167754449968">By/tettsted</translation>
 <translation id="8428213095426709021">Innstillinger</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index 931b10d6..1f49562 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -75,7 +75,7 @@
 <translation id="2000419248597011803">Отправлять некоторые файлы cookie и поисковые запросы из адресной строки в поисковую систему по умолчанию</translation>
 <translation id="2015722694326466240">Чтобы просматривать пароли, настройте на устройстве код доступа.</translation>
 <translation id="2068952045031577364">За прошлую неделю</translation>
-<translation id="2074131957428911366">Вы всегда можете изменить данные для синхронизации в <ph name="BEGIN_LINK" />настройках<ph name="END_LINK" />.</translation>
+<translation id="2074131957428911366">Вы всегда можете выбрать, что синхронизировать, в <ph name="BEGIN_LINK" />настройках<ph name="END_LINK" />.</translation>
 <translation id="2079545284768500474">Отмена</translation>
 <translation id="209018056901015185">Полная версия</translation>
 <translation id="2096012225669085171">Синхронизация и персонализация данных на всех устройствах.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
index 871b06a..86869d0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">Adressrad 2</translation>
 <translation id="3329904751041170572">Det gick inte att ansluta till servern.</translation>
 <translation id="3335947283844343239">Öppna stängd flik igen</translation>
+<translation id="3371831930909698441">Översättning finns. Alternativ visas nära skärmens nedre kant.</translation>
 <translation id="3393920035788932672">Popup tillåts</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation>
 <translation id="3448016392200048164">Delad vy</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">Land</translation>
 <translation id="6445981559479772097">SMS skickat.</translation>
 <translation id="6464071786529933911">Öppna i ny inkognitoflik</translation>
+<translation id="6476800141292307438">Översätter sidan till <ph name="LANGUAGE" />. Alternativ finns längst ned på skärmen.</translation>
 <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> objekt har tagits bort</translation>
 <translation id="6513773942555305766">Föreslaget lösenord: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">Senaste timmen</translation>
+<translation id="6610002944194042868">Översättningsalternativ</translation>
 <translation id="6642362222295953972">Byt till befintlig flik</translation>
 <translation id="6643016212128521049">Rensa</translation>
 <translation id="6656103420185847513">Redigera mapp</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">Aktivera synkronisering</translation>
 <translation id="6914583639806229067">Sök efter kopierad bild</translation>
 <translation id="6914783257214138813">Alla med tillgång till den exporterade filen kan läsa dina lösenord.</translation>
+<translation id="6944369514868857500">Välj ett annat konto</translation>
 <translation id="6945221475159498467">Välj</translation>
 <translation id="6973630695168034713">Mappar</translation>
 <translation id="6979158407327259162">Google Drive</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">Standard – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">Stäng alla</translation>
 <translation id="8381750437846184350">Styr hur Google anpassar Sök, annonser och andra Google-tjänster utifrån webbhistoriken</translation>
+<translation id="8407669440184693619">Inga lösenord hittades för webbplatsen</translation>
 <translation id="842017693807136194">Inloggad med</translation>
 <translation id="8428045167754449968">Ort</translation>
 <translation id="8428213095426709021">Inställningar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
index 86696d1..8a2d52f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">முகவரி 2</translation>
 <translation id="3329904751041170572">சேவையகத்துடன் இணைக்க முடியவில்லை.</translation>
 <translation id="3335947283844343239">மூடப்பட்ட தாவலை மீண்டும் திற</translation>
+<translation id="3371831930909698441">மொழியாக்கம் கிடைக்கிறது திரையின் கீழ்ப்பகுதிக்கு அருகில் விருப்பத்தேர்வுகள் உள்ளன.</translation>
 <translation id="3393920035788932672">பாப்-அப்கள் அனுமதிக்கப்பட்டன</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> நி.</translation>
 <translation id="3448016392200048164">காட்சிப் பிரிப்பு</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">நாடு</translation>
 <translation id="6445981559479772097">செய்தி அனுப்பப்பட்டது.</translation>
 <translation id="6464071786529933911">புதிய மறைநிலைத் தாவலில் திற</translation>
+<translation id="6476800141292307438">பக்கத்தை <ph name="LANGUAGE" /> மொழியில் மொழிபெயர்க்கிறது. திரையின் கீழ்ப்பகுதிக்கு அருகில் விருப்பத்தேர்வுகள் உள்ளன.</translation>
 <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> உருப்படிகள் நீக்கப்பட்டன</translation>
 <translation id="6513773942555305766">Chrome பரிந்துரைத்த கடவுச்சொல்: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">கடந்த ஒரு மணிநேரம்</translation>
+<translation id="6610002944194042868">மொழிபெயர்ப்பு விருப்பத்தேர்வுகள்</translation>
 <translation id="6642362222295953972">ஏற்கனவே திறந்துள்ள தாவலுக்கு மாறு</translation>
 <translation id="6643016212128521049">அழி</translation>
 <translation id="6656103420185847513">கோப்புறையைத் திருத்து</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">ஒத்திசைவை இயக்கு</translation>
 <translation id="6914583639806229067">நீங்கள் நகலெடுத்த படத்தைத் தேடுக</translation>
 <translation id="6914783257214138813">ஏற்றிய கோப்பைப் பார்க்கக்கூடிய அனைவரும் உங்கள் கடவுச்சொற்களைப் பார்க்க முடியும்.</translation>
+<translation id="6944369514868857500">மற்றொரு கணக்கைத் தேர்வுசெய்க</translation>
 <translation id="6945221475159498467">தேர்ந்தெடு</translation>
 <translation id="6973630695168034713">கோப்புறைகள்</translation>
 <translation id="6979158407327259162">Google இயக்ககம்</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">இயல்பு - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">எல்லாவற்றையும் மூடு</translation>
 <translation id="8381750437846184350">தேடல், விளம்பரங்கள் மற்றும் பிற Google சேவைகளைத் தனிப்பயனாக்க, உங்கள் உலாவல் வரலாற்றை Google எவ்வாறு பயன்படுத்துகிறது என்பதைக் கட்டுப்படுத்துக</translation>
+<translation id="8407669440184693619">இந்தத் தளத்திற்கான கடவுச்சொற்கள் எதுவும் இல்லை</translation>
 <translation id="842017693807136194">இதன் மூலம் உள்நுழைந்துள்ளீர்கள்:</translation>
 <translation id="8428045167754449968">மாநகரம் / நகரம்</translation>
 <translation id="8428213095426709021">அமைப்புகள்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb
index 7d0a53e1..e560ab5c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">చిరునామా 2</translation>
 <translation id="3329904751041170572">సర్వర్‌కు కనెక్ట్ చేయడం సాధ్యపడలేదు.</translation>
 <translation id="3335947283844343239">మూసిన ట్యాబ్‌ను మళ్లీ తెరువు</translation>
+<translation id="3371831930909698441">అనువాదం అందుబాటులో ఉంది. స్క్రీన్ దిగువభాగానికి సమీపంలో ఎంపికలు అందుబాటులో ఉంటాయి.</translation>
 <translation id="3393920035788932672">పాప్-అప్‌లు అనుమతించబడ్డాయి</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> నిమి</translation>
 <translation id="3448016392200048164">విభజన వీక్షణ</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">దేశం</translation>
 <translation id="6445981559479772097">సందేశం పంపబడింది.</translation>
 <translation id="6464071786529933911">కొత్త అజ్ఞాత ట్యాబ్‌లో తెరువు</translation>
+<translation id="6476800141292307438">పేజీని <ph name="LANGUAGE" />లోకి అనువదిస్తోంది. స్క్రీన్ దిగువ భాగానికి దగ్గర్లో ఎంపికలు అందుబాటులో ఉంటాయి.</translation>
 <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> అంశాలు తొలగించబడ్డాయి</translation>
 <translation id="6513773942555305766">Chrome సూచించిన పాస్‌వర్డ్: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">గడిచిన గంట</translation>
+<translation id="6610002944194042868">అనువాదం ఎంపికలు</translation>
 <translation id="6642362222295953972">ప్రస్తుత ట్యాబ్‌కు మారు</translation>
 <translation id="6643016212128521049">క్లియర్ చేయి</translation>
 <translation id="6656103420185847513">ఫోల్డర్‌ను సవరించండి</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">సమకాలీకరణను ఆన్ చేయి</translation>
 <translation id="6914583639806229067">మీరు కాపీ చేసిన చిత్రాన్ని వెతకండి</translation>
 <translation id="6914783257214138813">ఎగుమతి చేయబడిన ఫైల్‌ను చూడగల ఎవరికైనా మీ పాస్‌వర్డ్‌లు కనిపిస్తాయి.</translation>
+<translation id="6944369514868857500">మరొక ఖాతాను ఎంచుకోండి</translation>
 <translation id="6945221475159498467">ఎంచుకోండి</translation>
 <translation id="6973630695168034713">ఫోల్డర్‌లు</translation>
 <translation id="6979158407327259162">Google డిస్క్</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">డిఫాల్ట్ - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">అన్నింటినీ మూసివేయి</translation>
 <translation id="8381750437846184350">శోధన, ప్రకటనలు మరియు ఇతర Google సేవలను వ్యక్తిగతీకరించడం కోసం Google మీ బ్రౌజింగ్ చరిత్రను ఉపయోగించే విధానాన్ని నియంత్రించండి</translation>
+<translation id="8407669440184693619">ఈ సైట్ కోసం పాస్‌వర్డ్‌లు కనుగొనబడలేదు</translation>
 <translation id="842017693807136194">దీనితో సైన్ ఇన్ చేయబడింది</translation>
 <translation id="8428045167754449968">నగరం / పట్టణం</translation>
 <translation id="8428213095426709021">సెట్టింగ్‌లు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index 86cabca..bf0654ef 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">ที่อยู่ 2</translation>
 <translation id="3329904751041170572">ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์</translation>
 <translation id="3335947283844343239">เปิดแท็บที่ปิดไปแล้วขึ้นใหม่</translation>
+<translation id="3371831930909698441">มีบริการแปลภาษา ตัวเลือกจะอยู่ทางด้านล่างของหน้าจอ</translation>
 <translation id="3393920035788932672">อนุญาตให้แสดงป๊อปอัป</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> นาที</translation>
 <translation id="3448016392200048164">Split View</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">ประเทศ</translation>
 <translation id="6445981559479772097">ส่งข้อความแล้ว</translation>
 <translation id="6464071786529933911">เปิดในแท็บที่ไม่ระบุตัวตนใหม่</translation>
+<translation id="6476800141292307438">กำลังแปลหน้าเว็บเป็นภาษา<ph name="LANGUAGE" /> ตัวเลือกจะอยู่ทางด้านล่างของหน้าจอ</translation>
 <translation id="6482629121755362506">ลบแล้ว <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> รายการ</translation>
 <translation id="6513773942555305766">รหัสผ่านที่ Chrome แนะนำ: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">ชั่วโมงที่ผ่านมา</translation>
+<translation id="6610002944194042868">ตัวเลือกการแปลภาษา</translation>
 <translation id="6642362222295953972">เปลี่ยนไปใช้แท็บที่มีอยู่</translation>
 <translation id="6643016212128521049">ล้าง</translation>
 <translation id="6656103420185847513">แก้ไขโฟลเดอร์</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">เปิดการซิงค์</translation>
 <translation id="6914583639806229067">ค้นหารูปภาพที่คุณคัดลอก</translation>
 <translation id="6914783257214138813">คนที่ดูไฟล์ที่ส่งออกได้จะเห็นรหัสผ่านของคุณ</translation>
+<translation id="6944369514868857500">เลือกบัญชีอื่น</translation>
 <translation id="6945221475159498467">เลือก</translation>
 <translation id="6973630695168034713">โฟลเดอร์</translation>
 <translation id="6979158407327259162">Google ไดรฟ์</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">ค่าเริ่มต้น - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">ปิดทั้งหมด</translation>
 <translation id="8381750437846184350">ควบคุมวิธีที่ Google ใช้ประวัติการท่องเว็บของคุณเพื่อปรับเปลี่ยนการค้นหา โฆษณา และบริการอื่นๆ ของ Google ในแบบของคุณ</translation>
+<translation id="8407669440184693619">ไม่พบรหัสผ่านสำหรับเว็บไซต์นี้</translation>
 <translation id="842017693807136194">ลงชื่อเข้าใช้ด้วย</translation>
 <translation id="8428045167754449968">เมือง/จังหวัด</translation>
 <translation id="8428213095426709021">การตั้งค่า</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
index b737c49e..0e78dd92 100644
--- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">Adres 2</translation>
 <translation id="3329904751041170572">Sunucuya bağlanılamadı.</translation>
 <translation id="3335947283844343239">Kapatılan Sekmeyi Tekrar Aç</translation>
+<translation id="3371831930909698441">Çeviri kullanılabilir. Sayfanın altına yakın bir yerde kullanılabilen seçenekler.</translation>
 <translation id="3393920035788932672">İzin Verilen Pop-up'lar</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> dk.</translation>
 <translation id="3448016392200048164">Bölünmüş Görünüm</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">Ülke</translation>
 <translation id="6445981559479772097">Mesaj gönderildi.</translation>
 <translation id="6464071786529933911">Yeni Gizli Sekmede Aç</translation>
+<translation id="6476800141292307438">Sayfa <ph name="LANGUAGE" /> diline çevriliyor. Seçenekler ekranın alt kısmına yakın bir yerde bulunur.</translation>
 <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> öğe silindi</translation>
 <translation id="6513773942555305766">Chrome Tarafından Önerilen Şifre: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">Son 1 Saat</translation>
+<translation id="6610002944194042868">Çeviri Seçenekleri</translation>
 <translation id="6642362222295953972">Mevcut sekmeye geçiş yapın</translation>
 <translation id="6643016212128521049">Temizle</translation>
 <translation id="6656103420185847513">Klasörü Düzenleyin</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">Senkronizasyonu aç</translation>
 <translation id="6914583639806229067">Kopyalanan Metni Ara</translation>
 <translation id="6914783257214138813">Şifreleriniz, dışa aktarılan dosyayı görebilen herkes tarafından görülebilir.</translation>
+<translation id="6944369514868857500">Başka Hesap Seç</translation>
 <translation id="6945221475159498467">Seç</translation>
 <translation id="6973630695168034713">Klasörler</translation>
 <translation id="6979158407327259162">Google Drive</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">Varsayılan - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">Tümünü Kapat</translation>
 <translation id="8381750437846184350">Google'ın Arama, reklamlar ve diğer Google hizmetlerini kişiselleştirmek için tarama geçmişinizi nasıl kullanacağını kontrol edin</translation>
+<translation id="8407669440184693619">Bu site için şifre bulunamadı</translation>
 <translation id="842017693807136194">Şununla Oturum Açıldı:</translation>
 <translation id="8428045167754449968">İl / İlçe</translation>
 <translation id="8428213095426709021">Ayarlar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index 3a42393..638891ac 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">Адреса 2</translation>
 <translation id="3329904751041170572">Не вдалось під’єднатися до сервера.</translation>
 <translation id="3335947283844343239">Знову відкрити закриту вкладку</translation>
+<translation id="3371831930909698441">Доступний Перекладач. Параметри можна знайти внизу екрана</translation>
 <translation id="3393920035788932672">Спливаючі вікна дозволені</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> хв</translation>
 <translation id="3448016392200048164">Режим розділеного екрана</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">Країна</translation>
 <translation id="6445981559479772097">Повідомлення надіслано.</translation>
 <translation id="6464071786529933911">Відкрити в анонімній вкладці</translation>
+<translation id="6476800141292307438">Сторінка перекладається такою мовою: <ph name="LANGUAGE" />. Параметри розташовано внизу екрана.</translation>
 <translation id="6482629121755362506">Видалено елементів: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation>
 <translation id="6513773942555305766">Запропонований пароль від Chrome: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">Остання година</translation>
+<translation id="6610002944194042868">Параметри перекладу</translation>
 <translation id="6642362222295953972">Перейти на наявну вкладку</translation>
 <translation id="6643016212128521049">Очистити</translation>
 <translation id="6656103420185847513">Редагувати папку</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">Увімкнути синхронізацію</translation>
 <translation id="6914583639806229067">Шукати скопійоване зображення</translation>
 <translation id="6914783257214138813">Ваші паролі бачитимуть усі, хто може переглядати експортований файл.</translation>
+<translation id="6944369514868857500">Вибрати інший обліковий запис</translation>
 <translation id="6945221475159498467">Вибрати</translation>
 <translation id="6973630695168034713">Папки</translation>
 <translation id="6979158407327259162">Диск Google</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">За умовчанням – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">Закрити всі</translation>
 <translation id="8381750437846184350">Укажіть, як Google має використовувати вашу історію веб-перегляду, щоб персоналізувати Пошук, рекламу та інші служби Google</translation>
+<translation id="8407669440184693619">Немає паролів для цього сайту</translation>
 <translation id="842017693807136194">Ви ввійшли як</translation>
 <translation id="8428045167754449968">Місто</translation>
 <translation id="8428213095426709021">Налаштування</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
index 9cfc44e..17a989d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">Địa chỉ 2</translation>
 <translation id="3329904751041170572">Không thể kết nối với máy chủ.</translation>
 <translation id="3335947283844343239">Mở lại Tab đã Đóng</translation>
+<translation id="3371831930909698441">Có tính năng dịch. Các tùy chọn nằm ở gần cuối màn hình.</translation>
 <translation id="3393920035788932672">Cửa sổ bật lên được cho phép</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> phút</translation>
 <translation id="3448016392200048164">Chế độ xem phân tách</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">Quốc gia</translation>
 <translation id="6445981559479772097">Đã gửi tin nhắn.</translation>
 <translation id="6464071786529933911">Mở trong tab ẩn danh mới</translation>
+<translation id="6476800141292307438">Đang dịch trang sang <ph name="LANGUAGE" />. Các tùy chọn nằm ở gần cuối màn hình.</translation>
 <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> dấu trang đã bị xóa</translation>
 <translation id="6513773942555305766">Mật khẩu do Chrome đề xuất: <ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">Giờ trước</translation>
+<translation id="6610002944194042868">Tùy chọn dịch</translation>
 <translation id="6642362222295953972">Chuyển sang tab đang mở</translation>
 <translation id="6643016212128521049">Xóa</translation>
 <translation id="6656103420185847513">Chỉnh sửa thư mục</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">Bật đồng bộ hóa</translation>
 <translation id="6914583639806229067">Tìm kiếm hình ảnh bạn đã sao chép</translation>
 <translation id="6914783257214138813">Bất cứ ai có thể xem tệp đã xuất đều có thể biết mật khẩu của bạn.</translation>
+<translation id="6944369514868857500">Chọn một tài khoản khác</translation>
 <translation id="6945221475159498467">Chọn</translation>
 <translation id="6973630695168034713">Thư mục</translation>
 <translation id="6979158407327259162">Google Drive</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">Mặc định - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">Đóng tất cả</translation>
 <translation id="8381750437846184350">Kiểm soát cách Google sử dụng lịch sử duyệt web của bạn để cá nhân hóa Tìm kiếm, quảng cáo và các dịch vụ khác của Google</translation>
+<translation id="8407669440184693619">Không tìm thấy mật khẩu nào cho trang web này</translation>
 <translation id="842017693807136194">Đăng nhập bằng</translation>
 <translation id="8428045167754449968">Thành phố/thị trấn</translation>
 <translation id="8428213095426709021">Cài đặt</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
index 667f1450..76e2e78 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -202,7 +202,7 @@
 <translation id="4049507953662678203">请确保已连接到网络,然后重试。</translation>
 <translation id="4082688844002261427">控制 Google 如何利用您的浏览记录为您提供个性化的搜索、广告和其他服务</translation>
 <translation id="408404951701638773">现在可以更方便地使用搜索栏</translation>
-<translation id="4084682180776658562">已保存的书签</translation>
+<translation id="4084682180776658562">添加书签</translation>
 <translation id="411254640334432676">下载失败。</translation>
 <translation id="4112644173421521737">搜索</translation>
 <translation id="4121993058175073134">要发送净导出数据,请在“设置”应用中指定您的电子邮件帐号。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
index f238dca..d3563cd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -156,6 +156,7 @@
 <translation id="3324193307694657476">地址 2</translation>
 <translation id="3329904751041170572">無法連上伺服器。</translation>
 <translation id="3335947283844343239">重新開啟先前關閉的分頁</translation>
+<translation id="3371831930909698441">有可用的翻譯。翻譯選項的位置接近畫面底部。</translation>
 <translation id="3393920035788932672">已允許的彈出式視窗</translation>
 <translation id="3445288400492335833"><ph name="MINUTES" /> 分鐘</translation>
 <translation id="3448016392200048164">分割檢視</translation>
@@ -354,9 +355,11 @@
 <translation id="6445051938772793705">國家/地區</translation>
 <translation id="6445981559479772097">訊息已送出。</translation>
 <translation id="6464071786529933911">在新無痕式分頁中開啟</translation>
+<translation id="6476800141292307438">將網頁翻譯成<ph name="LANGUAGE" />。翻譯選項位於靠近畫面底部的位置。</translation>
 <translation id="6482629121755362506">已刪除 <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> 個項目</translation>
 <translation id="6513773942555305766">Chrome 建議的密碼:<ph name="SUGGESTED_PASSWORD" /></translation>
 <translation id="6541915733953096570">過去 1 小時</translation>
+<translation id="6610002944194042868">翻譯選項</translation>
 <translation id="6642362222295953972">切換至現有分頁</translation>
 <translation id="6643016212128521049">清除</translation>
 <translation id="6656103420185847513">編輯資料夾</translation>
@@ -377,6 +380,7 @@
 <translation id="6903907808598579934">開啟同步處理功能</translation>
 <translation id="6914583639806229067">搜尋你複製的圖片</translation>
 <translation id="6914783257214138813">凡是可查看匯出的檔案的使用者都能看到你的密碼。</translation>
+<translation id="6944369514868857500">選擇其他帳戶</translation>
 <translation id="6945221475159498467">選取</translation>
 <translation id="6973630695168034713">資料夾</translation>
 <translation id="6979158407327259162">Google 雲端硬碟</translation>
@@ -456,6 +460,7 @@
 <translation id="8281781826761538115">預設 - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8328777765163860529">關閉全部</translation>
 <translation id="8381750437846184350">控管 Google 使用您瀏覽記錄的方式,針對 Google 所提供的個人化搜尋服務、廣告內容和其他各項 Google 服務調整相關設定</translation>
+<translation id="8407669440184693619">找不到這個網站的密碼</translation>
 <translation id="842017693807136194">目前登入身分</translation>
 <translation id="8428045167754449968">鄉/鎮/市/區</translation>
 <translation id="8428213095426709021">設定</translation>
diff --git a/ios/chrome/browser/autofill/legacy_strike_database_factory.cc b/ios/chrome/browser/autofill/legacy_strike_database_factory.cc
index ca054d3e..e6fea6e 100644
--- a/ios/chrome/browser/autofill/legacy_strike_database_factory.cc
+++ b/ios/chrome/browser/autofill/legacy_strike_database_factory.cc
@@ -7,7 +7,7 @@
 #include <utility>
 
 #include "base/no_destructor.h"
-#include "components/autofill/core/browser/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/legacy_strike_database.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
diff --git a/ios/chrome/browser/autofill/strike_database_factory.cc b/ios/chrome/browser/autofill/strike_database_factory.cc
index 49ca9fa..a944172 100644
--- a/ios/chrome/browser/autofill/strike_database_factory.cc
+++ b/ios/chrome/browser/autofill/strike_database_factory.cc
@@ -7,7 +7,7 @@
 #include <utility>
 
 #include "base/no_destructor.h"
-#include "components/autofill/core/browser/strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
diff --git a/ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm b/ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm
index e113aae..5f890535 100644
--- a/ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm
+++ b/ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm
@@ -22,9 +22,9 @@
 #include "base/strings/sys_string_conversions.h"
 #include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
-#include "components/autofill/core/browser/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
-#include "components/autofill/core/browser/strike_database.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/history/core/browser/history_service.h"
diff --git a/ios/chrome/browser/ntp/new_tab_page_tab_helper.h b/ios/chrome/browser/ntp/new_tab_page_tab_helper.h
index 64190844..2dd7d31 100644
--- a/ios/chrome/browser/ntp/new_tab_page_tab_helper.h
+++ b/ios/chrome/browser/ntp/new_tab_page_tab_helper.h
@@ -15,10 +15,6 @@
 
 @protocol NewTabPageTabHelperDelegate;
 
-namespace web {
-class NavigationItem;
-}
-
 // NewTabPageTabHelper which manages a single NTP per tab.
 class NewTabPageTabHelper : public web::WebStateObserver,
                             public web::WebStateUserData<NewTabPageTabHelper> {
@@ -62,7 +58,7 @@
 
   // Sets the NTP's NavigationItem title and virtualURL to the appropriate
   // string and chrome://newtab respectively.
-  void UpdateItem(web::NavigationItem* item);
+  void UpdatePendingItem();
 
   // Returns true if an |url| is either chrome://newtab or about://newtab.
   bool IsNTPURL(const GURL& url);
diff --git a/ios/chrome/browser/ntp/new_tab_page_tab_helper.mm b/ios/chrome/browser/ntp/new_tab_page_tab_helper.mm
index 1f5bb72d..7dc646b 100644
--- a/ios/chrome/browser/ntp/new_tab_page_tab_helper.mm
+++ b/ios/chrome/browser/ntp/new_tab_page_tab_helper.mm
@@ -61,7 +61,7 @@
 
   active_ = IsNTPURL(web_state->GetVisibleURL());
   if (active_) {
-    UpdateItem(web_state_->GetNavigationManager()->GetPendingItem());
+    UpdatePendingItem();
     [delegate_ newTabPageHelperDidChangeVisibility:this forWebState:web_state_];
 
     // If about://newtab is currently loading but has not yet committed, block
@@ -120,7 +120,7 @@
     web::WebState* web_state,
     web::NavigationContext* navigation_context) {
   if (IsNTPURL(navigation_context->GetUrl())) {
-    UpdateItem(web_state_->GetNavigationManager()->GetPendingItem());
+    UpdatePendingItem();
   } else {
     SetActive(false);
   }
@@ -129,12 +129,10 @@
 void NewTabPageTabHelper::DidFinishNavigation(
     web::WebState* web_state,
     web::NavigationContext* navigation_context) {
-  if (navigation_context->IsSameDocument() ||
-      !navigation_context->HasCommitted()) {
+  if (navigation_context->IsSameDocument()) {
     return;
   }
 
-  UpdateItem(web_state_->GetNavigationManager()->GetLastCommittedItem());
   DisableIgnoreLoadRequests();
   SetActive(IsNTPURL(web_state->GetLastCommittedURL()));
 }
@@ -151,8 +149,10 @@
   }
 }
 
-void NewTabPageTabHelper::UpdateItem(web::NavigationItem* item) {
-  if (item && item->GetURL() == GURL(kChromeUIAboutNewTabURL)) {
+void NewTabPageTabHelper::UpdatePendingItem() {
+  web::NavigationManager* manager = web_state_->GetNavigationManager();
+  web::NavigationItem* item = manager->GetPendingItem();
+  if (item) {
     item->SetVirtualURL(GURL(kChromeUINewTabURL));
     item->SetTitle(l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE));
   }
diff --git a/ios/chrome/browser/ntp/new_tab_page_tab_helper_unittest.mm b/ios/chrome/browser/ntp/new_tab_page_tab_helper_unittest.mm
index 6a59e9a..039b920 100644
--- a/ios/chrome/browser/ntp/new_tab_page_tab_helper_unittest.mm
+++ b/ios/chrome/browser/ntp/new_tab_page_tab_helper_unittest.mm
@@ -63,7 +63,6 @@
         std::make_unique<web::TestNavigationManager>();
     test_navigation_manager_ = test_navigation_manager.get();
     pending_item_ = web::NavigationItem::Create();
-    pending_item_->SetURL(GURL(kChromeUIAboutNewTabURL));
     test_navigation_manager->SetPendingItem(pending_item_.get());
     test_web_state_.SetNavigationManager(std::move(test_navigation_manager));
     test_web_state_.SetBrowserState(chrome_browser_state_.get());
@@ -139,7 +138,6 @@
   GURL url(kChromeUINewTabURL);
   test_web_state_.SetCurrentURL(url);
   web::FakeNavigationContext context;
-  context.SetHasCommitted(true);
   context.SetUrl(url);
   test_web_state_.OnNavigationFinished(&context);
   EXPECT_TRUE(tab_helper()->IsActive());
@@ -164,28 +162,3 @@
   test_web_state_.OnNavigationFinished(&context);
   EXPECT_FALSE(tab_helper()->IsActive());
 }
-
-// Tests double navigations from an NTP and non-NTP page at the same time.
-TEST_F(NewTabPageTabHelperTest, TestMismatchedPendingItem) {
-  base::test::ScopedFeatureList scoped_feature_list_;
-  scoped_feature_list_.InitAndEnableFeature(kBrowserContainerContainsNTP);
-
-  // Test an NTP url with a mismatched pending item.
-  GURL url(kChromeUINewTabURL);
-  GURL not_ntp_url(kTestURL);
-  test_web_state_.SetCurrentURL(url);
-  pending_item_->SetURL(not_ntp_url);
-  CreateTabHelper();
-  // In this edge case, although the NTP is visible, the pending item is not
-  // incorrectly updated
-  EXPECT_EQ(GURL(kTestURL), pending_item_->GetVirtualURL());
-
-  // On commit, the web state url is correct, and the NTP is inactive.
-  web::FakeNavigationContext context;
-  context.SetHasCommitted(true);
-  context.SetUrl(not_ntp_url);
-  test_web_state_.SetCurrentURL(not_ntp_url);
-  test_web_state_.OnNavigationFinished(&context);
-  EXPECT_FALSE(tab_helper()->IsActive());
-  EXPECT_EQ(GURL(kTestURL), pending_item_->GetVirtualURL());
-}
diff --git a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h
index b14db696..81ebbf3 100644
--- a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h
+++ b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h
@@ -13,10 +13,10 @@
 #include "base/memory/weak_ptr.h"
 #include "components/autofill/core/browser/autocomplete_history_manager.h"
 #include "components/autofill/core/browser/autofill_client.h"
-#include "components/autofill/core/browser/card_unmask_delegate.h"
-#include "components/autofill/core/browser/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/card_unmask_delegate.h"
+#include "components/autofill/core/browser/payments/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
-#include "components/autofill/core/browser/strike_database.h"
 #include "components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #import "components/autofill/ios/browser/autofill_client_ios_bridge.h"
diff --git a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
index b3bedae0..475a4fd 100644
--- a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
+++ b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
@@ -10,9 +10,9 @@
 #include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
-#include "components/autofill/core/browser/autofill_credit_card_filling_infobar_delegate_mobile.h"
-#include "components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h"
 #include "components/autofill/core/browser/form_data_importer.h"
+#include "components/autofill/core/browser/payments/autofill_credit_card_filling_infobar_delegate_mobile.h"
+#include "components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.h"
 #include "components/autofill/core/browser/payments/payments_client.h"
 #include "components/autofill/core/browser/ui/card_unmask_prompt_view.h"
 #include "components/autofill/core/common/autofill_features.h"
diff --git a/ios/chrome/browser/ui/autofill/save_card_infobar_controller.mm b/ios/chrome/browser/ui/autofill/save_card_infobar_controller.mm
index f66ee22..50dc1b59 100644
--- a/ios/chrome/browser/ui/autofill/save_card_infobar_controller.mm
+++ b/ios/chrome/browser/ui/autofill/save_card_infobar_controller.mm
@@ -7,7 +7,7 @@
 #include "base/strings/string16.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h"
+#include "components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.h"
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/infobars/infobar_controller+protected.h"
 #include "ios/chrome/browser/infobars/infobar_controller_delegate.h"
diff --git a/ios/web_view/internal/autofill/cwv_autofill_client_ios_bridge.h b/ios/web_view/internal/autofill/cwv_autofill_client_ios_bridge.h
index fb60015..6ff40cd 100644
--- a/ios/web_view/internal/autofill/cwv_autofill_client_ios_bridge.h
+++ b/ios/web_view/internal/autofill/cwv_autofill_client_ios_bridge.h
@@ -10,7 +10,7 @@
 #include "base/callback.h"
 #include "base/memory/weak_ptr.h"
 #include "components/autofill/core/browser/autofill_client.h"
-#include "components/autofill/core/browser/card_unmask_delegate.h"
+#include "components/autofill/core/browser/payments/card_unmask_delegate.h"
 
 namespace autofill {
 class CreditCard;
diff --git a/ios/web_view/internal/autofill/cwv_credit_card_verifier_unittest.mm b/ios/web_view/internal/autofill/cwv_credit_card_verifier_unittest.mm
index 9ba5159..af004b9 100644
--- a/ios/web_view/internal/autofill/cwv_credit_card_verifier_unittest.mm
+++ b/ios/web_view/internal/autofill/cwv_credit_card_verifier_unittest.mm
@@ -18,8 +18,8 @@
 #include "base/task/post_task.h"
 #import "base/test/ios/wait_util.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
-#include "components/autofill/core/browser/card_unmask_delegate.h"
 #include "components/autofill/core/browser/credit_card.h"
+#include "components/autofill/core/browser/payments/card_unmask_delegate.h"
 #include "components/autofill/core/common/autofill_prefs.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
diff --git a/ios/web_view/internal/autofill/web_view_autofill_client_ios.h b/ios/web_view/internal/autofill/web_view_autofill_client_ios.h
index 9737d078..856e7522 100644
--- a/ios/web_view/internal/autofill/web_view_autofill_client_ios.h
+++ b/ios/web_view/internal/autofill/web_view_autofill_client_ios.h
@@ -13,10 +13,10 @@
 #include "base/memory/weak_ptr.h"
 #include "components/autofill/core/browser/autocomplete_history_manager.h"
 #include "components/autofill/core/browser/autofill_client.h"
-#include "components/autofill/core/browser/card_unmask_delegate.h"
-#include "components/autofill/core/browser/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/card_unmask_delegate.h"
+#include "components/autofill/core/browser/payments/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
-#include "components/autofill/core/browser/strike_database.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/prefs/pref_service.h"
 #include "components/sync/driver/sync_service.h"
diff --git a/ios/web_view/internal/autofill/web_view_legacy_strike_database_factory.mm b/ios/web_view/internal/autofill/web_view_legacy_strike_database_factory.mm
index 573a83a..39dc93e 100644
--- a/ios/web_view/internal/autofill/web_view_legacy_strike_database_factory.mm
+++ b/ios/web_view/internal/autofill/web_view_legacy_strike_database_factory.mm
@@ -7,7 +7,7 @@
 #include <utility>
 
 #include "base/no_destructor.h"
-#include "components/autofill/core/browser/legacy_strike_database.h"
+#include "components/autofill/core/browser/payments/legacy_strike_database.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
 #include "ios/web_view/internal/app/application_context.h"
 #include "ios/web_view/internal/web_view_browser_state.h"
diff --git a/ios/web_view/internal/autofill/web_view_strike_database_factory.mm b/ios/web_view/internal/autofill/web_view_strike_database_factory.mm
index b6162fa..ba9eb83 100644
--- a/ios/web_view/internal/autofill/web_view_strike_database_factory.mm
+++ b/ios/web_view/internal/autofill/web_view_strike_database_factory.mm
@@ -7,7 +7,7 @@
 #include <utility>
 
 #include "base/no_destructor.h"
-#include "components/autofill/core/browser/strike_database.h"
+#include "components/autofill/core/browser/payments/strike_database.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
 #include "ios/web_view/internal/app/application_context.h"
 #include "ios/web_view/internal/web_view_browser_state.h"
diff --git a/media/filters/BUILD.gn b/media/filters/BUILD.gn
index 81c1e4fc..7062ae8c 100644
--- a/media/filters/BUILD.gn
+++ b/media/filters/BUILD.gn
@@ -218,17 +218,6 @@
       "h264_bitstream_buffer.h",
     ]
   }
-
-  if (is_fuchsia) {
-    sources += [
-      "fuchsia/fuchsia_video_decoder.cc",
-      "fuchsia/fuchsia_video_decoder.h",
-    ]
-    deps += [
-      "//third_party/fuchsia-sdk/sdk:media",
-      "//third_party/fuchsia-sdk/sdk:mediacodec",
-    ]
-  }
 }
 
 # This component allows other targets to use the JPEG parser as a standalone,
@@ -356,10 +345,6 @@
     deps += [ "//ui/gl" ]
   }
 
-  if (is_fuchsia) {
-    sources += [ "fuchsia/fuchsia_video_decoder_unittest.cc" ]
-  }
-
   # libvpx for running vpx test on chromecast doesn't support high bit depth.
   # This may cause some unit tests failure.
   if (is_chromecast) {
diff --git a/media/renderers/default_decoder_factory.cc b/media/renderers/default_decoder_factory.cc
index 55a9b09..30aee795d 100644
--- a/media/renderers/default_decoder_factory.cc
+++ b/media/renderers/default_decoder_factory.cc
@@ -23,10 +23,6 @@
 #include "media/filters/decrypting_video_decoder.h"
 #endif
 
-#if defined(OS_FUCHSIA)
-#include "media/filters/fuchsia/fuchsia_video_decoder.h"
-#endif
-
 #if BUILDFLAG(ENABLE_AV1_DECODER)
 #include "media/filters/aom_video_decoder.h"
 #endif
@@ -114,10 +110,6 @@
     }
   }
 
-#if defined(OS_FUCHSIA)
-  video_decoders->push_back(CreateFuchsiaVideoDecoder());
-#endif
-
 #if BUILDFLAG(ENABLE_LIBVPX)
   video_decoders->push_back(std::make_unique<OffloadingVpxVideoDecoder>());
 #endif
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 7c99926..23e524c 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -2777,7 +2777,7 @@
   if (is_ios) {
     deps += [ ":test_support_bundle_data" ]
   } else {
-    public_deps += [ "//third_party/protobuf:py_proto" ]
+    public_deps += [ "//third_party/protobuf:py_proto_runtime" ]
   }
 
   if (use_nss_certs) {
diff --git a/net/base/features.cc b/net/base/features.cc
index c849ccd..47edb1b 100644
--- a/net/base/features.cc
+++ b/net/base/features.cc
@@ -34,5 +34,8 @@
 const base::Feature kPostQuantumCECPQ2{"PostQuantumCECPQ2",
                                        base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kNetUnusedIdleSocketTimeout{
+    "NetUnusedIdleSocketTimeout", base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace features
 }  // namespace net
diff --git a/net/base/features.h b/net/base/features.h
index e794e709..f926641 100644
--- a/net/base/features.h
+++ b/net/base/features.h
@@ -40,6 +40,10 @@
 // Enables CECPQ2, a post-quantum key-agreement, in TLS 1.3 connections.
 NET_EXPORT extern const base::Feature kPostQuantumCECPQ2;
 
+// Changes the timeout after which unused sockets idle sockets are cleaned up.
+NET_EXPORT
+extern const base::Feature kNetUnusedIdleSocketTimeout;
+
 }  // namespace features
 }  // namespace net
 
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc
index 9363220d..e541ca8 100644
--- a/net/dns/host_resolver_manager.cc
+++ b/net/dns/host_resolver_manager.cc
@@ -1861,10 +1861,21 @@
       query_types.push_back(key_.dns_query_type);
     }
 
-    mdns_task_ = std::make_unique<HostResolverMdnsTask>(
-        resolver_->GetOrCreateMdnsClient(), key_.hostname, query_types);
-    mdns_task_->Start(
-        base::BindOnce(&Job::OnMdnsTaskComplete, base::Unretained(this)));
+    MDnsClient* client;
+    int rv = resolver_->GetOrCreateMdnsClient(&client);
+    mdns_task_ = std::make_unique<HostResolverMdnsTask>(client, key_.hostname,
+                                                        query_types);
+
+    if (rv == OK) {
+      mdns_task_->Start(
+          base::BindOnce(&Job::OnMdnsTaskComplete, base::Unretained(this)));
+    } else {
+      // Could not create an mDNS client. Since we cannot complete synchronously
+      // from here, post a failure without starting the task.
+      base::SequencedTaskRunnerHandle::Get()->PostTask(
+          FROM_HERE, base::BindOnce(&Job::OnMdnsImmediateFailure,
+                                    weak_ptr_factory_.GetWeakPtr(), rv));
+    }
   }
 
   void OnMdnsTaskComplete() {
@@ -1882,6 +1893,13 @@
     }
   }
 
+  void OnMdnsImmediateFailure(int rv) {
+    DCHECK(is_mdns_running());
+    DCHECK_NE(OK, rv);
+
+    CompleteRequestsWithError(rv);
+  }
+
   URLRequestContext* url_request_context() override {
     return resolver_->url_request_context_;
   }
@@ -2219,11 +2237,16 @@
   auto listener =
       std::make_unique<HostResolverMdnsListenerImpl>(host, query_type);
 
-  MDnsClient* client = GetOrCreateMdnsClient();
-  std::unique_ptr<net::MDnsListener> inner_listener = client->CreateListener(
-      DnsQueryTypeToQtype(query_type), host.host(), listener.get());
+  MDnsClient* client;
+  int rv = GetOrCreateMdnsClient(&client);
 
-  listener->set_inner_listener(std::move(inner_listener));
+  if (rv == OK) {
+    std::unique_ptr<net::MDnsListener> inner_listener = client->CreateListener(
+        DnsQueryTypeToQtype(query_type), host.host(), listener.get());
+    listener->set_inner_listener(std::move(inner_listener));
+  } else {
+    listener->set_initialization_error(rv);
+  }
   return listener;
 }
 
@@ -3002,22 +3025,27 @@
   AbortDnsTasks(ERR_FAILED, true /* fallback_only */);
 }
 
-MDnsClient* HostResolverManager::GetOrCreateMdnsClient() {
+int HostResolverManager::GetOrCreateMdnsClient(MDnsClient** out_client) {
 #if BUILDFLAG(ENABLE_MDNS)
   if (!mdns_client_) {
     if (!mdns_socket_factory_)
       mdns_socket_factory_ = std::make_unique<MDnsSocketFactoryImpl>(net_log_);
-
     mdns_client_ = MDnsClient::CreateDefault();
-    mdns_client_->StartListening(mdns_socket_factory_.get());
   }
 
-  DCHECK(mdns_client_->IsListening());
-  return mdns_client_.get();
+  int rv = OK;
+  if (!mdns_client_->IsListening())
+    rv = mdns_client_->StartListening(mdns_socket_factory_.get());
+
+  DCHECK_NE(ERR_IO_PENDING, rv);
+  DCHECK(rv != OK || mdns_client_->IsListening());
+  if (rv == OK)
+    *out_client = mdns_client_.get();
+  return rv;
 #else
   // Should not request MDNS resoltuion unless MDNS is enabled.
   NOTREACHED();
-  return nullptr;
+  return ERR_UNEXPECTED;
 #endif
 }
 
diff --git a/net/dns/host_resolver_manager.h b/net/dns/host_resolver_manager.h
index 62612547..0dadfafd 100644
--- a/net/dns/host_resolver_manager.h
+++ b/net/dns/host_resolver_manager.h
@@ -330,7 +330,7 @@
   // DnsTask resolve.
   void OnFallbackResolve(int dns_task_error);
 
-  MDnsClient* GetOrCreateMdnsClient();
+  int GetOrCreateMdnsClient(MDnsClient** out_client);
 
   // Allows the tests to catch slots leaking out of the dispatcher.  One
   // HostResolverManager::Job could occupy multiple PrioritizedDispatcher job
diff --git a/net/dns/host_resolver_manager_unittest.cc b/net/dns/host_resolver_manager_unittest.cc
index fad419b..5a0110a 100644
--- a/net/dns/host_resolver_manager_unittest.cc
+++ b/net/dns/host_resolver_manager_unittest.cc
@@ -2598,6 +2598,23 @@
   EXPECT_FALSE(response.request()->GetAddressResults());
 }
 
+TEST_F(HostResolverManagerTest, Mdns_ListenFailure) {
+  // Inject an MdnsClient mock that will always fail to start listening.
+  auto client = std::make_unique<MockMDnsClient>();
+  EXPECT_CALL(*client, StartListening(_)).WillOnce(Return(ERR_FAILED));
+  EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(false));
+  resolver_->SetMdnsClientForTesting(std::move(client));
+
+  HostResolver::ResolveHostParameters parameters;
+  parameters.source = HostResolverSource::MULTICAST_DNS;
+
+  ResolveHostResponseHelper response(resolver_->CreateRequest(
+      HostPortPair("myhello.local", 80), NetLogWithSource(), parameters));
+
+  EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
+  EXPECT_FALSE(response.request()->GetAddressResults());
+}
+
 // Implementation of HostResolver::MdnsListenerDelegate that records all
 // received results in maps.
 class TestMdnsListenerDelegate : public HostResolver::MdnsListener::Delegate {
@@ -2674,7 +2691,7 @@
   auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
   auto mdns_client =
       std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
-  mdns_client->StartListening(socket_factory.get());
+  ASSERT_THAT(mdns_client->StartListening(socket_factory.get()), IsOk());
   resolver_->SetMdnsClientForTesting(std::move(mdns_client));
 
   std::unique_ptr<HostResolver::MdnsListener> listener =
@@ -2714,6 +2731,21 @@
   EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
 }
 
+TEST_F(HostResolverManagerTest, MdnsListener_StartListenFailure) {
+  // Inject an MdnsClient mock that will always fail to start listening.
+  auto client = std::make_unique<MockMDnsClient>();
+  EXPECT_CALL(*client, StartListening(_)).WillOnce(Return(ERR_TIMED_OUT));
+  EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(false));
+  resolver_->SetMdnsClientForTesting(std::move(client));
+
+  std::unique_ptr<HostResolver::MdnsListener> listener =
+      resolver_->CreateMdnsListener(HostPortPair("myhello.local", 80),
+                                    DnsQueryType::A);
+  TestMdnsListenerDelegate delegate;
+  EXPECT_THAT(listener->Start(&delegate), IsError(ERR_TIMED_OUT));
+  EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
+}
+
 // Test that removal notifications are sent on natural expiration of MDNS
 // records.
 TEST_F(HostResolverManagerTest, MdnsListener_Expiration) {
@@ -2724,7 +2756,7 @@
   auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
   auto mdns_client =
       std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
-  mdns_client->StartListening(socket_factory.get());
+  ASSERT_THAT(mdns_client->StartListening(socket_factory.get()), IsOk());
   resolver_->SetMdnsClientForTesting(std::move(mdns_client));
 
   std::unique_ptr<HostResolver::MdnsListener> listener =
diff --git a/net/dns/host_resolver_mdns_listener_impl.cc b/net/dns/host_resolver_mdns_listener_impl.cc
index 607c5c8..6cd3c9e 100644
--- a/net/dns/host_resolver_mdns_listener_impl.cc
+++ b/net/dns/host_resolver_mdns_listener_impl.cc
@@ -6,7 +6,6 @@
 
 #include "base/logging.h"
 #include "net/base/host_port_pair.h"
-#include "net/base/net_errors.h"
 #include "net/dns/host_cache.h"
 #include "net/dns/host_resolver_mdns_task.h"
 #include "net/dns/record_parsed.h"
@@ -44,6 +43,10 @@
 
 int HostResolverMdnsListenerImpl::Start(Delegate* delegate) {
   DCHECK(delegate);
+
+  if (initialization_error_ != OK)
+    return initialization_error_;
+
   DCHECK(inner_listener_);
 
   delegate_ = delegate;
diff --git a/net/dns/host_resolver_mdns_listener_impl.h b/net/dns/host_resolver_mdns_listener_impl.h
index 66eaf85d..2109249f 100644
--- a/net/dns/host_resolver_mdns_listener_impl.h
+++ b/net/dns/host_resolver_mdns_listener_impl.h
@@ -9,6 +9,7 @@
 #include <string>
 #include <utility>
 
+#include "net/base/net_errors.h"
 #include "net/dns/host_resolver.h"
 #include "net/dns/mdns_client.h"
 #include "net/dns/public/dns_query_type.h"
@@ -30,9 +31,15 @@
   ~HostResolverMdnsListenerImpl() override;
 
   void set_inner_listener(std::unique_ptr<net::MDnsListener> inner_listener) {
+    DCHECK_EQ(OK, initialization_error_);
     inner_listener_ = std::move(inner_listener);
   }
 
+  void set_initialization_error(int error) {
+    DCHECK(!inner_listener_);
+    initialization_error_ = error;
+  }
+
   // HostResolver::MdnsListener implementation
   int Start(Delegate* delegate) override;
 
@@ -46,6 +53,7 @@
   HostPortPair query_host_;
   DnsQueryType query_type_;
 
+  int initialization_error_ = OK;
   std::unique_ptr<net::MDnsListener> inner_listener_;
   Delegate* delegate_;
 };
diff --git a/net/dns/host_resolver_mdns_task.cc b/net/dns/host_resolver_mdns_task.cc
index a40686e3..cc5c364 100644
--- a/net/dns/host_resolver_mdns_task.cc
+++ b/net/dns/host_resolver_mdns_task.cc
@@ -143,6 +143,7 @@
 void HostResolverMdnsTask::Start(base::OnceClosure completion_closure) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!completion_closure_);
+  DCHECK(mdns_client_);
 
   completion_closure_ = std::move(completion_closure);
 
diff --git a/net/dns/mdns_client.h b/net/dns/mdns_client.h
index 89011cc..ba67ab3 100644
--- a/net/dns/mdns_client.h
+++ b/net/dns/mdns_client.h
@@ -9,6 +9,7 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/callback.h"
@@ -170,7 +171,7 @@
       int flags,
       const MDnsTransaction::ResultCallback& callback) = 0;
 
-  virtual bool StartListening(MDnsSocketFactory* factory) = 0;
+  virtual int StartListening(MDnsSocketFactory* factory) = 0;
 
   // Do not call this inside callbacks from related MDnsListener and
   // MDnsTransaction objects.
diff --git a/net/dns/mdns_client_impl.cc b/net/dns/mdns_client_impl.cc
index 5cead44..889c96c 100644
--- a/net/dns/mdns_client_impl.cc
+++ b/net/dns/mdns_client_impl.cc
@@ -136,7 +136,7 @@
 
 MDnsConnection::~MDnsConnection() = default;
 
-bool MDnsConnection::Init(MDnsSocketFactory* socket_factory) {
+int MDnsConnection::Init(MDnsSocketFactory* socket_factory) {
   std::vector<std::unique_ptr<DatagramServerSocket>> sockets;
   socket_factory->CreateSockets(&sockets);
 
@@ -148,9 +148,11 @@
   // All unbound sockets need to be bound before processing untrusted input.
   // This is done for security reasons, so that an attacker can't get an unbound
   // socket.
+  int last_failure = ERR_FAILED;
   for (size_t i = 0; i < socket_handlers_.size();) {
     int rv = socket_handlers_[i]->Start();
     if (rv != OK) {
+      last_failure = rv;
       socket_handlers_.erase(socket_handlers_.begin() + i);
       VLOG(1) << "Start failed, socket=" << i << ", error=" << rv;
     } else {
@@ -158,7 +160,8 @@
     }
   }
   VLOG(1) << "Sockets ready:" << socket_handlers_.size();
-  return !socket_handlers_.empty();
+  DCHECK_NE(ERR_IO_PENDING, last_failure);
+  return socket_handlers_.empty() ? last_failure : OK;
 }
 
 void MDnsConnection::Send(const scoped_refptr<IOBuffer>& buffer,
@@ -203,7 +206,7 @@
 
 MDnsClientImpl::Core::~Core() = default;
 
-bool MDnsClientImpl::Core::Init(MDnsSocketFactory* socket_factory) {
+int MDnsClientImpl::Core::Init(MDnsSocketFactory* socket_factory) {
   return connection_->Init(socket_factory);
 }
 
@@ -420,14 +423,15 @@
 
 MDnsClientImpl::~MDnsClientImpl() = default;
 
-bool MDnsClientImpl::StartListening(MDnsSocketFactory* socket_factory) {
+int MDnsClientImpl::StartListening(MDnsSocketFactory* socket_factory) {
   DCHECK(!core_.get());
   core_.reset(new Core(clock_, cleanup_timer_.get()));
-  if (!core_->Init(socket_factory)) {
+  int rv = core_->Init(socket_factory);
+  if (rv != OK) {
+    DCHECK_NE(ERR_IO_PENDING, rv);
     core_.reset();
-    return false;
   }
-  return true;
+  return rv;
 }
 
 void MDnsClientImpl::StopListening() {
diff --git a/net/dns/mdns_client_impl.h b/net/dns/mdns_client_impl.h
index 5627193..c449f6f 100644
--- a/net/dns/mdns_client_impl.h
+++ b/net/dns/mdns_client_impl.h
@@ -66,8 +66,8 @@
   explicit MDnsConnection(MDnsConnection::Delegate* delegate);
   virtual ~MDnsConnection();
 
-  // Both methods return true if at least one of the socket handlers succeeded.
-  bool Init(MDnsSocketFactory* socket_factory);
+  // Succeeds if at least one of the socket handlers succeeded.
+  int Init(MDnsSocketFactory* socket_factory);
   void Send(const scoped_refptr<IOBuffer>& buffer, unsigned size);
 
  private:
@@ -129,8 +129,8 @@
     Core(base::Clock* clock, base::OneShotTimer* timer);
     ~Core() override;
 
-    // Initialize the core. Returns true on success.
-    bool Init(MDnsSocketFactory* socket_factory);
+    // Initialize the core.
+    int Init(MDnsSocketFactory* socket_factory);
 
     // Send a query with a specific rrtype and name. Returns true on success.
     bool SendQuery(uint16_t rrtype, const std::string& name);
@@ -209,7 +209,7 @@
       int flags,
       const MDnsTransaction::ResultCallback& callback) override;
 
-  bool StartListening(MDnsSocketFactory* socket_factory) override;
+  int StartListening(MDnsSocketFactory* socket_factory) override;
   void StopListening() override;
   bool IsListening() const override;
 
diff --git a/net/dns/mdns_client_unittest.cc b/net/dns/mdns_client_unittest.cc
index 9b95172d..cfa0473 100644
--- a/net/dns/mdns_client_unittest.cc
+++ b/net/dns/mdns_client_unittest.cc
@@ -26,6 +26,7 @@
 #include "net/dns/record_rdata.h"
 #include "net/log/net_log.h"
 #include "net/socket/udp_client_socket.h"
+#include "net/test/gtest_util.h"
 #include "net/test/test_with_scoped_task_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -441,7 +442,7 @@
 
 void MDnsTest::SetUp() {
   test_client_.reset(new MDnsClientImpl());
-  test_client_->StartListening(&socket_factory_);
+  ASSERT_THAT(test_client_->StartListening(&socket_factory_), test::IsOk());
 }
 
 void MDnsTest::SimulatePacketReceive(const uint8_t* packet, unsigned size) {
@@ -565,7 +566,7 @@
   MockTimer* timer = new MockTimer;
 
   test_client_.reset(new MDnsClientImpl(&clock, base::WrapUnique(timer)));
-  test_client_->StartListening(&socket_factory_);
+  ASSERT_THAT(test_client_->StartListening(&socket_factory_), test::IsOk());
 
   EXPECT_CALL(*timer, StartObserver(_, _)).Times(1);
   EXPECT_CALL(clock, Now())
@@ -1099,6 +1100,28 @@
   RunFor(base::TimeDelta::FromSeconds(6));
 }
 
+// MDnsSocketFactory implementation that creates a single socket that will
+// always fail on RecvFrom. Passing this to MdnsClient is expected to result in
+// the client failing to start listening.
+class FailingSocketFactory : public MDnsSocketFactory {
+  void CreateSockets(
+      std::vector<std::unique_ptr<DatagramServerSocket>>* sockets) override {
+    auto socket =
+        std::make_unique<MockMDnsDatagramServerSocket>(ADDRESS_FAMILY_IPV4);
+    EXPECT_CALL(*socket, RecvFromInternal(_, _, _, _))
+        .WillRepeatedly(Return(ERR_FAILED));
+    sockets->push_back(std::move(socket));
+  }
+};
+
+TEST_F(MDnsTest, StartListeningFailure) {
+  test_client_ = std::make_unique<MDnsClientImpl>();
+  FailingSocketFactory socket_factory;
+
+  EXPECT_THAT(test_client_->StartListening(&socket_factory),
+              test::IsError(ERR_FAILED));
+}
+
 // Note: These tests assume that the ipv4 socket will always be created first.
 // This is a simplifying assumption based on the way the code works now.
 class SimpleMockSocketFactory : public MDnsSocketFactory {
@@ -1144,9 +1167,7 @@
     sample_buffer_ = base::MakeRefCounted<StringIOBuffer>(sample_packet_);
   }
 
-  bool InitConnection() {
-    return connection_.Init(&factory_);
-  }
+  int InitConnection() { return connection_.Init(&factory_); }
 
   StrictMock<MockMDnsConnectionDelegate> delegate_;
 
@@ -1169,7 +1190,7 @@
       .WillOnce(Return(ERR_IO_PENDING));
 
   EXPECT_CALL(delegate_, HandlePacketInternal(sample_packet_));
-  ASSERT_TRUE(InitConnection());
+  EXPECT_THAT(InitConnection(), test::IsOk());
 }
 
 TEST_F(MDnsConnectionTest, ReceiveAsynchronous) {
@@ -1183,7 +1204,7 @@
           Invoke(socket_ipv6_, &MockMDnsDatagramServerSocket::HandleRecvLater))
       .WillOnce(Return(ERR_IO_PENDING));
 
-  ASSERT_TRUE(InitConnection());
+  ASSERT_THAT(InitConnection(), test::IsOk());
 
   EXPECT_CALL(delegate_, HandlePacketInternal(sample_packet_));
 
@@ -1198,7 +1219,7 @@
   EXPECT_CALL(*socket_ipv6_, RecvFromInternal(_, _, _, _))
       .WillOnce(DoAll(SaveArg<3>(&callback), Return(ERR_IO_PENDING)));
 
-  ASSERT_TRUE(InitConnection());
+  ASSERT_THAT(InitConnection(), test::IsOk());
 
   EXPECT_CALL(delegate_, OnConnectionError(ERR_SOCKET_NOT_CONNECTED));
   callback.Run(ERR_SOCKET_NOT_CONNECTED);
@@ -1213,7 +1234,7 @@
         .WillOnce(Return(ERR_IO_PENDING));
     EXPECT_CALL(*socket_ipv6_, RecvFromInternal(_, _, _, _))
         .WillOnce(Return(ERR_IO_PENDING));
-    EXPECT_TRUE(InitConnection());
+    EXPECT_THAT(InitConnection(), test::IsOk());
   }
 };
 
diff --git a/net/dns/mock_mdns_client.h b/net/dns/mock_mdns_client.h
index 0670caa..ff437476 100644
--- a/net/dns/mock_mdns_client.h
+++ b/net/dns/mock_mdns_client.h
@@ -38,7 +38,7 @@
                                        const std::string&,
                                        int,
                                        const MDnsTransaction::ResultCallback&));
-  MOCK_METHOD1(StartListening, bool(MDnsSocketFactory*));
+  MOCK_METHOD1(StartListening, int(MDnsSocketFactory*));
   MOCK_METHOD0(StopListening, void());
   MOCK_CONST_METHOD0(IsListening, bool());
 };
diff --git a/net/http/http_stream_factory_job.cc b/net/http/http_stream_factory_job.cc
index aafd478..6e50a0a 100644
--- a/net/http/http_stream_factory_job.cc
+++ b/net/http/http_stream_factory_job.cc
@@ -64,57 +64,6 @@
 // not supported or initialized.
 const base::Feature kLimitEarlyPreconnectsExperiment{
     "LimitEarlyPreconnects", base::FEATURE_ENABLED_BY_DEFAULT};
-void RecordChannelIDKeyMatch(StreamSocket* socket,
-                             ChannelIDService* channel_id_service,
-                             std::string host) {
-  SSLInfo ssl_info;
-  socket->GetSSLInfo(&ssl_info);
-  if (!ssl_info.channel_id_sent)
-    return;
-  std::unique_ptr<crypto::ECPrivateKey> request_key;
-  ChannelIDService::Request request;
-  int result = channel_id_service->GetOrCreateChannelID(
-      host, &request_key, base::DoNothing(), &request);
-  // GetOrCreateChannelID only returns ERR_IO_PENDING before its first call
-  // (over the lifetime of the ChannelIDService) has completed or if it is
-  // creating a new key. The key that is being looked up here should already
-  // have been looked up before the channel ID was sent on the ssl socket, so
-  // the expectation is that this call will return synchronously. If this does
-  // return ERR_IO_PENDING, treat that as any other lookup failure and cancel
-  // the async request.
-  if (result == ERR_IO_PENDING)
-    request.Cancel();
-  crypto::ECPrivateKey* socket_key = socket->GetChannelIDKey();
-
-  // This enum is used for an UMA histogram - do not change or re-use values.
-  enum {
-    NO_KEYS = 0,
-    MATCH = 1,
-    SOCKET_KEY_MISSING = 2,
-    REQUEST_KEY_MISSING = 3,
-    KEYS_DIFFER = 4,
-    KEY_LOOKUP_ERROR = 5,
-    KEY_MATCH_MAX
-  } match;
-  if (result != OK) {
-    match = KEY_LOOKUP_ERROR;
-  } else if (!socket_key && !request_key) {
-    match = NO_KEYS;
-  } else if (!socket_key) {
-    match = SOCKET_KEY_MISSING;
-  } else if (!request_key) {
-    match = REQUEST_KEY_MISSING;
-  } else {
-    match = KEYS_DIFFER;
-    std::string raw_socket_key, raw_request_key;
-    if (socket_key->ExportRawPublicKey(&raw_socket_key) &&
-        request_key->ExportRawPublicKey(&raw_request_key) &&
-        raw_socket_key == raw_request_key) {
-      match = MATCH;
-    }
-  }
-  UMA_HISTOGRAM_ENUMERATION("Net.TokenBinding.KeyMatch", match, KEY_MATCH_MAX);
-}
 
 }  // namespace
 
@@ -1179,12 +1128,6 @@
 
   next_state_ = STATE_CREATE_STREAM_COMPLETE;
 
-  if (using_ssl_ && connection_->socket()) {
-    RecordChannelIDKeyMatch(connection_->socket(),
-                            session_->context().channel_id_service,
-                            destination_.HostForURL());
-  }
-
   if (!using_spdy_) {
     DCHECK(!expect_spdy_);
     // We may get ftp scheme when fetching ftp resources through proxy.
diff --git a/net/quic/platform/impl/quic_file_utils_impl.h b/net/quic/platform/impl/quic_file_utils_impl.h
index 18ac039..41e9dd9 100644
--- a/net/quic/platform/impl/quic_file_utils_impl.h
+++ b/net/quic/platform/impl/quic_file_utils_impl.h
@@ -16,8 +16,7 @@
 
 namespace quic {
 
-// Traverses the directory |dirname| and retuns all of the files
-// it contains.
+// Traverses the directory |dirname| and returns all of the files it contains.
 std::vector<std::string> ReadFileContentsImpl(const std::string& dirname) {
   std::vector<std::string> files;
   FilePath directory(FilePath::FromUTF8Unsafe(dirname));
diff --git a/net/quic/platform/impl/quic_reference_counted_impl.h b/net/quic/platform/impl/quic_reference_counted_impl.h
index f939af7..1a4d8cb2 100644
--- a/net/quic/platform/impl/quic_reference_counted_impl.h
+++ b/net/quic/platform/impl/quic_reference_counted_impl.h
@@ -27,9 +27,10 @@
  public:
   QuicReferenceCountedPointerImpl() = default;
 
-  // Constructor from raw pointer |p|. This guarantees the reference count of *p
-  // is 1. This should be only called when a new object is created, calling this
-  // on an already existent object does not increase its reference count.
+  // Constructor from raw pointer |p|. This guarantees that the reference count
+  // of *p is 1. This should be only called when a new object is created,
+  // calling this on an already existent object does not increase its reference
+  // count.
   explicit QuicReferenceCountedPointerImpl(T* p) : refptr_(p) {}
 
   // Allows implicit conversion from nullptr.
@@ -45,7 +46,7 @@
   QuicReferenceCountedPointerImpl(const QuicReferenceCountedPointerImpl& other)
       : refptr_(other.refptr()) {}
 
-  // Move constructors. After move, It adopts the reference from |other|.
+  // Move constructors. After move, it adopts the reference from |other|.
   template <typename U>
   QuicReferenceCountedPointerImpl(  // NOLINT
       QuicReferenceCountedPointerImpl<U>&& other)
@@ -84,18 +85,20 @@
   explicit operator bool() const { return static_cast<bool>(refptr_); }
 
   // Assignment operator on raw pointer. Drops a reference to current pointee,
-  // if any and replaces it with |p|. This garantee the reference count of *p is
-  // 1. This should only be used when a new object is created, calling this
-  // on a already existent object does not increase its reference count.
+  // if any, and replaces it with |p|. This guarantees that the reference count
+  // of *p is 1. This should only be used when a new object is created.  Calling
+  // this on an already existent object is undefined behavior according to the
+  // API contract (even though the underlying implementation might have a
+  // well-defined behavior).
   QuicReferenceCountedPointerImpl<T>& operator=(T* p) {
     refptr_ = p;
     return *this;
   }
-  // Returns the raw pointer with no change in reference.
+  // Returns the raw pointer with no change in reference count.
   T* get() const { return refptr_.get(); }
 
   // Accessors for the referenced object.
-  // operator* and operator-> will assert() if there is no current object.
+  // operator*() and operator->() will assert() if there is no current object.
   T& operator*() const { return *refptr_; }
   T* operator->() const {
     assert(refptr_ != nullptr);
diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket_pool_manager.cc
index d59710b0..f3831a8 100644
--- a/net/socket/client_socket_pool_manager.cc
+++ b/net/socket/client_socket_pool_manager.cc
@@ -7,8 +7,10 @@
 #include <memory>
 
 #include "base/logging.h"
+#include "base/metrics/field_trial_params.h"
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
+#include "net/base/features.h"
 #include "net/base/load_flags.h"
 #include "net/http/http_proxy_connect_job.h"
 #include "net/http/http_stream_factory.h"
@@ -59,8 +61,6 @@
   kDefaultMaxSocketsPerProxyServer   // WEBSOCKET_SOCKET_POOL
 };
 
-base::TimeDelta g_unused_idle_socket_timeout = base::TimeDelta::FromSeconds(10);
-
 static_assert(base::size(g_max_sockets_per_proxy_server) ==
                   HttpNetworkSession::NUM_SOCKET_POOL_TYPES,
               "max sockets per proxy server length mismatch");
@@ -304,14 +304,9 @@
 // static
 base::TimeDelta ClientSocketPoolManager::unused_idle_socket_timeout(
     HttpNetworkSession::SocketPoolType pool_type) {
-  return g_unused_idle_socket_timeout;
-}
-
-// static
-void ClientSocketPoolManager::set_unused_idle_socket_timeout(
-    HttpNetworkSession::SocketPoolType pool_type,
-    base::TimeDelta timeout) {
-  g_unused_idle_socket_timeout = timeout;
+  return base::TimeDelta::FromSeconds(base::GetFieldTrialParamByFeatureAsInt(
+      net::features::kNetUnusedIdleSocketTimeout,
+      "unused_idle_socket_timeout_seconds", 10));
 }
 
 int InitSocketHandleForHttpRequest(
diff --git a/net/socket/client_socket_pool_manager.h b/net/socket/client_socket_pool_manager.h
index 71aa9a2..2ee6fd6 100644
--- a/net/socket/client_socket_pool_manager.h
+++ b/net/socket/client_socket_pool_manager.h
@@ -76,9 +76,6 @@
 
   static base::TimeDelta unused_idle_socket_timeout(
       HttpNetworkSession::SocketPoolType pool_type);
-  static void set_unused_idle_socket_timeout(
-      HttpNetworkSession::SocketPoolType pool_type,
-      base::TimeDelta timeout);
 
   virtual void FlushSocketPoolsWithError(int error) = 0;
   virtual void CloseIdleSockets() = 0;
diff --git a/net/socket/transport_client_socket_pool_unittest.cc b/net/socket/transport_client_socket_pool_unittest.cc
index 64255af..05897576 100644
--- a/net/socket/transport_client_socket_pool_unittest.cc
+++ b/net/socket/transport_client_socket_pool_unittest.cc
@@ -9,9 +9,11 @@
 #include "base/callback.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/threading/platform_thread.h"
 #include "build/build_config.h"
 #include "net/base/completion_once_callback.h"
+#include "net/base/features.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/load_timing_info.h"
 #include "net/base/load_timing_info_test_util.h"
@@ -82,10 +84,21 @@
   std::unique_ptr<MockRead[]> reads_;
 };
 
-class TransportClientSocketPoolTest : public TestWithScopedTaskEnvironment {
+class TransportClientSocketPoolTest : public ::testing::Test,
+                                      public WithScopedTaskEnvironment {
  protected:
+  // Default constructor.
   TransportClientSocketPoolTest()
-      : connect_backup_jobs_enabled_(
+      : TransportClientSocketPoolTest(
+            base::test::ScopedTaskEnvironment::MainThreadType::IO,
+            base::test::ScopedTaskEnvironment::NowSource::REAL_TIME) {}
+
+  // Constructor that allows mocking of the time.
+  TransportClientSocketPoolTest(
+      base::test::ScopedTaskEnvironment::MainThreadType type,
+      base::test::ScopedTaskEnvironment::NowSource now_source)
+      : WithScopedTaskEnvironment(type, now_source),
+        connect_backup_jobs_enabled_(
             ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true)),
         params_(TransportClientSocketPool::SocketParams::
                     CreateFromTransportSocketParams(
@@ -1866,6 +1879,152 @@
 
 #endif  // defined(OS_ANDROID)
 
+// Class that enables tests to set mock time.
+class TransportClientSocketPoolMockNowSourceTest
+    : public TransportClientSocketPoolTest {
+ protected:
+  TransportClientSocketPoolMockNowSourceTest()
+      : TransportClientSocketPoolTest(
+            base::test::ScopedTaskEnvironment::MainThreadType::IO_MOCK_TIME,
+            base::test::ScopedTaskEnvironment::NowSource::
+                MAIN_THREAD_MOCK_TIME) {
+    // Forward the clock by a non-zero amount to avoid triggering DCHECKs that
+    // verify that certain timestamps are non-null.
+    FastForwardBy(base::TimeDelta::FromSeconds(1));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TransportClientSocketPoolMockNowSourceTest);
+};
+
+// Tests that changing the idle unused socket timeout using the experiment
+// works. The test first sets the value of timeout duration for idle sockets.
+// Next, it opens |kNumIdleSockets| sockets. To trigger the cleanup of idle
+// sockets that may have timedout, it then opens one more socket. This is
+// required since requesting a new socket triggers cleanup of idle timedout
+// sockets. Next, the test verifies the count of idle timed-out sockets.
+TEST_F(TransportClientSocketPoolMockNowSourceTest, IdleUnusedSocketTimeout) {
+  const HostPortPair kHostPortPair1("www.foo.com", 80);
+  const HostPortPair kHostPortPair2("www.bar.com", 80);
+
+  const struct {
+    bool use_first_socket;
+    int fast_forward_seconds;
+    int unused_idle_socket_timeout_seconds;
+    bool expect_idle_socket;
+  } kTests[] = {
+      // When the clock is fast forwarded by a duration longer than
+      // |unused_idle_socket_timeout_seconds|, the first unused idle socket is
+      // expected to be timedout, and cleared.
+      {false, 0, 0, false},
+      {false, 9, 10, true},
+      {false, 11, 10, false},
+      {false, 19, 20, true},
+      {false, 21, 20, false},
+      // If |use_first_socket| is true, then the test would write some data to
+      // the socket, thereby marking it as "used". Thereafter, this idle socket
+      // should be timedout based on used idle socket timeout, and changing
+      // |unused_idle_socket_timeout_seconds| should not affect the
+      // |expected_idle_sockets|.
+      {true, 0, 0, true},
+      {true, 9, 10, true},
+      {true, 11, 10, true},
+      {true, 19, 20, true},
+      {true, 21, 20, true},
+  };
+
+  for (const auto& test : kTests) {
+    SpdySessionDependencies session_deps(
+        ProxyResolutionService::CreateDirect());
+    std::unique_ptr<HttpNetworkSession> session(
+        SpdySessionDependencies::SpdyCreateSession(&session_deps));
+
+    base::test::ScopedFeatureList scoped_feature_list_;
+    std::map<std::string, std::string> parameters;
+    parameters["unused_idle_socket_timeout_seconds"] =
+        base::IntToString(test.unused_idle_socket_timeout_seconds);
+    scoped_feature_list_.InitAndEnableFeatureWithParameters(
+        net::features::kNetUnusedIdleSocketTimeout, parameters);
+
+    const char kWriteData[] = "1";
+    const MockWrite kWrites[] = {MockWrite(SYNCHRONOUS, kWriteData)};
+
+    SequencedSocketData provider_socket_1(MockConnect(ASYNC, OK),
+                                          base::span<MockRead>(), kWrites);
+    {
+      // Create 1 socket.
+      scoped_refptr<TransportSocketParams> transport_params(
+          base::MakeRefCounted<TransportSocketParams>(
+              kHostPortPair1, false, OnHostResolutionCallback()));
+      session_deps.socket_factory->AddSocketDataProvider(&provider_socket_1);
+      ClientSocketHandle connection;
+      TestCompletionCallback callback;
+      int rv = connection.Init(
+          kHostPortPair1.ToString(),
+          TransportClientSocketPool::SocketParams::
+              CreateFromTransportSocketParams(transport_params),
+          MEDIUM, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
+          callback.callback(), ClientSocketPool::ProxyAuthCallback(),
+          session->GetSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL,
+                                 ProxyServer::Direct()),
+          NetLogWithSource());
+      EXPECT_THAT(callback.GetResult(rv), IsOk());
+      EXPECT_FALSE(connection.socket()->WasEverUsed());
+
+      // Writing some data to the socket should set WasEverUsed.
+      if (test.use_first_socket) {
+        // Generate |socket_write_data| from kMockWriteData by appending null
+        // character to the latter.
+        auto write_buffer = base::MakeRefCounted<StringIOBuffer>(kWriteData);
+        TestCompletionCallback write_callback;
+        int rv = connection.socket()->Write(
+            write_buffer.get(), write_buffer->size(), write_callback.callback(),
+            TRAFFIC_ANNOTATION_FOR_TESTS);
+        EXPECT_EQ(rv, 1);
+        EXPECT_TRUE(connection.socket()->WasEverUsed());
+      }
+    }
+
+    EXPECT_EQ(1, session
+                     ->GetSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL,
+                                     ProxyServer::Direct())
+                     ->IdleSocketCount());
+
+    // Moving the clock forward may cause the idle socket to be timedout.
+    FastForwardBy(base::TimeDelta::FromSeconds(test.fast_forward_seconds));
+
+    {
+      // Request a new socket to trigger cleanup of idle timedout sockets.
+      scoped_refptr<TransportSocketParams> transport_params(
+          base::MakeRefCounted<TransportSocketParams>(
+              kHostPortPair2, false, OnHostResolutionCallback()));
+      SequencedSocketData provider_socket_2(MockConnect(ASYNC, OK),
+                                            base::span<MockRead>(),
+                                            base::span<MockWrite>());
+      session_deps.socket_factory->AddSocketDataProvider(&provider_socket_2);
+      ClientSocketHandle connection;
+      TestCompletionCallback callback;
+      int rv = connection.Init(
+          kHostPortPair2.ToString(),
+          TransportClientSocketPool::SocketParams::
+              CreateFromTransportSocketParams(transport_params),
+          MEDIUM, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
+          callback.callback(), ClientSocketPool::ProxyAuthCallback(),
+          session->GetSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL,
+                                 ProxyServer::Direct()),
+          NetLogWithSource());
+      EXPECT_THAT(callback.GetResult(rv), IsOk());
+      connection.socket()->Disconnect();
+    }
+
+    EXPECT_EQ(test.expect_idle_socket ? 1 : 0,
+              session
+                  ->GetSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL,
+                                  ProxyServer::Direct())
+                  ->IdleSocketCount());
+  }
+}
+
 }  // namespace
 
 }  // namespace net
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index 5db9b7b8..5d0d73f 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -136,93 +136,6 @@
   }
 }
 
-// Logs whether the CookieStore used for this request matches the
-// ChannelIDService used when establishing the connection that this request is
-// sent over. This logging is only done for requests to accounts.google.com, and
-// only for requests where Channel ID was sent when establishing the connection.
-void LogChannelIDAndCookieStores(const GURL& url,
-                                 const net::URLRequestContext* context,
-                                 const net::SSLInfo& ssl_info) {
-  if (url.host() != "accounts.google.com" || !ssl_info.channel_id_sent)
-    return;
-  // This enum is used for an UMA histogram - don't reuse or renumber entries.
-  enum {
-    // Value 0 was removed (CID_EPHEMERAL_COOKIE_EPHEMERAL)
-    // ChannelIDStore is ephemeral, but CookieStore is persistent.
-    CID_EPHEMERAL_COOKIE_PERSISTENT = 1,
-    // ChannelIDStore is persistent, but CookieStore is ephemeral.
-    CID_PERSISTENT_COOKIE_EPHEMERAL = 2,
-    // Value 3 was removed (CID_PERSISTENT_COOKIE_PERSISTENT)
-    // There is no CookieStore for this request.
-    NO_COOKIE_STORE = 4,
-    // There is no ChannelIDStore for this request. This should never happen,
-    // because we only log if Channel ID was sent.
-    NO_CHANNEL_ID_STORE = 5,
-    // Value 6 was removed (KNOWN_MISMATCH).
-    // Both stores are ephemeral, and the ChannelIDService used when
-    // establishing the connection is the same one that the CookieStore was
-    // created to be used with.
-    EPHEMERAL_MATCH = 7,
-    // Both stores are ephemeral, but a different CookieStore should have been
-    // used on this request.
-    EPHEMERAL_MISMATCH = 8,
-    // Both stores are persistent, and the ChannelIDService used when
-    // establishing the connection is the same one that the CookieStore was
-    // created to be used with.
-    PERSISTENT_MATCH = 9,
-    // Both stores are persistent, but a different CookieStore should have been
-    // used on this request.
-    PERSISTENT_MISMATCH = 10,
-    // Both stores are ephemeral, but it was never recorded in the CookieStore
-    // which ChannelIDService it was created for, so it is unknown whether the
-    // stores match.
-    EPHEMERAL_UNKNOWN = 11,
-    // Both stores are persistent, but it was never recorded in the CookieStore
-    // which ChannelIDService it was created for, so it is unknown whether the
-    // stores match.
-    PERSISTENT_UNKNOWN = 12,
-    EPHEMERALITY_MAX
-  } ephemerality;
-  const net::HttpNetworkSession::Context* session_context =
-      context->GetNetworkSessionContext();
-  net::CookieStore* cookie_store = context->cookie_store();
-  if (session_context == nullptr ||
-      session_context->channel_id_service == nullptr) {
-    ephemerality = NO_CHANNEL_ID_STORE;
-  } else if (cookie_store == nullptr) {
-    ephemerality = NO_COOKIE_STORE;
-  } else if (session_context->channel_id_service->GetChannelIDStore()
-                 ->IsEphemeral()) {
-    if (cookie_store->IsEphemeral()) {
-      if (cookie_store->GetChannelIDServiceID() == -1) {
-        ephemerality = EPHEMERAL_UNKNOWN;
-      } else if (cookie_store->GetChannelIDServiceID() ==
-                 session_context->channel_id_service->GetUniqueID()) {
-        ephemerality = EPHEMERAL_MATCH;
-      } else {
-        NOTREACHED();
-        ephemerality = EPHEMERAL_MISMATCH;
-      }
-    } else {
-      NOTREACHED();
-      ephemerality = CID_EPHEMERAL_COOKIE_PERSISTENT;
-    }
-  } else if (cookie_store->IsEphemeral()) {
-    NOTREACHED();
-    ephemerality = CID_PERSISTENT_COOKIE_EPHEMERAL;
-  } else if (cookie_store->GetChannelIDServiceID() == -1) {
-    ephemerality = PERSISTENT_UNKNOWN;
-  } else if (cookie_store->GetChannelIDServiceID() ==
-             session_context->channel_id_service->GetUniqueID()) {
-    ephemerality = PERSISTENT_MATCH;
-  } else {
-    NOTREACHED();
-    ephemerality = PERSISTENT_MISMATCH;
-  }
-  UMA_HISTOGRAM_ENUMERATION("Net.TokenBinding.StoreEphemerality", ephemerality,
-                            EPHEMERALITY_MAX);
-}
-
 net::CookieNetworkSecurity HistogramEntryForCookie(
     const net::CanonicalCookie& cookie,
     const net::URLRequest& request,
@@ -942,10 +855,6 @@
         return;
       }
     }
-    if (transaction_ && transaction_->GetResponseInfo()) {
-      LogChannelIDAndCookieStores(request_->url(), request_->context(),
-                                  transaction_->GetResponseInfo()->ssl_info);
-    }
 
     SaveCookiesAndNotifyHeadersComplete(OK);
   } else if (IsCertificateError(result)) {
diff --git a/remoting/host/win/BUILD.gn b/remoting/host/win/BUILD.gn
index d280f26f..1354dab 100644
--- a/remoting/host/win/BUILD.gn
+++ b/remoting/host/win/BUILD.gn
@@ -321,6 +321,7 @@
   output_name = "remoting_host"
 
   if (!is_asan) {
+    no_default_deps = true
     ldflags = [
       "/ENTRY:HostEntryPoint",
       # "/NODEFAULTLIB",
diff --git a/remoting/protocol/webrtc_data_stream_adapter.cc b/remoting/protocol/webrtc_data_stream_adapter.cc
index f67d8fa..c087255 100644
--- a/remoting/protocol/webrtc_data_stream_adapter.cc
+++ b/remoting/protocol/webrtc_data_stream_adapter.cc
@@ -52,7 +52,11 @@
 
 void WebrtcDataStreamAdapter::Send(google::protobuf::MessageLite* message,
                                    base::OnceClosure done) {
-  DCHECK(state_ == State::OPEN);
+  // This shouldn't DCHECK in the CLOSED case, because the connection may be
+  // abruptly closed at any time and the caller may not have been notified, yet.
+  // The message will still be enqueued so that the outstanding done callbacks
+  // are dropped at the expected time in the expected order.
+  DCHECK(state_ != State::CONNECTING);
 
   rtc::CopyOnWriteBuffer buffer;
   buffer.SetSize(message->ByteSize());
@@ -62,10 +66,7 @@
       webrtc::DataBuffer(std::move(buffer), true /* binary */),
       std::move(done));
 
-  // Send asynchronously to avoid nested calls to Send.
-  base::SequencedTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&WebrtcDataStreamAdapter::SendMessagesIfReady,
-                                weak_ptr_factory_.GetWeakPtr()));
+  SendMessagesIfReady();
 }
 
 void WebrtcDataStreamAdapter::SendMessagesIfReady() {
@@ -77,7 +78,8 @@
 
   // Send messages to the data channel until it has to add one to its own queue.
   // This ensures that the lower-level buffers remain full.
-  while (channel_->buffered_amount() == 0 && !pending_messages_.empty()) {
+  while (state_ == State::OPEN && channel_->buffered_amount() == 0 &&
+         !pending_messages_.empty()) {
     PendingMessage message = std::move(pending_messages_.front());
     pending_messages_.pop();
     if (!channel_->Send(std::move(message.buffer))) {
@@ -87,7 +89,9 @@
     }
 
     if (message.done_callback) {
-      std::move(message.done_callback).Run();
+      // Invoke callback asynchronously to avoid nested calls to Send.
+      base::SequencedTaskRunnerHandle::Get()->PostTask(
+          FROM_HERE, std::move(message.done_callback));
     }
   }
 }
@@ -97,13 +101,18 @@
     case webrtc::DataChannelInterface::kOpen:
       DCHECK(state_ == State::CONNECTING);
       state_ = State::OPEN;
-      event_handler_->OnMessagePipeOpen();
+      base::SequencedTaskRunnerHandle::Get()->PostTask(
+          FROM_HERE, base::BindOnce(&WebrtcDataStreamAdapter::InvokeOpenEvent,
+                                    weak_ptr_factory_.GetWeakPtr()));
       break;
 
     case webrtc::DataChannelInterface::kClosing:
       if (state_ != State::CLOSED) {
         state_ = State::CLOSED;
-        event_handler_->OnMessagePipeClosed();
+        base::SequencedTaskRunnerHandle::Get()->PostTask(
+            FROM_HERE,
+            base::BindOnce(&WebrtcDataStreamAdapter::InvokeClosedEvent,
+                           weak_ptr_factory_.GetWeakPtr()));
       }
       break;
 
@@ -123,7 +132,10 @@
   buffer->AppendCopyOf(reinterpret_cast<const char*>(rtc_buffer.data.data()),
                        rtc_buffer.data.size());
   buffer->Lock();
-  event_handler_->OnMessageReceived(std::move(buffer));
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(&WebrtcDataStreamAdapter::InvokeMessageEvent,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(buffer)));
 }
 
 void WebrtcDataStreamAdapter::OnBufferedAmountChange(uint64_t previous_amount) {
@@ -134,6 +146,19 @@
                                 weak_ptr_factory_.GetWeakPtr()));
 }
 
+void WebrtcDataStreamAdapter::InvokeOpenEvent() {
+  event_handler_->OnMessagePipeOpen();
+}
+
+void WebrtcDataStreamAdapter::InvokeClosedEvent() {
+  event_handler_->OnMessagePipeClosed();
+}
+
+void WebrtcDataStreamAdapter::InvokeMessageEvent(
+    std::unique_ptr<CompoundBuffer> buffer) {
+  event_handler_->OnMessageReceived(std::move(buffer));
+}
+
 WebrtcDataStreamAdapter::PendingMessage::PendingMessage(
     webrtc::DataBuffer buffer,
     base::OnceClosure done_callback)
diff --git a/remoting/protocol/webrtc_data_stream_adapter.h b/remoting/protocol/webrtc_data_stream_adapter.h
index 0d42d53..8b8f4de5 100644
--- a/remoting/protocol/webrtc_data_stream_adapter.h
+++ b/remoting/protocol/webrtc_data_stream_adapter.h
@@ -54,6 +54,16 @@
   void OnMessage(const webrtc::DataBuffer& buffer) override;
   void OnBufferedAmountChange(uint64_t previous_amount) override;
 
+  // Helpers for calling EventHandler methods asynchronously.
+  // webrtc::DataChannelObserver can be called synchronously mid-operation
+  // (e.g., in the middle of a Send operation). As such, it is important to let
+  // the stack unwind before doing any real work. Since this class doesn't
+  // control the EventHandler implementation, the safest approach is always to
+  // call the latter's methods asynchronously.
+  void InvokeOpenEvent();
+  void InvokeClosedEvent();
+  void InvokeMessageEvent(std::unique_ptr<CompoundBuffer> buffer);
+
   rtc::scoped_refptr<webrtc::DataChannelInterface> channel_;
 
   EventHandler* event_handler_ = nullptr;
diff --git a/remoting/protocol/webrtc_dummy_video_encoder.cc b/remoting/protocol/webrtc_dummy_video_encoder.cc
index e72cb02c..f7b04768 100644
--- a/remoting/protocol/webrtc_dummy_video_encoder.cc
+++ b/remoting/protocol/webrtc_dummy_video_encoder.cc
@@ -104,8 +104,7 @@
 
 int32_t WebrtcDummyVideoEncoder::Encode(
     const webrtc::VideoFrame& frame,
-    const webrtc::CodecSpecificInfo* codec_specific_info,
-    const std::vector<webrtc::FrameType>* frame_types) {
+    const std::vector<webrtc::VideoFrameType>* frame_types) {
   // WebrtcDummyVideoCapturer doesn't generate any video frames, so Encode() can
   // be called only from VCMGenericEncoder::RequestFrame() to request a key
   // frame.
diff --git a/remoting/protocol/webrtc_dummy_video_encoder.h b/remoting/protocol/webrtc_dummy_video_encoder.h
index 3aba911..63edc8d 100644
--- a/remoting/protocol/webrtc_dummy_video_encoder.h
+++ b/remoting/protocol/webrtc_dummy_video_encoder.h
@@ -47,9 +47,9 @@
   int32_t RegisterEncodeCompleteCallback(
       webrtc::EncodedImageCallback* callback) override;
   int32_t Release() override;
-  int32_t Encode(const webrtc::VideoFrame& frame,
-                 const webrtc::CodecSpecificInfo* codec_specific_info,
-                 const std::vector<webrtc::FrameType>* frame_types) override;
+  int32_t Encode(
+      const webrtc::VideoFrame& frame,
+      const std::vector<webrtc::VideoFrameType>* frame_types) override;
   int32_t SetRates(uint32_t bitrate, uint32_t framerate) override;
   webrtc::VideoEncoder::EncoderInfo GetEncoderInfo() const override;
 
diff --git a/services/device/fingerprint/fingerprint_chromeos.cc b/services/device/fingerprint/fingerprint_chromeos.cc
index 07173d2..7316d9e 100644
--- a/services/device/fingerprint/fingerprint_chromeos.cc
+++ b/services/device/fingerprint/fingerprint_chromeos.cc
@@ -7,7 +7,8 @@
 #include <string.h>
 
 #include "base/bind.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/biod/biod_client.h"
+#include "dbus/object_path.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "services/device/fingerprint/fingerprint.h"
 #include "services/device/public/mojom/fingerprint.mojom.h"
@@ -17,7 +18,7 @@
 namespace {
 
 chromeos::BiodClient* GetBiodClient() {
-  return chromeos::DBusThreadManager::Get()->GetBiodClient();
+  return chromeos::BiodClient::Get();
 }
 
 // Helper functions to convert between dbus and mojo types. The dbus type comes
@@ -63,6 +64,7 @@
 }  // namespace
 
 FingerprintChromeOS::FingerprintChromeOS() : weak_ptr_factory_(this) {
+  CHECK(GetBiodClient());
   GetBiodClient()->AddObserver(this);
 }
 
@@ -92,7 +94,7 @@
 void FingerprintChromeOS::RunGetRecordsForUser(
     const std::string& user_id,
     GetRecordsForUserCallback callback) {
-  chromeos::DBusThreadManager::Get()->GetBiodClient()->GetRecordsForUser(
+  GetBiodClient()->GetRecordsForUser(
       user_id,
       base::BindOnce(&FingerprintChromeOS::OnGetRecordsForUser,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
diff --git a/services/device/fingerprint/fingerprint_chromeos.h b/services/device/fingerprint/fingerprint_chromeos.h
index 5d92809c..c390544c5 100644
--- a/services/device/fingerprint/fingerprint_chromeos.h
+++ b/services/device/fingerprint/fingerprint_chromeos.h
@@ -11,15 +11,19 @@
 #include "base/containers/queue.h"
 #include "base/macros.h"
 #include "chromeos/dbus/biod/biod_client.h"
-#include "dbus/object_path.h"
 #include "services/device/fingerprint/fingerprint_export.h"
 #include "services/device/public/mojom/fingerprint.mojom.h"
 
+namespace dbus {
+class ObjectPath;
+}
+
 namespace device {
 
 // Implementation of Fingerprint interface for ChromeOS platform.
 // This is used to connect to biod(through dbus) and perform fingerprint related
-// operations. It observes signals from biod.
+// operations. It observes signals from biod. This class requires that
+// chromeos::BiodClient has been initialized.
 class SERVICES_DEVICE_FINGERPRINT_EXPORT FingerprintChromeOS
     : public mojom::Fingerprint,
       public chromeos::BiodClient::Observer {
diff --git a/services/device/fingerprint/fingerprint_chromeos_unittest.cc b/services/device/fingerprint/fingerprint_chromeos_unittest.cc
index bb44be6..9e1f03cb 100644
--- a/services/device/fingerprint/fingerprint_chromeos_unittest.cc
+++ b/services/device/fingerprint/fingerprint_chromeos_unittest.cc
@@ -57,15 +57,22 @@
 
 class FingerprintChromeOSTest : public testing::Test {
  public:
-  FingerprintChromeOSTest() {
+  FingerprintChromeOSTest() = default;
+
+  ~FingerprintChromeOSTest() override = default;
+
+  void SetUp() override {
     // This also initializes DBusThreadManager.
     std::unique_ptr<chromeos::DBusThreadManagerSetter> dbus_setter =
         chromeos::DBusThreadManager::GetSetterForTesting();
-    fake_biod_client_ = new chromeos::FakeBiodClient();
-    dbus_setter->SetBiodClient(base::WrapUnique(fake_biod_client_));
+    chromeos::BiodClient::InitializeFake();
     fingerprint_ = base::WrapUnique(new FingerprintChromeOS());
   }
-  ~FingerprintChromeOSTest() override {}
+
+  void TearDown() override {
+    fingerprint_.reset();
+    chromeos::BiodClient::Shutdown();
+  }
 
   FingerprintChromeOS* fingerprint() { return fingerprint_.get(); }
 
@@ -73,18 +80,20 @@
 
   void GenerateEnrollScanDoneSignal() {
     std::string fake_fingerprint_data;
-    fake_biod_client_->SendEnrollScanDone(fake_fingerprint_data,
-                                          biod::SCAN_RESULT_SUCCESS, true,
-                                          -1 /* percent_complete */);
+    chromeos::FakeBiodClient::Get()->SendEnrollScanDone(
+        fake_fingerprint_data, biod::SCAN_RESULT_SUCCESS, true,
+        -1 /* percent_complete */);
   }
 
   void GenerateAuthScanDoneSignal() {
     std::string fake_fingerprint_data;
-    fake_biod_client_->SendAuthScanDone(fake_fingerprint_data,
-                                        biod::SCAN_RESULT_SUCCESS);
+    chromeos::FakeBiodClient::Get()->SendAuthScanDone(
+        fake_fingerprint_data, biod::SCAN_RESULT_SUCCESS);
   }
 
-  void GenerateSessionFailedSignal() { fake_biod_client_->SendSessionFailed(); }
+  void GenerateSessionFailedSignal() {
+    chromeos::FakeBiodClient::Get()->SendSessionFailed();
+  }
 
   void onStartSession(const dbus::ObjectPath& path) {}
 
@@ -119,10 +128,6 @@
   bool IsRequestRunning() { return fingerprint_->is_request_running_; }
   int get_records_results() { return get_records_results_; }
 
- protected:
-  // Ownership is passed on to chromeos::DBusThreadManager.
-  chromeos::FakeBiodClient* fake_biod_client_;
-
  private:
   base::MessageLoop message_loop_;
   std::unique_ptr<FingerprintChromeOS> fingerprint_;
@@ -142,7 +147,7 @@
 
   std::string user_id;
   std::string label;
-  fake_biod_client_->StartEnrollSession(
+  chromeos::FakeBiodClient::Get()->StartEnrollSession(
       user_id, label,
       base::Bind(&FingerprintChromeOSTest::onStartSession,
                  base::Unretained(this)));
@@ -151,7 +156,7 @@
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(observer.enroll_scan_dones(), 1);
 
-  fake_biod_client_->StartAuthSession(base::Bind(
+  chromeos::FakeBiodClient::Get()->StartAuthSession(base::Bind(
       &FingerprintChromeOSTest::onStartSession, base::Unretained(this)));
   base::RunLoop().RunUntilIdle();
   GenerateAuthScanDoneSignal();
diff --git a/services/ws/public/cpp/gpu/context_provider_command_buffer.cc b/services/ws/public/cpp/gpu/context_provider_command_buffer.cc
index 9cb3ae47..c2de880 100644
--- a/services/ws/public/cpp/gpu/context_provider_command_buffer.cc
+++ b/services/ws/public/cpp/gpu/context_provider_command_buffer.cc
@@ -168,13 +168,18 @@
     // gpu::ContextSupport interface.
     auto webgpu_impl = std::make_unique<gpu::webgpu::WebGPUImplementation>(
         webgpu_helper.get(), transfer_buffer_.get(), command_buffer_.get());
+    bind_result_ = webgpu_impl->Initialize(memory_limits_);
+    if (bind_result_ != gpu::ContextResult::kSuccess) {
+      DLOG(ERROR) << "Failed to initialize WebGPUImplementation.";
+      return bind_result_;
+    }
 
     std::string type_name =
         command_buffer_metrics::ContextTypeToString(context_type_);
     std::string unique_context_name =
         base::StringPrintf("%s-%p", type_name.c_str(), webgpu_impl.get());
 
-    impl_ = nullptr;
+    impl_ = webgpu_impl.get();
     webgpu_interface_ = std::move(webgpu_impl);
     helper_ = std::move(webgpu_helper);
   } else if (attributes_.enable_raster_interface &&
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 5e425d2..e161fab 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -3840,38 +3840,6 @@
           "hard_timeout": 3600,
           "io_timeout": 3600
         },
-        "test": "chrome_all_tast_tests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "kvm": "1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-CrOS-VM"
-            }
-          ],
-          "hard_timeout": 3600,
-          "io_timeout": 3600
-        },
-        "test": "cros_vm_sanity_test"
-      },
-      {
-        "isolate_coverage_data": true,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "kvm": "1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-CrOS-VM"
-            }
-          ],
-          "hard_timeout": 3600,
-          "io_timeout": 3600
-        },
         "test": "crypto_unittests"
       },
       {
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 5628dc9..4df045a8 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -5544,23 +5544,6 @@
       },
       {
         "args": [
-          "--test-launcher-retry-limit=0"
-        ],
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-18.0.5",
-              "os": "Ubuntu",
-              "pool": "Chrome-GPU"
-            }
-          ]
-        },
-        "test": "angle_white_box_tests"
-      },
-      {
-        "args": [
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index 6f38d400..2b1dce4 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -1085,25 +1085,6 @@
       },
       {
         "args": [
-          "--jobs=1",
-          "--extra-browser-args=--disable-gpu"
-        ],
-        "isolate_name": "telemetry_unittests",
-        "name": "telemetry_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.10"
-            }
-          ],
-          "idempotent": false,
-          "shards": 4
-        }
-      },
-      {
-        "args": [
           "--gtest-benchmark-name=views_perftests"
         ],
         "isolate_name": "views_perftests",
@@ -2224,25 +2205,6 @@
       },
       {
         "args": [
-          "--jobs=1",
-          "--extra-browser-args=--disable-gpu"
-        ],
-        "isolate_name": "telemetry_unittests",
-        "name": "telemetry_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.11"
-            }
-          ],
-          "idempotent": false,
-          "shards": 4
-        }
-      },
-      {
-        "args": [
           "--gtest-benchmark-name=views_perftests"
         ],
         "isolate_name": "views_perftests",
diff --git a/testing/buildbot/filters/mojo.fyi.network_webview_instrumentation_test_apk.filter b/testing/buildbot/filters/mojo.fyi.network_webview_instrumentation_test_apk.filter
index 393cb3c..0eb8c8f7 100644
--- a/testing/buildbot/filters/mojo.fyi.network_webview_instrumentation_test_apk.filter
+++ b/testing/buildbot/filters/mojo.fyi.network_webview_instrumentation_test_apk.filter
@@ -20,8 +20,9 @@
 # https://crbug.com/933458
 -org.chromium.android_webview.test.CookieManagerTest.testAcceptFileSchemeCookies
 
-# https://crbug.com/936706
--org.chromium.android_webview.test.CookieManagerTest.testThirdPartyCookieForWebSocketDisabledCase
+# https://crbug.com/941260
+-org.chromium.android_webview.test.CookieManagerTest.testCookieForWebSocketHandshake_firstParty_disabled
+-org.chromium.android_webview.test.CookieManagerTest.testCookieForWebSocketHandshake_thirdParty_disabled
 
 # https://crbug.com/893580
 -org.chromium.android_webview.test.LoadDataWithBaseUrlTest.testLoadDataWithBaseUrlAccessingFile
diff --git a/testing/buildbot/filters/webui_polymer1_browser_tests.filter b/testing/buildbot/filters/webui_polymer1_browser_tests.filter
index 2081c92..c45803ec 100644
--- a/testing/buildbot/filters/webui_polymer1_browser_tests.filter
+++ b/testing/buildbot/filters/webui_polymer1_browser_tests.filter
@@ -233,7 +233,6 @@
 NoBackgroundTasksTest.*
 NTP4WebUITest.*
 OnboardingWelcomeEmailChooserTest.*
-OnboardingWelcomeEmailInterstitialTest.*
 OnboardingWelcomeWelcomeAppTest.*
 OpenAudioFiles/*
 PDFAnnotationsTest.*
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 72e1765..e09af88 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -57,6 +57,14 @@
       },
     },
   },
+  'angle_white_box_tests': {
+    'remove_from': [
+      # chromium.gpu.fyi
+      # Vulkan tests fail consistently due to missing extensions.
+      # See crbug.com/940750
+      'Linux FYI Experimental Release (Intel HD 630)',
+    ],
+  },
   'browser_tests': {
     'remove_from': [
       # chromium.clang
@@ -259,6 +267,11 @@
       'mac-rel',
     ],
   },
+  'chrome_all_tast_tests': {
+    'remove_from': [
+      'chromeos-vm-code-coverage',
+      ],
+  },
   # Note: keep experiment percentages the same as
   # network_service_chrome_public_test_apk.
   'chrome_public_test_apk': {
@@ -431,6 +444,11 @@
       'linux-win_cross-rel', # https://crbug.com/762167
     ],
   },
+  'cros_vm_sanity_test': {
+    'remove_from': [
+      'chromeos-vm-code-coverage',
+      ],
+  },
   'dawn_end2end_tests': {
     'remove_from': [
       # chromium.gpu.fyi
@@ -1245,7 +1263,12 @@
       'Win10 Tests x64 (dbg)': {
         'experiment_percentage': 100,  # crbug.com/870673
       }
-    }
+    },
+    'remove_from': [
+      # crbug.com/936540
+      'Mac10.10 Tests',
+      'Mac10.11 Tests',
+    ],
   },
   'unit_tests': {
     'modifications': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 2201703..71c39200 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -366,6 +366,10 @@
       'chromedriver_replay_unittests': {},
     },
 
+    # Identical to chromeos_device_friendly_gtests below minus
+    #   - cros_vm_sanity_test
+    #   - chrome_all_tast_tests
+
     # Tests that run in Chrome OS VMs.
     # NOTE: We only want a small subset of test suites here, because most
     # suites assume that they stub out the underlying device hardware.
diff --git a/testing/iossim/iossim.mm b/testing/iossim/iossim.mm
index 1cf3be2..1240c62 100644
--- a/testing/iossim/iossim.mm
+++ b/testing/iossim/iossim.mm
@@ -190,6 +190,17 @@
                                 NSString* sdk_version) {
   NSString* sdk = [@"iOS " stringByAppendingString:sdk_version];
   NSArray* devices = [simctl_list[@"devices"] objectForKey:sdk];
+  // Pre-Xcode 10.2's simulator, xcrun simctl -j returned "devices" that looked
+  // like "iOS 12.1".  Now they look like
+  // com.apple.CoreSimulator.SimRuntime.iOS-12-1. Only use this block when all
+  // bots move to Xcode 10.2+
+  if (devices == nil || [devices count] == 0) {
+    sdk_version = [sdk_version stringByReplacingOccurrencesOfString:@"."
+                                                         withString:@"-"];
+    NSString* sdk = [@"com.apple.CoreSimulator.SimRuntime.iOS-"
+        stringByAppendingString:sdk_version];
+    devices = [simctl_list[@"devices"] objectForKey:sdk];
+  }
   for (NSDictionary* device in devices) {
     if ([device[@"name"] isEqualToString:device_name]) {
       return device[@"udid"];
diff --git a/testing/merge_scripts/code_coverage/OWNERS b/testing/merge_scripts/code_coverage/OWNERS
new file mode 100644
index 0000000..c3d0dbb
--- /dev/null
+++ b/testing/merge_scripts/code_coverage/OWNERS
@@ -0,0 +1,3 @@
+liaoyuke@chromium.org
+robertocn@chromium.org
+sajjadm@chromium.org
diff --git a/testing/merge_scripts/code_coverage/merge_lib.py b/testing/merge_scripts/code_coverage/merge_lib.py
new file mode 100644
index 0000000..8e40f44
--- /dev/null
+++ b/testing/merge_scripts/code_coverage/merge_lib.py
@@ -0,0 +1,199 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Functions for interacting with llvm-profdata"""
+
+import logging
+import multiprocessing
+import os
+import subprocess
+
+logging.basicConfig(
+    format='[%(asctime)s %(levelname)s] %(message)s', level=logging.DEBUG)
+
+
+def _call_profdata_tool(profile_input_file_paths,
+                        profile_output_file_path,
+                        profdata_tool_path,
+                        retries=3):
+  """Calls the llvm-profdata tool.
+
+  Args:
+    profile_input_file_paths: A list of relative paths to the files that
+        are to be merged.
+    profile_output_file_path: The path to the merged file to write.
+    profdata_tool_path: The path to the llvm-profdata executable.
+
+  Returns:
+    A list of paths to profiles that had to be excluded to get the merge to
+    succeed, suspected of being corrupted or malformed.
+
+  Raises:
+    CalledProcessError: An error occurred merging profiles.
+  """
+  logging.info('Merging profiles.')
+
+  try:
+    subprocess_cmd = [
+        profdata_tool_path, 'merge', '-o', profile_output_file_path,
+        '-sparse=true'
+    ]
+    subprocess_cmd.extend(profile_input_file_paths)
+
+    # Redirecting stderr is required because when error happens, llvm-profdata
+    # writes the error output to stderr and our error handling logic relies on
+    # that output.
+    output = subprocess.check_output(subprocess_cmd, stderr=subprocess.STDOUT)
+    logging.info('Merge succeeded with output: %r', output)
+  except subprocess.CalledProcessError as error:
+    if len(profile_input_file_paths) > 1 and retries >= 0:
+      logging.warning('Merge failed with error output: %r', error.output)
+
+      # The output of the llvm-profdata command will include the path of
+      # malformed files, such as
+      # `error: /.../default.profraw: Malformed instrumentation profile data`
+      invalid_profiles = [
+          f for f in profile_input_file_paths if f in error.output
+      ]
+
+      if not invalid_profiles:
+        logging.info(
+            'Merge failed, but wasn\'t able to figure out the culprit invalid '
+            'profiles from the output, so skip retry and bail out.')
+        raise error
+
+      valid_profiles = list(
+          set(profile_input_file_paths) - set(invalid_profiles))
+      if valid_profiles:
+        logging.warning(
+            'Following invalid profiles are removed as they were mentioned in '
+            'the merge error output: %r', invalid_profiles)
+        logging.info('Retry merging with the remaining profiles: %r',
+                     valid_profiles)
+        return invalid_profiles + _call_profdata_tool(
+            valid_profiles, profile_output_file_path, profdata_tool_path,
+            retries - 1)
+
+    logging.error('Failed to merge profiles, return code (%d), output: %r' %
+                  (error.returncode, error.output))
+    raise error
+
+  logging.info('Profile data is created as: "%r".', profile_output_file_path)
+  return []
+
+
+def _get_profile_paths(input_dir, input_extension):
+  """Finds all the profiles in the given directory (recursively)."""
+  paths = []
+  for dir_path, _sub_dirs, file_names in os.walk(input_dir):
+    paths.extend([
+        os.path.join(dir_path, fn)
+        for fn in file_names
+        if fn.endswith(input_extension)
+    ])
+  return paths
+
+
+def _validate_and_convert_profraws(profraw_files, profdata_tool_path):
+  """Validates and converts profraws to profdatas.
+
+  For each given .profraw file in the input, this method first validates it by
+  trying to convert it to an indexed .profdata file, and if the validation and
+  conversion succeeds, the generated .profdata file will be included in the
+  output, otherwise, won't.
+
+  This method is mainly used to filter out invalid profraw files.
+
+  Args:
+    profraw_files: A list of .profraw paths.
+    profdata_tool_path: The path to the llvm-profdata executable.
+
+  Returns:
+    A tulple:
+      A list of converted .profdata files of *valid* profraw files.
+      A list of *invalid* profraw files.
+  """
+  logging.info('Validating and converting .profraw files.')
+
+  for profraw_file in profraw_files:
+    if not profraw_file.endswith('.profraw'):
+      raise RuntimeError('%r is expected to be a .profraw file.' % profraw_file)
+
+  cpu_count = multiprocessing.cpu_count()
+  counts = max(10, cpu_count - 5)  # Use 10+ processes, but leave 5 cpu cores.
+  pool = multiprocessing.Pool(counts)
+  output_profdata_files = multiprocessing.Manager().list()
+  invalid_profraw_files = multiprocessing.Manager().list()
+
+  for profraw_file in profraw_files:
+    pool.apply_async(_validate_and_convert_profraw,
+                     (profraw_file, output_profdata_files,
+                      invalid_profraw_files, profdata_tool_path))
+
+  pool.close()
+  pool.join()
+
+  # Remove inputs, as they won't be needed and they can be pretty large.
+  for input_file in profraw_files:
+    os.remove(input_file)
+
+  return list(output_profdata_files), list(invalid_profraw_files)
+
+
+def _validate_and_convert_profraw(profraw_file, output_profdata_files,
+                                  invalid_profraw_files, profdata_tool_path):
+  output_profdata_file = profraw_file.replace('.profraw', '.profdata')
+  subprocess_cmd = [
+      profdata_tool_path, 'merge', '-o', output_profdata_file, '-sparse=true',
+      profraw_file
+  ]
+
+  try:
+    # Redirecting stderr is required because when error happens, llvm-profdata
+    # writes the error output to stderr and our error handling logic relies on
+    # that output.
+    output = subprocess.check_output(subprocess_cmd, stderr=subprocess.STDOUT)
+    logging.info('Validating and converting %r to %r succeeded with output: %r',
+                 profraw_file, output_profdata_file, output)
+    output_profdata_files.append(output_profdata_file)
+  except subprocess.CalledProcessError as error:
+    logging.warning('Validating and converting %r to %r failed with output: %r',
+                    profraw_file, output_profdata_file, error.output)
+    invalid_profraw_files.append(profraw_file)
+
+
+def merge_profiles(input_dir, output_file, input_extension, profdata_tool_path):
+  """Merges the profiles produced by the shards using llvm-profdata.
+
+  Args:
+    input_dir (str): The path to traverse to find input profiles.
+    output_file (str): Where to write the merged profile.
+    input_extension (str): File extension to look for in the input_dir.
+        e.g. '.profdata' or '.profraw'
+    profdata_tool_path: The path to the llvm-profdata executable.
+  Returns:
+    The list of profiles that had to be excluded to get the merge to
+    succeed.
+  """
+  profile_input_file_paths = _get_profile_paths(input_dir, input_extension)
+  invalid_profraw_files = []
+  if input_extension == '.profraw':
+    profile_input_file_paths, invalid_profraw_files = (
+        _validate_and_convert_profraws(profile_input_file_paths,
+                                       profdata_tool_path))
+    logging.info('List of converted .profdata files: %r',
+                 profile_input_file_paths)
+    logging.info((
+        'List of invalid .profraw files that failed to validate and convert: %r'
+    ), invalid_profraw_files)
+
+  invalid_profdata_files = _call_profdata_tool(
+      profile_input_file_paths=profile_input_file_paths,
+      profile_output_file_path=output_file,
+      profdata_tool_path=profdata_tool_path)
+
+  # Remove inputs, as they won't be needed and they can be pretty large.
+  for input_file in profile_input_file_paths:
+    os.remove(input_file)
+
+  return invalid_profraw_files + invalid_profdata_files
diff --git a/testing/merge_scripts/code_coverage/merge_profiles.py b/testing/merge_scripts/code_coverage/merge_profiles.py
new file mode 100755
index 0000000..354080a2
--- /dev/null
+++ b/testing/merge_scripts/code_coverage/merge_profiles.py
@@ -0,0 +1,67 @@
+#!/usr/bin/python
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""This script merges code coverage profiles from multiple shards.
+
+It is functionally identical to merge_steps.py but it accepts the parameters
+passed by swarming api.
+"""
+
+import argparse
+import json
+import logging
+import os
+import sys
+
+import merge_lib as merger
+
+
+def _MergeAPIArgumentParser(*args, **kwargs):
+  """Parameters passed to this merge script, as per:
+  https://chromium.googlesource.com/chromium/tools/build/+/master/scripts/slave/recipe_modules/swarming/resources/merge_api.py
+  """
+  parser = argparse.ArgumentParser(*args, **kwargs)
+  parser.add_argument('--build-properties', help=argparse.SUPPRESS)
+  parser.add_argument('--summary-json', help=argparse.SUPPRESS)
+  parser.add_argument('--task-output-dir', help=argparse.SUPPRESS)
+  parser.add_argument(
+      '-o', '--output-json', required=True, help=argparse.SUPPRESS)
+  parser.add_argument(
+      '--profdata-dir', required=True, help='where to store the merged data')
+  parser.add_argument(
+      '--llvm-profdata', required=True, help='path to llvm-profdata executable')
+  parser.add_argument('jsons_to_merge', nargs='*', help=argparse.SUPPRESS)
+  return parser
+
+
+def main():
+  desc = "Merge profraw files in <--task-output-dir> into a single profdata."
+  parser = _MergeAPIArgumentParser(description=desc)
+  params = parser.parse_args()
+  invalid_profiles = merger.merge_profiles(
+      params.task_output_dir,
+      os.path.join(params.profdata_dir, 'default.profdata'), '.profraw',
+      params.llvm_profdata)
+  if invalid_profiles:
+    with open(os.path.join(params.profdata_dir, 'invalid_profiles.json'),
+              'w') as f:
+      json.dump(invalid_profiles, f)
+
+  # TODO(crbug.com/921300) This script doesn't know how to merge test results,
+  # and the correct solution should be taking other merge script as inputs to
+  # perform the merge.
+  # However, to work around the issue that fuzzer test steps are red, following
+  # logic directly copy paste the output json if there is only one shard, and
+  # this strategy should work for test targets that only have one shard, such
+  # as fuzzer targets and simple gtests targets.
+  if len(params.jsons_to_merge) == 1:
+    with open(params.jsons_to_merge[0]) as f_read:
+      with open(params.output_json, 'w') as f_write:
+        f_write.write(f_read.read())
+
+
+if __name__ == '__main__':
+  logging.basicConfig(
+      format='[%(asctime)s %(levelname)s] %(message)s', level=logging.INFO)
+  sys.exit(main())
diff --git a/testing/merge_scripts/code_coverage/merge_profiles_test.py b/testing/merge_scripts/code_coverage/merge_profiles_test.py
new file mode 100755
index 0000000..5cbe5c22
--- /dev/null
+++ b/testing/merge_scripts/code_coverage/merge_profiles_test.py
@@ -0,0 +1,197 @@
+#!/usr/bin/env vpython
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import json
+import os
+import subprocess
+import sys
+import unittest
+
+THIS_DIR = os.path.dirname(os.path.abspath(__file__))
+sys.path.insert(
+    0, os.path.abspath(os.path.join(THIS_DIR, os.pardir, os.pardir, os.pardir,
+                                    'third_party', 'pymock')))
+
+import mock
+
+import merge_profiles
+import merge_steps
+import merge_lib as merger
+
+
+class MergeProfilesTest(unittest.TestCase):
+
+  def __init__(self, *args, **kwargs):
+    super(MergeProfilesTest, self).__init__(*args, **kwargs)
+    self.maxDiff = None
+
+  def test_merge_script_api_parameters(self):
+    """Test the step-level merge front-end."""
+    build_properties = json.dumps({
+        'some': {
+            'complicated': ['nested', {
+                'json': None,
+                'object': 'thing',
+            }]
+        }
+    })
+    task_output_dir = 'some/task/output/dir'
+    profdata_dir = '/some/different/path/to/profdata/default.profdata'
+    profdata_file = os.path.join(profdata_dir, 'default.profdata')
+    args = [
+        'script_name', '--output-json', 'output.json', '--build-properties',
+        build_properties, '--summary-json', 'summary.json', '--task-output-dir',
+        task_output_dir, '--profdata-dir', profdata_dir, '--llvm-profdata',
+        'llvm-profdata', 'a.json', 'b.json', 'c.json'
+    ]
+    with mock.patch.object(merger, 'merge_profiles') as mock_merge:
+      mock_merge.return_value = None
+      with mock.patch.object(sys, 'argv', args):
+        merge_profiles.main()
+        self.assertEqual(
+            mock_merge.call_args,
+            mock.call(task_output_dir, profdata_file, '.profraw',
+                      'llvm-profdata'))
+
+  def test_merge_steps_parameters(self):
+    """Test the build-level merge front-end."""
+    input_dir = 'some/task/output/dir'
+    output_file = '/some/different/path/to/profdata/merged.profdata'
+    args = [
+        'script_name',
+        '--input-dir',
+        input_dir,
+        '--output-file',
+        output_file,
+        '--llvm-profdata',
+        'llvm-profdata',
+    ]
+    with mock.patch.object(merger, 'merge_profiles') as mock_merge:
+      mock_merge.return_value = None
+      with mock.patch.object(sys, 'argv', args):
+        merge_steps.main()
+        self.assertEqual(
+            mock_merge.call_args,
+            mock.call(input_dir, output_file, '.profdata', 'llvm-profdata'))
+
+  @mock.patch.object(merger, '_validate_and_convert_profraws')
+  def test_merge_profraw(self, mock_validate_and_convert_profraws):
+    mock_input_dir_walk = [
+        ('/b/some/path', ['0', '1', '2', '3'], ['summary.json']),
+        ('/b/some/path/0', [],
+         ['output.json', 'default-1.profraw', 'default-2.profraw']),
+        ('/b/some/path/1', [],
+         ['output.json', 'default-1.profraw', 'default-2.profraw']),
+    ]
+
+    mock_validate_and_convert_profraws.return_value = [
+        '/b/some/path/0/default-1.profdata',
+        '/b/some/path/1/default-2.profdata',
+    ], [
+        '/b/some/path/0/default-2.profraw',
+        '/b/some/path/1/default-1.profraw',
+    ]
+
+    with mock.patch.object(os, 'walk') as mock_walk:
+      with mock.patch.object(os, 'remove'):
+        mock_walk.return_value = mock_input_dir_walk
+        with mock.patch.object(subprocess, 'check_output') as mock_exec_cmd:
+          merger.merge_profiles('/b/some/path', 'output/dir/default.profdata',
+                                '.profraw', 'llvm-profdata')
+          self.assertEqual(
+              mock.call(
+                  [
+                      'llvm-profdata',
+                      'merge',
+                      '-o',
+                      'output/dir/default.profdata',
+                      '-sparse=true',
+                      '/b/some/path/0/default-1.profdata',
+                      '/b/some/path/1/default-2.profdata',
+                  ],
+                  stderr=-2,
+              ), mock_exec_cmd.call_args)
+
+    self.assertTrue(mock_validate_and_convert_profraws.called)
+
+  @mock.patch.object(merger, '_validate_and_convert_profraws')
+  def test_merge_profdata(self, mock_validate_and_convert_profraws):
+    mock_input_dir_walk = [
+        ('/b/some/path', ['base_unittests', 'url_unittests'], ['summary.json']),
+        ('/b/some/path/base_unittests', [], ['output.json',
+                                             'default.profdata']),
+        ('/b/some/path/url_unittests', [], ['output.json', 'default.profdata']),
+    ]
+    with mock.patch.object(os, 'walk') as mock_walk:
+      with mock.patch.object(os, 'remove'):
+        mock_walk.return_value = mock_input_dir_walk
+        with mock.patch.object(subprocess, 'check_output') as mock_exec_cmd:
+          merger.merge_profiles('/b/some/path', 'output/dir/default.profdata',
+                                '.profdata', 'llvm-profdata')
+          self.assertEqual(
+              mock.call(
+                  [
+                      'llvm-profdata',
+                      'merge',
+                      '-o',
+                      'output/dir/default.profdata',
+                      '-sparse=true',
+                      '/b/some/path/base_unittests/default.profdata',
+                      '/b/some/path/url_unittests/default.profdata',
+                  ],
+                  stderr=-2,
+              ), mock_exec_cmd.call_args)
+
+    # The mock method should only apply when merging .profraw files.
+    self.assertFalse(mock_validate_and_convert_profraws.called)
+
+  def test_retry_profdata_merge_failures(self):
+    mock_input_dir_walk = [
+        ('/b/some/path', ['0', '1'], ['summary.json']),
+        ('/b/some/path/0', [],
+         ['output.json', 'default-1.profdata', 'default-2.profdata']),
+        ('/b/some/path/1', [],
+         ['output.json', 'default-1.profdata', 'default-2.profdata']),
+    ]
+    with mock.patch.object(os, 'walk') as mock_walk:
+      with mock.patch.object(os, 'remove'):
+        mock_walk.return_value = mock_input_dir_walk
+        with mock.patch.object(subprocess, 'check_output') as mock_exec_cmd:
+          invalid_profiles_msg = (
+              'error: /b/some/path/0/default-1.profdata: Malformed '
+              'instrumentation profile data.')
+
+          # Failed on the first merge, but succeed on the second attempt.
+          mock_exec_cmd.side_effect = [
+              subprocess.CalledProcessError(
+                  returncode=1, cmd='dummy cmd', output=invalid_profiles_msg),
+              None
+          ]
+
+          merger.merge_profiles('/b/some/path', 'output/dir/default.profdata',
+                                '.profdata', 'llvm-profdata')
+
+          self.assertEqual(2, mock_exec_cmd.call_count)
+
+          # Note that in the second call, /b/some/path/0/default-1.profdata is
+          # excluded!
+          self.assertEqual(
+              mock.call(
+                  [
+                      'llvm-profdata',
+                      'merge',
+                      '-o',
+                      'output/dir/default.profdata',
+                      '-sparse=true',
+                      '/b/some/path/0/default-2.profdata',
+                      '/b/some/path/1/default-1.profdata',
+                      '/b/some/path/1/default-2.profdata',
+                  ],
+                  stderr=-2,
+              ), mock_exec_cmd.call_args)
+
+
+if __name__ == '__main__':
+  unittest.main()
diff --git a/testing/merge_scripts/code_coverage/merge_steps.py b/testing/merge_scripts/code_coverage/merge_steps.py
new file mode 100755
index 0000000..c0d5d4e
--- /dev/null
+++ b/testing/merge_scripts/code_coverage/merge_steps.py
@@ -0,0 +1,33 @@
+#!/usr/bin/python
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""This script merges code coverage profiles from multiple steps."""
+
+import argparse
+import os
+import sys
+
+import merge_lib as merger
+
+
+def _merge_steps_argument_parser(*args, **kwargs):
+  parser = argparse.ArgumentParser(*args, **kwargs)
+  parser.add_argument('--input-dir', required=True, help=argparse.SUPPRESS)
+  parser.add_argument(
+      '--output-file', required=True, help='where to store the merged data')
+  parser.add_argument(
+      '--llvm-profdata', required=True, help='path to llvm-profdata executable')
+  return parser
+
+
+def main():
+  desc = "Merge profdata files in <--input-dir> into a single profdata."
+  parser = _merge_steps_argument_parser(description=desc)
+  params = parser.parse_args()
+  merger.merge_profiles(params.input_dir, params.output_file, '.profdata',
+                        params.llvm_profdata)
+
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 618714e..d9f4f99 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -5227,6 +5227,24 @@
             ]
         }
     ],
+    "UserActivityPredictionMlService": [
+        {
+            "platforms": [
+                "chromeos"
+            ],
+            "experiments": [
+                {
+                    "name": "UserActivityPredictionMlService",
+                    "params": {
+                        "dim_threshold": "-1.0"
+                    },
+                    "enable_features": [
+                        "UserActivityPredictionMlService"
+                    ]
+                }
+            ]
+        }
+    ],
     "V8AsmJSToWasm": [
         {
             "platforms": [
diff --git a/third_party/blink/public/mojom/indexeddb/indexeddb.mojom b/third_party/blink/public/mojom/indexeddb/indexeddb.mojom
index 622426f..14c855c0 100644
--- a/third_party/blink/public/mojom/indexeddb/indexeddb.mojom
+++ b/third_party/blink/public/mojom/indexeddb/indexeddb.mojom
@@ -235,11 +235,6 @@
   // Database::Get / Cursor::Advance
   SuccessValue(IDBReturnValue? value);
 
-  // Cursor::Prefetch
-  SuccessCursorPrefetch(array<IDBKey> keys,
-                        array<IDBKey> primary_keys,
-                        array<IDBValue> values);
-
   // Database::GetAll
   SuccessArray(array<IDBReturnValue> values);
 
diff --git a/third_party/blink/public/web/web_widget_client.h b/third_party/blink/public/web/web_widget_client.h
index 47e12365..ebe92e4 100644
--- a/third_party/blink/public/web/web_widget_client.h
+++ b/third_party/blink/public/web/web_widget_client.h
@@ -5,7 +5,7 @@
  * modification, are permitted provided that the following conditions are
  * met:
  *
- r *     * Redistributions of source code must retain the above copyright
+ *     * Redistributions of source code must retain the above copyright
  * notice, this list of conditions and the following disclaimer.
  *     * Redistributions in binary form must reproduce the above
  * copyright notice, this list of conditions and the following disclaimer
diff --git a/third_party/blink/renderer/core/animation/animation_test.cc b/third_party/blink/renderer/core/animation/animation_test.cc
index 478b3e7..09bd4ae 100644
--- a/third_party/blink/renderer/core/animation/animation_test.cc
+++ b/third_party/blink/renderer/core/animation/animation_test.cc
@@ -79,7 +79,7 @@
     PropertyHandle PropertyHandleOpacity(GetCSSPropertyOpacity());
     TransitionKeyframe* start_keyframe =
         TransitionKeyframe::Create(PropertyHandleOpacity);
-    start_keyframe->SetValue(TypedInterpolationValue::Create(
+    start_keyframe->SetValue(std::make_unique<TypedInterpolationValue>(
         CSSNumberInterpolationType(PropertyHandleOpacity),
         std::make_unique<InterpolableNumber>(1.0)));
     start_keyframe->SetOffset(0.0);
@@ -89,7 +89,7 @@
     start_keyframe->SetCompositorValue(AnimatableDouble::Create(1.0));
     TransitionKeyframe* end_keyframe =
         TransitionKeyframe::Create(PropertyHandleOpacity);
-    end_keyframe->SetValue(TypedInterpolationValue::Create(
+    end_keyframe->SetValue(std::make_unique<TypedInterpolationValue>(
         CSSNumberInterpolationType(PropertyHandleOpacity),
         std::make_unique<InterpolableNumber>(0.0)));
     end_keyframe->SetOffset(1.0);
diff --git a/third_party/blink/renderer/core/animation/css/css_animation_data.h b/third_party/blink/renderer/core/animation/css/css_animation_data.h
index e716e49..6466df5b 100644
--- a/third_party/blink/renderer/core/animation/css/css_animation_data.h
+++ b/third_party/blink/renderer/core/animation/css/css_animation_data.h
@@ -16,9 +16,8 @@
 
 class CSSAnimationData final : public CSSTimingData {
  public:
-  static std::unique_ptr<CSSAnimationData> Create() {
-    return base::WrapUnique(new CSSAnimationData);
-  }
+  CSSAnimationData();
+  explicit CSSAnimationData(const CSSAnimationData&);
 
   std::unique_ptr<CSSAnimationData> Clone() const {
     return base::WrapUnique(new CSSAnimationData(*this));
@@ -60,9 +59,6 @@
   static EAnimPlayState InitialPlayState() { return EAnimPlayState::kPlaying; }
 
  private:
-  CSSAnimationData();
-  explicit CSSAnimationData(const CSSAnimationData&);
-
   Vector<AtomicString> name_list_;
   Vector<double> iteration_count_list_;
   Vector<Timing::PlaybackDirection> direction_list_;
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.cc b/third_party/blink/renderer/core/animation/css/css_animations.cc
index 4c4699e2..c26c9ac 100644
--- a/third_party/blink/renderer/core/animation/css/css_animations.cc
+++ b/third_party/blink/renderer/core/animation/css/css_animations.cc
@@ -794,7 +794,7 @@
   TransitionKeyframeVector keyframes;
 
   TransitionKeyframe* start_keyframe = TransitionKeyframe::Create(property);
-  start_keyframe->SetValue(TypedInterpolationValue::Create(
+  start_keyframe->SetValue(std::make_unique<TypedInterpolationValue>(
       *transition_type, start.interpolable_value->Clone(),
       start.non_interpolable_value));
   start_keyframe->SetOffset(0);
@@ -803,7 +803,7 @@
   keyframes.push_back(start_keyframe);
 
   TransitionKeyframe* end_keyframe = TransitionKeyframe::Create(property);
-  end_keyframe->SetValue(TypedInterpolationValue::Create(
+  end_keyframe->SetValue(std::make_unique<TypedInterpolationValue>(
       *transition_type, end.interpolable_value->Clone(),
       end.non_interpolable_value));
   end_keyframe->SetOffset(1);
diff --git a/third_party/blink/renderer/core/animation/css_path_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_path_interpolation_type.cc
index 4c1c579..691c4360d 100644
--- a/third_party/blink/renderer/core/animation/css_path_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_path_interpolation_type.cc
@@ -94,18 +94,11 @@
 
 class InheritedPathChecker : public CSSInterpolationType::CSSConversionChecker {
  public:
-  static std::unique_ptr<InheritedPathChecker> Create(
-      const CSSProperty& property,
-      scoped_refptr<StylePath> style_path) {
-    return base::WrapUnique(
-        new InheritedPathChecker(property, std::move(style_path)));
-  }
-
- private:
   InheritedPathChecker(const CSSProperty& property,
                        scoped_refptr<StylePath> style_path)
       : property_(property), style_path_(std::move(style_path)) {}
 
+ private:
   bool IsValid(const StyleResolverState& state,
                const InterpolationValue& underlying) const final {
     return GetPath(property_, *state.ParentStyle()) == style_path_.get();
@@ -121,7 +114,7 @@
   if (!state.ParentStyle())
     return nullptr;
 
-  conversion_checkers.push_back(InheritedPathChecker::Create(
+  conversion_checkers.push_back(std::make_unique<InheritedPathChecker>(
       CssProperty(), GetPath(CssProperty(), *state.ParentStyle())));
   return PathInterpolationFunctions::ConvertValue(
       GetPath(CssProperty(), *state.ParentStyle()),
diff --git a/third_party/blink/renderer/core/animation/invalidatable_interpolation.cc b/third_party/blink/renderer/core/animation/invalidatable_interpolation.cc
index 1f765f2..5b38eb6 100644
--- a/third_party/blink/renderer/core/animation/invalidatable_interpolation.cc
+++ b/third_party/blink/renderer/core/animation/invalidatable_interpolation.cc
@@ -71,7 +71,7 @@
         conversion_checkers);
     AddConversionCheckers(*interpolation_type, conversion_checkers);
     if (result) {
-      return TypedInterpolationValue::Create(
+      return std::make_unique<TypedInterpolationValue>(
           *interpolation_type, std::move(result.interpolable_value),
           std::move(result.non_interpolable_value));
     }
@@ -96,7 +96,7 @@
     InterpolationValue result =
         interpolation_type->MaybeConvertUnderlyingValue(environment);
     if (result) {
-      return TypedInterpolationValue::Create(
+      return std::make_unique<TypedInterpolationValue>(
           *interpolation_type, std::move(result.interpolable_value),
           std::move(result.non_interpolable_value));
     }
diff --git a/third_party/blink/renderer/core/animation/primitive_interpolation.h b/third_party/blink/renderer/core/animation/primitive_interpolation.h
index 90dc5ef8..d9a15b0 100644
--- a/third_party/blink/renderer/core/animation/primitive_interpolation.h
+++ b/third_party/blink/renderer/core/animation/primitive_interpolation.h
@@ -59,8 +59,8 @@
   const InterpolationType& GetType() const { return type_; }
 
   std::unique_ptr<TypedInterpolationValue> InitialValue() const {
-    return TypedInterpolationValue::Create(type_, start_->Clone(),
-                                           non_interpolable_value_);
+    return std::make_unique<TypedInterpolationValue>(type_, start_->Clone(),
+                                                     non_interpolable_value_);
   }
 
  private:
diff --git a/third_party/blink/renderer/core/animation/transition_interpolation.cc b/third_party/blink/renderer/core/animation/transition_interpolation.cc
index b2818c7..d592d8b 100644
--- a/third_party/blink/renderer/core/animation/transition_interpolation.cc
+++ b/third_party/blink/renderer/core/animation/transition_interpolation.cc
@@ -55,7 +55,7 @@
 
 std::unique_ptr<TypedInterpolationValue>
 TransitionInterpolation::GetInterpolatedValue() const {
-  return TypedInterpolationValue::Create(
+  return std::make_unique<TypedInterpolationValue>(
       type_, CurrentInterpolableValue().Clone(), CurrentNonInterpolableValue());
 }
 
diff --git a/third_party/blink/renderer/core/animation/typed_interpolation_value.h b/third_party/blink/renderer/core/animation/typed_interpolation_value.h
index 1b4014c..389df39c 100644
--- a/third_party/blink/renderer/core/animation/typed_interpolation_value.h
+++ b/third_party/blink/renderer/core/animation/typed_interpolation_value.h
@@ -22,19 +22,21 @@
   USING_FAST_MALLOC(TypedInterpolationValue);
 
  public:
-  static std::unique_ptr<TypedInterpolationValue> Create(
+  TypedInterpolationValue(
       const InterpolationType& type,
       std::unique_ptr<InterpolableValue> interpolable_value,
-      scoped_refptr<NonInterpolableValue> non_interpolable_value = nullptr) {
-    return base::WrapUnique(
-        new TypedInterpolationValue(type, std::move(interpolable_value),
-                                    std::move(non_interpolable_value)));
+      scoped_refptr<NonInterpolableValue> non_interpolable_value = nullptr)
+      : type_(type),
+        value_(std::move(interpolable_value),
+               std::move(non_interpolable_value)) {
+    DCHECK(value_.interpolable_value);
   }
 
   std::unique_ptr<TypedInterpolationValue> Clone() const {
     InterpolationValue copy = value_.Clone();
-    return Create(type_, std::move(copy.interpolable_value),
-                  std::move(copy.non_interpolable_value));
+    return std::make_unique<TypedInterpolationValue>(
+        type_, std::move(copy.interpolable_value),
+        std::move(copy.non_interpolable_value));
   }
 
   const InterpolationType& GetType() const { return type_; }
@@ -49,16 +51,6 @@
   InterpolationValue& MutableValue() { return value_; }
 
  private:
-  TypedInterpolationValue(
-      const InterpolationType& type,
-      std::unique_ptr<InterpolableValue> interpolable_value,
-      scoped_refptr<NonInterpolableValue> non_interpolable_value)
-      : type_(type),
-        value_(std::move(interpolable_value),
-               std::move(non_interpolable_value)) {
-    DCHECK(value_.interpolable_value);
-  }
-
   const InterpolationType& type_;
   InterpolationValue value_;
 };
diff --git a/third_party/blink/renderer/core/css/css_axis_value.cc b/third_party/blink/renderer/core/css/css_axis_value.cc
index 554dbcb..ecfda0e5 100644
--- a/third_party/blink/renderer/core/css/css_axis_value.cc
+++ b/third_party/blink/renderer/core/css/css_axis_value.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 
 namespace blink {
+namespace cssvalue {
 
 CSSAxisValue::CSSAxisValue(CSSValueID axis_name)
     : CSSValueList(kAxisClass, kSpaceSeparator), axis_name_(axis_name) {
@@ -76,4 +77,5 @@
   return To<CSSPrimitiveValue>(Item(2)).GetDoubleValue();
 }
 
+}  // namespace cssvalue
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_axis_value.h b/third_party/blink/renderer/core/css/css_axis_value.h
index 29a67d5..185cbcb 100644
--- a/third_party/blink/renderer/core/css/css_axis_value.h
+++ b/third_party/blink/renderer/core/css/css_axis_value.h
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/platform/wtf/casting.h"
 
 namespace blink {
+namespace cssvalue {
 
 class CSSAxisValue : public CSSValueList {
  public:
@@ -39,8 +40,10 @@
   CSSValueID axis_name_;
 };
 
+}  // namespace cssvalue
+
 template <>
-struct DowncastTraits<CSSAxisValue> {
+struct DowncastTraits<cssvalue::CSSAxisValue> {
   static bool AllowFrom(const CSSValue& value) { return value.IsAxisValue(); }
 };
 
diff --git a/third_party/blink/renderer/core/css/css_grid_template_areas_value.cc b/third_party/blink/renderer/core/css/css_grid_template_areas_value.cc
index f1521668..57a7d1e 100644
--- a/third_party/blink/renderer/core/css/css_grid_template_areas_value.cc
+++ b/third_party/blink/renderer/core/css/css_grid_template_areas_value.cc
@@ -33,6 +33,7 @@
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 
 namespace blink {
+namespace cssvalue {
 
 CSSGridTemplateAreasValue::CSSGridTemplateAreasValue(
     const NamedGridAreaMap& grid_area_map,
@@ -81,4 +82,5 @@
          row_count_ == other.row_count_ && column_count_ == other.column_count_;
 }
 
+}  // namespace cssvalue
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_grid_template_areas_value.h b/third_party/blink/renderer/core/css/css_grid_template_areas_value.h
index 8f31aa2..54e7f03 100644
--- a/third_party/blink/renderer/core/css/css_grid_template_areas_value.h
+++ b/third_party/blink/renderer/core/css/css_grid_template_areas_value.h
@@ -37,6 +37,7 @@
 #include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
 
 namespace blink {
+namespace cssvalue {
 
 class CSSGridTemplateAreasValue : public CSSValue {
  public:
@@ -71,8 +72,10 @@
   size_t column_count_;
 };
 
+}  // namespace cssvalue
+
 template <>
-struct DowncastTraits<CSSGridTemplateAreasValue> {
+struct DowncastTraits<cssvalue::CSSGridTemplateAreasValue> {
   static bool AllowFrom(const CSSValue& value) {
     return value.IsGridTemplateAreasValue();
   }
diff --git a/third_party/blink/renderer/core/css/properties/longhands/grid_template_areas_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/grid_template_areas_custom.cc
index ce02ce7..a634d96e 100644
--- a/third_party/blink/renderer/core/css/properties/longhands/grid_template_areas_custom.cc
+++ b/third_party/blink/renderer/core/css/properties/longhands/grid_template_areas_custom.cc
@@ -40,8 +40,8 @@
   if (row_count == 0)
     return nullptr;
   DCHECK(column_count);
-  return CSSGridTemplateAreasValue::Create(grid_area_map, row_count,
-                                           column_count);
+  return cssvalue::CSSGridTemplateAreasValue::Create(grid_area_map, row_count,
+                                                     column_count);
 }
 
 const CSSValue* GridTemplateAreas::CSSValueFromComputedStyleInternal(
@@ -55,9 +55,9 @@
     return CSSIdentifierValue::Create(CSSValueNone);
   }
 
-  return CSSGridTemplateAreasValue::Create(style.NamedGridArea(),
-                                           style.NamedGridAreaRowCount(),
-                                           style.NamedGridAreaColumnCount());
+  return cssvalue::CSSGridTemplateAreasValue::Create(
+      style.NamedGridArea(), style.NamedGridAreaRowCount(),
+      style.NamedGridAreaColumnCount());
 }
 
 void GridTemplateAreas::ApplyInitial(StyleResolverState& state) const {
@@ -85,7 +85,8 @@
     return;
   }
 
-  const auto& grid_template_areas_value = To<CSSGridTemplateAreasValue>(value);
+  const auto& grid_template_areas_value =
+      To<cssvalue::CSSGridTemplateAreasValue>(value);
   const NamedGridAreaMap& new_named_grid_areas =
       grid_template_areas_value.GridAreaMap();
 
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 2f41bc3..17b63b8 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -713,13 +713,8 @@
   if (frame_) {
     DCHECK(frame_->GetPage());
     ProvideContextFeaturesToDocumentFrom(*this, *frame_->GetPage());
-
-    fetcher_ = frame_->Loader().GetDocumentLoader()->Fetcher();
-    frame_->Loader()
-        .GetDocumentLoader()
-        ->ProvideDocumentToResourceFetcherProperties(*this);
-    fetcher_->SetConsoleLogger(this);
-
+    fetcher_ = FrameFetchContext::CreateFetcherForCommittedDocument(
+        *frame_->Loader().GetDocumentLoader(), *this);
     // TODO(dcheng): Why does this need to check that DOMWindow is non-null?
     CustomElementRegistry* registry =
         frame_->DomWindow() ? frame_->DomWindow()->MaybeCustomElements()
@@ -1202,8 +1197,7 @@
 }
 
 void Document::ClearImportsController() {
-  if (!Loader())
-    fetcher_->ClearContext();
+  fetcher_->ClearContext();
   imports_controller_ = nullptr;
 }
 
@@ -2816,13 +2810,7 @@
   DocumentShutdownNotifier::NotifyContextDestroyed();
   SynchronousMutationNotifier::NotifyContextDestroyed();
 
-  // If this Document is associated with a live DocumentLoader, the
-  // DocumentLoader will take care of clearing the FetchContext. Deferring
-  // to the DocumentLoader when possible also prevents prematurely clearing
-  // the context in the case where multiple Documents end up associated with
-  // a single DocumentLoader (e.g., navigating to a javascript: url).
-  if (!Loader())
-    fetcher_->ClearContext();
+  fetcher_->ClearContext();
   // If this document is the master for an HTMLImportsController, sever that
   // relationship. This ensures that we don't leave import loads in flight,
   // thinking they should have access to a valid frame when they don't.
@@ -3240,8 +3228,8 @@
 }
 
 void Document::WillInsertBody() {
-  if (auto* loader = Loader())
-    loader->Fetcher()->LoosenLoadThrottlingPolicy();
+  if (Loader())
+    fetcher_->LoosenLoadThrottlingPolicy();
 
   // If we get to the <body> try to resume commits since we should have content
   // to paint now.
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc
index c9d47e3..f428654 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.cc
+++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -1302,12 +1302,9 @@
 }
 
 void LocalDOMWindow::WarnUnusedPreloads(TimerBase* base) {
-  if (!GetFrame() || !GetFrame()->Loader().GetDocumentLoader())
+  if (!document() || !document()->Fetcher())
     return;
-  ResourceFetcher* fetcher =
-      GetFrame()->Loader().GetDocumentLoader()->Fetcher();
-  DCHECK(fetcher);
-  Vector<KURL> urls = fetcher->GetUrlsOfUnusedPreloads();
+  Vector<KURL> urls = document()->Fetcher()->GetUrlsOfUnusedPreloads();
   for (const KURL& url : urls) {
     String message =
         "The resource " + url.GetString() + " was preloaded using link " +
@@ -1329,12 +1326,11 @@
     timing.MarkLoadEventStart();
     DispatchEvent(load_event, document());
     timing.MarkLoadEventEnd();
-    DCHECK(document_loader->Fetcher());
     // If fetcher->countPreloads() is not empty here, it's full of link
     // preloads, as speculatove preloads were cleared at DCL.
     if (GetFrame() &&
         document_loader == GetFrame()->Loader().GetDocumentLoader() &&
-        document_loader->Fetcher()->CountPreloads()) {
+        document()->Fetcher()->CountPreloads()) {
       unused_preloads_timer_.StartOneShot(kUnusedPreloadTimeout, FROM_HERE);
     }
   } else {
diff --git a/third_party/blink/renderer/core/inspector/BUILD.gn b/third_party/blink/renderer/core/inspector/BUILD.gn
index ce5a13bf..e7964cd 100644
--- a/third_party/blink/renderer/core/inspector/BUILD.gn
+++ b/third_party/blink/renderer/core/inspector/BUILD.gn
@@ -33,6 +33,8 @@
     "dom_patch_support.h",
     "identifiers_factory.cc",
     "identifiers_factory.h",
+    "inspect_tools.cc",
+    "inspect_tools.h",
     "inspected_frames.cc",
     "inspected_frames.h",
     "inspector_animation_agent.cc",
diff --git a/third_party/blink/renderer/core/inspector/inspect_tools.cc b/third_party/blink/renderer/core/inspector/inspect_tools.cc
new file mode 100644
index 0000000..6d74893
--- /dev/null
+++ b/third_party/blink/renderer/core/inspector/inspect_tools.cc
@@ -0,0 +1,285 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/core/inspector/inspect_tools.h"
+
+#include "third_party/blink/public/platform/web_gesture_event.h"
+#include "third_party/blink/public/platform/web_input_event.h"
+#include "third_party/blink/public/platform/web_input_event_result.h"
+#include "third_party/blink/public/platform/web_keyboard_event.h"
+#include "third_party/blink/public/platform/web_pointer_event.h"
+#include "third_party/blink/renderer/core/dom/shadow_root.h"
+#include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/core/frame/root_frame_viewport.h"
+#include "third_party/blink/renderer/core/frame/visual_viewport.h"
+#include "third_party/blink/renderer/core/html/html_frame_owner_element.h"
+#include "third_party/blink/renderer/core/inspector/inspector_dom_agent.h"
+#include "third_party/blink/renderer/core/layout/hit_test_location.h"
+#include "third_party/blink/renderer/core/layout/layout_view.h"
+#include "third_party/blink/renderer/core/page/chrome_client.h"
+#include "third_party/blink/renderer/core/page/page.h"
+#include "third_party/blink/renderer/platform/keyboard_codes.h"
+
+namespace blink {
+
+namespace {
+
+Node* HoveredNodeForPoint(LocalFrame* frame,
+                          const IntPoint& point_in_root_frame,
+                          bool ignore_pointer_events_none) {
+  HitTestRequest::HitTestRequestType hit_type =
+      HitTestRequest::kMove | HitTestRequest::kReadOnly |
+      HitTestRequest::kAllowChildFrameContent;
+  if (ignore_pointer_events_none)
+    hit_type |= HitTestRequest::kIgnorePointerEventsNone;
+  HitTestRequest request(hit_type);
+  HitTestLocation location(
+      frame->View()->ConvertFromRootFrame(point_in_root_frame));
+  HitTestResult result(request, location);
+  frame->ContentLayoutObject()->HitTest(location, result);
+  Node* node = result.InnerPossiblyPseudoNode();
+  while (node && node->getNodeType() == Node::kTextNode)
+    node = node->parentNode();
+  return node;
+}
+
+Node* HoveredNodeForEvent(LocalFrame* frame,
+                          const WebGestureEvent& event,
+                          bool ignore_pointer_events_none) {
+  return HoveredNodeForPoint(frame,
+                             RoundedIntPoint(event.PositionInRootFrame()),
+                             ignore_pointer_events_none);
+}
+
+Node* HoveredNodeForEvent(LocalFrame* frame,
+                          const WebMouseEvent& event,
+                          bool ignore_pointer_events_none) {
+  return HoveredNodeForPoint(frame,
+                             RoundedIntPoint(event.PositionInRootFrame()),
+                             ignore_pointer_events_none);
+}
+
+Node* HoveredNodeForEvent(LocalFrame* frame,
+                          const WebPointerEvent& event,
+                          bool ignore_pointer_events_none) {
+  WebPointerEvent transformed_point = event.WebPointerEventInRootFrame();
+  return HoveredNodeForPoint(
+      frame, RoundedIntPoint(transformed_point.PositionInWidget()),
+      ignore_pointer_events_none);
+}
+
+}  // namespace
+
+// SearchingForNodeTool --------------------------------------------------------
+
+SearchingForNodeTool::SearchingForNodeTool(InspectorDOMAgent* dom_agent,
+                                           bool ua_shadow,
+                                           const String& config)
+    : dom_agent_(dom_agent), ua_shadow_(ua_shadow) {
+  std::unique_ptr<protocol::Value> value =
+      protocol::StringUtil::parseJSON(config);
+  if (!value)
+    return;
+  protocol::ErrorSupport errors;
+  std::unique_ptr<protocol::Overlay::HighlightConfig> highlight_config =
+      protocol::Overlay::HighlightConfig::fromValue(value.get(), &errors);
+  inspect_mode_highlight_config_ =
+      InspectorOverlayAgent::ToHighlightConfig(highlight_config.get());
+}
+
+void SearchingForNodeTool::Trace(blink::Visitor* visitor) {
+  InspectTool::Trace(visitor);
+  visitor->Trace(dom_agent_);
+  visitor->Trace(hovered_node_for_inspect_mode_);
+}
+
+bool SearchingForNodeTool::HandleMouseMove(const WebMouseEvent& event) {
+  LocalFrame* frame = overlay_->GetFrame();
+  if (!frame || !frame->View() || !frame->ContentLayoutObject())
+    return false;
+  Node* node = HoveredNodeForEvent(
+      frame, event, event.GetModifiers() & WebInputEvent::kShiftKey);
+
+  // Do not highlight within user agent shadow root unless requested.
+  if (!ua_shadow_) {
+    ShadowRoot* shadow_root = InspectorDOMAgent::UserAgentShadowRoot(node);
+    if (shadow_root)
+      node = &shadow_root->host();
+  }
+
+  // Shadow roots don't have boxes - use host element instead.
+  if (node && node->IsShadowRoot())
+    node = node->ParentOrShadowHostNode();
+
+  if (!node)
+    return true;
+
+  if (auto* frame_owner = DynamicTo<HTMLFrameOwnerElement>(node)) {
+    if (!IsA<LocalFrame>(frame_owner->ContentFrame())) {
+      // Do not consume event so that remote frame can handle it.
+      overlay_->hideHighlight();
+      hovered_node_for_inspect_mode_.Clear();
+      return false;
+    }
+  }
+
+  Node* event_target = (event.GetModifiers() & WebInputEvent::kShiftKey)
+                           ? HoveredNodeForEvent(frame, event, false)
+                           : nullptr;
+  if (event_target == node)
+    event_target = nullptr;
+
+  if (node && inspect_mode_highlight_config_) {
+    hovered_node_for_inspect_mode_ = node;
+    NodeHighlightRequested(node);
+    bool omit_tooltip = event.GetModifiers() &
+                        (WebInputEvent::kControlKey | WebInputEvent::kMetaKey);
+    overlay_->InnerHighlightNode(node, event_target, String(),
+                                 *inspect_mode_highlight_config_, omit_tooltip);
+  }
+  return true;
+}
+
+bool SearchingForNodeTool::HandleMouseDown(const WebMouseEvent& event,
+                                           bool* swallow_next_mouse_up) {
+  if (hovered_node_for_inspect_mode_) {
+    *swallow_next_mouse_up = true;
+    overlay_->Inspect(hovered_node_for_inspect_mode_.Get());
+    hovered_node_for_inspect_mode_.Clear();
+    return true;
+  }
+  return false;
+}
+
+bool SearchingForNodeTool::HandleGestureTapEvent(const WebGestureEvent& event) {
+  Node* node = HoveredNodeForEvent(overlay_->GetFrame(), event, false);
+  if (node && inspect_mode_highlight_config_) {
+    overlay_->InnerHighlightNode(node, nullptr, String(),
+                                 *inspect_mode_highlight_config_, false);
+    overlay_->Inspect(node);
+    return true;
+  }
+  return false;
+}
+
+bool SearchingForNodeTool::HandlePointerEvent(const WebPointerEvent& event) {
+  Node* node = HoveredNodeForEvent(overlay_->GetFrame(), event, false);
+  if (node && inspect_mode_highlight_config_) {
+    overlay_->InnerHighlightNode(node, nullptr, String(),
+                                 *inspect_mode_highlight_config_, false);
+    overlay_->Inspect(node);
+    return true;
+  }
+  return false;
+}
+
+void SearchingForNodeTool::NodeHighlightRequested(Node* node) {
+  while (node && !node->IsElementNode() && !node->IsDocumentNode() &&
+         !node->IsDocumentFragment())
+    node = node->ParentOrShadowHostNode();
+
+  if (!node)
+    return;
+
+  int node_id = dom_agent_->PushNodePathToFrontend(node);
+  if (node_id)
+    frontend_->nodeHighlightRequested(node_id);
+}
+
+// ScreenshotTool --------------------------------------------------------------
+
+void ScreenshotTool::DoInit() {
+  auto& client = overlay_->GetFrame()->GetPage()->GetChromeClient();
+  client.SetCursorOverridden(false);
+  client.SetCursor(CrossCursor(), overlay_->GetFrame());
+  client.SetCursorOverridden(true);
+}
+
+bool ScreenshotTool::HandleMouseUp(const WebMouseEvent& event) {
+  if (screenshot_anchor_ == IntPoint::Zero())
+    return true;
+  float scale = 1.0f;
+  IntPoint p1 = screenshot_anchor_;
+  IntPoint p2 = screenshot_position_;
+  if (LocalFrame* frame = overlay_->GetFrame()) {
+    scale = frame->GetPage()->PageScaleFactor();
+    p1 = frame->View()->ConvertFromRootFrame(p1);
+    p2 = frame->View()->ConvertFromRootFrame(p2);
+    if (const RootFrameViewport* root_frame_viewport =
+            frame->View()->GetRootFrameViewport()) {
+      IntSize scroll_offset = FlooredIntSize(
+          root_frame_viewport->LayoutViewport().GetScrollOffset());
+      p1 += scroll_offset;
+      p2 += scroll_offset;
+    }
+  }
+  float dp_to_dip = 1.f / overlay_->WindowToViewportScale();
+  p1.Scale(scale, dp_to_dip);
+  p2.Scale(scale, dp_to_dip);
+  // Points are in device independent pixels (dip) now.
+  IntRect rect =
+      UnionRectEvenIfEmpty(IntRect(p1, IntSize()), IntRect(p2, IntSize()));
+  if (rect.Width() < 5 || rect.Height() < 5) {
+    screenshot_anchor_ = IntPoint::Zero();
+    return true;
+  }
+  frontend_->screenshotRequested(protocol::Page::Viewport::create()
+                                     .setX(rect.X())
+                                     .setY(rect.Y())
+                                     .setWidth(rect.Width())
+                                     .setHeight(rect.Height())
+                                     .setScale(scale)
+                                     .build());
+  return true;
+}
+
+bool ScreenshotTool::HandleKeyboardEvent(const WebKeyboardEvent& event,
+                                         bool* swallow_next_escape_up) {
+  if (event.GetType() == WebInputEvent::kRawKeyDown &&
+      event.windows_key_code == VKEY_ESCAPE &&
+      screenshot_anchor_ != IntPoint::Zero()) {
+    screenshot_anchor_ = IntPoint::Zero();
+    *swallow_next_escape_up = true;
+    return true;
+  }
+  return false;
+}
+
+bool ScreenshotTool::HandleMouseDown(const WebMouseEvent& event,
+                                     bool* swallow_next_mouse_up) {
+  screenshot_anchor_ = RoundedIntPoint(event.PositionInRootFrame());
+  screenshot_position_ = screenshot_anchor_;
+  return true;
+}
+
+bool ScreenshotTool::HandleMouseMove(const WebMouseEvent& event) {
+  screenshot_position_ = RoundedIntPoint(event.PositionInRootFrame());
+  return true;
+}
+
+void ScreenshotTool::Draw(float scale) {
+  if (screenshot_anchor_ == IntPoint::Zero())
+    return;
+  const VisualViewport& visual_viewport =
+      overlay_->GetFrame()->GetPage()->GetVisualViewport();
+  IntPoint p1 = visual_viewport.RootFrameToViewport(screenshot_anchor_);
+  IntPoint p2 = visual_viewport.RootFrameToViewport(screenshot_position_);
+  p1.Scale(scale, scale);
+  p2.Scale(scale, scale);
+  std::unique_ptr<protocol::DictionaryValue> data =
+      protocol::DictionaryValue::create();
+  data->setInteger("x1", p1.X());
+  data->setInteger("y1", p1.Y());
+  data->setInteger("x2", p2.X());
+  data->setInteger("y2", p2.Y());
+  overlay_->EvaluateInOverlay("drawScreenshotBorder", std::move(data));
+}
+
+// PausedInDebuggerTool --------------------------------------------------------
+
+void PausedInDebuggerTool::Draw(float scale) {
+  overlay_->EvaluateInOverlay("drawPausedInDebuggerMessage", message_);
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspect_tools.h b/third_party/blink/renderer/core/inspector/inspect_tools.h
new file mode 100644
index 0000000..5389bf48
--- /dev/null
+++ b/third_party/blink/renderer/core/inspector/inspect_tools.h
@@ -0,0 +1,66 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECT_TOOLS_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECT_TOOLS_H_
+
+#include "base/macros.h"
+#include "third_party/blink/renderer/core/inspector/inspector_overlay_agent.h"
+
+namespace blink {
+
+class WebMouseEvent;
+class WebPointerEvent;
+
+class SearchingForNodeTool : public InspectTool {
+ public:
+  SearchingForNodeTool(InspectorDOMAgent* dom_agent,
+                       bool ua_shadow,
+                       const String& highlight_config);
+
+ private:
+  bool HandleMouseDown(const WebMouseEvent& event,
+                       bool* swallow_next_mouse_up) override;
+  bool HandleMouseMove(const WebMouseEvent& event) override;
+  bool HandleGestureTapEvent(const WebGestureEvent&) override;
+  bool HandlePointerEvent(const WebPointerEvent&) override;
+  void NodeHighlightRequested(Node*);
+  void Trace(blink::Visitor* visitor) override;
+
+  Member<InspectorDOMAgent> dom_agent_;
+  bool ua_shadow_;
+  Member<Node> hovered_node_for_inspect_mode_;
+  std::unique_ptr<InspectorHighlightConfig> inspect_mode_highlight_config_;
+};
+
+class ScreenshotTool : public InspectTool {
+ public:
+  ScreenshotTool() = default;
+
+ private:
+  bool HandleKeyboardEvent(const WebKeyboardEvent&,
+                           bool* swallow_next_escape_up) override;
+  bool HandleMouseDown(const WebMouseEvent& event,
+                       bool* swallow_next_mouse_up) override;
+  bool HandleMouseMove(const WebMouseEvent& event) override;
+  bool HandleMouseUp(const WebMouseEvent& event) override;
+  void Draw(float scale) override;
+  void DoInit() override;
+
+  IntPoint screenshot_anchor_;
+  IntPoint screenshot_position_;
+};
+
+class PausedInDebuggerTool : public InspectTool {
+ public:
+  explicit PausedInDebuggerTool(const String& message) : message_(message) {}
+
+ private:
+  void Draw(float scale) override;
+  String message_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECT_TOOLS_H_
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
index 621a17c..cc7a1969 100644
--- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -62,6 +62,7 @@
 #include "third_party/blink/renderer/core/html/html_frame_owner_element.h"
 #include "third_party/blink/renderer/core/input/event_handler.h"
 #include "third_party/blink/renderer/core/inspector/identifiers_factory.h"
+#include "third_party/blink/renderer/core/inspector/inspect_tools.h"
 #include "third_party/blink/renderer/core/inspector/inspected_frames.h"
 #include "third_party/blink/renderer/core/inspector/inspector_css_agent.h"
 #include "third_party/blink/renderer/core/inspector/inspector_dom_agent.h"
@@ -86,49 +87,6 @@
 using protocol::Response;
 
 namespace {
-Node* HoveredNodeForPoint(LocalFrame* frame,
-                          const IntPoint& point_in_root_frame,
-                          bool ignore_pointer_events_none) {
-  HitTestRequest::HitTestRequestType hit_type =
-      HitTestRequest::kMove | HitTestRequest::kReadOnly |
-      HitTestRequest::kAllowChildFrameContent;
-  if (ignore_pointer_events_none)
-    hit_type |= HitTestRequest::kIgnorePointerEventsNone;
-  HitTestRequest request(hit_type);
-  HitTestLocation location(
-      frame->View()->ConvertFromRootFrame(point_in_root_frame));
-  HitTestResult result(request, location);
-  frame->ContentLayoutObject()->HitTest(location, result);
-  Node* node = result.InnerPossiblyPseudoNode();
-  while (node && node->getNodeType() == Node::kTextNode)
-    node = node->parentNode();
-  return node;
-}
-
-Node* HoveredNodeForEvent(LocalFrame* frame,
-                          const WebGestureEvent& event,
-                          bool ignore_pointer_events_none) {
-  return HoveredNodeForPoint(frame,
-                             RoundedIntPoint(event.PositionInRootFrame()),
-                             ignore_pointer_events_none);
-}
-
-Node* HoveredNodeForEvent(LocalFrame* frame,
-                          const WebMouseEvent& event,
-                          bool ignore_pointer_events_none) {
-  return HoveredNodeForPoint(frame,
-                             RoundedIntPoint(event.PositionInRootFrame()),
-                             ignore_pointer_events_none);
-}
-
-Node* HoveredNodeForEvent(LocalFrame* frame,
-                          const WebPointerEvent& event,
-                          bool ignore_pointer_events_none) {
-  WebPointerEvent transformed_point = event.WebPointerEventInRootFrame();
-  return HoveredNodeForPoint(
-      frame, RoundedIntPoint(transformed_point.PositionInWidget()),
-      ignore_pointer_events_none);
-}
 
 bool ParseQuad(std::unique_ptr<protocol::Array<double>> quad_array,
                FloatQuad* quad) {
@@ -183,134 +141,6 @@
   visitor->Trace(overlay_);
 }
 
-// SearchingForNodeTool --------------------------------------------------------
-
-class SearchingForNodeTool : public InspectTool {
- public:
-  SearchingForNodeTool(InspectorDOMAgent* dom_agent,
-                       bool ua_shadow,
-                       const String& highlight_config);
-
- private:
-  bool HandleMouseDown(const WebMouseEvent& event,
-                       bool* swallow_next_mouse_up) override;
-  bool HandleMouseMove(const WebMouseEvent& event) override;
-  bool HandleGestureTapEvent(const WebGestureEvent&) override;
-  bool HandlePointerEvent(const WebPointerEvent&) override;
-  void NodeHighlightRequested(Node*);
-  void Trace(blink::Visitor* visitor) override;
-
-  Member<InspectorDOMAgent> dom_agent_;
-  bool ua_shadow_;
-  Member<Node> hovered_node_for_inspect_mode_;
-  std::unique_ptr<InspectorHighlightConfig> inspect_mode_highlight_config_;
-};
-
-SearchingForNodeTool::SearchingForNodeTool(InspectorDOMAgent* dom_agent,
-                                           bool ua_shadow,
-                                           const String& config)
-    : dom_agent_(dom_agent), ua_shadow_(ua_shadow) {
-  std::unique_ptr<protocol::Value> value =
-      protocol::StringUtil::parseJSON(config);
-  if (!value)
-    return;
-  protocol::ErrorSupport errors;
-  std::unique_ptr<protocol::Overlay::HighlightConfig> highlight_config =
-      protocol::Overlay::HighlightConfig::fromValue(value.get(), &errors);
-  overlay_->HighlightConfigFromInspectorObject(std::move(highlight_config),
-                                               &inspect_mode_highlight_config_);
-}
-
-void SearchingForNodeTool::Trace(blink::Visitor* visitor) {
-  InspectTool::Trace(visitor);
-  visitor->Trace(dom_agent_);
-  visitor->Trace(hovered_node_for_inspect_mode_);
-}
-
-// ScreenshotTool --------------------------------------------------------------
-
-class ScreenshotTool : public InspectTool {
- public:
-  ScreenshotTool() = default;
-
- private:
-  bool HandleKeyboardEvent(const WebKeyboardEvent&,
-                           bool* swallow_next_escape_up) override;
-  bool HandleMouseDown(const WebMouseEvent& event,
-                       bool* swallow_next_mouse_up) override;
-  bool HandleMouseMove(const WebMouseEvent& event) override;
-  bool HandleMouseUp(const WebMouseEvent& event) override;
-  void Draw(float scale) override;
-  void DoInit() override;
-
-  IntPoint screenshot_anchor_;
-  IntPoint screenshot_position_;
-};
-
-void ScreenshotTool::DoInit() {
-  auto& client = overlay_->GetFrame()->GetPage()->GetChromeClient();
-  client.SetCursorOverridden(false);
-  client.SetCursor(CrossCursor(), overlay_->GetFrame());
-  client.SetCursorOverridden(true);
-}
-
-bool ScreenshotTool::HandleKeyboardEvent(const WebKeyboardEvent& event,
-                                         bool* swallow_next_escape_up) {
-  if (event.GetType() == WebInputEvent::kRawKeyDown &&
-      event.windows_key_code == VKEY_ESCAPE &&
-      screenshot_anchor_ != IntPoint::Zero()) {
-    screenshot_anchor_ = IntPoint::Zero();
-    *swallow_next_escape_up = true;
-    return true;
-  }
-  return false;
-}
-
-bool ScreenshotTool::HandleMouseDown(const WebMouseEvent& event,
-                                     bool* swallow_next_mouse_up) {
-  screenshot_anchor_ = RoundedIntPoint(event.PositionInRootFrame());
-  screenshot_position_ = screenshot_anchor_;
-  return true;
-}
-
-bool ScreenshotTool::HandleMouseMove(const WebMouseEvent& event) {
-  screenshot_position_ = RoundedIntPoint(event.PositionInRootFrame());
-  return true;
-}
-
-void ScreenshotTool::Draw(float scale) {
-  if (screenshot_anchor_ == IntPoint::Zero())
-    return;
-  const VisualViewport& visual_viewport =
-      overlay_->GetFrame()->GetPage()->GetVisualViewport();
-  IntPoint p1 = visual_viewport.RootFrameToViewport(screenshot_anchor_);
-  IntPoint p2 = visual_viewport.RootFrameToViewport(screenshot_position_);
-  p1.Scale(scale, scale);
-  p2.Scale(scale, scale);
-  std::unique_ptr<protocol::DictionaryValue> data =
-      protocol::DictionaryValue::create();
-  data->setInteger("x1", p1.X());
-  data->setInteger("y1", p1.Y());
-  data->setInteger("x2", p2.X());
-  data->setInteger("y2", p2.Y());
-  overlay_->EvaluateInOverlay("drawScreenshotBorder", std::move(data));
-}
-
-// PausedInDebuggerTool --------------------------------------------------------
-
-class PausedInDebuggerTool : public InspectTool {
- public:
-  PausedInDebuggerTool(const String& message) : message_(message) {}
-
- private:
-  void Draw(float scale) override;
-  String message_;
-};
-
-void PausedInDebuggerTool::Draw(float scale) {
-  overlay_->EvaluateInOverlay("drawPausedInDebuggerMessage", message_);
-}
-
 // InspectorOverlayAgent -------------------------------------------------------
 
 class InspectorOverlayAgent::InspectorPageOverlayDelegate final
@@ -1248,124 +1078,6 @@
   ScheduleUpdate();
 }
 
-bool SearchingForNodeTool::HandleMouseMove(const WebMouseEvent& event) {
-  LocalFrame* frame = overlay_->GetFrame();
-  if (!frame || !frame->View() || !frame->ContentLayoutObject())
-    return false;
-  Node* node = HoveredNodeForEvent(
-      frame, event, event.GetModifiers() & WebInputEvent::kShiftKey);
-
-  // Do not highlight within user agent shadow root unless requested.
-  if (!ua_shadow_) {
-    ShadowRoot* shadow_root = InspectorDOMAgent::UserAgentShadowRoot(node);
-    if (shadow_root)
-      node = &shadow_root->host();
-  }
-
-  // Shadow roots don't have boxes - use host element instead.
-  if (node && node->IsShadowRoot())
-    node = node->ParentOrShadowHostNode();
-
-  if (!node)
-    return true;
-
-  if (auto* frame_owner = DynamicTo<HTMLFrameOwnerElement>(node)) {
-    if (!IsA<LocalFrame>(frame_owner->ContentFrame())) {
-      // Do not consume event so that remote frame can handle it.
-      overlay_->hideHighlight();
-      hovered_node_for_inspect_mode_.Clear();
-      return false;
-    }
-  }
-
-  Node* event_target = (event.GetModifiers() & WebInputEvent::kShiftKey)
-                           ? HoveredNodeForEvent(frame, event, false)
-                           : nullptr;
-  if (event_target == node)
-    event_target = nullptr;
-
-  if (node && inspect_mode_highlight_config_) {
-    hovered_node_for_inspect_mode_ = node;
-    NodeHighlightRequested(node);
-    bool omit_tooltip = event.GetModifiers() &
-                        (WebInputEvent::kControlKey | WebInputEvent::kMetaKey);
-    overlay_->InnerHighlightNode(node, event_target, String(),
-                                 *inspect_mode_highlight_config_, omit_tooltip);
-  }
-  return true;
-}
-
-bool SearchingForNodeTool::HandleMouseDown(const WebMouseEvent& event,
-                                           bool* swallow_next_mouse_up) {
-  if (hovered_node_for_inspect_mode_) {
-    *swallow_next_mouse_up = true;
-    overlay_->Inspect(hovered_node_for_inspect_mode_.Get());
-    hovered_node_for_inspect_mode_.Clear();
-    return true;
-  }
-  return false;
-}
-
-bool ScreenshotTool::HandleMouseUp(const WebMouseEvent& event) {
-  if (screenshot_anchor_ == IntPoint::Zero())
-    return true;
-  float scale = 1.0f;
-  IntPoint p1 = screenshot_anchor_;
-  IntPoint p2 = screenshot_position_;
-  if (LocalFrame* frame = overlay_->GetFrame()) {
-    scale = frame->GetPage()->PageScaleFactor();
-    p1 = frame->View()->ConvertFromRootFrame(p1);
-    p2 = frame->View()->ConvertFromRootFrame(p2);
-    if (const RootFrameViewport* root_frame_viewport =
-            frame->View()->GetRootFrameViewport()) {
-      IntSize scroll_offset = FlooredIntSize(
-          root_frame_viewport->LayoutViewport().GetScrollOffset());
-      p1 += scroll_offset;
-      p2 += scroll_offset;
-    }
-  }
-  float dp_to_dip = 1.f / overlay_->WindowToViewportScale();
-  p1.Scale(scale, dp_to_dip);
-  p2.Scale(scale, dp_to_dip);
-  // Points are in device independent pixels (dip) now.
-  IntRect rect =
-      UnionRectEvenIfEmpty(IntRect(p1, IntSize()), IntRect(p2, IntSize()));
-  if (rect.Width() < 5 || rect.Height() < 5) {
-    screenshot_anchor_ = IntPoint::Zero();
-    return true;
-  }
-  frontend_->screenshotRequested(protocol::Page::Viewport::create()
-                                     .setX(rect.X())
-                                     .setY(rect.Y())
-                                     .setWidth(rect.Width())
-                                     .setHeight(rect.Height())
-                                     .setScale(scale)
-                                     .build());
-  return true;
-}
-
-bool SearchingForNodeTool::HandleGestureTapEvent(const WebGestureEvent& event) {
-  Node* node = HoveredNodeForEvent(overlay_->GetFrame(), event, false);
-  if (node && inspect_mode_highlight_config_) {
-    overlay_->InnerHighlightNode(node, nullptr, String(),
-                                 *inspect_mode_highlight_config_, false);
-    overlay_->Inspect(node);
-    return true;
-  }
-  return false;
-}
-
-bool SearchingForNodeTool::HandlePointerEvent(const WebPointerEvent& event) {
-  Node* node = HoveredNodeForEvent(overlay_->GetFrame(), event, false);
-  if (node && inspect_mode_highlight_config_) {
-    overlay_->InnerHighlightNode(node, nullptr, String(),
-                                 *inspect_mode_highlight_config_, false);
-    overlay_->Inspect(node);
-    return true;
-  }
-  return false;
-}
-
 Response InspectorOverlayAgent::CompositingEnabled() {
   bool main_frame = frame_impl_->ViewImpl() && !frame_impl_->Parent();
   if (!main_frame || !frame_impl_->ViewImpl()
@@ -1400,19 +1112,6 @@
   GetFrontend()->inspectNodeRequested(IdentifiersFactory::IntIdForNode(node));
 }
 
-void SearchingForNodeTool::NodeHighlightRequested(Node* node) {
-  while (node && !node->IsElementNode() && !node->IsDocumentNode() &&
-         !node->IsDocumentFragment())
-    node = node->ParentOrShadowHostNode();
-
-  if (!node)
-    return;
-
-  int node_id = dom_agent_->PushNodePathToFrontend(node);
-  if (node_id)
-    frontend_->nodeHighlightRequested(node_id);
-}
-
 Response InspectorOverlayAgent::setInspectMode(
     const String& mode,
     Maybe<protocol::Overlay::HighlightConfig> highlight_inspector_object) {
@@ -1477,9 +1176,16 @@
     return Response::Error(
         "Internal error: highlight configuration parameter is missing");
   }
-
   protocol::Overlay::HighlightConfig* config =
       highlight_inspector_object.fromJust();
+  *out_config = InspectorOverlayAgent::ToHighlightConfig(config);
+  return Response::OK();
+}
+
+// static
+std::unique_ptr<InspectorHighlightConfig>
+InspectorOverlayAgent::ToHighlightConfig(
+    protocol::Overlay::HighlightConfig* config) {
   std::unique_ptr<InspectorHighlightConfig> highlight_config =
       std::make_unique<InspectorHighlightConfig>();
   highlight_config->show_info = config->getShowInfo(false);
@@ -1502,9 +1208,7 @@
       InspectorDOMAgent::ParseColor(config->getShapeMarginColor(nullptr));
   highlight_config->css_grid =
       InspectorDOMAgent::ParseColor(config->getCssGridColor(nullptr));
-
-  *out_config = std::move(highlight_config);
-  return Response::OK();
+  return highlight_config;
 }
 
 void InspectorOverlayAgent::SetNeedsUnbufferedInput(bool unbuffered) {
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h
index 5e3b6b1..a918309eda 100644
--- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h
@@ -100,6 +100,8 @@
   USING_GARBAGE_COLLECTED_MIXIN(InspectorOverlayAgent);
 
  public:
+  static std::unique_ptr<InspectorHighlightConfig> ToHighlightConfig(
+      protocol::Overlay::HighlightConfig*);
   InspectorOverlayAgent(WebLocalFrameImpl*,
                         InspectedFrames*,
                         v8_inspector::V8InspectorSession*,
@@ -176,10 +178,6 @@
                           String selector,
                           const InspectorHighlightConfig&,
                           bool omit_tooltip);
-  protocol::Response HighlightConfigFromInspectorObject(
-      protocol::Maybe<protocol::Overlay::HighlightConfig>
-          highlight_inspector_object,
-      std::unique_ptr<InspectorHighlightConfig>*);
 
  private:
   class InspectorOverlayChromeClient;
@@ -195,7 +193,6 @@
   void DrawQuadHighlight();
   void DrawViewSize();
 
-
   Page* OverlayPage();
   LocalFrame* OverlayMainFrame();
   void Reset(const IntSize& viewport_size);
@@ -215,6 +212,10 @@
 
   void SetNeedsUnbufferedInput(bool unbuffered);
   void PickTheRightTool();
+  protocol::Response HighlightConfigFromInspectorObject(
+      protocol::Maybe<protocol::Overlay::HighlightConfig>
+          highlight_inspector_object,
+      std::unique_ptr<InspectorHighlightConfig>*);
 
   Member<WebLocalFrameImpl> frame_impl_;
   Member<InspectedFrames> inspected_frames_;
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index f87c474..6e60b60 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -62,8 +62,6 @@
 #include "third_party/blink/renderer/core/loader/appcache/application_cache_host.h"
 #include "third_party/blink/renderer/core/loader/frame_fetch_context.h"
 #include "third_party/blink/renderer/core/loader/frame_loader.h"
-#include "third_party/blink/renderer/core/loader/frame_or_imported_document.h"
-#include "third_party/blink/renderer/core/loader/frame_resource_fetcher_properties.h"
 #include "third_party/blink/renderer/core/loader/idleness_detector.h"
 #include "third_party/blink/renderer/core/loader/interactive_detector.h"
 #include "third_party/blink/renderer/core/loader/mixed_content_checker.h"
@@ -118,10 +116,6 @@
     std::unique_ptr<WebNavigationParams> navigation_params)
     : params_(std::move(navigation_params)),
       frame_(frame),
-      resource_fetcher_properties_(
-          MakeGarbageCollected<FrameResourceFetcherProperties>(
-              *MakeGarbageCollected<FrameOrImportedDocument>(*this))),
-      fetcher_(FrameFetchContext::CreateFetcher(*resource_fetcher_properties_)),
       load_type_(params_->frame_load_type),
       is_client_redirect_(params_->is_client_redirect),
       replaces_current_history_item_(false),
@@ -302,8 +296,6 @@
 void DocumentLoader::Trace(blink::Visitor* visitor) {
   visitor->Trace(archive_);
   visitor->Trace(frame_);
-  visitor->Trace(resource_fetcher_properties_);
-  visitor->Trace(fetcher_);
   visitor->Trace(history_item_);
   visitor->Trace(parser_);
   visitor->Trace(subresource_filter_);
@@ -986,7 +978,8 @@
 }
 
 void DocumentLoader::StopLoading() {
-  fetcher_->StopFetching();
+  if (frame_ && GetFrameLoader().GetDocumentLoader() == this)
+    frame_->GetDocument()->Fetcher()->StopFetching();
   body_loader_.reset();
   virtual_time_pauser_.UnpauseVirtualTime();
   if (!SentDidFinishLoad())
@@ -995,7 +988,6 @@
 
 void DocumentLoader::SetDefersLoading(bool defers) {
   defers_loading_ = defers;
-  Fetcher()->SetDefersLoading(defers);
   if (body_loader_) {
     body_loader_->SetDefersLoading(defers);
     if (defers_loading_)
@@ -1008,7 +1000,6 @@
 void DocumentLoader::DetachFromFrame(bool flush_microtask_queue) {
   DCHECK(frame_);
   StopLoading();
-  fetcher_->ClearContext();
   if (flush_microtask_queue) {
     // Flush microtask queue so that they all run on pre-navigation context.
     // TODO(dcheng): This is a temporary hack that should be removed. This is
@@ -1270,11 +1261,6 @@
   document->GetFrame()->GetClientHintsPreferences().UpdateFrom(
       client_hints_preferences_);
 
-  // TODO(japhet): There's no reason to wait until commit to set these bits.
-  Settings* settings = document->GetSettings();
-  fetcher_->SetImagesEnabled(settings->GetImagesEnabled());
-  fetcher_->SetAutoLoadImages(settings->GetLoadsImagesAutomatically());
-
   const AtomicString& dns_prefetch_control =
       response_.HttpHeaderField(http_names::kXDNSPrefetchControl);
   if (!dns_prefetch_control.IsEmpty())
@@ -1537,7 +1523,8 @@
   }
   bool stale_while_revalidate_enabled =
       origin_trials::StaleWhileRevalidateEnabled(document);
-  fetcher_->SetStaleWhileRevalidateEnabled(stale_while_revalidate_enabled);
+  document->Fetcher()->SetStaleWhileRevalidateEnabled(
+      stale_while_revalidate_enabled);
 
   // If stale while revalidate is enabled via Origin Trials count it as such.
   if (stale_while_revalidate_enabled &&
@@ -1631,12 +1618,6 @@
   }
 }
 
-void DocumentLoader::ProvideDocumentToResourceFetcherProperties(
-    Document& document) {
-  resource_fetcher_properties_->UpdateDocument(document);
-  fetcher_->SetArchive(archive_.Get());
-}
-
 void DocumentLoader::ReportPreviewsIntervention() const {
   // Only send reports for main frames.
   if (!frame_->IsMainFrame())
diff --git a/third_party/blink/renderer/core/loader/document_loader.h b/third_party/blink/renderer/core/loader/document_loader.h
index c1835f9..318aa0b 100644
--- a/third_party/blink/renderer/core/loader/document_loader.h
+++ b/third_party/blink/renderer/core/loader/document_loader.h
@@ -72,12 +72,10 @@
 class Document;
 class DocumentParser;
 class FrameLoader;
-class FrameResourceFetcherProperties;
 class HistoryItem;
 class LocalFrame;
 class LocalFrameClient;
 class MHTMLArchive;
-class ResourceFetcher;
 class ResourceTimingInfo;
 class SerializedScriptValue;
 class SubresourceFilter;
@@ -114,7 +112,7 @@
   const KURL& OriginalUrl() const;
   const Referrer& OriginalReferrer() const;
 
-  ResourceFetcher* Fetcher() const { return fetcher_.Get(); }
+  MHTMLArchive* Archive() const { return archive_.Get(); }
 
   void SetSubresourceFilter(SubresourceFilter*);
   SubresourceFilter* GetSubresourceFilter() const {
@@ -254,8 +252,6 @@
   UseCounter& GetUseCounter() { return use_counter_; }
   Dactyloscoper& GetDactyloscoper() { return dactyloscoper_; }
 
-  void ProvideDocumentToResourceFetcherProperties(Document&);
-
   int ErrorCode() const { return error_code_; }
 
  protected:
@@ -366,11 +362,6 @@
   std::unique_ptr<WebNavigationParams> params_;
 
   Member<LocalFrame> frame_;
-  // This member is held so that we can update the document later. Do not use
-  // this member outside ProvideDocumentToResourceFetcherProperties.
-  // TODO(yhirano): Remove this once https://crbug.com/855189 is done.
-  const Member<FrameResourceFetcherProperties> resource_fetcher_properties_;
-  Member<ResourceFetcher> fetcher_;
 
   Member<HistoryItem> history_item_;
 
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
index eada4da..779a6f0 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
@@ -213,23 +213,32 @@
   }
 };
 
-ResourceFetcher* FrameFetchContext::CreateFetcher(
-    const FrameResourceFetcherProperties& properties) {
-  const FrameOrImportedDocument& frame_or_imported_document =
-      properties.GetFrameOrImportedDocument();
-  LocalFrame& frame = frame_or_imported_document.GetFrame();
+ResourceFetcher* FrameFetchContext::CreateFetcherForCommittedDocument(
+    DocumentLoader& loader,
+    Document& document) {
+  auto* frame_or_imported_document =
+      MakeGarbageCollected<FrameOrImportedDocument>(loader, document);
+  auto* resource_fetcher_properties =
+      MakeGarbageCollected<FrameResourceFetcherProperties>(
+          *frame_or_imported_document);
+  LocalFrame& frame = frame_or_imported_document->GetFrame();
   ResourceFetcherInit init(
-      properties,
-      MakeGarbageCollected<FrameFetchContext>(frame_or_imported_document),
+      *resource_fetcher_properties,
+      MakeGarbageCollected<FrameFetchContext>(*frame_or_imported_document),
       frame.GetTaskRunner(TaskType::kNetworking),
-      MakeGarbageCollected<LoaderFactoryForFrame>(frame_or_imported_document),
-      frame.Console());
+      MakeGarbageCollected<LoaderFactoryForFrame>(*frame_or_imported_document),
+      document);
   // Frame loading should normally start with |kTight| throttling, as the
   // frame will be in layout-blocking state until the <body> tag is inserted
   init.initial_throttling_policy =
       ResourceLoadScheduler::ThrottlingPolicy::kTight;
   init.frame_scheduler = frame.GetFrameScheduler();
-  return MakeGarbageCollected<ResourceFetcher>(init);
+  init.archive = loader.Archive();
+  ResourceFetcher* fetcher = MakeGarbageCollected<ResourceFetcher>(init);
+  fetcher->SetImagesEnabled(frame.GetSettings()->GetImagesEnabled());
+  fetcher->SetAutoLoadImages(
+      frame.GetSettings()->GetLoadsImagesAutomatically());
+  return fetcher;
 }
 
 ResourceFetcher* FrameFetchContext::CreateFetcherForImportedDocument(
@@ -261,24 +270,14 @@
 KURL FrameFetchContext::GetSiteForCookies() const {
   if (GetResourceFetcherProperties().IsDetached())
     return frozen_state_->site_for_cookies;
-
-  Document* document = frame_or_imported_document_->GetDocument();
-  // Use |document| for subresource or nested frame cases,
-  // GetFrame()->GetDocument() otherwise.
-  if (!document)
-    document = GetFrame()->GetDocument();
-  return document->SiteForCookies();
+  return frame_or_imported_document_->GetDocument().SiteForCookies();
 }
 
 scoped_refptr<const SecurityOrigin> FrameFetchContext::GetTopFrameOrigin()
     const {
   if (GetResourceFetcherProperties().IsDetached())
     return frozen_state_->top_frame_origin;
-
-  Document* document = frame_or_imported_document_->GetDocument();
-  if (!document)
-    document = GetFrame()->GetDocument();
-  return document->TopFrameOrigin();
+  return frame_or_imported_document_->GetDocument().TopFrameOrigin();
 }
 
 SubresourceFilter* FrameFetchContext::GetSubresourceFilter() const {
@@ -432,7 +431,7 @@
 
   // If it's not for redirect, hook up ApplicationCache here too.
   if (redirect_type == FetchContext::RedirectType::kNotForRedirect &&
-      GetDocumentLoader() && !GetDocumentLoader()->Fetcher()->Archive() &&
+      GetDocumentLoader() && !GetDocumentLoader()->Archive() &&
       request.Url().IsValid()) {
     GetDocumentLoader()->GetApplicationCacheHost()->WillStartLoading(request);
   }
@@ -456,15 +455,11 @@
   probe::WillSendRequest(Probe(), identifier, MasterDocumentLoader(), Url(),
                          request, redirect_response, initiator_info,
                          resource_type);
-  if (IdlenessDetector* idleness_detector = GetFrame()->GetIdlenessDetector())
-    idleness_detector->OnWillSendRequest(MasterDocumentLoader()->Fetcher());
-  if (frame_or_imported_document_->GetDocument()) {
-    InteractiveDetector* interactive_detector(
-        InteractiveDetector::From(*frame_or_imported_document_->GetDocument()));
-    if (interactive_detector) {
-      interactive_detector->OnResourceLoadBegin(base::nullopt);
-    }
-  }
+  Document& document = frame_or_imported_document_->GetDocument();
+  if (auto* idleness_detector = GetFrame()->GetIdlenessDetector())
+    idleness_detector->OnWillSendRequest(document.Fetcher());
+  if (auto* interactive_detector = InteractiveDetector::From(document))
+    interactive_detector->OnResourceLoadBegin(base::nullopt);
 }
 
 void FrameFetchContext::DispatchDidReceiveResponse(
@@ -508,7 +503,7 @@
           : PreloadHelper::kLoadResourcesAndPreconnect;
   PreloadHelper::LoadLinksFromHeader(
       response.HttpHeaderField(http_names::kLink), response.CurrentRequestUrl(),
-      *GetFrame(), frame_or_imported_document_->GetDocument(),
+      *GetFrame(), &frame_or_imported_document_->GetDocument(),
       NetworkHintsInterfaceImpl(), resource_loading_policy,
       PreloadHelper::kLoadAll, nullptr);
 
@@ -522,7 +517,7 @@
   }
 
   if (response.IsLegacyTLSVersion()) {
-    UseCounter::Count(frame_or_imported_document_->GetDocument(),
+    UseCounter::Count(&frame_or_imported_document_->GetDocument(),
                       WebFeature::kLegacyTLSVersionInSubresource);
     GetLocalFrameClient()->ReportLegacyTLSVersion(response.CurrentRequestUrl());
   }
@@ -580,24 +575,17 @@
                           finish_time, encoded_data_length, decoded_body_length,
                           should_report_corb_blocking);
 
-  Document* document = frame_or_imported_document_->GetDocument();
-  if (!document) {
-    return;
-  }
-
-  if (auto* interactive_detector = InteractiveDetector::From(*document)) {
+  Document& document = frame_or_imported_document_->GetDocument();
+  if (auto* interactive_detector = InteractiveDetector::From(document))
     interactive_detector->OnResourceLoadEnd(finish_time);
-  }
 
-  if (LocalFrame* frame = document->GetFrame()) {
-    if (IdlenessDetector* idleness_detector = frame->GetIdlenessDetector()) {
+  if (LocalFrame* frame = document.GetFrame()) {
+    if (IdlenessDetector* idleness_detector = frame->GetIdlenessDetector())
       idleness_detector->OnDidLoadResource();
-    }
   }
 
-  if (response_type == ResourceResponseType::kNotFromMemoryCache) {
-    document->CheckCompleted();
-  }
+  if (response_type == ResourceResponseType::kNotFromMemoryCache)
+    document.CheckCompleted();
 }
 
 void FrameFetchContext::DispatchDidFail(const KURL& url,
@@ -626,22 +614,17 @@
     GetFrame()->Console().DidFailLoading(MasterDocumentLoader(), identifier,
                                          error);
   }
-  Document* document = frame_or_imported_document_->GetDocument();
-  if (!document) {
-    return;
-  }
-
-  if (auto* interactive_detector = InteractiveDetector::From(*document)) {
+  Document& document = frame_or_imported_document_->GetDocument();
+  if (auto* interactive_detector = InteractiveDetector::From(document)) {
     // We have not yet recorded load_finish_time. Pass nullopt here; we will
     // call CurrentTimeTicksInSeconds lazily when we need it.
     interactive_detector->OnResourceLoadEnd(base::nullopt);
   }
-  if (LocalFrame* frame = document->GetFrame()) {
-    if (IdlenessDetector* idleness_detector = frame->GetIdlenessDetector()) {
+  if (LocalFrame* frame = document.GetFrame()) {
+    if (IdlenessDetector* idleness_detector = frame->GetIdlenessDetector())
       idleness_detector->OnDidLoadResource();
-    }
   }
-  document->CheckCompleted();
+  document.CheckCompleted();
 }
 
 void FrameFetchContext::RecordLoadingActivity(
@@ -649,7 +632,7 @@
     ResourceType type,
     const AtomicString& fetch_initiator_name) {
   if (GetResourceFetcherProperties().IsDetached() || !GetDocumentLoader() ||
-      GetDocumentLoader()->Fetcher()->Archive() || !request.Url().IsValid())
+      GetDocumentLoader()->Archive() || !request.Url().IsValid())
     return;
   V8DOMActivityLogger* activity_logger = nullptr;
   if (fetch_initiator_name == fetch_initiator_type_names::kXmlhttprequest) {
@@ -677,17 +660,16 @@
   // Normally, |document_| is cleared on Document shutdown. However, Documents
   // for HTML imports will also not have a LocalFrame set: in that case, also
   // early return, as there is nothing to report the resource timing to.
-  if (GetResourceFetcherProperties().IsDetached() ||
-      !frame_or_imported_document_->GetDocument())
+  if (GetResourceFetcherProperties().IsDetached())
     return;
-  LocalFrame* frame = frame_or_imported_document_->GetDocument()->GetFrame();
+  LocalFrame* frame = frame_or_imported_document_->GetDocument().GetFrame();
   if (!frame)
     return;
 
   // Timing for main resource is handled in DocumentLoader.
   // All other resources are reported to the corresponding Document.
   DOMWindowPerformance::performance(
-      *frame_or_imported_document_->GetDocument()->domWindow())
+      *frame_or_imported_document_->GetDocument().domWindow())
       ->GenerateAndAddResourceTiming(info);
 }
 
@@ -707,7 +689,7 @@
   // request.
   GetFrame()->Loader().RecordLatestRequiredCSP();
   GetFrame()->Loader().ModifyRequestForCSP(
-      resource_request, frame_or_imported_document_->GetDocument());
+      resource_request, &frame_or_imported_document_->GetDocument());
 }
 
 void FrameFetchContext::AddClientHintsIfNecessary(
@@ -1066,9 +1048,7 @@
 const KURL& FrameFetchContext::Url() const {
   if (GetResourceFetcherProperties().IsDetached())
     return frozen_state_->url;
-  if (!frame_or_imported_document_->GetDocument())
-    return NullURL();
-  return frame_or_imported_document_->GetDocument()->Url();
+  return frame_or_imported_document_->GetDocument().Url();
 }
 
 const SecurityOrigin* FrameFetchContext::GetParentSecurityOrigin() const {
@@ -1084,20 +1064,18 @@
     const {
   if (GetResourceFetcherProperties().IsDetached())
     return frozen_state_->content_security_policy;
-  Document* document = frame_or_imported_document_->GetDocument();
-  return document ? document->GetContentSecurityPolicy() : nullptr;
+  return frame_or_imported_document_->GetDocument().GetContentSecurityPolicy();
 }
 
 void FrameFetchContext::AddConsoleMessage(ConsoleMessage* message) const {
   if (GetResourceFetcherProperties().IsDetached())
     return;
 
-  Document* document = frame_or_imported_document_->GetDocument();
   // Route the console message through Document if it's attached, so
   // that script line numbers can be included. Otherwise, route directly to the
   // FrameConsole, to ensure we never drop a message.
-  if (document && document->GetFrame())
-    document->AddConsoleMessage(message);
+  if (frame_or_imported_document_->GetDocument().GetFrame())
+    frame_or_imported_document_->GetDocument().AddConsoleMessage(message);
   else
     GetFrame()->Console().AddMessage(message);
 }
@@ -1131,26 +1109,14 @@
     const {
   if (GetResourceFetcherProperties().IsDetached())
     return frozen_state_->client_hints_preferences;
-
-  Document* document = frame_or_imported_document_->GetDocument();
-  if (!document || !document->GetFrame())
-    return ClientHintsPreferences();
-
-  return document->GetFrame()->GetClientHintsPreferences();
+  LocalFrame* frame = frame_or_imported_document_->GetDocument().GetFrame();
+  return frame ? frame->GetClientHintsPreferences() : ClientHintsPreferences();
 }
 
 float FrameFetchContext::GetDevicePixelRatio() const {
   if (GetResourceFetcherProperties().IsDetached())
     return frozen_state_->device_pixel_ratio;
-
-  Document* document = frame_or_imported_document_->GetDocument();
-  if (!document) {
-    // Note that this value is not used because the preferences object returned
-    // by GetClientHintsPreferences() doesn't allow to use it.
-    return 1.0;
-  }
-
-  return document->DevicePixelRatio();
+  return frame_or_imported_document_->GetDocument().DevicePixelRatio();
 }
 
 bool FrameFetchContext::ShouldSendClientHint(
@@ -1165,21 +1131,11 @@
   if (GetResourceFetcherProperties().IsDetached())
     return this;
 
-  if (frame_or_imported_document_->GetDocument()) {
-    frozen_state_ = MakeGarbageCollected<FrozenState>(
-        Url(), GetParentSecurityOrigin(), GetContentSecurityPolicy(),
-        GetSiteForCookies(), GetTopFrameOrigin(), GetClientHintsPreferences(),
-        GetDevicePixelRatio(), GetUserAgent(), GetUserAgentMetadata(),
-        IsSVGImageChromeClient());
-  } else {
-    // Some getters are unavailable in this case.
-    frozen_state_ = MakeGarbageCollected<FrozenState>(
-        NullURL(), GetParentSecurityOrigin(), GetContentSecurityPolicy(),
-        GetSiteForCookies(), GetTopFrameOrigin(), GetClientHintsPreferences(),
-        GetDevicePixelRatio(), GetUserAgent(), GetUserAgentMetadata(),
-        IsSVGImageChromeClient());
-  }
-
+  frozen_state_ = MakeGarbageCollected<FrozenState>(
+      Url(), GetParentSecurityOrigin(), GetContentSecurityPolicy(),
+      GetSiteForCookies(), GetTopFrameOrigin(), GetClientHintsPreferences(),
+      GetDevicePixelRatio(), GetUserAgent(), GetUserAgentMetadata(),
+      IsSVGImageChromeClient());
   frame_or_imported_document_ = nullptr;
   return this;
 }
@@ -1251,7 +1207,7 @@
   // The AdTracker needs to know about the request as well, and may also mark it
   // as an ad.
   return GetFrame()->GetAdTracker()->CalculateIfAdSubresource(
-      frame_or_imported_document_->GetDocument(), resource_request, type,
+      &frame_or_imported_document_->GetDocument(), resource_request, type,
       known_ad);
 }
 
@@ -1269,10 +1225,8 @@
     const ResourceLoaderOptions& options,
     SecurityViolationReportingPolicy reporting_policy,
     ResourceRequest::RedirectStatus redirect_status) const {
-  Document* document = GetResourceFetcherProperties().IsDetached()
-                           ? nullptr
-                           : frame_or_imported_document_->GetDocument();
-  if (document && document->IsFreezingInProgress() &&
+  if (!GetResourceFetcherProperties().IsDetached() &&
+      frame_or_imported_document_->GetDocument().IsFreezingInProgress() &&
       !resource_request.GetKeepalive()) {
     AddConsoleMessage(ConsoleMessage::Create(
         kJSMessageSource, mojom::ConsoleMessageLevel::kError,
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.h b/third_party/blink/renderer/core/loader/frame_fetch_context.h
index 22d4e44..206c9cb 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.h
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.h
@@ -53,7 +53,6 @@
 class Document;
 class DocumentLoader;
 class FrameOrImportedDocument;
-class FrameResourceFetcherProperties;
 class LocalFrame;
 class LocalFrameClient;
 class ResourceError;
@@ -63,7 +62,8 @@
 
 class CORE_EXPORT FrameFetchContext final : public BaseFetchContext {
  public:
-  static ResourceFetcher* CreateFetcher(const FrameResourceFetcherProperties&);
+  static ResourceFetcher* CreateFetcherForCommittedDocument(DocumentLoader&,
+                                                            Document&);
   // Used for creating a FrameFetchContext for an imported Document.
   // |document_loader_| will be set to nullptr.
   static ResourceFetcher* CreateFetcherForImportedDocument(Document* document);
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc b/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc
index 063521d..8e47d82f 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc
@@ -143,7 +143,6 @@
     dummy_page_holder->GetPage().SetDeviceScaleFactorDeprecated(1.0);
     document = &dummy_page_holder->GetDocument();
     owner = DummyFrameOwner::Create();
-    document->Loader()->ProvideDocumentToResourceFetcherProperties(*document);
   }
 
   void TearDown() override {
@@ -159,10 +158,8 @@
         LocalFrameView::Create(*child_frame, IntSize(500, 500)));
     child_frame->Init();
     child_document = child_frame->GetDocument();
-    FrameFetchContext* child_fetch_context = static_cast<FrameFetchContext*>(
-        &child_frame->Loader().GetDocumentLoader()->Fetcher()->Context());
-    child_document->Loader()->ProvideDocumentToResourceFetcherProperties(
-        *document);
+    FrameFetchContext* child_fetch_context =
+        static_cast<FrameFetchContext*>(&child_document->Fetcher()->Context());
     return child_fetch_context;
   }
 
@@ -301,7 +298,6 @@
     document = &dummy_page_holder->GetDocument();
     document->SetURL(main_resource_url);
     owner = DummyFrameOwner::Create();
-    document->Loader()->ProvideDocumentToResourceFetcherProperties(*document);
   }
 
   KURL url;
@@ -442,7 +438,6 @@
        "ftp://example.test:1212/image.png"},
   };
 
-  document->Loader()->ProvideDocumentToResourceFetcherProperties(*document);
   document->SetInsecureRequestPolicy(kUpgradeInsecureRequests);
 
   for (const auto& test : tests) {
@@ -490,7 +485,6 @@
 
 TEST_F(FrameFetchContextModifyRequestTest,
        DoNotUpgradeInsecureResourceRequests) {
-  document->Loader()->ProvideDocumentToResourceFetcherProperties(*document);
   document->SetSecurityOrigin(secure_origin);
   document->SetInsecureRequestPolicy(kLeaveInsecureRequestsAlone);
 
@@ -575,8 +569,6 @@
                                        test.should_prefer);
   }
 
-  document->Loader()->ProvideDocumentToResourceFetcherProperties(*document);
-
   for (const auto& test : tests) {
     document->SetInsecureRequestPolicy(kLeaveInsecureRequestsAlone);
     ExpectUpgradeInsecureRequestHeader(test.to_request, test.frame_type,
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
index 4830a911..a95b961 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -249,6 +249,8 @@
 }
 
 void FrameLoader::SetDefersLoading(bool defers) {
+  if (frame_->GetDocument())
+    frame_->GetDocument()->Fetcher()->SetDefersLoading(defers);
   if (document_loader_)
     document_loader_->SetDefersLoading(defers);
   if (provisional_document_loader_)
diff --git a/third_party/blink/renderer/core/loader/frame_or_imported_document.cc b/third_party/blink/renderer/core/loader/frame_or_imported_document.cc
index 12b944f..b5f8657 100644
--- a/third_party/blink/renderer/core/loader/frame_or_imported_document.cc
+++ b/third_party/blink/renderer/core/loader/frame_or_imported_document.cc
@@ -13,14 +13,14 @@
 namespace blink {
 
 LocalFrame& FrameOrImportedDocument::GetFrame() const {
+  DCHECK(document_);
   if (document_loader_) {
-    LocalFrame* frame = document_loader_->GetFrame();
+    LocalFrame* frame = document_->GetFrame();
     DCHECK(frame);
     return *frame;
   }
 
   // HTML imports case
-  DCHECK(document_);
   // It's guaranteed that imports_controller is not nullptr since:
   // - only ClearImportsController() clears it
   // - ClearImportsController() also calls ResourceFethcer::ClearContext().
@@ -57,11 +57,6 @@
   return *loader;
 }
 
-void FrameOrImportedDocument::UpdateDocument(Document& document) {
-  DCHECK(document_loader_);
-  document_ = document;
-}
-
 void FrameOrImportedDocument::Trace(Visitor* visitor) {
   visitor->Trace(document_loader_);
   visitor->Trace(document_);
diff --git a/third_party/blink/renderer/core/loader/frame_or_imported_document.h b/third_party/blink/renderer/core/loader/frame_or_imported_document.h
index b0035af..81d61588 100644
--- a/third_party/blink/renderer/core/loader/frame_or_imported_document.h
+++ b/third_party/blink/renderer/core/loader/frame_or_imported_document.h
@@ -18,8 +18,6 @@
 // the differences between Document-ish things behind FrameFetchContext:
 // - An imported Document
 //   (document_loader_ is null, document_ is non-null),
-// - A DocumentLoader that has not yet committed its navigation
-//   (document_loader_ is non-null, document_ is null), or
 // - A DocumentLoader that has committed its navigation
 //   (document_loader_ is non-null, document_ is non-null).
 //
@@ -32,8 +30,8 @@
   // Creates a FrameOrImportedDocument associated with a LocalFrame (which is,
   // loader.GetFrame() which cannot be null). This object works until the
   // associated frame is detached.
-  explicit FrameOrImportedDocument(DocumentLoader& loader)
-      : document_loader_(loader) {}
+  FrameOrImportedDocument(DocumentLoader& loader, Document& committed_document)
+      : document_loader_(loader), document_(committed_document) {}
 
   // Creates a FrameOrImportedDocument associated with an imported document.
   // This object works until |document| is shut-down.
@@ -60,20 +58,14 @@
 
   // When this object is associated with a frame with a committed document,
   // returns it.
-  // When this object is associated with a frame with no committed document,
-  // returns nullptr
   // When this object is associated with an imported document, returns it.
-  Document* GetDocument() const { return document_; }
-
-  // Provide a committed document to |this|. |this| must be a
-  // FrameOrImportedDocument associated with a frame.
-  void UpdateDocument(Document&);
+  Document& GetDocument() const { return *document_; }
 
   void Trace(Visitor* visitor);
 
  private:
   const Member<DocumentLoader> document_loader_;
-  Member<Document> document_;
+  const Member<Document> document_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/loader/frame_resource_fetcher_properties.cc b/third_party/blink/renderer/core/loader/frame_resource_fetcher_properties.cc
index a371603..5597ff0 100644
--- a/third_party/blink/renderer/core/loader/frame_resource_fetcher_properties.cc
+++ b/third_party/blink/renderer/core/loader/frame_resource_fetcher_properties.cc
@@ -20,7 +20,8 @@
     FrameOrImportedDocument& frame_or_imported_document)
     : frame_or_imported_document_(frame_or_imported_document),
       fetch_client_settings_object_(
-          CreateFetchClientSettingsObject(frame_or_imported_document)) {}
+          MakeGarbageCollected<FetchClientSettingsObjectImpl>(
+              frame_or_imported_document.GetDocument())) {}
 
 void FrameResourceFetcherProperties::Trace(Visitor* visitor) {
   visitor->Trace(frame_or_imported_document_);
@@ -28,12 +29,6 @@
   ResourceFetcherProperties::Trace(visitor);
 }
 
-void FrameResourceFetcherProperties::UpdateDocument(Document& document) {
-  frame_or_imported_document_->UpdateDocument(document);
-  fetch_client_settings_object_ =
-      CreateFetchClientSettingsObject(*frame_or_imported_document_);
-}
-
 bool FrameResourceFetcherProperties::IsMainFrame() const {
   return frame_or_imported_document_->GetFrame().IsMainFrame();
 }
@@ -63,8 +58,7 @@
 }
 
 bool FrameResourceFetcherProperties::IsLoadComplete() const {
-  Document* document = frame_or_imported_document_->GetDocument();
-  return document && document->LoadEventFinished();
+  return frame_or_imported_document_->GetDocument().LoadEventFinished();
 }
 
 bool FrameResourceFetcherProperties::ShouldBlockLoadingSubResource() const {
@@ -82,52 +76,4 @@
       frame_or_imported_document_->GetFrame().GetFrameScheduler());
 }
 
-const FetchClientSettingsObject&
-FrameResourceFetcherProperties::CreateFetchClientSettingsObject(
-    const FrameOrImportedDocument& frame_or_imported_document) {
-  if (frame_or_imported_document.GetDocument()) {
-    // HTML imports case
-    return *MakeGarbageCollected<FetchClientSettingsObjectImpl>(
-        *frame_or_imported_document.GetDocument());
-  }
-
-  // This FetchClientSettingsObject can be used only for navigation, as
-  // at the creation of the corresponding Document a new
-  // FetchClientSettingsObject is set.
-  // Also, currently all the members except for SecurityOrigin are not
-  // used in FrameFetchContext, and therefore we set some safe default
-  // values here.
-  // Once PlzNavigate removes ResourceFetcher usage in navigations, we
-  // might be able to remove this FetchClientSettingsObject at all.
-  return *MakeGarbageCollected<FetchClientSettingsObjectSnapshot>(
-      KURL(), KURL(),
-
-      // SecurityOrigin. This is actually used via
-      // FetchContext::GetSecurityOrigin().
-      // TODO(hiroshige): Assign non-nullptr SecurityOrigin.
-      nullptr,
-
-      // Currently this is not used, and referrer for navigation request
-      // is set based on previous Document's referrer policy, for example
-      // in FrameLoader::SetReferrerForFrameRequest().
-      // If we want to set referrer based on FetchClientSettingsObject,
-      // it should refer to the FetchClientSettingsObject of the previous
-      // Document, probably not this one.
-      network::mojom::ReferrerPolicy::kDefault, String(),
-
-      // MixedContentChecker::ShouldBlockFetch() doesn't check mixed
-      // contents if frame type is not kNone, which is always true in
-      // RawResource::FetchMainResource().
-      // Therefore HttpsState here isn't (and isn't expected to be)
-      // used and thus it's safe to pass a safer default value.
-      HttpsState::kModern,
-
-      // This is only for workers and this value is not (and isn't
-      // expected to be) used.
-      AllowedByNosniff::MimeTypeCheck::kStrict,
-
-      // address space; Until the document gets available, return nullopt.
-      base::nullopt);
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/loader/frame_resource_fetcher_properties.h b/third_party/blink/renderer/core/loader/frame_resource_fetcher_properties.h
index f622774..c71c68a0 100644
--- a/third_party/blink/renderer/core/loader/frame_resource_fetcher_properties.h
+++ b/third_party/blink/renderer/core/loader/frame_resource_fetcher_properties.h
@@ -10,7 +10,6 @@
 
 namespace blink {
 
-class Document;
 class FrameOrImportedDocument;
 
 // FrameResourceFetcherProperties is a ResourceFetcherProperties implementation
@@ -25,8 +24,6 @@
   const FrameOrImportedDocument& GetFrameOrImportedDocument() const {
     return *frame_or_imported_document_;
   }
-  // Provides a committed document to |this|.
-  void UpdateDocument(Document& document);
 
   // ResourceFetcherProperties implementation
   const FetchClientSettingsObject& GetFetchClientSettingsObject()
@@ -43,9 +40,6 @@
   scheduler::FrameStatus GetFrameStatus() const override;
 
  private:
-  static const FetchClientSettingsObject& CreateFetchClientSettingsObject(
-      const FrameOrImportedDocument&);
-
   const Member<FrameOrImportedDocument> frame_or_imported_document_;
   Member<const FetchClientSettingsObject> fetch_client_settings_object_;
 };
diff --git a/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc b/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc
index 97e3f1d..e2a2229 100644
--- a/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc
+++ b/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc
@@ -55,12 +55,11 @@
   // disabled).
   // TODO(mek): Move the RequestContext check to the worker side's relevant
   // callsite when we make Shared Worker loading off-main-thread.
-  Document* document = frame_or_imported_document_->GetDocument();
-  if (document && request.Url().ProtocolIs("blob") &&
-      BlobUtils::MojoBlobURLsEnabled() && !url_loader_factory &&
+  if (request.Url().ProtocolIs("blob") && BlobUtils::MojoBlobURLsEnabled() &&
+      !url_loader_factory &&
       request.GetRequestContext() != mojom::RequestContextType::SHARED_WORKER) {
-    document->GetPublicURLManager().Resolve(request.Url(),
-                                            MakeRequest(&url_loader_factory));
+    frame_or_imported_document_->GetDocument().GetPublicURLManager().Resolve(
+        request.Url(), MakeRequest(&url_loader_factory));
   }
   LocalFrame& frame = frame_or_imported_document_->GetFrame();
   FrameScheduler* frame_scheduler = frame.GetFrameScheduler();
diff --git a/third_party/blink/renderer/core/style/computed_style.cc b/third_party/blink/renderer/core/style/computed_style.cc
index 8da9a55..f20f260f 100644
--- a/third_party/blink/renderer/core/style/computed_style.cc
+++ b/third_party/blink/renderer/core/style/computed_style.cc
@@ -1592,7 +1592,7 @@
 
 CSSAnimationData& ComputedStyle::AccessAnimations() {
   if (!AnimationsInternal())
-    SetAnimationsInternal(CSSAnimationData::Create());
+    SetAnimationsInternal(std::make_unique<CSSAnimationData>());
   return *AnimationsInternal();
 }
 
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.cc b/third_party/blink/renderer/core/workers/worker_global_scope.cc
index 9bcb82a..1e8a6b79 100644
--- a/third_party/blink/renderer/core/workers/worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/worker_global_scope.cc
@@ -494,17 +494,6 @@
   SetFeaturePolicy(std::move(creation_params->worker_feature_policy));
 }
 
-void WorkerGlobalScope::ApplyContentSecurityPolicyFromHeaders(
-    const ContentSecurityPolicyResponseHeaders& headers) {
-  if (!GetContentSecurityPolicy()) {
-    ContentSecurityPolicy* csp = ContentSecurityPolicy::Create();
-    SetContentSecurityPolicy(csp);
-  }
-  GetContentSecurityPolicy()->DidReceiveHeaders(headers);
-  GetContentSecurityPolicy()->BindToDelegate(
-      GetContentSecurityPolicyDelegate());
-}
-
 void WorkerGlobalScope::ExceptionThrown(ErrorEvent* event) {
   int next_id = ++last_pending_error_event_id_;
   pending_error_events_.Set(next_id, event);
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.h b/third_party/blink/renderer/core/workers/worker_global_scope.h
index a3ed6e03..f3c2542 100644
--- a/third_party/blink/renderer/core/workers/worker_global_scope.h
+++ b/third_party/blink/renderer/core/workers/worker_global_scope.h
@@ -187,8 +187,6 @@
   WorkerGlobalScope(std::unique_ptr<GlobalScopeCreationParams>,
                     WorkerThread*,
                     base::TimeTicks time_origin);
-  void ApplyContentSecurityPolicyFromHeaders(
-      const ContentSecurityPolicyResponseHeaders&);
 
   // ExecutionContext
   void ExceptionThrown(ErrorEvent*) override;
diff --git a/third_party/blink/renderer/devtools/BUILD.gn b/third_party/blink/renderer/devtools/BUILD.gn
index 98860d8..bf42733 100644
--- a/third_party/blink/renderer/devtools/BUILD.gn
+++ b/third_party/blink/renderer/devtools/BUILD.gn
@@ -1197,26 +1197,36 @@
 
 group("devtools_all_files") {
   data = all_devtools_files
+  deps = [":devtools_frontend_resources_data"]
+}
+
+devtools_frontend_resources_deps = [
+  ":aria_properties",
+  ":build_release_devtools",
+  ":copy_embedder_scripts",
+  ":copy_emulated_devices_images",
+  ":copy_htaccess",
+  ":copy_inspector_images",
+  ":devtools_extension_api",
+  ":frontend_protocol_sources",
+  ":supported_css_properties",
+]
+
+if (debug_devtools) {
+  devtools_frontend_resources_deps += [
+    ":build_debug_devtools",
+    ":copy_aria_properties",
+    ":copy_generated_scripts",
+  ]
 }
 
 group("devtools_frontend_resources") {
-  public_deps = [
-    ":aria_properties",
-    ":build_release_devtools",
-    ":copy_embedder_scripts",
-    ":copy_emulated_devices_images",
-    ":copy_htaccess",
-    ":copy_inspector_images",
-    ":devtools_extension_api",
-    ":frontend_protocol_sources",
-    ":supported_css_properties",
-  ]
-  if (debug_devtools) {
-    public_deps += [
-      ":build_debug_devtools",
-      ":copy_aria_properties",
-    ]
-  }
+  public_deps = devtools_frontend_resources_deps
+}
+
+# Do not use this unless you need unpacked devtools at runtime.
+group("devtools_frontend_resources_data") {
+  data_deps = devtools_frontend_resources_deps
 }
 
 copy("copy_embedder_scripts") {
@@ -1224,7 +1234,6 @@
   outputs = [
     "$resources_out_dir/{{source_file_part}}",
   ]
-  data = process_file_template(sources, outputs)
 }
 
 copy("copy_htaccess") {
@@ -1234,7 +1243,6 @@
   outputs = [
     "$resources_out_dir/.htaccess",
   ]
-  data = outputs
 }
 
 copy("copy_inspector_images") {
@@ -1242,7 +1250,6 @@
   outputs = [
     "$resources_out_dir/Images/{{source_file_part}}",
   ]
-  data = process_file_template(sources, outputs)
 }
 
 copy("copy_emulated_devices_images") {
@@ -1250,7 +1257,6 @@
   outputs = [
     "$resources_out_dir/emulated_devices/{{source_file_part}}",
   ]
-  data = process_file_template(sources, outputs)
 }
 
 action("generate_devtools_grd") {
@@ -1299,7 +1305,6 @@
   outputs = [
     "$resources_out_dir/devtools_extension_api.js",
   ]
-  data = outputs
 
   args = rebase_path(outputs, root_build_dir) +
          rebase_path(devtools_extension_api_files, root_build_dir)
@@ -1315,7 +1320,6 @@
   outputs = [
     "$resources_out_dir/SupportedCSSProperties.js",
   ]
-  data = outputs
 
   args =
       rebase_path(inputs, root_build_dir) + rebase_path(outputs, root_build_dir)
@@ -1331,7 +1335,6 @@
   outputs = [
     "$resources_out_dir/accessibility/ARIAProperties.js",
   ]
-  data = outputs
 
   args =
       rebase_path(inputs, root_build_dir) + rebase_path(outputs, root_build_dir)
@@ -1348,7 +1351,6 @@
   outputs = [
     "$resources_out_dir/InspectorBackendCommands.js",
   ]
-  data = outputs
 
   args = rebase_path(inputs, root_build_dir) + [
            "--output_js_dir",
@@ -1375,7 +1377,6 @@
   outputs =
       generated_applications + generated_non_autostart_non_remote_modules +
       generated_remote_modules + generated_test_modules
-  data = outputs
 
   args = devtools_applications + [
            "--input_path",
@@ -1406,7 +1407,6 @@
       "$resources_out_debug_dir/toolbox.html",
       "$resources_out_debug_dir/worker_app.html",
     ]
-    data = outputs
 
     args = devtools_applications + [
              "--input_path",
@@ -1425,7 +1425,6 @@
     outputs = [
       "$resources_out_debug_dir/{{source_file_part}}",
     ]
-    data = process_file_template(sources, outputs)
   }
 
   copy("copy_aria_properties") {
@@ -1439,7 +1438,6 @@
     outputs = [
       "$resources_out_debug_dir/accessibility/{{source_file_part}}",
     ]
-    data = process_file_template(sources, outputs)
   }
 }
 
diff --git a/third_party/blink/renderer/devtools/front_end/accessibility/ARIAAttributesView.js b/third_party/blink/renderer/devtools/front_end/accessibility/ARIAAttributesView.js
index 434cefe..a8a61db6 100644
--- a/third_party/blink/renderer/devtools/front_end/accessibility/ARIAAttributesView.js
+++ b/third_party/blink/renderer/devtools/front_end/accessibility/ARIAAttributesView.js
@@ -177,7 +177,7 @@
       return;
     }
 
-    if (event.keyCode === UI.KeyboardShortcut.Keys.Esc.code || event.keyIdentifier === 'U+001B') {
+    if (isEscKey(event)) {
       this._editingCancelled();
       event.consume();
       return;
diff --git a/third_party/blink/renderer/devtools/front_end/elements/StylesSidebarPane.js b/third_party/blink/renderer/devtools/front_end/elements/StylesSidebarPane.js
index bc7d485..17f1111 100644
--- a/third_party/blink/renderer/devtools/front_end/elements/StylesSidebarPane.js
+++ b/third_party/blink/renderer/devtools/front_end/elements/StylesSidebarPane.js
@@ -2278,12 +2278,19 @@
           results[i].text = results[i].text.toUpperCase();
       }
     }
-    if (editingVariable) {
-      results.forEach(result => {
+    results.forEach(result => {
+      if (editingVariable) {
         result.title = result.text;
         result.text += ')';
-      });
-    }
+        return;
+      }
+      const valuePreset = SDK.cssMetadata().getValuePreset(this._treeElement.name, result.text);
+      if (!this._isEditingName && valuePreset) {
+        result.title = result.text;
+        result.text = valuePreset.text;
+        result.selectionRange = {startColumn: valuePreset.startColumn, endColumn: valuePreset.endColumn};
+      }
+    });
     if (this._isColorAware && !this._isEditingName) {
       results.stableSort((a, b) => {
         if (!!a.subtitleRenderer === !!b.subtitleRenderer)
diff --git a/third_party/blink/renderer/devtools/front_end/perf_ui/LineLevelProfile.js b/third_party/blink/renderer/devtools/front_end/perf_ui/LineLevelProfile.js
index c4ef519..8e88d14 100644
--- a/third_party/blink/renderer/devtools/front_end/perf_ui/LineLevelProfile.js
+++ b/third_party/blink/renderer/devtools/front_end/perf_ui/LineLevelProfile.js
@@ -260,9 +260,20 @@
       element.createChild('span', 'line-marker-units').textContent = ls`ms`;
     } else {
       const intensity = Number.constrain(Math.log10(1 + 2e-3 * value) / 5, 0.02, 1);
-      element.textContent = Common.UIString('%.0f', value / 1024);
       element.style.backgroundColor = `hsla(217, 100%, 70%, ${intensity.toFixed(3)})`;
-      element.createChild('span', 'line-marker-units').textContent = ls`KB`;
+      value /= 1e3;
+      let units;
+      let fractionDigits;
+      if (value >= 1e3) {
+        units = ls`MB`;
+        value /= 1e3;
+        fractionDigits = value >= 20 ? 0 : 1;
+      } else {
+        units = ls`KB`;
+        fractionDigits = 0;
+      }
+      element.textContent = Common.UIString(`%.${fractionDigits}f`, value);
+      element.createChild('span', 'line-marker-units').textContent = units;
     }
     return element;
   }
diff --git a/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js b/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js
index aa75a6a..4a488603 100644
--- a/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js
+++ b/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js
@@ -215,6 +215,27 @@
   propertyUsageWeight(property) {
     return SDK.CSSMetadata.Weight[property] || SDK.CSSMetadata.Weight[this.canonicalPropertyName(property)] || 0;
   }
+
+  /**
+   * @param {string} key
+   * @param {string} value
+   * @return {?{text: string, startColumn: number, endColumn: number}}
+   */
+  getValuePreset(key, value) {
+    const values = SDK.CSSMetadata._valuePresets.get(key);
+    let text = values ? values.get(value) : null;
+    if (!text)
+      return null;
+    let startColumn = text.length;
+    let endColumn = text.length;
+    if (text) {
+      startColumn = text.indexOf('|');
+      endColumn = text.lastIndexOf('|');
+      endColumn = startColumn === endColumn ? endColumn : endColumn - 1;
+      text = text.replace(/\|/g, '');
+    }
+    return {text, startColumn, endColumn};
+  }
 };
 
 SDK.CSSMetadata.VariableRegex = /(var\(--.*?\))/g;
@@ -229,6 +250,61 @@
   return SDK.CSSMetadata._instance;
 };
 
+/**
+ * The pipe character '|' indicates where text selection should be set.
+ */
+SDK.CSSMetadata._imageValuePresetMap = new Map([
+  ['linear-gradient', 'linear-gradient(|45deg, black, transparent|)'],
+  ['radial-gradient', 'radial-gradient(|black, transparent|)'],
+  ['repeating-linear-gradient', 'repeating-linear-gradient(|45deg, black, transparent 100px|)'],
+  ['repeating-radial-gradient', 'repeating-radial-gradient(|black, transparent 100px|)'],
+  ['url', 'url(||)'],
+]);
+
+SDK.CSSMetadata._valuePresets = new Map([
+  [
+    'filter', new Map([
+      ['blur', 'blur(|1px|)'],
+      ['brightness', 'brightness(|0.5|)'],
+      ['contrast', 'contrast(|0.5|)'],
+      ['drop-shadow', 'drop-shadow(|2px 4px 6px black|)'],
+      ['grayscale', 'grayscale(|1|)'],
+      ['hue-rotate', 'hue-rotate(|45deg|)'],
+      ['invert', 'invert(|1|)'],
+      ['opacity', 'opacity(|0.5|)'],
+      ['saturate', 'saturate(|0.5|)'],
+      ['sepia', 'sepia(|1|)'],
+      ['url', 'url(||)'],
+    ])
+  ],
+  ['background', SDK.CSSMetadata._imageValuePresetMap], ['background-image', SDK.CSSMetadata._imageValuePresetMap],
+  ['-webkit-mask-image', SDK.CSSMetadata._imageValuePresetMap],
+  [
+    'transform', new Map([
+      ['scale', 'scale(|1.5|)'],
+      ['scaleX', 'scaleX(|1.5|)'],
+      ['scaleY', 'scaleY(|1.5|)'],
+      ['scale3d', 'scale3d(|1.5, 1.5, 1.5|)'],
+      ['rotate', 'rotate(|45deg|)'],
+      ['rotateX', 'rotateX(|45deg|)'],
+      ['rotateY', 'rotateY(|45deg|)'],
+      ['rotateZ', 'rotateZ(|45deg|)'],
+      ['rotate3d', 'rotate3d(|1, 1, 1, 45deg|)'],
+      ['skew', 'skew(|10deg, 10deg|)'],
+      ['skewX', 'skewX(|10deg|)'],
+      ['skewY', 'skewY(|10deg|)'],
+      ['translate', 'translate(|10px, 10px|)'],
+      ['translateX', 'translateX(|10px|)'],
+      ['translateY', 'translateY(|10px|)'],
+      ['translateZ', 'translateZ(|10px|)'],
+      ['translate3d', 'translate3d(|10px, 10px, 10px|)'],
+      ['matrix', 'matrix(|1, 0, 0, 1, 0, 0|)'],
+      ['matrix3d', 'matrix3d(|1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1|)'],
+      ['perspective', 'perspective(|10px|)']
+    ])
+  ]
+]);
+
 SDK.CSSMetadata._distanceProperties = new Set([
   'background-position', 'border-spacing', 'bottom', 'font-size', 'height', 'left', 'letter-spacing', 'max-height',
   'max-width', 'min-height', 'min-width', 'right', 'text-indent', 'top', 'width', 'word-spacing', 'grid-row-gap',
@@ -792,11 +868,33 @@
   'backface-visibility': {values: ['hidden', 'visible']},
   'background': {
     values: [
-      'repeat', 'repeat-x', 'repeat-y', 'no-repeat', 'top', 'bottom', 'left', 'right', 'center', 'fixed', 'local',
-      'scroll', 'space', 'round', 'border-box', 'content-box', 'padding-box'
+      'repeat',
+      'repeat-x',
+      'repeat-y',
+      'no-repeat',
+      'top',
+      'bottom',
+      'left',
+      'right',
+      'center',
+      'fixed',
+      'local',
+      'scroll',
+      'space',
+      'round',
+      'border-box',
+      'content-box',
+      'padding-box',
+      'linear-gradient',
+      'radial-gradient',
+      'repeating-linear-gradient',
+      'repeating-radial-gradient',
+      'url'
     ]
   },
   'background-attachment': {values: ['fixed', 'local', 'scroll']},
+  'background-image':
+      {values: ['linear-gradient', 'radial-gradient', 'repeating-linear-gradient', 'repeating-radial-gradient', 'url']},
   'background-position': {values: ['top', 'bottom', 'left', 'right', 'center']},
   'background-position-x': {values: ['left', 'right', 'center']},
   'background-position-y': {values: ['top', 'bottom', 'center']},
@@ -1038,6 +1136,8 @@
       'destination-out', 'destination-atop', 'xor', 'plus-lighter'
     ]
   },
+  '-webkit-mask-image':
+      {values: ['linear-gradient', 'radial-gradient', 'repeating-linear-gradient', 'repeating-radial-gradient', 'url']},
   '-webkit-mask-origin': {values: ['border', 'border-box', 'content', 'content-box', 'padding', 'padding-box']},
   '-webkit-mask-position': {values: ['top', 'bottom', 'left', 'right', 'center']},
   '-webkit-mask-position-x': {values: ['left', 'right', 'center']},
diff --git a/third_party/blink/renderer/devtools/front_end/text_editor/TextEditorAutocompleteController.js b/third_party/blink/renderer/devtools/front_end/text_editor/TextEditorAutocompleteController.js
index 5e46745..531c5fb 100644
--- a/third_party/blink/renderer/devtools/front_end/text_editor/TextEditorAutocompleteController.js
+++ b/third_party/blink/renderer/devtools/front_end/text_editor/TextEditorAutocompleteController.js
@@ -30,7 +30,7 @@
     this._lastHintText = '';
     /** @type {?UI.SuggestBox} */
     this._suggestBox = null;
-    /** @type {?string} */
+    /** @type {?UI.SuggestBox.Suggestion} */
     this._currentSuggestion = null;
     this._hintElement = createElementWithClass('span', 'auto-complete-text');
 
@@ -393,14 +393,14 @@
 
   /**
    * @override
-   * @param {string} suggestion
+   * @param {?UI.SuggestBox.Suggestion} suggestion
    * @param {boolean=} isIntermediateSuggestion
    */
   applySuggestion(suggestion, isIntermediateSuggestion) {
     const oldSuggestion = this._currentSuggestion;
     this._currentSuggestion = suggestion;
-    this._setHint(suggestion);
-    if (oldSuggestion !== suggestion)
+    this._setHint(suggestion ? suggestion.text : '');
+    if ((oldSuggestion ? oldSuggestion.text : '') !== (suggestion ? suggestion.text : ''))
       this._textEditor.dispatchEventToListeners(UI.TextEditor.Events.SuggestionChanged);
   }
 
@@ -410,7 +410,7 @@
   acceptSuggestion() {
     const selections = this._codeMirror.listSelections().slice();
     const queryLength = this._queryRange.endColumn - this._queryRange.startColumn;
-    const suggestion = this._currentSuggestion;
+    const suggestion = this._currentSuggestion.text;
     this._codeMirror.operation(() => {
       for (let i = selections.length - 1; i >= 0; --i) {
         const start = selections[i].head;
@@ -435,7 +435,7 @@
       const range =
           new TextUtils.TextRange(last.line, last.column, selection.head.line, selection.head.ch - queryLength);
       text += this._textEditor.text(range);
-      text += this._currentSuggestion;
+      text += this._currentSuggestion.text;
       last = {line: selection.head.line, column: selection.head.ch};
     }
     const range = new TextUtils.TextRange(last.line, last.column, Infinity, Infinity);
diff --git a/third_party/blink/renderer/devtools/front_end/text_editor/cmdevtools.css b/third_party/blink/renderer/devtools/front_end/text_editor/cmdevtools.css
index 22df9a2c9..9fdf386 100644
--- a/third_party/blink/renderer/devtools/front_end/text_editor/cmdevtools.css
+++ b/third_party/blink/renderer/devtools/front_end/text_editor/cmdevtools.css
@@ -9,13 +9,18 @@
     overflow: visible !important;
 }
 
-.CodeMirror-gutter-performance,
-.CodeMirror-gutter-memory {
+.CodeMirror-gutter-performance {
     width: 60px;
     background-color: white;
     margin-left: 3px;
 }
 
+.CodeMirror-gutter-memory {
+    width: 48px;
+    background-color: white;
+    margin-left: 3px;
+}
+
 .CodeMirror-gutter-coverage {
     width: 5px;
     background-color: white;
@@ -429,6 +434,7 @@
 .CodeMirror .text-editor-line-marker-text {
     text-align: right;
     padding-right: 3px;
+    height: 12px;
 }
 
 .CodeMirror .text-editor-line-marker-text span.line-marker-units {
diff --git a/third_party/blink/renderer/devtools/front_end/ui/SuggestBox.js b/third_party/blink/renderer/devtools/front_end/ui/SuggestBox.js
index 1ede0c2f..d3cd95ee 100644
--- a/third_party/blink/renderer/devtools/front_end/ui/SuggestBox.js
+++ b/third_party/blink/renderer/devtools/front_end/ui/SuggestBox.js
@@ -34,7 +34,7 @@
 
 UI.SuggestBoxDelegate.prototype = {
   /**
-   * @param {string} suggestion
+   * @param {?UI.SuggestBox.Suggestion} suggestion
    * @param {boolean=} isIntermediateSuggestion
    */
   applySuggestion(suggestion, isIntermediateSuggestion) {},
@@ -60,7 +60,7 @@
     this._userEnteredText = '';
     this._defaultSelectionIsDimmed = false;
 
-    /** @type {?string} */
+    /** @type {?UI.SuggestBox.Suggestion} */
     this._onlyCompletion = null;
 
     /** @type {!UI.ListModel<!UI.SuggestBox.Suggestion>} */
@@ -157,13 +157,13 @@
    */
   _applySuggestion(isIntermediateSuggestion) {
     if (this._onlyCompletion) {
-      UI.ARIAUtils.alert(ls`${this._onlyCompletion}, suggestion`, this._element);
+      UI.ARIAUtils.alert(ls`${this._onlyCompletion.text}, suggestion`, this._element);
       this._suggestBoxDelegate.applySuggestion(this._onlyCompletion, isIntermediateSuggestion);
       return true;
     }
-    const suggestion = this._list.selectedItem() ? this._list.selectedItem().text : '';
-    if (suggestion)
-      UI.ARIAUtils.alert(ls`${suggestion}, suggestion`, this._element);
+    const suggestion = this._list.selectedItem();
+    if (suggestion && suggestion.text)
+      UI.ARIAUtils.alert(ls`${suggestion.title || suggestion.text}, suggestion`, this._element);
     this._suggestBoxDelegate.applySuggestion(suggestion, isIntermediateSuggestion);
 
     return this.visible() && !!suggestion;
@@ -316,7 +316,7 @@
         this._list.selectItem(null);
     } else {
       if (completions.length === 1) {
-        this._onlyCompletion = completions[0].text;
+        this._onlyCompletion = completions[0];
         this._applySuggestion(true);
       }
       this.hide();
@@ -364,7 +364,8 @@
  *      iconType: (string|undefined),
  *      priority: (number|undefined),
  *      isSecondary: (boolean|undefined),
- *      subtitleRenderer: (function():!Element|undefined)
+ *      subtitleRenderer: (function():!Element|undefined),
+ *      selectionRange: ({startColumn: number, endColumn: number}|undefined)
  * }}
  */
 UI.SuggestBox.Suggestion;
diff --git a/third_party/blink/renderer/devtools/front_end/ui/TextPrompt.js b/third_party/blink/renderer/devtools/front_end/ui/TextPrompt.js
index f0ecc9cb..a6797e5 100644
--- a/third_party/blink/renderer/devtools/front_end/ui/TextPrompt.js
+++ b/third_party/blink/renderer/devtools/front_end/ui/TextPrompt.js
@@ -42,7 +42,7 @@
     this._title = '';
     this._queryRange = null;
     this._previousText = '';
-    this._currentSuggestion = '';
+    this._currentSuggestion = null;
     this._completionRequestId = 0;
     this._ghostTextElement = createElementWithClass('span', 'auto-complete-text');
     this._ghostTextElement.setAttribute('contenteditable', 'false');
@@ -150,8 +150,8 @@
     const text = this.text();
     if (!this._queryRange)
       return text;
-    return text.substring(0, this._queryRange.startColumn) + this._currentSuggestion +
-        text.substring(this._queryRange.endColumn);
+    const suggestion = this._currentSuggestion ? this._currentSuggestion.text : '';
+    return text.substring(0, this._queryRange.startColumn) + suggestion + text.substring(this._queryRange.endColumn);
   }
 
   /**
@@ -310,6 +310,7 @@
         }
         break;
     }
+
     if (isEnterKey(event))
       event.preventDefault();
 
@@ -318,13 +319,32 @@
   }
 
   /**
+   * @param {string} key
+   * @return {boolean}
+   */
+  _acceptSuggestionOnStopCharacters(key) {
+    if (!this._currentSuggestion || !this._queryRange || key.length !== 1 ||
+        !this._completionStopCharacters.includes(key))
+      return false;
+
+    const query = this.text().substring(this._queryRange.startColumn, this._queryRange.endColumn);
+    if (query && this._currentSuggestion.text.startsWith(query + key)) {
+      this._queryRange.endColumn += 1;
+      return this.acceptAutoComplete();
+    }
+    return false;
+  }
+
+  /**
    * @param {!Event} event
    */
   onInput(event) {
     const text = this.text();
-    const hasCommonPrefix = text.startsWith(this._previousText) || this._previousText.startsWith(text);
-    if (this._queryRange && hasCommonPrefix)
-      this._queryRange.endColumn += text.length - this._previousText.length;
+    if (event.data && !this._acceptSuggestionOnStopCharacters(event.data)) {
+      const hasCommonPrefix = text.startsWith(this._previousText) || this._previousText.startsWith(text);
+      if (this._queryRange && hasCommonPrefix)
+        this._queryRange.endColumn += text.length - this._previousText.length;
+    }
     this._refreshGhostText();
     this._previousText = text;
     this.dispatchEventToListeners(UI.TextPrompt.Events.TextChanged);
@@ -360,9 +380,9 @@
 
   _refreshGhostText() {
     if (this._queryRange && this._currentSuggestion && this._isCaretAtEndOfPrompt() &&
-        this._currentSuggestion.startsWith(this.text().substring(this._queryRange.startColumn))) {
+        this._currentSuggestion.text.startsWith(this.text().substring(this._queryRange.startColumn))) {
       this._ghostTextElement.textContent =
-          this._currentSuggestion.substring(this._queryRange.endColumn - this._queryRange.startColumn);
+          this._currentSuggestion.text.substring(this._queryRange.endColumn - this._queryRange.startColumn);
       this._element.appendChild(this._ghostTextElement);
     } else {
       this._ghostTextElement.remove();
@@ -511,7 +531,7 @@
 
   /**
    * @override
-   * @param {string} suggestion
+   * @param {?UI.SuggestBox.Suggestion} suggestion
    * @param {boolean=} isIntermediateSuggestion
    */
   applySuggestion(suggestion, isIntermediateSuggestion) {
@@ -535,10 +555,11 @@
     if (!this._queryRange)
       return false;
 
+    const selectionRange = this._currentSuggestion ? this._currentSuggestion.selectionRange : null;
+    const endColumn = selectionRange ? selectionRange.endColumn : this._currentSuggestion.text.length;
+    const startColumn = selectionRange ? selectionRange.startColumn : this._currentSuggestion.text.length;
     this._element.textContent = this.textWithCurrentSuggestion();
-    this.setDOMSelection(
-        this._queryRange.startColumn + this._currentSuggestion.length,
-        this._queryRange.startColumn + this._currentSuggestion.length);
+    this.setDOMSelection(this._queryRange.startColumn + startColumn, this._queryRange.startColumn + endColumn);
 
     this.clearAutocomplete();
     this.dispatchEventToListeners(UI.TextPrompt.Events.TextChanged);
diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn
index 26ed9a0d..9cd46b7 100644
--- a/third_party/blink/renderer/modules/BUILD.gn
+++ b/third_party/blink/renderer/modules/BUILD.gn
@@ -293,6 +293,7 @@
     "media_controls/media_controls_impl_test.cc",
     "media_controls/media_controls_orientation_lock_delegate_test.cc",
     "media_controls/media_controls_rotate_to_fullscreen_delegate_test.cc",
+    "media_controls/non_touch/media_controls_non_touch_impl_test.cc",
     "mediastream/media_constraints_test.cc",
     "mediastream/media_devices_test.cc",
     "notifications/notification_data_test.cc",
diff --git a/third_party/blink/renderer/modules/filesystem/dom_file_system.cc b/third_party/blink/renderer/modules/filesystem/dom_file_system.cc
index 8275751..7c70d5d 100644
--- a/third_party/blink/renderer/modules/filesystem/dom_file_system.cc
+++ b/third_party/blink/renderer/modules/filesystem/dom_file_system.cc
@@ -146,7 +146,7 @@
   DCHECK(file_entry);
 
   FileWriter* file_writer = FileWriter::Create(GetExecutionContext());
-  std::unique_ptr<FileWriterCallbacks> callbacks = FileWriterCallbacks::Create(
+  auto callbacks = std::make_unique<FileWriterCallbacks>(
       file_writer, success_callback, error_callback, context_);
   FileSystemDispatcher::From(context_).InitializeFileWriter(
       CreateFileSystemURL(file_entry), std::move(callbacks));
@@ -159,9 +159,9 @@
   KURL file_system_url = CreateFileSystemURL(file_entry);
 
   FileSystemDispatcher::From(context_).CreateSnapshotFile(
-      file_system_url,
-      SnapshotFileCallback::Create(this, file_entry->name(), file_system_url,
-                                   success_callback, error_callback, context_));
+      file_system_url, std::make_unique<SnapshotFileCallback>(
+                           this, file_entry->name(), file_system_url,
+                           success_callback, error_callback, context_));
 }
 
 void DOMFileSystem::ScheduleCallback(ExecutionContext* execution_context,
diff --git a/third_party/blink/renderer/modules/filesystem/dom_file_system_base.cc b/third_party/blink/renderer/modules/filesystem/dom_file_system_base.cc
index 8c22e7f..a2a0235 100644
--- a/third_party/blink/renderer/modules/filesystem/dom_file_system_base.cc
+++ b/third_party/blink/renderer/modules/filesystem/dom_file_system_base.cc
@@ -209,8 +209,8 @@
     MetadataCallbacks::OnDidReadMetadataCallback* success_callback,
     ErrorCallbackBase* error_callback,
     SynchronousType synchronous_type) {
-  std::unique_ptr<MetadataCallbacks> callbacks(MetadataCallbacks::Create(
-      success_callback, error_callback, context_, this));
+  auto callbacks = std::make_unique<MetadataCallbacks>(
+      success_callback, error_callback, context_, this);
   FileSystemDispatcher& dispatcher = FileSystemDispatcher::From(context_);
 
   if (synchronous_type == kSynchronous) {
@@ -272,9 +272,9 @@
     return;
   }
 
-  std::unique_ptr<EntryCallbacks> callbacks(EntryCallbacks::Create(
+  auto callbacks = std::make_unique<EntryCallbacks>(
       success_callback, error_callback, context_, parent->filesystem(),
-      destination_path, source->isDirectory()));
+      destination_path, source->isDirectory());
 
   FileSystemDispatcher& dispatcher = FileSystemDispatcher::From(context_);
   const KURL& src = CreateFileSystemURL(source);
@@ -300,9 +300,9 @@
     return;
   }
 
-  std::unique_ptr<EntryCallbacks> callbacks(EntryCallbacks::Create(
+  auto callbacks = std::make_unique<EntryCallbacks>(
       success_callback, error_callback, context_, parent->filesystem(),
-      destination_path, source->isDirectory()));
+      destination_path, source->isDirectory());
 
   const KURL& src = CreateFileSystemURL(source);
   const KURL& dest =
@@ -326,8 +326,8 @@
     return;
   }
 
-  std::unique_ptr<VoidCallbacks> callbacks(
-      VoidCallbacks::Create(success_callback, error_callback, context_, this));
+  auto callbacks = std::make_unique<VoidCallbacks>(
+      success_callback, error_callback, context_, this);
   const KURL& url = CreateFileSystemURL(entry);
   FileSystemDispatcher& dispatcher = FileSystemDispatcher::From(context_);
   if (synchronous_type == kSynchronous)
@@ -349,8 +349,8 @@
     return;
   }
 
-  std::unique_ptr<VoidCallbacks> callbacks(
-      VoidCallbacks::Create(success_callback, error_callback, context_, this));
+  auto callbacks = std::make_unique<VoidCallbacks>(
+      success_callback, error_callback, context_, this);
   const KURL& url = CreateFileSystemURL(entry);
   FileSystemDispatcher& dispatcher = FileSystemDispatcher::From(context_);
   if (synchronous_type == kSynchronous)
@@ -368,8 +368,8 @@
 
   FileSystemDispatcher::From(context_).Exists(
       CreateFileSystemURL(path), /*is_directory=*/true,
-      EntryCallbacks::Create(success_callback, error_callback, context_, this,
-                             path, true));
+      std::make_unique<EntryCallbacks>(success_callback, error_callback,
+                                       context_, this, path, true));
 }
 
 void DOMFileSystemBase::GetFile(
@@ -385,8 +385,8 @@
     return;
   }
 
-  std::unique_ptr<EntryCallbacks> callbacks(EntryCallbacks::Create(
-      success_callback, error_callback, context_, this, absolute_path, false));
+  auto callbacks = std::make_unique<EntryCallbacks>(
+      success_callback, error_callback, context_, this, absolute_path, false);
   const KURL& url = CreateFileSystemURL(absolute_path);
   FileSystemDispatcher& dispatcher = FileSystemDispatcher::From(context_);
 
@@ -417,8 +417,8 @@
     return;
   }
 
-  std::unique_ptr<EntryCallbacks> callbacks(EntryCallbacks::Create(
-      success_callback, error_callback, context_, this, absolute_path, true));
+  auto callbacks = std::make_unique<EntryCallbacks>(
+      success_callback, error_callback, context_, this, absolute_path, true);
   const KURL& url = CreateFileSystemURL(absolute_path);
   FileSystemDispatcher& dispatcher = FileSystemDispatcher::From(context_);
 
@@ -447,8 +447,8 @@
     SynchronousType synchronous_type) {
   DCHECK(DOMFilePath::IsAbsolute(path));
 
-  std::unique_ptr<EntriesCallbacks> callbacks(EntriesCallbacks::Create(
-      success_callback, error_callback, context_, reader, path));
+  auto callbacks = std::make_unique<EntriesCallbacks>(
+      success_callback, error_callback, context_, reader, path);
   FileSystemDispatcher& dispatcher = FileSystemDispatcher::From(context_);
   const KURL& url = CreateFileSystemURL(path);
   if (synchronous_type == kSynchronous) {
diff --git a/third_party/blink/renderer/modules/filesystem/dom_file_system_sync.cc b/third_party/blink/renderer/modules/filesystem/dom_file_system_sync.cc
index 95c6193e..afee5ea3 100644
--- a/third_party/blink/renderer/modules/filesystem/dom_file_system_sync.cc
+++ b/third_party/blink/renderer/modules/filesystem/dom_file_system_sync.cc
@@ -162,7 +162,7 @@
 
   FileWriterCallbacksSyncHelper* sync_helper =
       FileWriterCallbacksSyncHelper::Create();
-  std::unique_ptr<FileWriterCallbacks> callbacks = FileWriterCallbacks::Create(
+  auto callbacks = std::make_unique<FileWriterCallbacks>(
       file_writer, sync_helper->GetSuccessCallback(),
       sync_helper->GetErrorCallback(), context_);
 
diff --git a/third_party/blink/renderer/modules/filesystem/dom_window_file_system.cc b/third_party/blink/renderer/modules/filesystem/dom_window_file_system.cc
index 3da7c46e..6bb468d6 100644
--- a/third_party/blink/renderer/modules/filesystem/dom_window_file_system.cc
+++ b/third_party/blink/renderer/modules/filesystem/dom_window_file_system.cc
@@ -48,7 +48,7 @@
 void DOMWindowFileSystem::webkitRequestFileSystem(
     LocalDOMWindow& window,
     int type,
-    long long size,
+    int64_t size,
     V8FileSystemCallback* success_callback,
     V8ErrorCallback* error_callback) {
   if (!window.IsCurrentlyDisplayedInFrame())
@@ -82,7 +82,7 @@
 
   LocalFileSystem::From(*document)->RequestFileSystem(
       document, file_system_type, size,
-      FileSystemCallbacks::Create(
+      std::make_unique<FileSystemCallbacks>(
           FileSystemCallbacks::OnDidOpenFileSystemV8Impl::Create(
               success_callback),
           ScriptErrorCallback::Wrap(error_callback), document,
@@ -123,7 +123,7 @@
 
   LocalFileSystem::From(*document)->ResolveURL(
       document, completed_url,
-      ResolveURICallbacks::Create(
+      std::make_unique<ResolveURICallbacks>(
           ResolveURICallbacks::OnDidGetEntryV8Impl::Create(success_callback),
           ScriptErrorCallback::Wrap(error_callback), document),
       LocalFileSystem::kAsynchronous);
diff --git a/third_party/blink/renderer/modules/filesystem/dom_window_file_system.h b/third_party/blink/renderer/modules/filesystem/dom_window_file_system.h
index 2044964..325051af 100644
--- a/third_party/blink/renderer/modules/filesystem/dom_window_file_system.h
+++ b/third_party/blink/renderer/modules/filesystem/dom_window_file_system.h
@@ -46,7 +46,7 @@
  public:
   static void webkitRequestFileSystem(LocalDOMWindow&,
                                       int type,
-                                      long long size,
+                                      int64_t size,
                                       V8FileSystemCallback*,
                                       V8ErrorCallback*);
   static void webkitResolveLocalFileSystemURL(LocalDOMWindow&,
diff --git a/third_party/blink/renderer/modules/filesystem/file_system_callbacks.cc b/third_party/blink/renderer/modules/filesystem/file_system_callbacks.cc
index e3aa200..8b5dd93 100644
--- a/third_party/blink/renderer/modules/filesystem/file_system_callbacks.cc
+++ b/third_party/blink/renderer/modules/filesystem/file_system_callbacks.cc
@@ -158,18 +158,6 @@
   resolver_->Resolve(entry->asFileSystemHandle());
 }
 
-std::unique_ptr<EntryCallbacks> EntryCallbacks::Create(
-    OnDidGetEntryCallback* success_callback,
-    ErrorCallbackBase* error_callback,
-    ExecutionContext* context,
-    DOMFileSystemBase* file_system,
-    const String& expected_path,
-    bool is_directory) {
-  return base::WrapUnique(new EntryCallbacks(success_callback, error_callback,
-                                             context, file_system,
-                                             expected_path, is_directory));
-}
-
 EntryCallbacks::EntryCallbacks(OnDidGetEntryCallback* success_callback,
                                ErrorCallbackBase* error_callback,
                                ExecutionContext* context,
@@ -202,16 +190,6 @@
 
 // EntriesCallbacks -----------------------------------------------------------
 
-std::unique_ptr<EntriesCallbacks> EntriesCallbacks::Create(
-    OnDidGetEntriesCallback* success_callback,
-    ErrorCallbackBase* error_callback,
-    ExecutionContext* context,
-    DirectoryReaderBase* directory_reader,
-    const String& base_path) {
-  return base::WrapUnique(new EntriesCallbacks(
-      success_callback, error_callback, context, directory_reader, base_path));
-}
-
 EntriesCallbacks::EntriesCallbacks(OnDidGetEntriesCallback* success_callback,
                                    ErrorCallbackBase* error_callback,
                                    ExecutionContext* context,
@@ -285,15 +263,6 @@
   resolver_->Resolve(file_system->root()->asFileSystemHandle());
 }
 
-std::unique_ptr<FileSystemCallbacks> FileSystemCallbacks::Create(
-    OnDidOpenFileSystemCallback* success_callback,
-    ErrorCallbackBase* error_callback,
-    ExecutionContext* context,
-    mojom::blink::FileSystemType type) {
-  return base::WrapUnique(
-      new FileSystemCallbacks(success_callback, error_callback, context, type));
-}
-
 FileSystemCallbacks::FileSystemCallbacks(
     OnDidOpenFileSystemCallback* success_callback,
     ErrorCallbackBase* error_callback,
@@ -322,14 +291,6 @@
 
 // ResolveURICallbacks --------------------------------------------------------
 
-std::unique_ptr<ResolveURICallbacks> ResolveURICallbacks::Create(
-    OnDidGetEntryCallback* success_callback,
-    ErrorCallbackBase* error_callback,
-    ExecutionContext* context) {
-  return base::WrapUnique(
-      new ResolveURICallbacks(success_callback, error_callback, context));
-}
-
 ResolveURICallbacks::ResolveURICallbacks(
     OnDidGetEntryCallback* success_callback,
     ErrorCallbackBase* error_callback,
@@ -383,15 +344,6 @@
   callback_->InvokeAndReportException(nullptr, metadata);
 }
 
-std::unique_ptr<MetadataCallbacks> MetadataCallbacks::Create(
-    OnDidReadMetadataCallback* success_callback,
-    ErrorCallbackBase* error_callback,
-    ExecutionContext* context,
-    DOMFileSystemBase* file_system) {
-  return base::WrapUnique(new MetadataCallbacks(
-      success_callback, error_callback, context, file_system));
-}
-
 MetadataCallbacks::MetadataCallbacks(
     OnDidReadMetadataCallback* success_callback,
     ErrorCallbackBase* error_callback,
@@ -431,15 +383,6 @@
                                       static_cast<FileWriter*>(file_writer));
 }
 
-std::unique_ptr<FileWriterCallbacks> FileWriterCallbacks::Create(
-    FileWriterBase* file_writer,
-    OnDidCreateFileWriterCallback* success_callback,
-    ErrorCallbackBase* error_callback,
-    ExecutionContext* context) {
-  return base::WrapUnique(new FileWriterCallbacks(file_writer, success_callback,
-                                                  error_callback, context));
-}
-
 FileWriterCallbacks::FileWriterCallbacks(
     FileWriterBase* file_writer,
     OnDidCreateFileWriterCallback* success_callback,
@@ -478,17 +421,6 @@
   callback_->InvokeAndReportException(nullptr, file);
 }
 
-std::unique_ptr<SnapshotFileCallbackBase> SnapshotFileCallback::Create(
-    DOMFileSystemBase* filesystem,
-    const String& name,
-    const KURL& url,
-    OnDidCreateSnapshotFileCallback* success_callback,
-    ErrorCallbackBase* error_callback,
-    ExecutionContext* context) {
-  return base::WrapUnique(new SnapshotFileCallback(
-      filesystem, name, url, success_callback, error_callback, context));
-}
-
 SnapshotFileCallback::SnapshotFileCallback(
     DOMFileSystemBase* filesystem,
     const String& name,
@@ -552,15 +484,6 @@
   resolver_->Resolve();
 }
 
-std::unique_ptr<VoidCallbacks> VoidCallbacks::Create(
-    OnDidSucceedCallback* success_callback,
-    ErrorCallbackBase* error_callback,
-    ExecutionContext* context,
-    DOMFileSystemBase* file_system) {
-  return base::WrapUnique(new VoidCallbacks(success_callback, error_callback,
-                                            context, file_system));
-}
-
 VoidCallbacks::VoidCallbacks(OnDidSucceedCallback* success_callback,
                              ErrorCallbackBase* error_callback,
                              ExecutionContext* context,
diff --git a/third_party/blink/renderer/modules/filesystem/file_system_callbacks.h b/third_party/blink/renderer/modules/filesystem/file_system_callbacks.h
index beea02c..7268aac6 100644
--- a/third_party/blink/renderer/modules/filesystem/file_system_callbacks.h
+++ b/third_party/blink/renderer/modules/filesystem/file_system_callbacks.h
@@ -179,12 +179,13 @@
     Member<ScriptPromiseResolver> resolver_;
   };
 
-  static std::unique_ptr<EntryCallbacks> Create(OnDidGetEntryCallback*,
-                                                ErrorCallbackBase*,
-                                                ExecutionContext*,
-                                                DOMFileSystemBase*,
-                                                const String& expected_path,
-                                                bool is_directory);
+  EntryCallbacks(OnDidGetEntryCallback*,
+                 ErrorCallbackBase*,
+                 ExecutionContext*,
+                 DOMFileSystemBase*,
+                 const String& expected_path,
+                 bool is_directory);
+
   // Called when a requested operation is completed successfully.
   void DidSucceed();
 
@@ -192,12 +193,6 @@
   void DidFail(base::File::Error error);
 
  private:
-  EntryCallbacks(OnDidGetEntryCallback*,
-                 ErrorCallbackBase*,
-                 ExecutionContext*,
-                 DOMFileSystemBase*,
-                 const String& expected_path,
-                 bool is_directory);
   Persistent<OnDidGetEntryCallback> success_callback_;
   String expected_path_;
   bool is_directory_;
@@ -216,11 +211,12 @@
     OnDidGetEntriesCallback() = default;
   };
 
-  static std::unique_ptr<EntriesCallbacks> Create(OnDidGetEntriesCallback*,
-                                                  ErrorCallbackBase*,
-                                                  ExecutionContext*,
-                                                  DirectoryReaderBase*,
-                                                  const String& base_path);
+  EntriesCallbacks(OnDidGetEntriesCallback*,
+                   ErrorCallbackBase*,
+                   ExecutionContext*,
+                   DirectoryReaderBase*,
+                   const String& base_path);
+
   // Called when a directory entry is read.
   void DidReadDirectoryEntry(const String& name, bool is_directory);
 
@@ -233,11 +229,6 @@
   void DidFail(base::File::Error error);
 
  private:
-  EntriesCallbacks(OnDidGetEntriesCallback*,
-                   ErrorCallbackBase*,
-                   ExecutionContext*,
-                   DirectoryReaderBase*,
-                   const String& base_path);
   Persistent<OnDidGetEntriesCallback> success_callback_;
   Persistent<DirectoryReaderBase> directory_reader_;
   String base_path_;
@@ -285,11 +276,11 @@
     Member<ScriptPromiseResolver> resolver_;
   };
 
-  static std::unique_ptr<FileSystemCallbacks> Create(
-      OnDidOpenFileSystemCallback*,
-      ErrorCallbackBase*,
-      ExecutionContext*,
-      mojom::blink::FileSystemType);
+  FileSystemCallbacks(OnDidOpenFileSystemCallback*,
+                      ErrorCallbackBase*,
+                      ExecutionContext*,
+                      mojom::blink::FileSystemType);
+
   // Called when a requested file system is opened.
   void DidOpenFileSystem(const String& name, const KURL& root_url);
 
@@ -297,10 +288,6 @@
   void DidFail(base::File::Error error);
 
  private:
-  FileSystemCallbacks(OnDidOpenFileSystemCallback*,
-                      ErrorCallbackBase*,
-                      ExecutionContext*,
-                      mojom::blink::FileSystemType);
   Persistent<OnDidOpenFileSystemCallback> success_callback_;
   mojom::blink::FileSystemType type_;
 };
@@ -310,9 +297,10 @@
   using OnDidGetEntryCallback = EntryCallbacks::OnDidGetEntryCallback;
   using OnDidGetEntryV8Impl = EntryCallbacks::OnDidGetEntryV8Impl;
 
-  static std::unique_ptr<ResolveURICallbacks> Create(OnDidGetEntryCallback*,
-                                                     ErrorCallbackBase*,
-                                                     ExecutionContext*);
+  ResolveURICallbacks(OnDidGetEntryCallback*,
+                      ErrorCallbackBase*,
+                      ExecutionContext*);
+
   // Called when a filesystem URL is resolved.
   void DidResolveURL(const String& name,
                      const KURL& root_url,
@@ -324,9 +312,6 @@
   void DidFail(base::File::Error error);
 
  private:
-  ResolveURICallbacks(OnDidGetEntryCallback*,
-                      ErrorCallbackBase*,
-                      ExecutionContext*);
   Persistent<OnDidGetEntryCallback> success_callback_;
 };
 
@@ -360,10 +345,11 @@
     Member<V8PersistentCallbackInterface<V8MetadataCallback>> callback_;
   };
 
-  static std::unique_ptr<MetadataCallbacks> Create(OnDidReadMetadataCallback*,
-                                                   ErrorCallbackBase*,
-                                                   ExecutionContext*,
-                                                   DOMFileSystemBase*);
+  MetadataCallbacks(OnDidReadMetadataCallback*,
+                    ErrorCallbackBase*,
+                    ExecutionContext*,
+                    DOMFileSystemBase*);
+
   // Called when a file metadata is read successfully.
   void DidReadMetadata(const FileMetadata&);
 
@@ -371,10 +357,6 @@
   void DidFail(base::File::Error error);
 
  private:
-  MetadataCallbacks(OnDidReadMetadataCallback*,
-                    ErrorCallbackBase*,
-                    ExecutionContext*,
-                    DOMFileSystemBase*);
   Persistent<OnDidReadMetadataCallback> success_callback_;
 };
 
@@ -409,11 +391,11 @@
     Member<V8PersistentCallbackInterface<V8FileWriterCallback>> callback_;
   };
 
-  static std::unique_ptr<FileWriterCallbacks> Create(
-      FileWriterBase*,
-      OnDidCreateFileWriterCallback*,
-      ErrorCallbackBase*,
-      ExecutionContext*);
+  FileWriterCallbacks(FileWriterBase*,
+                      OnDidCreateFileWriterCallback*,
+                      ErrorCallbackBase*,
+                      ExecutionContext*);
+
   // Called when an AsyncFileWrter has been created successfully.
   void DidCreateFileWriter(const KURL& path, long long length);
 
@@ -421,10 +403,6 @@
   void DidFail(base::File::Error error);
 
  private:
-  FileWriterCallbacks(FileWriterBase*,
-                      OnDidCreateFileWriterCallback*,
-                      ErrorCallbackBase*,
-                      ExecutionContext*);
   Persistent<FileWriterBase> file_writer_;
   Persistent<OnDidCreateFileWriterCallback> success_callback_;
 };
@@ -461,13 +439,13 @@
     Member<V8PersistentCallbackInterface<V8FileCallback>> callback_;
   };
 
-  static std::unique_ptr<SnapshotFileCallbackBase> Create(
-      DOMFileSystemBase*,
-      const String& name,
-      const KURL&,
-      OnDidCreateSnapshotFileCallback*,
-      ErrorCallbackBase*,
-      ExecutionContext*);
+  SnapshotFileCallback(DOMFileSystemBase*,
+                       const String& name,
+                       const KURL&,
+                       OnDidCreateSnapshotFileCallback*,
+                       ErrorCallbackBase*,
+                       ExecutionContext*);
+
   // Called when a snapshot file is created successfully.
   void DidCreateSnapshotFile(const FileMetadata&,
                              scoped_refptr<BlobDataHandle> snapshot) override;
@@ -476,12 +454,6 @@
   void DidFail(base::File::Error error) override;
 
  private:
-  SnapshotFileCallback(DOMFileSystemBase*,
-                       const String& name,
-                       const KURL&,
-                       OnDidCreateSnapshotFileCallback*,
-                       ErrorCallbackBase*,
-                       ExecutionContext*);
   String name_;
   KURL url_;
   Persistent<OnDidCreateSnapshotFileCallback> success_callback_;
@@ -527,10 +499,11 @@
     Member<ScriptPromiseResolver> resolver_;
   };
 
-  static std::unique_ptr<VoidCallbacks> Create(OnDidSucceedCallback*,
-                                               ErrorCallbackBase*,
-                                               ExecutionContext*,
-                                               DOMFileSystemBase*);
+  VoidCallbacks(OnDidSucceedCallback*,
+                ErrorCallbackBase*,
+                ExecutionContext*,
+                DOMFileSystemBase*);
+
   // Called when a requested operation is completed successfully.
   void DidSucceed();
 
@@ -538,10 +511,6 @@
   void DidFail(base::File::Error error);
 
  private:
-  VoidCallbacks(OnDidSucceedCallback*,
-                ErrorCallbackBase*,
-                ExecutionContext*,
-                DOMFileSystemBase*);
   Persistent<OnDidSucceedCallback> success_callback_;
 };
 
diff --git a/third_party/blink/renderer/modules/filesystem/file_system_directory_handle.cc b/third_party/blink/renderer/modules/filesystem/file_system_directory_handle.cc
index 0be01e92..786b2d4 100644
--- a/third_party/blink/renderer/modules/filesystem/file_system_directory_handle.cc
+++ b/third_party/blink/renderer/modules/filesystem/file_system_directory_handle.cc
@@ -58,7 +58,7 @@
 
   LocalFileSystem::From(*context)->RequestFileSystem(
       context, mojom::blink::FileSystemType::kTemporary, /*size=*/0,
-      FileSystemCallbacks::Create(
+      std::make_unique<FileSystemCallbacks>(
           MakeGarbageCollected<
               FileSystemCallbacks::OnDidOpenFileSystemPromiseImpl>(resolver),
           MakeGarbageCollected<PromiseErrorCallback>(resolver), context,
diff --git a/third_party/blink/renderer/modules/filesystem/file_system_file_handle.cc b/third_party/blink/renderer/modules/filesystem/file_system_file_handle.cc
index 7a7b14082..6fb7dace 100644
--- a/third_party/blink/renderer/modules/filesystem/file_system_file_handle.cc
+++ b/third_party/blink/renderer/modules/filesystem/file_system_file_handle.cc
@@ -68,7 +68,7 @@
   FileSystemDispatcher::From(ExecutionContext::From(script_state))
       .CreateSnapshotFile(
           file_system_url,
-          SnapshotFileCallback::Create(
+          std::make_unique<SnapshotFileCallback>(
               filesystem(), name(), file_system_url,
               MakeGarbageCollected<OnDidCreateSnapshotFilePromise>(resolver),
               MakeGarbageCollected<PromiseErrorCallback>(resolver),
diff --git a/third_party/blink/renderer/modules/filesystem/file_writer.cc b/third_party/blink/renderer/modules/filesystem/file_writer.cc
index 94dbe81..f8b5bac 100644
--- a/third_party/blink/renderer/modules/filesystem/file_writer.cc
+++ b/third_party/blink/renderer/modules/filesystem/file_writer.cc
@@ -43,6 +43,8 @@
 
 static const int kMaxRecursionDepth = 3;
 static const double kProgressNotificationIntervalMS = 50;
+static constexpr uint64_t kMaxTruncateLength =
+    std::numeric_limits<uint64_t>::max();
 
 FileWriter* FileWriter::Create(ExecutionContext* context) {
   return MakeGarbageCollected<FileWriter>(context);
@@ -55,7 +57,7 @@
       queued_operation_(kOperationNone),
       bytes_written_(0),
       bytes_to_write_(0),
-      truncate_length_(-1),
+      truncate_length_(kMaxTruncateLength),
       num_aborts_(0),
       recursion_depth_(0),
       last_progress_notification_time_ms_(0),
@@ -82,7 +84,7 @@
   if (!GetExecutionContext())
     return;
   DCHECK(data);
-  DCHECK_EQ(truncate_length_, -1);
+  DCHECK_EQ(truncate_length_, kMaxTruncateLength);
   if (ready_state_ == kWriting) {
     SetError(FileErrorCode::kInvalidStateErr, exception_state);
     return;
@@ -108,7 +110,7 @@
   FireEvent(event_type_names::kWritestart);
 }
 
-void FileWriter::seek(long long position, ExceptionState& exception_state) {
+void FileWriter::seek(int64_t position, ExceptionState& exception_state) {
   if (!GetExecutionContext())
     return;
   if (ready_state_ == kWriting) {
@@ -116,15 +118,15 @@
     return;
   }
 
-  DCHECK_EQ(truncate_length_, -1);
+  DCHECK_EQ(truncate_length_, kMaxTruncateLength);
   DCHECK_EQ(queued_operation_, kOperationNone);
   SeekInternal(position);
 }
 
-void FileWriter::truncate(long long position, ExceptionState& exception_state) {
+void FileWriter::truncate(int64_t position, ExceptionState& exception_state) {
   if (!GetExecutionContext())
     return;
-  DCHECK_EQ(truncate_length_, -1);
+  DCHECK_EQ(truncate_length_, kMaxTruncateLength);
   if (ready_state_ == kWriting || position < 0) {
     SetError(FileErrorCode::kInvalidStateErr, exception_state);
     return;
@@ -166,7 +168,7 @@
     return;
   }
   DCHECK_EQ(kWriting, ready_state_);
-  DCHECK_EQ(-1, truncate_length_);
+  DCHECK_EQ(kMaxTruncateLength, truncate_length_);
   DCHECK_EQ(kOperationWrite, operation_in_progress_);
   DCHECK(!bytes_to_write_ || bytes + bytes_written_ > 0);
   DCHECK(bytes + bytes_written_ <= bytes_to_write_);
@@ -180,7 +182,7 @@
     operation_in_progress_ = kOperationNone;
   }
 
-  long long num_aborts = num_aborts_;
+  uint64_t num_aborts = num_aborts_;
   // We could get an abort in the handler for this event. If we do, it's
   // already handled the cleanup and signalCompletion call.
   double now = CurrentTimeMS();
@@ -203,7 +205,7 @@
     return;
   }
   DCHECK_EQ(operation_in_progress_, kOperationTruncate);
-  DCHECK_GE(truncate_length_, 0);
+  DCHECK_NE(truncate_length_, kMaxTruncateLength);
   SetLength(truncate_length_);
   if (position() > length())
     SetPosition(length());
@@ -260,20 +262,20 @@
   switch (operation) {
     case kOperationWrite:
       DCHECK_EQ(kOperationNone, operation_in_progress_);
-      DCHECK_EQ(-1, truncate_length_);
+      DCHECK_EQ(kMaxTruncateLength, truncate_length_);
       DCHECK(blob_being_written_.Get());
       DCHECK_EQ(kWriting, ready_state_);
       Write(position(), blob_being_written_->Uuid());
       break;
     case kOperationTruncate:
       DCHECK_EQ(kOperationNone, operation_in_progress_);
-      DCHECK_GE(truncate_length_, 0);
+      DCHECK_NE(truncate_length_, kMaxTruncateLength);
       DCHECK_EQ(kWriting, ready_state_);
       Truncate(truncate_length_);
       break;
     case kOperationNone:
       DCHECK_EQ(kOperationNone, operation_in_progress_);
-      DCHECK_EQ(-1, truncate_length_);
+      DCHECK_EQ(kMaxTruncateLength, truncate_length_);
       DCHECK(!blob_being_written_.Get());
       DCHECK_EQ(kDone, ready_state_);
       break;
@@ -285,7 +287,7 @@
         operation = kOperationNone;
       queued_operation_ = kOperationNone;
       blob_being_written_.Clear();
-      truncate_length_ = -1;
+      truncate_length_ = kMaxTruncateLength;
       break;
   }
   DCHECK_EQ(queued_operation_, kOperationNone);
@@ -294,7 +296,7 @@
 
 void FileWriter::SignalCompletion(base::File::Error error) {
   ready_state_ = kDone;
-  truncate_length_ = -1;
+  truncate_length_ = kMaxTruncateLength;
   if (error != base::File::FILE_OK) {
     error_ = file_error::CreateDOMException(error);
     if (base::File::FILE_ERROR_ABORT == error)
@@ -314,8 +316,8 @@
   ++recursion_depth_;
   DispatchEvent(
       *ProgressEvent::Create(type, true, bytes_written_, bytes_to_write_));
+  DCHECK_GT(recursion_depth_, 0);
   --recursion_depth_;
-  DCHECK_GE(recursion_depth_, 0);
 }
 
 void FileWriter::SetError(FileErrorCode error_code,
diff --git a/third_party/blink/renderer/modules/filesystem/file_writer.h b/third_party/blink/renderer/modules/filesystem/file_writer.h
index 970e12a..fbde639 100644
--- a/third_party/blink/renderer/modules/filesystem/file_writer.h
+++ b/third_party/blink/renderer/modules/filesystem/file_writer.h
@@ -63,8 +63,8 @@
   enum ReadyState { kInit = 0, kWriting = 1, kDone = 2 };
 
   void write(Blob*, ExceptionState&);
-  void seek(long long position, ExceptionState&);
-  void truncate(long long length, ExceptionState&);
+  void seek(int64_t position, ExceptionState&);
+  void truncate(int64_t length, ExceptionState&);
   void abort(ExceptionState&);
   ReadyState getReadyState() const { return ready_state_; }
   DOMException* error() const { return error_.Get(); }
@@ -124,11 +124,11 @@
   ReadyState ready_state_;
   Operation operation_in_progress_;
   Operation queued_operation_;
-  long long bytes_written_;
-  long long bytes_to_write_;
-  long long truncate_length_;
-  long long num_aborts_;
-  long long recursion_depth_;
+  uint64_t bytes_written_;
+  uint64_t bytes_to_write_;
+  uint64_t truncate_length_;
+  uint64_t num_aborts_;
+  uint8_t recursion_depth_;
   double last_progress_notification_time_ms_;
   Member<Blob> blob_being_written_;
   int request_id_;
diff --git a/third_party/blink/renderer/modules/filesystem/file_writer_base.cc b/third_party/blink/renderer/modules/filesystem/file_writer_base.cc
index 5e01937d..1b7f8ea 100644
--- a/third_party/blink/renderer/modules/filesystem/file_writer_base.cc
+++ b/third_party/blink/renderer/modules/filesystem/file_writer_base.cc
@@ -39,7 +39,7 @@
 
 FileWriterBase::~FileWriterBase() = default;
 
-void FileWriterBase::Initialize(const KURL& path, long long length) {
+void FileWriterBase::Initialize(const KURL& path, int64_t length) {
   DCHECK_GE(length, 0);
   length_ = length;
   path_ = path;
@@ -50,7 +50,7 @@
       operation_(kOperationNone),
       cancel_state_(kCancelNotInProgress) {}
 
-void FileWriterBase::SeekInternal(long long position) {
+void FileWriterBase::SeekInternal(int64_t position) {
   if (position > length_)
     position = length_;
   else if (position < 0)
@@ -60,14 +60,14 @@
   position_ = position;
 }
 
-void FileWriterBase::Truncate(long long length) {
+void FileWriterBase::Truncate(int64_t length) {
   DCHECK_EQ(kOperationNone, operation_);
   DCHECK_EQ(kCancelNotInProgress, cancel_state_);
   operation_ = kOperationTruncate;
   DoTruncate(path_, length);
 }
 
-void FileWriterBase::Write(long long position, const String& id) {
+void FileWriterBase::Write(int64_t position, const String& id) {
   DCHECK_EQ(kOperationNone, operation_);
   DCHECK_EQ(kCancelNotInProgress, cancel_state_);
   operation_ = kOperationWrite;
diff --git a/third_party/blink/renderer/modules/filesystem/file_writer_base.h b/third_party/blink/renderer/modules/filesystem/file_writer_base.h
index 03e1b25c..d8d3633 100644
--- a/third_party/blink/renderer/modules/filesystem/file_writer_base.h
+++ b/third_party/blink/renderer/modules/filesystem/file_writer_base.h
@@ -42,25 +42,25 @@
 class MODULES_EXPORT FileWriterBase : public GarbageCollectedMixin {
  public:
   virtual ~FileWriterBase();
-  void Initialize(const KURL& path, long long length);
+  void Initialize(const KURL& path, int64_t length);
 
-  long long position() const { return position_; }
-  long long length() const { return length_; }
+  int64_t position() const { return position_; }
+  int64_t length() const { return length_; }
 
   void Trace(blink::Visitor* visitor) override {}
 
-  virtual void Truncate(long long length);
-  virtual void Write(long long position, const String& id);
+  virtual void Truncate(int64_t length);
+  virtual void Write(int64_t position, const String& id);
   virtual void Cancel();
 
  protected:
   FileWriterBase();
 
-  void SetPosition(long long position) { position_ = position; }
+  void SetPosition(int64_t position) { position_ = position; }
 
-  void SetLength(long long length) { length_ = length; }
+  void SetLength(int64_t length) { length_ = length; }
 
-  void SeekInternal(long long position);
+  void SeekInternal(int64_t position);
 
   // This calls DidSucceed() or DidFail() based on the value of |error_code|.
   void DidFinish(base::File::Error error_code);
@@ -93,8 +93,8 @@
 
   void FinishCancel();
 
-  long long position_;
-  long long length_;
+  int64_t position_;
+  int64_t length_;
   KURL path_;
   OperationType operation_;
   CancelState cancel_state_;
diff --git a/third_party/blink/renderer/modules/filesystem/file_writer_sync.cc b/third_party/blink/renderer/modules/filesystem/file_writer_sync.cc
index 702cd3c..d3f2530 100644
--- a/third_party/blink/renderer/modules/filesystem/file_writer_sync.cc
+++ b/third_party/blink/renderer/modules/filesystem/file_writer_sync.cc
@@ -54,13 +54,12 @@
     SetLength(position());
 }
 
-void FileWriterSync::seek(long long position, ExceptionState& exception_state) {
+void FileWriterSync::seek(int64_t position, ExceptionState& exception_state) {
   DCHECK(complete_);
   SeekInternal(position);
 }
 
-void FileWriterSync::truncate(long long offset,
-                              ExceptionState& exception_state) {
+void FileWriterSync::truncate(int64_t offset, ExceptionState& exception_state) {
   DCHECK(complete_);
   if (offset < 0) {
     exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
diff --git a/third_party/blink/renderer/modules/filesystem/file_writer_sync.h b/third_party/blink/renderer/modules/filesystem/file_writer_sync.h
index cd19a8d..32a2194 100644
--- a/third_party/blink/renderer/modules/filesystem/file_writer_sync.h
+++ b/third_party/blink/renderer/modules/filesystem/file_writer_sync.h
@@ -58,8 +58,8 @@
   void Trace(blink::Visitor*) override;
 
   void write(Blob*, ExceptionState&);
-  void seek(long long position, ExceptionState&);
-  void truncate(long long length, ExceptionState&);
+  void seek(int64_t position, ExceptionState&);
+  void truncate(int64_t length, ExceptionState&);
 
   // FileWriterBase
   void DidWriteImpl(int64_t bytes, bool complete) override;
diff --git a/third_party/blink/renderer/modules/filesystem/file_writer_test.cc b/third_party/blink/renderer/modules/filesystem/file_writer_test.cc
index 262e809..1da44bd 100644
--- a/third_party/blink/renderer/modules/filesystem/file_writer_test.cc
+++ b/third_party/blink/renderer/modules/filesystem/file_writer_test.cc
@@ -67,7 +67,7 @@
   bool received_cancel_;
 
   int received_did_write_count_;
-  long long received_did_write_bytes_total_;
+  int64_t received_did_write_bytes_total_;
   bool received_did_write_complete_;
   bool received_did_truncate_;
   bool received_did_fail_;
diff --git a/third_party/blink/renderer/modules/filesystem/local_file_system.cc b/third_party/blink/renderer/modules/filesystem/local_file_system.cc
index 758395e..b0cd5d9b 100644
--- a/third_party/blink/renderer/modules/filesystem/local_file_system.cc
+++ b/third_party/blink/renderer/modules/filesystem/local_file_system.cc
@@ -84,7 +84,7 @@
 void LocalFileSystem::RequestFileSystem(
     ExecutionContext* context,
     mojom::blink::FileSystemType type,
-    long long size,
+    int64_t size,
     std::unique_ptr<FileSystemCallbacks> callbacks,
     SynchronousType sync_type) {
   RequestFileSystemAccessInternal(
diff --git a/third_party/blink/renderer/modules/filesystem/local_file_system.h b/third_party/blink/renderer/modules/filesystem/local_file_system.h
index 2645ee5..532745c 100644
--- a/third_party/blink/renderer/modules/filesystem/local_file_system.h
+++ b/third_party/blink/renderer/modules/filesystem/local_file_system.h
@@ -73,7 +73,7 @@
                   SynchronousType sync_type);
   void RequestFileSystem(ExecutionContext*,
                          mojom::blink::FileSystemType,
-                         long long size,
+                         int64_t size,
                          std::unique_ptr<FileSystemCallbacks>,
                          SynchronousType sync_type);
 
diff --git a/third_party/blink/renderer/modules/filesystem/worker_global_scope_file_system.cc b/third_party/blink/renderer/modules/filesystem/worker_global_scope_file_system.cc
index cdd307e..08afe92 100644
--- a/third_party/blink/renderer/modules/filesystem/worker_global_scope_file_system.cc
+++ b/third_party/blink/renderer/modules/filesystem/worker_global_scope_file_system.cc
@@ -48,7 +48,7 @@
 void WorkerGlobalScopeFileSystem::webkitRequestFileSystem(
     WorkerGlobalScope& worker,
     int type,
-    long long size,
+    int64_t size,
     V8FileSystemCallback* success_callback,
     V8ErrorCallback* error_callback) {
   ExecutionContext* secure_context = worker.GetExecutionContext();
@@ -72,7 +72,7 @@
 
   LocalFileSystem::From(worker)->RequestFileSystem(
       &worker, file_system_type, size,
-      FileSystemCallbacks::Create(
+      std::make_unique<FileSystemCallbacks>(
           FileSystemCallbacks::OnDidOpenFileSystemV8Impl::Create(
               success_callback),
           ScriptErrorCallback::Wrap(error_callback), &worker, file_system_type),
@@ -82,7 +82,7 @@
 DOMFileSystemSync* WorkerGlobalScopeFileSystem::webkitRequestFileSystemSync(
     WorkerGlobalScope& worker,
     int type,
-    long long size,
+    int64_t size,
     ExceptionState& exception_state) {
   ExecutionContext* secure_context = worker.GetExecutionContext();
   if (!secure_context->GetSecurityOrigin()->CanAccessFileSystem()) {
@@ -103,7 +103,7 @@
 
   FileSystemCallbacksSyncHelper* sync_helper =
       FileSystemCallbacksSyncHelper::Create();
-  std::unique_ptr<FileSystemCallbacks> callbacks = FileSystemCallbacks::Create(
+  auto callbacks = std::make_unique<FileSystemCallbacks>(
       sync_helper->GetSuccessCallback(), sync_helper->GetErrorCallback(),
       &worker, file_system_type);
 
@@ -140,7 +140,7 @@
 
   LocalFileSystem::From(worker)->ResolveURL(
       &worker, completed_url,
-      ResolveURICallbacks::Create(
+      std::make_unique<ResolveURICallbacks>(
           ResolveURICallbacks::OnDidGetEntryV8Impl::Create(success_callback),
           ScriptErrorCallback::Wrap(error_callback), &worker),
       LocalFileSystem::kAsynchronous);
@@ -168,8 +168,9 @@
 
   EntryCallbacksSyncHelper* sync_helper = EntryCallbacksSyncHelper::Create();
   std::unique_ptr<ResolveURICallbacks> callbacks =
-      ResolveURICallbacks::Create(sync_helper->GetSuccessCallback(),
-                                  sync_helper->GetErrorCallback(), &worker);
+      std::make_unique<ResolveURICallbacks>(sync_helper->GetSuccessCallback(),
+                                            sync_helper->GetErrorCallback(),
+                                            &worker);
 
   LocalFileSystem::From(worker)->ResolveURL(&worker, completed_url,
                                             std::move(callbacks),
diff --git a/third_party/blink/renderer/modules/filesystem/worker_global_scope_file_system.h b/third_party/blink/renderer/modules/filesystem/worker_global_scope_file_system.h
index d483a66..ef72adc 100644
--- a/third_party/blink/renderer/modules/filesystem/worker_global_scope_file_system.h
+++ b/third_party/blink/renderer/modules/filesystem/worker_global_scope_file_system.h
@@ -50,12 +50,12 @@
 
   static void webkitRequestFileSystem(WorkerGlobalScope&,
                                       int type,
-                                      long long size,
+                                      int64_t size,
                                       V8FileSystemCallback* success_callback,
                                       V8ErrorCallback*);
   static DOMFileSystemSync* webkitRequestFileSystemSync(WorkerGlobalScope&,
                                                         int type,
-                                                        long long size,
+                                                        int64_t size,
                                                         ExceptionState&);
   static void webkitResolveLocalFileSystemURL(WorkerGlobalScope&,
                                               const String& url,
diff --git a/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks.h b/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks.h
index d749133..6700573 100644
--- a/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks.h
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks.h
@@ -38,6 +38,10 @@
 
 class WebIDBCallbacks : public mojom::blink::IDBCallbacks {
  public:
+  virtual void SuccessCursorPrefetch(
+      Vector<std::unique_ptr<IDBKey>> keys,
+      Vector<std::unique_ptr<IDBKey>> primary_keys,
+      Vector<std::unique_ptr<IDBValue>> values) = 0;
   virtual void DetachRequestFromCallback() = 0;
   virtual void SetState(base::WeakPtr<WebIDBCursorImpl> cursor,
                         int64_t transaction_id) = 0;
diff --git a/third_party/blink/renderer/modules/media_controls/BUILD.gn b/third_party/blink/renderer/modules/media_controls/BUILD.gn
index 680021e..f95ad65 100644
--- a/third_party/blink/renderer/modules/media_controls/BUILD.gn
+++ b/third_party/blink/renderer/modules/media_controls/BUILD.gn
@@ -88,6 +88,11 @@
     "media_controls_resource_loader.h",
     "media_controls_rotate_to_fullscreen_delegate.cc",
     "media_controls_rotate_to_fullscreen_delegate.h",
+    "non_touch/media_controls_non_touch_impl.cc",
+    "non_touch/media_controls_non_touch_impl.h",
+    "non_touch/media_controls_non_touch_media_event_listener.cc",
+    "non_touch/media_controls_non_touch_media_event_listener.h",
+    "non_touch/media_controls_non_touch_media_event_listener_observer.h",
   ]
 
   deps = [
diff --git a/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_impl.cc b/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_impl.cc
new file mode 100644
index 0000000..6d4782523
--- /dev/null
+++ b/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_impl.cc
@@ -0,0 +1,88 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_impl.h"
+
+#include "third_party/blink/renderer/core/dom/events/event.h"
+#include "third_party/blink/renderer/core/dom/shadow_root.h"
+#include "third_party/blink/renderer/core/events/keyboard_event.h"
+#include "third_party/blink/renderer/core/html/media/html_media_element.h"
+#include "third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_media_event_listener.h"
+#include "third_party/blink/renderer/platform/keyboard_codes.h"
+
+namespace blink {
+
+MediaControlsNonTouchImpl::MediaControlsNonTouchImpl(
+    HTMLMediaElement& media_element)
+    : HTMLDivElement(media_element.GetDocument()),
+      MediaControls(media_element),
+      media_event_listener_(
+          MakeGarbageCollected<MediaControlsNonTouchMediaEventListener>(
+              media_element)) {
+  SetShadowPseudoId(AtomicString("-internal-media-controls-non-touch"));
+  media_event_listener_->AddObserver(this);
+}
+
+MediaControlsNonTouchImpl* MediaControlsNonTouchImpl::Create(
+    HTMLMediaElement& media_element,
+    ShadowRoot& shadow_root) {
+  MediaControlsNonTouchImpl* controls =
+      MakeGarbageCollected<MediaControlsNonTouchImpl>(media_element);
+  shadow_root.ParserAppendChild(controls);
+  return controls;
+}
+
+Node::InsertionNotificationRequest MediaControlsNonTouchImpl::InsertedInto(
+    ContainerNode& root) {
+  media_event_listener_->Attach();
+  return HTMLDivElement::InsertedInto(root);
+}
+
+void MediaControlsNonTouchImpl::RemovedFrom(ContainerNode& insertion_point) {
+  HTMLDivElement::RemovedFrom(insertion_point);
+  Hide();
+  media_event_listener_->Detach();
+}
+
+void MediaControlsNonTouchImpl::MaybeShow() {
+  // show controls
+}
+
+void MediaControlsNonTouchImpl::Hide() {
+  // hide controls
+}
+
+void MediaControlsNonTouchImpl::OnFocusIn() {
+  if (MediaElement().ShouldShowControls())
+    MaybeShow();
+}
+
+void MediaControlsNonTouchImpl::OnKeyDown(KeyboardEvent* event) {
+  bool handled = true;
+  switch (event->keyCode()) {
+    case VKEY_RETURN:
+      MediaElement().TogglePlayState();
+      break;
+    case VKEY_LEFT:
+    case VKEY_RIGHT:
+    case VKEY_UP:
+    case VKEY_DOWN:
+      // do something
+      break;
+    default:
+      handled = false;
+      break;
+  }
+
+  if (handled)
+    event->SetDefaultHandled();
+}
+
+void MediaControlsNonTouchImpl::Trace(blink::Visitor* visitor) {
+  visitor->Trace(media_event_listener_);
+  MediaControls::Trace(visitor);
+  HTMLDivElement::Trace(visitor);
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_impl.h b/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_impl.h
new file mode 100644
index 0000000..cb278933
--- /dev/null
+++ b/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_impl.h
@@ -0,0 +1,72 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_NON_TOUCH_MEDIA_CONTROLS_NON_TOUCH_IMPL_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_NON_TOUCH_MEDIA_CONTROLS_NON_TOUCH_IMPL_H_
+
+#include "third_party/blink/renderer/core/html/html_div_element.h"
+#include "third_party/blink/renderer/core/html/media/media_controls.h"
+#include "third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_media_event_listener_observer.h"
+#include "third_party/blink/renderer/modules/modules_export.h"
+
+namespace blink {
+
+class MediaControlsNonTouchMediaEventListener;
+
+class MODULES_EXPORT MediaControlsNonTouchImpl final
+    : public HTMLDivElement,
+      public MediaControls,
+      public MediaControlsNonTouchMediaEventListenerObserver {
+  USING_GARBAGE_COLLECTED_MIXIN(MediaControlsNonTouchImpl);
+
+ public:
+  static MediaControlsNonTouchImpl* Create(HTMLMediaElement&, ShadowRoot&);
+
+  explicit MediaControlsNonTouchImpl(HTMLMediaElement&);
+
+  // Node override.
+  Node::InsertionNotificationRequest InsertedInto(ContainerNode&) override;
+  void RemovedFrom(ContainerNode&) override;
+
+  // MediaControls implementation.
+  void MaybeShow() override;
+  void Hide() override;
+  void Reset() override {}
+  void OnControlsListUpdated() override {}
+  void OnTrackElementFailedToLoad() override {}
+  void NetworkStateChanged() override {}
+  LayoutObject* PanelLayoutObject() override { return nullptr; }
+  LayoutObject* TimelineLayoutObject() override { return nullptr; }
+  LayoutObject* ButtonPanelLayoutObject() override { return nullptr; }
+  LayoutObject* ContainerLayoutObject() override { return nullptr; }
+  void SetTestMode(bool) override {}
+  HTMLDivElement* PanelElement() override { return nullptr; }
+  void OnMediaControlsEnabledChange() override {}
+
+  // MediaControlsNonTouchMediaEventListenerObserver implementation.
+  void OnFocusIn() override;
+  void OnTimeUpdate() override {}
+  void OnDurationChange() override {}
+  void OnPlay() override {}
+  void OnPause() override {}
+  void OnError() override {}
+  void OnLoadedMetadata() override {}
+  void OnKeyPress(KeyboardEvent* event) override {}
+  void OnKeyDown(KeyboardEvent* event) override;
+  void OnKeyUp(KeyboardEvent* event) override {}
+
+  void Trace(blink::Visitor*) override;
+
+ private:
+  friend class MediaControlsNonTouchImplTest;
+
+  // Node
+  bool IsMediaControls() const override { return true; }
+
+  Member<MediaControlsNonTouchMediaEventListener> media_event_listener_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_NON_TOUCH_MEDIA_CONTROLS_NON_TOUCH_IMPL_H_
diff --git a/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_impl_test.cc b/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_impl_test.cc
new file mode 100644
index 0000000..dbc8b42d
--- /dev/null
+++ b/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_impl_test.cc
@@ -0,0 +1,82 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_impl.h"
+
+#include <memory>
+
+#include "build/build_config.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/renderer/core/dom/element.h"
+#include "third_party/blink/renderer/core/events/keyboard_event.h"
+#include "third_party/blink/renderer/core/frame/settings.h"
+#include "third_party/blink/renderer/core/html/media/html_media_element.h"
+#include "third_party/blink/renderer/core/html/media/html_media_test_helper.h"
+#include "third_party/blink/renderer/core/html/media/html_video_element.h"
+#include "third_party/blink/renderer/core/loader/empty_clients.h"
+#include "third_party/blink/renderer/core/testing/page_test_base.h"
+#include "third_party/blink/renderer/platform/keyboard_codes.h"
+#include "third_party/blink/renderer/platform/testing/empty_web_media_player.h"
+
+namespace blink {
+
+namespace {
+
+class MockWebMediaPlayerForNonTouchImpl : public EmptyWebMediaPlayer {
+ public:
+  bool HasVideo() const override { return true; }
+};
+
+class MediaControlsNonTouchImplTest : public PageTestBase {
+ protected:
+  void SetUp() override { InitializePage(); }
+
+  void InitializePage() {
+    Page::PageClients clients;
+    FillWithEmptyClients(clients);
+    clients.chrome_client = MakeGarbageCollected<EmptyChromeClient>();
+    SetupPageWithClients(
+        &clients, test::MediaStubLocalFrameClient::Create(
+                      std::make_unique<MockWebMediaPlayerForNonTouchImpl>()));
+
+    GetDocument().write("<video>");
+    HTMLMediaElement& video =
+        ToHTMLVideoElement(*GetDocument().QuerySelector("video"));
+    media_controls_ = MediaControlsNonTouchImpl::Create(
+        video, video.EnsureUserAgentShadowRoot());
+  }
+
+  MediaControlsNonTouchImpl& MediaControls() { return *media_controls_; }
+
+  void SimulateKeydownEvent(Element& element, int key_code) {
+    KeyboardEventInit* keyboard_event_init = KeyboardEventInit::Create();
+    keyboard_event_init->setKeyCode(key_code);
+
+    Event* keyboard_event =
+        MakeGarbageCollected<KeyboardEvent>("keydown", keyboard_event_init);
+    element.DispatchEvent(*keyboard_event);
+  }
+
+ private:
+  Persistent<MediaControlsNonTouchImpl> media_controls_;
+};
+
+TEST_F(MediaControlsNonTouchImplTest, PlayPause) {
+  MediaControls().MediaElement().SetFocused(true,
+                                            WebFocusType::kWebFocusTypeNone);
+  MediaControls().MediaElement().Play();
+  ASSERT_FALSE(MediaControls().MediaElement().paused());
+
+  // Press center key and video should be paused.
+  SimulateKeydownEvent(MediaControls().MediaElement(), VKEY_RETURN);
+  ASSERT_TRUE(MediaControls().MediaElement().paused());
+
+  // Press center key and video should be played.
+  SimulateKeydownEvent(MediaControls().MediaElement(), VKEY_RETURN);
+  ASSERT_FALSE(MediaControls().MediaElement().paused());
+}
+
+}  // namespace
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_media_event_listener.cc b/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_media_event_listener.cc
new file mode 100644
index 0000000..2ee0746
--- /dev/null
+++ b/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_media_event_listener.cc
@@ -0,0 +1,116 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_media_event_listener.h"
+
+#include "third_party/blink/renderer/core/dom/events/event.h"
+#include "third_party/blink/renderer/core/events/keyboard_event.h"
+#include "third_party/blink/renderer/core/html/media/html_media_element.h"
+#include "third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_media_event_listener_observer.h"
+
+namespace blink {
+
+MediaControlsNonTouchMediaEventListener::
+    MediaControlsNonTouchMediaEventListener(HTMLMediaElement& media_element)
+    : media_element_(media_element) {
+  if (media_element.isConnected())
+    Attach();
+}
+
+void MediaControlsNonTouchMediaEventListener::AddObserver(
+    MediaControlsNonTouchMediaEventListenerObserver* observer) {
+  observers_.insert(observer);
+}
+
+void MediaControlsNonTouchMediaEventListener::RemoveObserver(
+    MediaControlsNonTouchMediaEventListenerObserver* observer) {
+  observers_.erase(observer);
+}
+
+void MediaControlsNonTouchMediaEventListener::Attach() {
+  DCHECK(media_element_->isConnected());
+
+  media_element_->addEventListener(event_type_names::kFocusin, this, false);
+  media_element_->addEventListener(event_type_names::kTimeupdate, this, false);
+  media_element_->addEventListener(event_type_names::kDurationchange, this,
+                                   false);
+
+  media_element_->addEventListener(event_type_names::kPlay, this, false);
+  media_element_->addEventListener(event_type_names::kPause, this, false);
+
+  media_element_->addEventListener(event_type_names::kError, this, false);
+  media_element_->addEventListener(event_type_names::kLoadedmetadata, this,
+                                   false);
+
+  media_element_->addEventListener(event_type_names::kKeypress, this, false);
+  media_element_->addEventListener(event_type_names::kKeydown, this, false);
+  media_element_->addEventListener(event_type_names::kKeyup, this, false);
+}
+
+void MediaControlsNonTouchMediaEventListener::Detach() {
+  DCHECK(!media_element_->isConnected());
+}
+
+void MediaControlsNonTouchMediaEventListener::Invoke(
+    ExecutionContext* execution_context,
+    Event* event) {
+  if (event->type() == event_type_names::kFocusin) {
+    for (auto& observer : observers_)
+      observer->OnFocusIn();
+    return;
+  }
+  if (event->type() == event_type_names::kTimeupdate) {
+    for (auto& observer : observers_)
+      observer->OnTimeUpdate();
+    return;
+  }
+  if (event->type() == event_type_names::kDurationchange) {
+    for (auto& observer : observers_)
+      observer->OnDurationChange();
+    return;
+  }
+  if (event->type() == event_type_names::kPlay) {
+    for (auto& observer : observers_)
+      observer->OnPlay();
+    return;
+  }
+  if (event->type() == event_type_names::kPause) {
+    for (auto& observer : observers_)
+      observer->OnPause();
+    return;
+  }
+  if (event->type() == event_type_names::kError) {
+    for (auto& observer : observers_)
+      observer->OnError();
+    return;
+  }
+  if (event->type() == event_type_names::kLoadedmetadata) {
+    for (auto& observer : observers_)
+      observer->OnLoadedMetadata();
+    return;
+  }
+  if (event->type() == event_type_names::kKeypress) {
+    for (auto& observer : observers_)
+      observer->OnKeyPress(ToKeyboardEvent(event));
+    return;
+  }
+  if (event->type() == event_type_names::kKeydown) {
+    for (auto& observer : observers_)
+      observer->OnKeyDown(ToKeyboardEvent(event));
+    return;
+  }
+  if (event->type() == event_type_names::kKeyup) {
+    for (auto& observer : observers_)
+      observer->OnKeyUp(ToKeyboardEvent(event));
+    return;
+  }
+}
+
+void MediaControlsNonTouchMediaEventListener::Trace(blink::Visitor* visitor) {
+  NativeEventListener::Trace(visitor);
+  visitor->Trace(media_element_);
+  visitor->Trace(observers_);
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_media_event_listener.h b/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_media_event_listener.h
new file mode 100644
index 0000000..39329a67
--- /dev/null
+++ b/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_media_event_listener.h
@@ -0,0 +1,41 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_NON_TOUCH_MEDIA_CONTROLS_NON_TOUCH_MEDIA_EVENT_LISTENER_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_NON_TOUCH_MEDIA_CONTROLS_NON_TOUCH_MEDIA_EVENT_LISTENER_H_
+
+#include "third_party/blink/renderer/core/dom/events/native_event_listener.h"
+
+namespace blink {
+
+class HTMLMediaElement;
+class MediaControlsNonTouchMediaEventListenerObserver;
+
+class MediaControlsNonTouchMediaEventListener final
+    : public NativeEventListener {
+ public:
+  explicit MediaControlsNonTouchMediaEventListener(HTMLMediaElement&);
+
+  void AddObserver(MediaControlsNonTouchMediaEventListenerObserver*);
+  void RemoveObserver(MediaControlsNonTouchMediaEventListenerObserver*);
+
+  void Attach();
+  void Detach();
+
+  void Trace(blink::Visitor*) override;
+  void Invoke(ExecutionContext*, Event*) override;
+
+ private:
+  HTMLMediaElement& GetMediaElement();
+
+  HeapListHashSet<Member<MediaControlsNonTouchMediaEventListenerObserver>>
+      observers_;
+  Member<HTMLMediaElement> media_element_;
+
+  DISALLOW_COPY_AND_ASSIGN(MediaControlsNonTouchMediaEventListener);
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_NON_TOUCH_MEDIA_CONTROLS_NON_TOUCH_MEDIA_EVENT_LISTENER_H_
diff --git a/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_media_event_listener_observer.h b/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_media_event_listener_observer.h
new file mode 100644
index 0000000..3d7d55b
--- /dev/null
+++ b/third_party/blink/renderer/modules/media_controls/non_touch/media_controls_non_touch_media_event_listener_observer.h
@@ -0,0 +1,29 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_NON_TOUCH_MEDIA_CONTROLS_NON_TOUCH_MEDIA_EVENT_LISTENER_OBSERVER_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_NON_TOUCH_MEDIA_CONTROLS_NON_TOUCH_MEDIA_EVENT_LISTENER_OBSERVER_H_
+
+namespace blink {
+
+class KeyboardEvent;
+
+class MediaControlsNonTouchMediaEventListenerObserver
+    : public GarbageCollectedMixin {
+ public:
+  virtual void OnFocusIn() = 0;
+  virtual void OnTimeUpdate() = 0;
+  virtual void OnDurationChange() = 0;
+  virtual void OnPlay() = 0;
+  virtual void OnPause() = 0;
+  virtual void OnError() = 0;
+  virtual void OnLoadedMetadata() = 0;
+  virtual void OnKeyPress(KeyboardEvent* event) = 0;
+  virtual void OnKeyDown(KeyboardEvent* event) = 0;
+  virtual void OnKeyUp(KeyboardEvent* event) = 0;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_NON_TOUCH_MEDIA_CONTROLS_NON_TOUCH_MEDIA_EVENT_LISTENER_OBSERVER_H_
diff --git a/third_party/blink/renderer/modules/modules_idl_files.gni b/third_party/blink/renderer/modules/modules_idl_files.gni
index 49018962..7f8e8d2 100644
--- a/third_party/blink/renderer/modules/modules_idl_files.gni
+++ b/third_party/blink/renderer/modules/modules_idl_files.gni
@@ -459,7 +459,6 @@
           "xr/xr_bounded_reference_space.idl",
           "xr/xr_frame.idl",
           "xr/xr_hit_result.idl",
-          "xr/xr_input_pose.idl",
           "xr/xr_input_source.idl",
           "xr/xr_input_source_event.idl",
           "xr/xr_layer.idl",
diff --git a/third_party/blink/renderer/modules/xr/BUILD.gn b/third_party/blink/renderer/modules/xr/BUILD.gn
index b7c970c1..eb041867 100644
--- a/third_party/blink/renderer/modules/xr/BUILD.gn
+++ b/third_party/blink/renderer/modules/xr/BUILD.gn
@@ -20,8 +20,6 @@
     "xr_frame_request_callback_collection.h",
     "xr_hit_result.cc",
     "xr_hit_result.h",
-    "xr_input_pose.cc",
-    "xr_input_pose.h",
     "xr_input_source.cc",
     "xr_input_source.h",
     "xr_input_source_event.cc",
diff --git a/third_party/blink/renderer/modules/xr/xr_frame.cc b/third_party/blink/renderer/modules/xr/xr_frame.cc
index c28510cd..e615fa5e 100644
--- a/third_party/blink/renderer/modules/xr/xr_frame.cc
+++ b/third_party/blink/renderer/modules/xr/xr_frame.cc
@@ -5,7 +5,6 @@
 #include "third_party/blink/renderer/modules/xr/xr_frame.h"
 
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
-#include "third_party/blink/renderer/modules/xr/xr_input_pose.h"
 #include "third_party/blink/renderer/modules/xr/xr_input_source.h"
 #include "third_party/blink/renderer/modules/xr/xr_reference_space.h"
 #include "third_party/blink/renderer/modules/xr/xr_session.h"
@@ -60,28 +59,50 @@
     return nullptr;
   }
 
+  // Account for any changes made to the reference space's origin offset so that
+  // things like teleportation works.
+  pose = TransformationMatrix::Create(
+      reference_space->OriginOffsetMatrix().Inverse().Multiply(*pose));
+
   return MakeGarbageCollected<XRViewerPose>(session(), std::move(pose));
 }
 
-XRInputPose* XRFrame::getInputPose(XRInputSource* input_source,
-                                   XRReferenceSpace* reference_space,
-                                   ExceptionState& exception_state) const {
-  if (!active_) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
-                                      kInactiveFrame);
+// TODO(jacde): Move this logic into an XRSpace that gets passed to getPose so
+// that this method is longer needed.
+XRPose* XRFrame::GetGripPose(XRInputSource* input_source,
+                             XRSpace* reference_space) const {
+  // Grip is only available when using tracked pointer for input.
+  if (input_source->target_ray_mode_ != XRInputSource::kTrackedPointer) {
     return nullptr;
   }
 
-  if (!input_source || !reference_space) {
+  // Make sure the required pose matrices are available.
+  if (!base_pose_matrix_ || !input_source->base_pose_matrix_) {
     return nullptr;
   }
 
-  // Must use an input source and coordinate system from the same session.
-  if (input_source->session() != session_ ||
-      reference_space->session() != session_) {
+  std::unique_ptr<TransformationMatrix> grip_pose =
+      reference_space->TransformBaseInputPose(
+          *(input_source->base_pose_matrix_), *base_pose_matrix_);
+
+  if (!grip_pose) {
     return nullptr;
   }
 
+  // Account for any changes made to the reference space's origin offset so
+  // that things like teleportation works.
+  grip_pose = TransformationMatrix::Create(
+      reference_space->OriginOffsetMatrix().Inverse().Multiply(*grip_pose));
+
+  return MakeGarbageCollected<XRPose>(std::move(grip_pose),
+                                      input_source->emulatedPosition());
+}
+
+// TODO(jacde): Move this logic into an XRSpace that gets passed to getPose so
+// that this method is longer needed.
+XRPose* XRFrame::GetTargetRayPose(XRInputSource* input_source,
+                                  XRSpace* reference_space) const {
+  std::unique_ptr<TransformationMatrix> pointer_pose = nullptr;
   switch (input_source->target_ray_mode_) {
     case XRInputSource::kScreen: {
       // If the pointer origin is the screen we need the head's base pose and
@@ -92,12 +113,13 @@
       }
 
       // Multiply the head pose and pointer transform to get the final pointer.
-      std::unique_ptr<TransformationMatrix> pointer_pose =
-          reference_space->TransformBasePose(*base_pose_matrix_);
-      pointer_pose->Multiply(*(input_source->pointer_transform_matrix_));
+      pointer_pose = reference_space->TransformBasePose(*base_pose_matrix_);
+      if (!pointer_pose) {
+        return nullptr;
+      }
 
-      return MakeGarbageCollected<XRInputPose>(std::move(pointer_pose),
-                                               nullptr);
+      pointer_pose->Multiply(*(input_source->pointer_transform_matrix_));
+      break;
     }
     case XRInputSource::kGaze: {
       // If the pointer origin is the users head, this is a gaze cursor and the
@@ -108,15 +130,15 @@
       }
 
       // Just return the head pose as the pointer pose.
-      std::unique_ptr<TransformationMatrix> pointer_pose =
-          reference_space->TransformBasePose(*base_pose_matrix_);
-
-      return MakeGarbageCollected<XRInputPose>(
-          std::move(pointer_pose), nullptr, input_source->emulatedPosition());
+      pointer_pose = reference_space->TransformBasePose(*base_pose_matrix_);
+      if (!pointer_pose) {
+        return nullptr;
+      }
+      break;
     }
     case XRInputSource::kTrackedPointer: {
       // If the input source doesn't have a base pose return null;
-      if (!input_source->base_pose_matrix_) {
+      if (!base_pose_matrix_ || !input_source->base_pose_matrix_) {
         return nullptr;
       }
 
@@ -128,20 +150,26 @@
         return nullptr;
       }
 
-      std::unique_ptr<TransformationMatrix> pointer_pose(
-          TransformationMatrix::Create(*grip_pose));
+      pointer_pose = TransformationMatrix::Create(*grip_pose);
 
       if (input_source->pointer_transform_matrix_) {
         pointer_pose->Multiply(*(input_source->pointer_transform_matrix_));
       }
 
-      return MakeGarbageCollected<XRInputPose>(
-          std::move(pointer_pose), std::move(grip_pose),
-          input_source->emulatedPosition());
+      break;
+    }
+    default: {
+      return nullptr;
     }
   }
 
-  return nullptr;
+  // Account for any changes made to the reference space's origin offset so that
+  // things like teleportation works.
+  pointer_pose = TransformationMatrix::Create(
+      reference_space->OriginOffsetMatrix().Inverse().Multiply(*pointer_pose));
+
+  return MakeGarbageCollected<XRPose>(std::move(pointer_pose),
+                                      input_source->emulatedPosition());
 }
 
 // Return an XRPose that has a transform mapping to space A from space B, while
@@ -156,6 +184,10 @@
     return nullptr;
   }
 
+  if (!space_A || !space_B) {
+    return nullptr;
+  }
+
   if (space_A->session() != session_) {
     exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
                                       kSessionMismatch);
@@ -168,6 +200,18 @@
     return nullptr;
   }
 
+  // Check if the caller is actually requesting a grip or target ray pose, which
+  // requires some special logic.
+  // TODO(jacde): Move that logic to an XRSpace so that these extra checks and
+  // methods are no longer needed here.
+  if (space_A->GetInputSource()) {
+    if (space_A->ReturnTargetRay()) {
+      return GetTargetRayPose(space_A->GetInputSource(), space_B);
+    }
+
+    return GetGripPose(space_A->GetInputSource(), space_B);
+  }
+
   std::unique_ptr<TransformationMatrix> mojo_from_A =
       space_A->GetTransformToMojoSpace();
   if (!mojo_from_A) {
diff --git a/third_party/blink/renderer/modules/xr/xr_frame.h b/third_party/blink/renderer/modules/xr/xr_frame.h
index 024d1e9..ace7139 100644
--- a/third_party/blink/renderer/modules/xr/xr_frame.h
+++ b/third_party/blink/renderer/modules/xr/xr_frame.h
@@ -17,7 +17,6 @@
 namespace blink {
 
 class ExceptionState;
-class XRInputPose;
 class XRInputSource;
 class XRPose;
 class XRReferenceSpace;
@@ -34,9 +33,6 @@
   XRSession* session() const { return session_; }
 
   XRViewerPose* getViewerPose(XRReferenceSpace*, ExceptionState&) const;
-  XRInputPose* getInputPose(XRInputSource*,
-                            XRReferenceSpace*,
-                            ExceptionState&) const;
   XRPose* getPose(XRSpace*, XRSpace*, ExceptionState&);
 
   void SetBasePoseMatrix(const TransformationMatrix&);
@@ -46,6 +42,9 @@
   void Deactivate();
 
  private:
+  XRPose* GetTargetRayPose(XRInputSource*, XRSpace*) const;
+  XRPose* GetGripPose(XRInputSource*, XRSpace*) const;
+
   const Member<XRSession> session_;
 
   // Maps from mojo space to headset space.
@@ -56,4 +55,4 @@
 
 }  // namespace blink
 
-#endif  // XRWebGLLayer_h
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_FRAME_H_
diff --git a/third_party/blink/renderer/modules/xr/xr_frame.idl b/third_party/blink/renderer/modules/xr/xr_frame.idl
index c0a8248..50bb9dc 100644
--- a/third_party/blink/renderer/modules/xr/xr_frame.idl
+++ b/third_party/blink/renderer/modules/xr/xr_frame.idl
@@ -11,7 +11,5 @@
   readonly attribute XRSession session;
 
   [RaisesException] XRViewerPose? getViewerPose(XRReferenceSpace referenceSpace);
-  [RaisesException] XRInputPose? getInputPose(XRInputSource inputSource,
-                            XRReferenceSpace referenceSpace);
   [RaisesException] XRPose? getPose(XRSpace space, XRSpace relativeTo);
 };
diff --git a/third_party/blink/renderer/modules/xr/xr_input_pose.cc b/third_party/blink/renderer/modules/xr/xr_input_pose.cc
deleted file mode 100644
index 0bc41cd..0000000
--- a/third_party/blink/renderer/modules/xr/xr_input_pose.cc
+++ /dev/null
@@ -1,27 +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 "third_party/blink/renderer/modules/xr/xr_input_pose.h"
-
-#include "third_party/blink/renderer/modules/xr/xr_utils.h"
-
-namespace blink {
-
-XRInputPose::XRInputPose(std::unique_ptr<TransformationMatrix> pointer_matrix,
-                         std::unique_ptr<TransformationMatrix> grip_matrix,
-                         bool emulated_position)
-    : target_ray_(MakeGarbageCollected<XRRay>(std::move(pointer_matrix))),
-      grip_transform_(
-          MakeGarbageCollected<XRRigidTransform>(std::move(grip_matrix))),
-      emulated_position_(emulated_position) {}
-
-XRInputPose::~XRInputPose() {}
-
-void XRInputPose::Trace(blink::Visitor* visitor) {
-  visitor->Trace(target_ray_);
-  visitor->Trace(grip_transform_);
-  ScriptWrappable::Trace(visitor);
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/modules/xr/xr_input_pose.h b/third_party/blink/renderer/modules/xr/xr_input_pose.h
deleted file mode 100644
index 5b93669..0000000
--- a/third_party/blink/renderer/modules/xr/xr_input_pose.h
+++ /dev/null
@@ -1,43 +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 THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_INPUT_POSE_H_
-#define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_INPUT_POSE_H_
-
-#include <utility>
-
-#include "third_party/blink/renderer/core/typed_arrays/dom_typed_array.h"
-#include "third_party/blink/renderer/modules/xr/xr_ray.h"
-#include "third_party/blink/renderer/modules/xr/xr_rigid_transform.h"
-#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
-#include "third_party/blink/renderer/platform/heap/handle.h"
-#include "third_party/blink/renderer/platform/transforms/transformation_matrix.h"
-#include "third_party/blink/renderer/platform/wtf/forward.h"
-
-namespace blink {
-
-class XRInputPose final : public ScriptWrappable {
-  DEFINE_WRAPPERTYPEINFO();
-
- public:
-  XRInputPose(std::unique_ptr<TransformationMatrix> target_ray_matrix,
-              std::unique_ptr<TransformationMatrix> grip_matrix,
-              bool emulated_position = false);
-  ~XRInputPose() override;
-
-  XRRay* targetRay() const { return target_ray_; }
-  XRRigidTransform* gripTransform() const { return grip_transform_; }
-  bool emulatedPosition() const { return emulated_position_; }
-
-  void Trace(blink::Visitor*) override;
-
- private:
-  const Member<XRRay> target_ray_;
-  Member<XRRigidTransform> grip_transform_;
-  const bool emulated_position_;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_INPUT_POSE_H_
diff --git a/third_party/blink/renderer/modules/xr/xr_input_pose.idl b/third_party/blink/renderer/modules/xr/xr_input_pose.idl
deleted file mode 100644
index bf7e012..0000000
--- a/third_party/blink/renderer/modules/xr/xr_input_pose.idl
+++ /dev/null
@@ -1,13 +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.
-
-[
-    SecureContext,
-    Exposed=Window,
-    OriginTrialEnabled=WebXR
-] interface XRInputPose {
-  readonly attribute boolean emulatedPosition;
-  readonly attribute XRRay targetRay;
-  readonly attribute XRRigidTransform? gripTransform;
-};
diff --git a/third_party/blink/renderer/modules/xr/xr_input_source.cc b/third_party/blink/renderer/modules/xr/xr_input_source.cc
index 61df35142..ae750f18 100644
--- a/third_party/blink/renderer/modules/xr/xr_input_source.cc
+++ b/third_party/blink/renderer/modules/xr/xr_input_source.cc
@@ -4,13 +4,27 @@
 
 #include "third_party/blink/renderer/modules/xr/xr_input_source.h"
 #include "third_party/blink/renderer/modules/xr/xr_session.h"
+#include "third_party/blink/renderer/modules/xr/xr_space.h"
 
 namespace blink {
 
 XRInputSource::XRInputSource(XRSession* session, uint32_t source_id)
-    : session_(session), source_id_(source_id) {
+    : session_(session),
+      source_id_(source_id),
+      target_ray_space_(MakeGarbageCollected<XRSpace>(session)),
+      grip_space_(MakeGarbageCollected<XRSpace>(session)) {
   SetTargetRayMode(kGaze);
   SetHandedness(kHandNone);
+  target_ray_space_->SetInputSource(this, true);
+  grip_space_->SetInputSource(this, false);
+}
+
+XRSpace* XRInputSource::gripSpace() const {
+  if (target_ray_mode_ == kTrackedPointer) {
+    return grip_space_;
+  }
+
+  return nullptr;
 }
 
 void XRInputSource::SetTargetRayMode(TargetRayMode target_ray_mode) {
@@ -74,6 +88,8 @@
 
 void XRInputSource::Trace(blink::Visitor* visitor) {
   visitor->Trace(session_);
+  visitor->Trace(target_ray_space_);
+  visitor->Trace(grip_space_);
   ScriptWrappable::Trace(visitor);
 }
 
diff --git a/third_party/blink/renderer/modules/xr/xr_input_source.h b/third_party/blink/renderer/modules/xr/xr_input_source.h
index 42f6445..5c35a88a 100644
--- a/third_party/blink/renderer/modules/xr/xr_input_source.h
+++ b/third_party/blink/renderer/modules/xr/xr_input_source.h
@@ -14,6 +14,7 @@
 namespace blink {
 
 class XRSession;
+class XRSpace;
 
 class XRInputSource : public ScriptWrappable {
   DEFINE_WRAPPERTYPEINFO();
@@ -35,6 +36,8 @@
   const String& handedness() const { return handedness_string_; }
   const String& targetRayMode() const { return target_ray_mode_string_; }
   bool emulatedPosition() const { return emulated_position_; }
+  XRSpace* targetRaySpace() const { return target_ray_space_; }
+  XRSpace* gripSpace() const;
 
   uint32_t source_id() const { return source_id_; }
 
@@ -55,6 +58,8 @@
 
   const Member<XRSession> session_;
   const uint32_t source_id_;
+  Member<XRSpace> target_ray_space_;
+  Member<XRSpace> grip_space_;
 
   Handedness handedness_ = kHandUninitialized;
   String handedness_string_;
diff --git a/third_party/blink/renderer/modules/xr/xr_input_source.idl b/third_party/blink/renderer/modules/xr/xr_input_source.idl
index a018bd8..fe3f036 100644
--- a/third_party/blink/renderer/modules/xr/xr_input_source.idl
+++ b/third_party/blink/renderer/modules/xr/xr_input_source.idl
@@ -21,4 +21,6 @@
 ] interface XRInputSource {
   readonly attribute XRHandedness handedness;
   readonly attribute XRTargetRayMode targetRayMode;
+  readonly attribute XRSpace targetRaySpace;
+  readonly attribute XRSpace? gripSpace;
 };
diff --git a/third_party/blink/renderer/modules/xr/xr_reference_space.cc b/third_party/blink/renderer/modules/xr/xr_reference_space.cc
index bab0bcf..05a5ed2 100644
--- a/third_party/blink/renderer/modules/xr/xr_reference_space.cc
+++ b/third_party/blink/renderer/modules/xr/xr_reference_space.cc
@@ -67,6 +67,10 @@
   origin_offset_ = transform;
 }
 
+TransformationMatrix XRReferenceSpace::OriginOffsetMatrix() {
+  return origin_offset_->TransformMatrix();
+}
+
 void XRReferenceSpace::Trace(blink::Visitor* visitor) {
   visitor->Trace(origin_offset_);
   XRSpace::Trace(visitor);
diff --git a/third_party/blink/renderer/modules/xr/xr_reference_space.h b/third_party/blink/renderer/modules/xr/xr_reference_space.h
index 1d30e78..53b73c0 100644
--- a/third_party/blink/renderer/modules/xr/xr_reference_space.h
+++ b/third_party/blink/renderer/modules/xr/xr_reference_space.h
@@ -21,17 +21,18 @@
   explicit XRReferenceSpace(XRSession*);
   ~XRReferenceSpace() override;
 
-  virtual std::unique_ptr<TransformationMatrix> DefaultPose();
-  virtual std::unique_ptr<TransformationMatrix> TransformBasePose(
-      const TransformationMatrix& base_pose);
-  virtual std::unique_ptr<TransformationMatrix> TransformBaseInputPose(
+  std::unique_ptr<TransformationMatrix> DefaultPose() override;
+  std::unique_ptr<TransformationMatrix> TransformBasePose(
+      const TransformationMatrix& base_pose) override;
+  std::unique_ptr<TransformationMatrix> TransformBaseInputPose(
       const TransformationMatrix& base_input_pose,
-      const TransformationMatrix& base_pose);
+      const TransformationMatrix& base_pose) override;
 
   std::unique_ptr<TransformationMatrix> GetTransformToMojoSpace() override;
 
   XRRigidTransform* originOffset() const { return origin_offset_; }
   void setOriginOffset(XRRigidTransform*);
+  TransformationMatrix OriginOffsetMatrix() override;
 
   void Trace(blink::Visitor*) override;
 
diff --git a/third_party/blink/renderer/modules/xr/xr_space.cc b/third_party/blink/renderer/modules/xr/xr_space.cc
index f233161..e6c0860 100644
--- a/third_party/blink/renderer/modules/xr/xr_space.cc
+++ b/third_party/blink/renderer/modules/xr/xr_space.cc
@@ -5,21 +5,48 @@
 #include "third_party/blink/renderer/modules/xr/xr_space.h"
 
 #include "third_party/blink/renderer/modules/event_target_modules.h"
+#include "third_party/blink/renderer/modules/xr/xr_input_source.h"
 #include "third_party/blink/renderer/modules/xr/xr_rigid_transform.h"
 #include "third_party/blink/renderer/modules/xr/xr_session.h"
 
 namespace blink {
 
-XRSpace::XRSpace(XRSession* session) : session_(session) {}
+XRSpace::XRSpace(XRSession* session)
+    : session_(session), input_source_(nullptr), return_target_ray_(false) {}
 
 XRSpace::~XRSpace() = default;
 
+void XRSpace::SetInputSource(XRInputSource* source, bool return_target_ray) {
+  input_source_ = source;
+  return_target_ray_ = return_target_ray;
+}
+
 std::unique_ptr<TransformationMatrix> XRSpace::GetTransformToMojoSpace() {
   // The base XRSpace does not have any relevant information, so can't determine
   // a transform here.
   return nullptr;
 }
 
+std::unique_ptr<TransformationMatrix> XRSpace::DefaultPose() {
+  return nullptr;
+}
+
+std::unique_ptr<TransformationMatrix> XRSpace::TransformBasePose(
+    const TransformationMatrix& base_pose) {
+  return nullptr;
+}
+
+std::unique_ptr<TransformationMatrix> XRSpace::TransformBaseInputPose(
+    const TransformationMatrix& base_input_pose,
+    const TransformationMatrix& base_pose) {
+  return nullptr;
+}
+
+TransformationMatrix XRSpace::OriginOffsetMatrix() {
+  TransformationMatrix identity;
+  return identity;
+}
+
 ExecutionContext* XRSpace::GetExecutionContext() const {
   return session()->GetExecutionContext();
 }
@@ -29,6 +56,7 @@
 }
 
 void XRSpace::Trace(blink::Visitor* visitor) {
+  visitor->Trace(input_source_);
   visitor->Trace(session_);
   ScriptWrappable::Trace(visitor);
   EventTargetWithInlineData::Trace(visitor);
diff --git a/third_party/blink/renderer/modules/xr/xr_space.h b/third_party/blink/renderer/modules/xr/xr_space.h
index 3899c78..1e1f220 100644
--- a/third_party/blink/renderer/modules/xr/xr_space.h
+++ b/third_party/blink/renderer/modules/xr/xr_space.h
@@ -17,6 +17,7 @@
 
 class TransformationMatrix;
 class XRSession;
+class XRInputSource;
 
 class XRSpace : public EventTargetWithInlineData {
   DEFINE_WRAPPERTYPEINFO();
@@ -29,6 +30,13 @@
   // Returns nullptr if computing a transform is not possible.
   virtual std::unique_ptr<TransformationMatrix> GetTransformToMojoSpace();
 
+  virtual std::unique_ptr<TransformationMatrix> DefaultPose();
+  virtual std::unique_ptr<TransformationMatrix> TransformBasePose(
+      const TransformationMatrix& base_pose);
+  virtual std::unique_ptr<TransformationMatrix> TransformBaseInputPose(
+      const TransformationMatrix& base_input_pose,
+      const TransformationMatrix& base_pose);
+
   XRSession* session() const { return session_; }
 
   DEFINE_ATTRIBUTE_EVENT_LISTENER(reset, kReset)
@@ -37,10 +45,17 @@
   ExecutionContext* GetExecutionContext() const override;
   const AtomicString& InterfaceName() const override;
 
+  void SetInputSource(XRInputSource*, bool);
+  XRInputSource* GetInputSource() const { return input_source_; }
+  bool ReturnTargetRay() const { return return_target_ray_; }
+  virtual TransformationMatrix OriginOffsetMatrix();
+
   void Trace(blink::Visitor*) override;
 
  private:
   const Member<XRSession> session_;
+  Member<XRInputSource> input_source_;
+  bool return_target_ray_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
index 10ddb45..71d6ba0 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -34,6 +34,7 @@
 #include "base/feature_list.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/time/time.h"
+#include "third_party/blink/public/common/mime_util/mime_util.h"
 #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/public/platform/interface_provider.h"
 #include "third_party/blink/public/platform/platform.h"
@@ -484,6 +485,7 @@
           init.initial_throttling_policy,
           *properties_,
           init.frame_scheduler)),
+      archive_(init.archive),
       resource_timing_report_timer_(
           task_runner_,
           this,
@@ -630,13 +632,14 @@
   scoped_refptr<SharedBuffer> data;
   if (url.ProtocolIsData()) {
     int result;
-    std::tie(result, response, data) =
-        network_utils::ParseDataURLAndPopulateResponse(
-            url, true /* verify_mime_type */);
-    if (result != net::OK)
+    std::tie(result, response, data) = network_utils::ParseDataURL(url);
+    if (result != net::OK) {
       return nullptr;
-    // |response| is modified by parseDataURLAndPopulateResponse() and is
-    // ready to be used.
+    }
+    // TODO(yhirano): Consider removing this.
+    if (!IsSupportedMimeType(WebString(response.MimeType()).Utf8())) {
+      return nullptr;
+    }
   } else {
     ArchiveResource* archive_resource =
         archive_->SubresourceForURL(params.Url());
@@ -1678,10 +1681,6 @@
   return urls;
 }
 
-void ResourceFetcher::SetArchive(MHTMLArchive* archive) {
-  archive_ = archive;
-}
-
 void ResourceFetcher::HandleLoaderFinish(
     Resource* resource,
     TimeTicks response_end,
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
index 561a20c..6ec99063 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
@@ -155,10 +155,6 @@
   FetchContext& Context() const;
   void ClearContext();
   ConsoleLogger* GetConsoleLogger() { return console_logger_; }
-  void SetConsoleLogger(ConsoleLogger* console_logger) {
-    DCHECK(console_logger);
-    console_logger_ = console_logger;
-  }
 
   int BlockingRequestCount() const;
   int NonblockingRequestCount() const;
@@ -176,7 +172,6 @@
   void ClearPreloads(ClearPreloadsPolicy = kClearAllPreloads);
   Vector<KURL> GetUrlsOfUnusedPreloads();
 
-  void SetArchive(MHTMLArchive*);
   MHTMLArchive* Archive() const { return archive_.Get(); }
 
   void SetDefersLoading(bool);
@@ -455,9 +450,6 @@
   const Member<ConsoleLogger> console_logger;
   ResourceLoadScheduler::ThrottlingPolicy initial_throttling_policy =
       ResourceLoadScheduler::ThrottlingPolicy::kNormal;
-  // TODO(dgozman): this is currently unused (see ResourceFetcher::SetArchive),
-  // but should be used again once we create fetcher in Document instead of
-  // DocumentLoader.
   Member<MHTMLArchive> archive;
   FrameScheduler* frame_scheduler = nullptr;
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
index 3328212..8cecfbb 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
@@ -1252,8 +1252,7 @@
     // CanHandleDataURLRequestLocally() has already checked if the data url can
     // be handled here.
     std::tie(result, response, data) =
-        network_utils::ParseDataURLAndPopulateResponse(
-            resource_->Url(), false /* verify_mime_type */);
+        network_utils::ParseDataURL(resource_->Url());
     if (result != net::OK) {
       error_out = WebURLError(result, resource_->Url());
     } else {
@@ -1456,8 +1455,7 @@
   // CanHandleDataURLRequestLocally() has already checked if the data url can be
   // handled here.
   std::tie(result, response, data) =
-      network_utils::ParseDataURLAndPopulateResponse(
-          resource_->Url(), false /* verify_mime_type */);
+      network_utils::ParseDataURL(resource_->Url());
   if (result != net::OK) {
     HandleError(ResourceError(result, resource_->Url(), base::nullopt));
     return;
diff --git a/third_party/blink/renderer/platform/network/network_utils.cc b/third_party/blink/renderer/platform/network/network_utils.cc
index 8c69acef..19ea819 100644
--- a/third_party/blink/renderer/platform/network/network_utils.cc
+++ b/third_party/blink/renderer/platform/network/network_utils.cc
@@ -65,8 +65,8 @@
   return String(domain.data(), domain.length());
 }
 
-std::tuple<int, ResourceResponse, scoped_refptr<SharedBuffer>>
-ParseDataURLAndPopulateResponse(const KURL& url, bool verify_mime_type) {
+std::tuple<int, ResourceResponse, scoped_refptr<SharedBuffer>> ParseDataURL(
+    const KURL& url) {
   // The following code contains duplication of GetInfoFromDataURL() and
   // WebURLLoaderImpl::PopulateURLResponse() in
   // content/child/web_url_loader_impl.cc. Merge them once content/child is
@@ -74,17 +74,13 @@
   std::string utf8_mime_type;
   std::string utf8_charset;
   std::string data_string;
-  scoped_refptr<net::HttpResponseHeaders> headers(
-      new net::HttpResponseHeaders(std::string()));
+  auto headers = base::MakeRefCounted<net::HttpResponseHeaders>(std::string());
 
   int result = net::URLRequestDataJob::BuildResponse(
       GURL(url), &utf8_mime_type, &utf8_charset, &data_string, headers.get());
   if (result != net::OK)
     return std::make_tuple(result, ResourceResponse(), nullptr);
 
-  if (verify_mime_type && !blink::IsSupportedMimeType(utf8_mime_type))
-    return std::make_tuple(net::ERR_FAILED, ResourceResponse(), nullptr);
-
   auto buffer = SharedBuffer::Create(data_string.data(), data_string.size());
   ResourceResponse response;
   response.SetHttpStatusCode(200);
diff --git a/third_party/blink/renderer/platform/network/network_utils.h b/third_party/blink/renderer/platform/network/network_utils.h
index 9d02246..69d8c8ef 100644
--- a/third_party/blink/renderer/platform/network/network_utils.h
+++ b/third_party/blink/renderer/platform/network/network_utils.h
@@ -33,11 +33,8 @@
 // Returns the decoded data url as ResourceResponse and SharedBuffer if parsing
 // was successful. The result is returned as net error code. It returns net::OK
 // if decoding succeeds, otherwise it failed.
-// When |verify_mime_type| is true, it returns net::ERR_FAILED if the mime type
-// is not supported (blink::IsSupportedMimeType() returns false) even if parsing
-// succeeds.
 PLATFORM_EXPORT std::tuple<int, ResourceResponse, scoped_refptr<SharedBuffer>>
-ParseDataURLAndPopulateResponse(const KURL&, bool verify_mime_type);
+ParseDataURL(const KURL&);
 
 // Returns true if the URL is a data URL and its MIME type is in the list of
 // supported/recognized MIME types.
diff --git a/third_party/blink/renderer/platform/testing/weburl_loader_mock_factory_impl.cc b/third_party/blink/renderer/platform/testing/weburl_loader_mock_factory_impl.cc
index 0046775f..3e708886 100644
--- a/third_party/blink/renderer/platform/testing/weburl_loader_mock_factory_impl.cc
+++ b/third_party/blink/renderer/platform/testing/weburl_loader_mock_factory_impl.cc
@@ -151,9 +151,7 @@
     ResourceResponse response;
     scoped_refptr<SharedBuffer> buffer;
     int result;
-    std::tie(result, response, buffer) =
-        network_utils::ParseDataURLAndPopulateResponse(
-            kurl, true /* verify_mime_type */);
+    std::tie(result, response, buffer) = network_utils::ParseDataURL(kurl);
     DCHECK(buffer);
     DCHECK_EQ(net::OK, result);
     params->response = WrappedResourceResponse(response);
diff --git a/third_party/blink/web_tests/external/wpt/lint.whitelist b/third_party/blink/web_tests/external/wpt/lint.whitelist
index 85d31ce..11b75562 100644
--- a/third_party/blink/web_tests/external/wpt/lint.whitelist
+++ b/third_party/blink/web_tests/external/wpt/lint.whitelist
@@ -58,6 +58,7 @@
 TRAILING WHITESPACE, INDENT TABS, CR AT EOL: *.ico
 TRAILING WHITESPACE, INDENT TABS, CR AT EOL: *.wasm
 TRAILING WHITESPACE, INDENT TABS, CR AT EOL: *.bmp
+TRAILING WHITESPACE, INDENT TABS, CR AT EOL: *.sxg
 
 ## Whitespace needed for testing
 
@@ -800,4 +801,4 @@
 
 # Signed Exchange files have hard-coded URLs in the certUrl field
 WEB-PLATFORM.TEST:signed-exchange/resources/*.sxg
-WEB-PLATFORM.TEST:signed-exchange/resources/generate-test-sxgs.sh
\ No newline at end of file
+WEB-PLATFORM.TEST:signed-exchange/resources/generate-test-sxgs.sh
diff --git a/third_party/blink/web_tests/external/wpt/signed-exchange/resources/generate-test-sxgs.sh b/third_party/blink/web_tests/external/wpt/signed-exchange/resources/generate-test-sxgs.sh
index 60746ff3..e76286be9 100755
--- a/third_party/blink/web_tests/external/wpt/signed-exchange/resources/generate-test-sxgs.sh
+++ b/third_party/blink/web_tests/external/wpt/signed-exchange/resources/generate-test-sxgs.sh
@@ -454,4 +454,35 @@
   -o sxg/sxg-navigation-timing.sxg \
   -miRecordSize 100
 
+# A valid Signed Exchange for testing service worker registration.
+gen-signedexchange \
+  -version $sxg_version \
+  -uri $wpt_test_origin/signed-exchange/resources/register-sw-from-sxg.html \
+  -status 200 \
+  -content register-sw.html \
+  -certificate $certfile \
+  -certUrl $cert_url_origin/signed-exchange/resources/$certfile.cbor \
+  -validityUrl $wpt_test_origin/resource.validity.msg \
+  -privateKey $keyfile \
+  -date 2018-04-01T00:00:00Z \
+  -expire 168h \
+  -o sxg/register-sw-from-sxg.sxg \
+  -miRecordSize 100
+
+# An invalid Signed Exchange for testing service worker registration after
+# fallback.
+gen-signedexchange \
+  -version $sxg_version \
+  -uri $wpt_test_origin/signed-exchange/resources/register-sw-after-fallback.html \
+  -status 200 \
+  -content sxg-location.html \
+  -certificate $certfile \
+  -certUrl $cert_url_origin/signed-exchange/resources/not_found_certfile.cbor \
+  -validityUrl $wpt_test_origin/resource.validity.msg \
+  -privateKey $keyfile \
+  -date 2018-04-01T00:00:00Z \
+  -expire 168h \
+  -o sxg/register-sw-after-fallback.sxg \
+  -miRecordSize 100
+
 rm -fr $tmpdir
diff --git a/third_party/blink/web_tests/external/wpt/signed-exchange/resources/register-sw-after-fallback.html b/third_party/blink/web_tests/external/wpt/signed-exchange/resources/register-sw-after-fallback.html
new file mode 100644
index 0000000..2711fc24
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/signed-exchange/resources/register-sw-after-fallback.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<script src="sxg-util.js"></script>
+<script>
+window.addEventListener('message', async (event) => {
+  try {
+    const scope = './scope/' + location.href;
+    await registerServiceWorkerAndWaitUntilActivated(
+        './service-worker.js', scope)
+    const iframe = await withIframe(scope, 'inner_iframe');
+    event.data.port.postMessage({
+        location: document.location.href,
+        is_fallback: true,
+        err: undefined,
+        iframe_body: iframe.contentWindow.document.body.innerHTML});
+  } catch (err) {
+    event.data.port.postMessage({
+        location: document.location.href,
+        is_fallback: true,
+        err: err.toString()
+    });
+  }
+}, false);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/signed-exchange/resources/register-sw.html b/third_party/blink/web_tests/external/wpt/signed-exchange/resources/register-sw.html
new file mode 100644
index 0000000..8a3873b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/signed-exchange/resources/register-sw.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<script src="sxg-util.js"></script>
+<script>
+window.addEventListener('message', async (event) => {
+  try {
+    const scope = './scope/' + location.href;
+    await registerServiceWorkerAndWaitUntilActivated(
+        './service-worker.js', scope)
+    const iframe = await withIframe(scope, 'inner_iframe');
+    event.data.port.postMessage({
+        location: document.location.href,
+        is_fallback: false,
+        err: undefined,
+        iframe_body: iframe.contentWindow.document.body.innerHTML});
+  } catch (err) {
+    event.data.port.postMessage({
+        location: document.location.href,
+        is_fallback: false,
+        err: err.toString()
+    });
+  }
+}, false);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/signed-exchange/resources/service-worker.js b/third_party/blink/web_tests/external/wpt/signed-exchange/resources/service-worker.js
new file mode 100644
index 0000000..2647f45a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/signed-exchange/resources/service-worker.js
@@ -0,0 +1,5 @@
+self.addEventListener('fetch', function(event) {
+  event.respondWith(new Response(
+    '<body>Generated by service worker</body>',
+    {headers:[['content-type', 'text/html']]}));
+});
diff --git a/third_party/blink/web_tests/external/wpt/signed-exchange/resources/sxg-util.js b/third_party/blink/web_tests/external/wpt/signed-exchange/resources/sxg-util.js
index 7abb3cf..78edf137 100644
--- a/third_party/blink/web_tests/external/wpt/signed-exchange/resources/sxg-util.js
+++ b/third_party/blink/web_tests/external/wpt/signed-exchange/resources/sxg-util.js
@@ -72,3 +72,16 @@
   link.href = url;
   document.body.appendChild(link);
 }
+
+async function registerServiceWorkerAndWaitUntilActivated(script, scope) {
+  const reg = await navigator.serviceWorker.register(script, {scope: scope});
+  if (reg.active)
+    return;
+  const worker =  reg.installing || reg.waiting;
+  await new Promise((resolve) => {
+    worker.addEventListener('statechange', (event) => {
+      if (event.target.state == 'activated')
+        resolve();
+    });
+  });
+}
diff --git a/third_party/blink/web_tests/external/wpt/signed-exchange/resources/sxg/register-sw-after-fallback.sxg b/third_party/blink/web_tests/external/wpt/signed-exchange/resources/sxg/register-sw-after-fallback.sxg
new file mode 100644
index 0000000..20ae275
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/signed-exchange/resources/sxg/register-sw-after-fallback.sxg
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/signed-exchange/resources/sxg/register-sw-from-sxg.sxg b/third_party/blink/web_tests/external/wpt/signed-exchange/resources/sxg/register-sw-from-sxg.sxg
new file mode 100644
index 0000000..7922220
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/signed-exchange/resources/sxg/register-sw-from-sxg.sxg
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/signed-exchange/service-workers/sxg-sw-register-after-fallback.tentative.https-expected.txt b/third_party/blink/web_tests/external/wpt/signed-exchange/service-workers/sxg-sw-register-after-fallback.tentative.https-expected.txt
new file mode 100644
index 0000000..7a8dbb39
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/signed-exchange/service-workers/sxg-sw-register-after-fallback.tentative.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Service worker registration after fallback assert_equals: expected (undefined) undefined but got (string) "SecurityError: Failed to register a ServiceWorker: No URL is associated with the caller's document."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/signed-exchange/service-workers/sxg-sw-register-after-fallback.tentative.https.html b/third_party/blink/web_tests/external/wpt/signed-exchange/service-workers/sxg-sw-register-after-fallback.tentative.https.html
new file mode 100644
index 0000000..2b76a70d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/signed-exchange/service-workers/sxg-sw-register-after-fallback.tentative.https.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<title>Service worker registration after fallback</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/sxg-util.js"></script>
+<body>
+<script>
+promise_test(async (t) => {
+  const sxgUrl =
+      get_host_info().HTTPS_ORIGIN +
+      '/signed-exchange/resources/sxg/register-sw-after-fallback.sxg';
+  const message = await openSXGInIframeAndWaitForMessage(t, sxgUrl);
+  assert_equals(message.location,
+                get_host_info().HTTPS_ORIGIN +
+                '/signed-exchange/resources/register-sw-after-fallback.html');
+  assert_true(message.is_fallback);
+
+  assert_equals(message.err, undefined);
+  assert_equals(message.iframe_body, 'Generated by service worker');
+}, 'Service worker registration after fallback');
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/signed-exchange/service-workers/sxg-sw-register.tentative.https-expected.txt b/third_party/blink/web_tests/external/wpt/signed-exchange/service-workers/sxg-sw-register.tentative.https-expected.txt
new file mode 100644
index 0000000..c50ff44
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/signed-exchange/service-workers/sxg-sw-register.tentative.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Service worker registration from signed exchange assert_equals: expected (undefined) undefined but got (string) "SecurityError: Failed to register a ServiceWorker: No URL is associated with the caller's document."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/signed-exchange/service-workers/sxg-sw-register.tentative.https.html b/third_party/blink/web_tests/external/wpt/signed-exchange/service-workers/sxg-sw-register.tentative.https.html
new file mode 100644
index 0000000..ad21ebb2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/signed-exchange/service-workers/sxg-sw-register.tentative.https.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<title>Service worker registration from signed exchange</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/sxg-util.js"></script>
+<body>
+<script>
+promise_test(async (t) => {
+  const sxgUrl =
+      get_host_info().HTTPS_ORIGIN +
+      '/signed-exchange/resources/sxg/register-sw-from-sxg.sxg';
+  const message = await openSXGInIframeAndWaitForMessage(t, sxgUrl);
+  assert_equals(message.location,
+                get_host_info().HTTPS_ORIGIN +
+                '/signed-exchange/resources/register-sw-from-sxg.html');
+  assert_false(message.is_fallback);
+
+  assert_equals(message.err, undefined);
+  assert_equals(message.iframe_body, 'Generated by service worker');
+}, 'Service worker registration from signed exchange');
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/webxr/idlharness.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/webxr/idlharness.https.window-expected.txt
index c491e80..979535e 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/idlharness.https.window-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/webxr/idlharness.https.window-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 216 tests; 197 PASS, 19 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 216 tests; 199 PASS, 17 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idl_test setup
 PASS Partial interface Navigator: original interface defined
 PASS Partial dictionary WebGLContextAttributes: original dictionary defined
@@ -157,8 +157,8 @@
 PASS XRInputSource interface: existence and properties of interface prototype object's @@unscopables property
 PASS XRInputSource interface: attribute handedness
 PASS XRInputSource interface: attribute targetRayMode
-FAIL XRInputSource interface: attribute targetRaySpace assert_true: The prototype object must have a property "targetRaySpace" expected true got false
-FAIL XRInputSource interface: attribute gripSpace assert_true: The prototype object must have a property "gripSpace" expected true got false
+PASS XRInputSource interface: attribute targetRaySpace
+PASS XRInputSource interface: attribute gripSpace
 PASS XRLayer interface: existence and properties of interface object
 PASS XRLayer interface object length
 PASS XRLayer interface object name
diff --git a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_math_utils.js b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_math_utils.js
new file mode 100644
index 0000000..bb55fb729
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_math_utils.js
@@ -0,0 +1,61 @@
+// |matrix| - Float32Array, |input| - point-like dict (must have x, y, z, w)
+let transform_point_by_matrix = function(matrix, input) {
+  return {
+    x : matrix[0] * input.x + matrix[4] * input.y + matrix[8] * input.z + matrix[12] * input.w,
+    y : matrix[1] * input.x + matrix[5] * input.y + matrix[9] * input.z + matrix[13] * input.w,
+    z : matrix[2] * input.x + matrix[6] * input.y + matrix[10] * input.z + matrix[14] * input.w,
+    w : matrix[3] * input.x + matrix[7] * input.y + matrix[11] * input.z + matrix[15] * input.w,
+  };
+}
+
+// Creates a unit-length quaternion.
+// |input| - point-like dict (must have x, y, z, w)
+let normalize_quaternion = function(input) {
+  const length_squared = input.x * input.x + input.y * input.y + input.z * input.z + input.w * input.w;
+  const length = Math.sqrt(length_squared);
+
+  return {x : input.x / length, y : input.y / length, z : input.z / length, w : input.w / length};
+}
+
+// |input| - point-like dict (must have x, y, z, w)
+let conjugate_quaternion = function(input) {
+  return {x : -input.x, y : -input.y, z : -input.z, w : input.w};
+}
+
+let multiply_quaternions = function(q1, q2) {
+  return {
+    w : q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z,
+    x : q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y,
+    y : q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x,
+    z : q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w,
+  }
+}
+
+// |point| - point-like dict (must have x, y, z, w)
+let normalize_perspective = function(point) {
+  if(point.w == 0 || point.w == 1) return point;
+
+  return {
+    x : point.x / point.w,
+    y : point.y / point.w,
+    z : point.z / point.w,
+    w : 1
+  };
+}
+
+// |quaternion| - point-like dict (must have x, y, z, w),
+// |input| - point-like dict (must have x, y, z, w)
+let transform_point_by_quaternion = function(quaternion, input) {
+  const q_normalized = normalize_quaternion(quaternion);
+  const q_conj = conjugate_quaternion(q_normalized);
+  const p_in = normalize_perspective(input);
+
+  // construct a quaternion out of the point (take xyz & zero the real part).
+  const p = {x : p_in.x, y : p_in.y, z : p_in.z, w : 0};
+
+  // transform the input point
+  const p_mul = multiply_quaternions( q_normalized, multiply_quaternions(p, q_conj) );
+
+  // add back the w component of the input
+  return { x : p_mul.x, y : p_mul.y, z : p_mul.z, w : p_in.w };
+}
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrRay_matrix.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrRay_matrix.https.html
index 3c9cea0..85d7bff 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrRay_matrix.https.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrRay_matrix.https.html
@@ -3,31 +3,10 @@
 <script src="/resources/testharnessreport.js"></script>
 <script src="resources/webxr_test_constants.js"></script>
 <script src="resources/webxr_test_asserts.js"></script>
+<script src="resources/webxr_math_utils.js"></script>
 
 <script>
 
-// |matrix| - Float32Array, |input| - point-like dict (must have x, y, z, w)
-let transform_point = function (matrix, input) {
-  return {
-    x : matrix[0] * input.x + matrix[4] * input.y + matrix[8] * input.z + matrix[12] * input.w,
-    y : matrix[1] * input.x + matrix[5] * input.y + matrix[9] * input.z + matrix[13] * input.w,
-    z : matrix[2] * input.x + matrix[6] * input.y + matrix[10] * input.z + matrix[14] * input.w,
-    w : matrix[3] * input.x + matrix[7] * input.y + matrix[11] * input.z + matrix[15] * input.w,
-  };
-}
-
-// |point| - point-like dict (must have x, y, z, w)
-let normalize_perspective = function(point) {
-  if(point.w == 0 || point.w == 1) return point;
-
-  return {
-    x : point.x / point.w,
-    y : point.y / point.w,
-    z : point.z / point.w,
-    w : 1
-  };
-}
-
 let matrix_tests_name = "XRRay matrix works";
 
 let matrix_tests = function() {
@@ -46,8 +25,8 @@
       DOMPoint.fromPoint(originDict),
       DOMPoint.fromPoint(directionDict));
 
-    let transformedOrigin = normalize_perspective(transform_point(xrRay.matrix, initialOrigin));
-    let transformedDirection = normalize_perspective(transform_point(xrRay.matrix, initialDirection));
+    let transformedOrigin = normalize_perspective(transform_point_by_matrix(xrRay.matrix, initialOrigin));
+    let transformedDirection = normalize_perspective(transform_point_by_matrix(xrRay.matrix, initialDirection));
 
     assert_point_approx_equals(
       originDict, transformedOrigin,
@@ -66,8 +45,8 @@
       DOMPoint.fromPoint(originDict),
       DOMPoint.fromPoint(directionDict));
 
-    let transformedOrigin = normalize_perspective(transform_point(xrRay.matrix, initialOrigin));
-    let transformedDirection = normalize_perspective(transform_point(xrRay.matrix, initialDirection));
+    let transformedOrigin = normalize_perspective(transform_point_by_matrix(xrRay.matrix, initialOrigin));
+    let transformedDirection = normalize_perspective(transform_point_by_matrix(xrRay.matrix, initialDirection));
 
     assert_point_approx_equals(
       originDict, transformedOrigin,
@@ -86,8 +65,8 @@
       DOMPoint.fromPoint(originDict),
       DOMPoint.fromPoint(directionDict));
 
-    let transformedOrigin = normalize_perspective(transform_point(xrRay.matrix, initialOrigin));
-    let transformedDirection = normalize_perspective(transform_point(xrRay.matrix, initialDirection));
+    let transformedOrigin = normalize_perspective(transform_point_by_matrix(xrRay.matrix, initialOrigin));
+    let transformedDirection = normalize_perspective(transform_point_by_matrix(xrRay.matrix, initialDirection));
 
     assert_point_approx_equals(
       originDict, transformedOrigin,
@@ -106,8 +85,8 @@
       DOMPoint.fromPoint(originDict),
       DOMPoint.fromPoint(directionDict));
 
-    let transformedOrigin = normalize_perspective(transform_point(xrRay.matrix, initialOrigin));
-    let transformedDirection = normalize_perspective(transform_point(xrRay.matrix, initialDirection));
+    let transformedOrigin = normalize_perspective(transform_point_by_matrix(xrRay.matrix, initialOrigin));
+    let transformedDirection = normalize_perspective(transform_point_by_matrix(xrRay.matrix, initialDirection));
 
     assert_point_approx_equals(
       originDict, transformedOrigin,
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_matrix.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_matrix.https.html
new file mode 100644
index 0000000..21236c7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_matrix.https.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
+<script src="resources/webxr_test_asserts.js"></script>
+<script src="resources/webxr_math_utils.js"></script>
+
+<script>
+
+let matrix_tests_name = "XRRigidTransform matrix works";
+
+let matrix_tests = function() {
+  // Matrix tests for XRRigidTransform.
+
+  // Test 1. Check if matrix rotates the vector the same way as quaternion
+  // used to construct it. This does not perform a translation.
+  {
+    // point
+    const originDict = {x : 0, y : 0, z : 0, w : 1};
+    // quaternion - should be normalized
+    const orientationDict = {x : 0, y : 0.3805356, z : 0.7610712, w : 0.525322 }
+
+    let rigidTransform = new XRRigidTransform(
+        DOMPoint.fromPoint(originDict),
+        DOMPoint.fromPoint(orientationDict));
+
+    const point_0 = {x : 10, y : 11, z : 12, w : 1};
+
+    // transform the point by matrix from rigid transform
+    const point_transformed_0 = normalize_perspective(transform_point_by_matrix(rigidTransform.matrix, point_0));
+    const point_transformed_1 = transform_point_by_quaternion(orientationDict, point_0);
+    const point_transformed_2 = transform_point_by_quaternion(rigidTransform.orientation, point_0);
+
+    assert_point_approx_equals(
+      point_transformed_1, point_transformed_0,
+      FLOAT_EPSILON, "by-initial-quaternion-and-matrix:");
+
+    assert_point_approx_equals(
+      point_transformed_2, point_transformed_0,
+      FLOAT_EPSILON, "by-transform's-quaternion-and-matrix:");
+  }
+};
+
+test(matrix_tests, matrix_tests_name);
+
+</script>
diff --git a/third_party/blink/web_tests/fast/dom/window-load-crash-expected.txt b/third_party/blink/web_tests/fast/dom/window-load-crash-expected.txt
index d7b424b0..c6f20fc 100644
--- a/third_party/blink/web_tests/fast/dom/window-load-crash-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/window-load-crash-expected.txt
@@ -1,2 +1 @@
-Blocked access to external URL http://blocked/does-not-exist.html
 Test passes if it does not crash. 
diff --git a/third_party/blink/web_tests/fast/loader/main-document-url-for-non-http-loads-expected.txt b/third_party/blink/web_tests/fast/loader/main-document-url-for-non-http-loads-expected.txt
deleted file mode 100644
index cb209de..0000000
--- a/third_party/blink/web_tests/fast/loader/main-document-url-for-non-http-loads-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-resources/subframe-notify-done.html - willSendRequest <NSURLRequest URL resources/subframe-notify-done.html, main document URL main-document-url-for-non-http-loads.html, http method GET>
-resources/subframe-notify-done.html - didReceiveResponse <NSURLResponse resources/subframe-notify-done.html, http status code 0>
-Radar 6616664 - Non-HTTP/HTTPS loads need to have their main document URL set.
-When run in DumpRenderTree, this test will dump the resource load callback for the following subframe to make sure it had its main document URL set in its NSURLRequest.
-
diff --git a/third_party/blink/web_tests/fast/loader/main-document-url-for-non-http-loads.html b/third_party/blink/web_tests/fast/loader/main-document-url-for-non-http-loads.html
deleted file mode 100644
index 05db21e..0000000
--- a/third_party/blink/web_tests/fast/loader/main-document-url-for-non-http-loads.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<html>
-<head>
-<script>
-
-if (window.testRunner) {
-    testRunner.dumpResourceLoadCallbacks();
-    testRunner.dumpAsText();
-    testRunner.waitUntilDone();
-}
-
-</script>
-<body>
-Radar 6616664 - Non-HTTP/HTTPS loads need to have their main document URL set.<br>
-When run in DumpRenderTree, this test will dump the resource load callback for the following subframe to make sure it had its main document URL set in its NSURLRequest.<br>
-<iframe src="resources/subframe-notify-done.html"></iframe>
-</body>
-</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/loader/subframe-removes-itself-expected.txt b/third_party/blink/web_tests/fast/loader/subframe-removes-itself-expected.txt
index 8fb7b90..8c814e7 100644
--- a/third_party/blink/web_tests/fast/loader/subframe-removes-itself-expected.txt
+++ b/third_party/blink/web_tests/fast/loader/subframe-removes-itself-expected.txt
@@ -1,4 +1,5 @@
 frame "<!--framePath //<!--frame0-->-->" - didReceiveTitle: 
+frame "<!--framePath //<!--frame0-->-->" - BeginNavigation request to 'resources/subframe-that-removes-itself.html', http method GET
 frame "<!--framePath //<!--frame0-->-->" - DidStartNavigation
 main frame - didReceiveTitle: 
 main frame - didFinishDocumentLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/cache/iframe-304-crash-expected.txt b/third_party/blink/web_tests/http/tests/cache/iframe-304-crash-expected.txt
index 78d1d6f..e3b4cd8 100644
--- a/third_party/blink/web_tests/http/tests/cache/iframe-304-crash-expected.txt
+++ b/third_party/blink/web_tests/http/tests/cache/iframe-304-crash-expected.txt
@@ -1,5 +1 @@
-http://127.0.0.1:8000/cache/resources/iframe304.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/cache/resources/iframe304.php, main document URL http://127.0.0.1:8000/cache/iframe-304-crash.html, http method GET>
-http://127.0.0.1:8000/cache/resources/iframe304.php - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/cache/resources/iframe304.php, http status code 200>
-http://127.0.0.1:8000/cache/resources/iframe304.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/cache/resources/iframe304.php, main document URL http://127.0.0.1:8000/cache/iframe-304-crash.html, http method GET>
-http://127.0.0.1:8000/cache/resources/iframe304.php - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/cache/resources/iframe304.php, http status code 200>
-
+This test passes if does not crash. 
diff --git a/third_party/blink/web_tests/http/tests/cache/iframe-304-crash.html b/third_party/blink/web_tests/http/tests/cache/iframe-304-crash.html
index bcf3549..efa1d05 100644
--- a/third_party/blink/web_tests/http/tests/cache/iframe-304-crash.html
+++ b/third_party/blink/web_tests/http/tests/cache/iframe-304-crash.html
@@ -3,7 +3,6 @@
 <script>
 if (window.testRunner) {
     testRunner.dumpAsText();
-    testRunner.dumpResourceLoadCallbacks();
     testRunner.waitUntilDone();
 }
 
@@ -23,5 +22,6 @@
 </head>
 <body onload="setTimeout(removeAndReplaceIframe, 0)">
 <iframe id="iframe" src="resources/iframe304.php"></iframe>
+This test passes if does not crash.
 </body>
 </html>
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete-expected.txt
index 19d63c96..2785196 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete-expected.txt
@@ -23,6 +23,8 @@
 
 Running: testValueUnprefixed
 
+Running: testValuePresets
+
 Running: testValueSubstring
 
 Running: testNameVariables
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete.js
index 69c2f96..d51914c 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete.js
@@ -77,6 +77,12 @@
           ['initial', 'inherit'], next);
     },
 
+    function testValuePresets(next) {
+      testAgainstGolden(
+          valuePromptFor('transform'), 'tr', false, [], [], next,
+          ['translate(10px, 10px)', 'translateY(10px)', 'translate3d(10px, 10px, 10px)']);
+    },
+
     function testValueSubstring(next) {
       testAgainstGolden(
           valuePromptFor('color'), 'blue', false, ['blue', 'darkblue', 'lightblue'],
@@ -88,11 +94,12 @@
     },
 
     function testValueVariables(next) {
-      testAgainstGolden(valuePromptFor('color'), 'var(', true, ['--red-color)', '--blue-color)'], ['width'], next);
+      testAgainstGolden(valuePromptFor('color'), 'var(', true, ['--red-color', '--blue-color'], ['width'], next,
+          ['--red-color)', '--blue-color)']);
     }
   ]);
 
-  function testAgainstGolden(prompt, inputText, force, golden, antiGolden, callback) {
+  function testAgainstGolden(prompt, inputText, force, golden, antiGolden, callback, transformedGolden = []) {
     var proxyElement = document.createElement('div');
     document.body.appendChild(proxyElement);
     proxyElement.style = 'webkit-user-select: text; -webkit-user-modify: read-write-plaintext-only';
@@ -112,7 +119,8 @@
         .then(completions);
 
     function completions(result) {
-      var suggestions = new Set(result.map(s => s.text));
+      var suggestions = new Set(result.map(s => s.title || s.text));
+      var appliedSuggestions = new Set(result.map(s => s.text));
       var i;
       for (i = 0; i < golden.length; ++i) {
         if (!suggestions.has(golden[i]))
@@ -122,6 +130,10 @@
         if (suggestions.has(antiGolden[i]))
           TestRunner.addResult('FOUND: ' + antiGolden[i]);
       }
+      for (i = 0; i < transformedGolden.length; ++i) {
+        if (!appliedSuggestions.has(transformedGolden[i]))
+          TestRunner.addResult('NOT FOUND: ' + transformedGolden[i]);
+      }
       proxyElement.remove();
       callback();
     }
diff --git a/third_party/blink/web_tests/http/tests/devtools/network/network-xsl-content.js b/third_party/blink/web_tests/http/tests/devtools/network/network-xsl-content.js
index a8ea471..5d31385 100644
--- a/third_party/blink/web_tests/http/tests/devtools/network/network-xsl-content.js
+++ b/third_party/blink/web_tests/http/tests/devtools/network/network-xsl-content.js
@@ -6,38 +6,23 @@
   TestRunner.addResult(`Tests XSL stylsheet content. http://crbug.com/603806\n`);
   await TestRunner.loadModule('network_test_runner');
   await TestRunner.showPanel('network');
-  await TestRunner.evaluateInPagePromise(`
-      function loadIframe()
-      {
-          var iframe = document.createElement("iframe");
-          document.body.appendChild(iframe);
-          iframe.src = "resources/xml-with-stylesheet.xml";
-      }
+  NetworkTestRunner.recordNetwork();
+  await TestRunner.evaluateInPageAsync(`
+    var iframe = document.createElement("iframe");
+    document.body.appendChild(iframe);
+    iframe.src = "resources/xml-with-stylesheet.xml";
+    new Promise(f => iframe.addEventListener('load', f))
   `);
 
-  var expectedResourceCount = 2;
-  var foundResources = 0;
   var resultsOutput = [];
-  NetworkTestRunner.recordNetwork();
-  TestRunner.evaluateInPage('loadIframe()');
-  TestRunner.addSniffer(SDK.NetworkDispatcher.prototype, 'loadingFinished', loadingFinished, true);
-
-  function loadingFinished(requestId) {
-    var request = SDK.networkLog.requestByManagerAndId(TestRunner.networkManager, requestId);
-    request.requestContent().then(contentReceived.bind(this, request));
-  }
-  function contentReceived(request, content) {
+  for (const request of SDK.networkLog.requests()) {
+    const content = await TestRunner.NetworkAgent.getResponseBody(request.requestId());
     var output = [];
     output.push(request.url());
     output.push('resource.type: ' + request.resourceType());
     output.push('resource.content: ' + content);
-
     resultsOutput.push(output.join('\n'));
-    if (++foundResources >= expectedResourceCount)
-      finish();
   }
-  function finish() {
-    TestRunner.addResult(resultsOutput.sort().join('\n'));
-    TestRunner.completeTest();
-  }
+  TestRunner.addResult(resultsOutput.sort().join('\n'));
+  TestRunner.completeTest();
 })();
diff --git a/third_party/blink/web_tests/http/tests/devtools/unit/suggest-box.js b/third_party/blink/web_tests/http/tests/devtools/unit/suggest-box.js
index 11dc032..d4550ac 100644
--- a/third_party/blink/web_tests/http/tests/devtools/unit/suggest-box.js
+++ b/third_party/blink/web_tests/http/tests/devtools/unit/suggest-box.js
@@ -6,7 +6,7 @@
           if (!suggestion)
               TestRunner.addResult('No item selected.')
           else
-              TestRunner.addResult((isIntermediateSuggestion ? "Intermediate " : "") + "Suggestion Applied: " + suggestion);
+              TestRunner.addResult((isIntermediateSuggestion ? "Intermediate " : "") + "Suggestion Applied: " + suggestion.text);
       },
       acceptSuggestion: function() {
           TestRunner.addResult("Suggestion accepted");
diff --git a/third_party/blink/web_tests/http/tests/history/post-replace-state-reload-expected.txt b/third_party/blink/web_tests/http/tests/history/post-replace-state-reload-expected.txt
index 41134f3a8..d7626f1 100644
--- a/third_party/blink/web_tests/http/tests/history/post-replace-state-reload-expected.txt
+++ b/third_party/blink/web_tests/http/tests/history/post-replace-state-reload-expected.txt
@@ -1,5 +1,24 @@
-http://127.0.0.1:8000/history/post-replace-state-reload.html - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/history/post-replace-state-reload.html, main document URL http://127.0.0.1:8000/history/post-replace-state-reload.html, http method POST>
-http://127.0.0.1:8000/history/post-replace-state-reload.html - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/history/post-replace-state-reload.html, http status code 200>
-http://127.0.0.1:8000/history/post-replace-state-reload.html - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/history/post-replace-state-reload.html, main document URL http://127.0.0.1:8000/history/post-replace-state-reload.html, http method GET>
-http://127.0.0.1:8000/history/post-replace-state-reload.html - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/history/post-replace-state-reload.html, http status code 200>
+main frame - didCommitLoadForFrame
+main frame - didReceiveTitle: 
+main frame - didFinishDocumentLoadForFrame
+main frame - didHandleOnloadEventsForFrame
+main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/history/post-replace-state-reload.html', http method POST
+main frame - DidStartNavigation
+main frame - ReadyToCommitNavigation
+main frame - didCommitLoadForFrame
+main frame - didCommitLoadForFrame
+main frame - didReceiveTitle: 
+main frame - didFinishDocumentLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/history/post-replace-state-reload.html', http method GET
+main frame - DidStartNavigation
+main frame - didFinishLoadForFrame
+main frame - didHandleOnloadEventsForFrame
+main frame - ReadyToCommitNavigation
+main frame - didCommitLoadForFrame
+main frame - didCommitLoadForFrame
+main frame - didReceiveTitle: 
+main frame - didFinishDocumentLoadForFrame
+main frame - didHandleOnloadEventsForFrame
+main frame - didFinishLoadForFrame
 
diff --git a/third_party/blink/web_tests/http/tests/history/post-replace-state-reload.html b/third_party/blink/web_tests/http/tests/history/post-replace-state-reload.html
index f88bb5009..02442d9 100644
--- a/third_party/blink/web_tests/http/tests/history/post-replace-state-reload.html
+++ b/third_party/blink/web_tests/http/tests/history/post-replace-state-reload.html
@@ -3,7 +3,7 @@
 <script>
 if (window.testRunner) {
     testRunner.dumpAsText();
-    testRunner.dumpResourceLoadCallbacks();
+    testRunner.dumpFrameLoadCallbacks();
     testRunner.waitUntilDone();
 }
 
diff --git a/third_party/blink/web_tests/http/tests/loading/307-after-303-after-post-expected.txt b/third_party/blink/web_tests/http/tests/loading/307-after-303-after-post-expected.txt
index c67c95f..cf19318c 100644
--- a/third_party/blink/web_tests/http/tests/loading/307-after-303-after-post-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/307-after-303-after-post-expected.txt
@@ -5,8 +5,8 @@
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/post-to-303-target.php', http method POST
 main frame - DidStartNavigation
-http://127.0.0.1:8000/loading/resources/post-to-303-target.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/post-to-303-target.php, main document URL http://127.0.0.1:8000/loading/resources/post-to-303-target.php, http method POST>
 main frame - ReadyToCommitNavigation
 http://127.0.0.1:8000/loading/resources/307-post-output-target.php - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/307-post-output-target.php, http status code 200>
 main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/bad-scheme-subframe-expected.txt b/third_party/blink/web_tests/http/tests/loading/bad-scheme-subframe-expected.txt
index c763b17..39b8952 100644
--- a/third_party/blink/web_tests/http/tests/loading/bad-scheme-subframe-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/bad-scheme-subframe-expected.txt
@@ -4,6 +4,7 @@
 main frame - didReceiveTitle: 
 main frame - didFinishDocumentLoadForFrame
 frame "f1" - didReceiveTitle: 
+frame "f1" - BeginNavigation request to 'this-is-definitely-a-bad-uri-scheme:', http method GET
 frame "f1" - DidStartNavigation
 main frame - didHandleOnloadEventsForFrame
 frame "f1" - didFailProvisionalLoadWithError
diff --git a/third_party/blink/web_tests/http/tests/loading/bad-server-subframe-expected.txt b/third_party/blink/web_tests/http/tests/loading/bad-server-subframe-expected.txt
index 4aad07b..2378629 100644
--- a/third_party/blink/web_tests/http/tests/loading/bad-server-subframe-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/bad-server-subframe-expected.txt
@@ -2,6 +2,7 @@
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
 frame "f1" - didReceiveTitle: 
+frame "f1" - BeginNavigation request to 'http://localhost:54321/', http method GET
 frame "f1" - DidStartNavigation
 main frame - didReceiveTitle: 
 main frame - didFinishDocumentLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/dont-preload-non-img-srcset-expected.txt b/third_party/blink/web_tests/http/tests/loading/dont-preload-non-img-srcset-expected.txt
index 8d230d60..7f24659 100644
--- a/third_party/blink/web_tests/http/tests/loading/dont-preload-non-img-srcset-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/dont-preload-non-img-srcset-expected.txt
@@ -2,6 +2,7 @@
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
 frame "<!--framePath //<!--frame0-->-->" - didReceiveTitle: 
+frame "<!--framePath //<!--frame0-->-->" - BeginNavigation request to 'about:blank', http method GET
 frame "<!--framePath //<!--frame0-->-->" - DidStartNavigation
 frame "<!--framePath //<!--frame0-->-->" - ReadyToCommitNavigation
 frame "<!--framePath //<!--frame0-->-->" - didCommitLoadForFrame
@@ -13,10 +14,12 @@
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/dont-preload-non-img-srcset.html', http method GET
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
 frame "<!--framePath //<!--frame0-->-->" - didReceiveTitle: 
+frame "<!--framePath //<!--frame0-->-->" - BeginNavigation request to 'about:blank', http method GET
 frame "<!--framePath //<!--frame0-->-->" - DidStartNavigation
 frame "<!--framePath //<!--frame0-->-->" - ReadyToCommitNavigation
 frame "<!--framePath //<!--frame0-->-->" - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/empty-subframe-expected.txt b/third_party/blink/web_tests/http/tests/loading/empty-subframe-expected.txt
index ab5d22f4..456eaf22 100644
--- a/third_party/blink/web_tests/http/tests/loading/empty-subframe-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/empty-subframe-expected.txt
@@ -2,6 +2,7 @@
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
 frame "f1" - didReceiveTitle: 
+frame "f1" - BeginNavigation request to 'about:blank', http method GET
 frame "f1" - DidStartNavigation
 frame "f1" - ReadyToCommitNavigation
 frame "f1" - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/link-preload-image-sizes-2x-expected.txt b/third_party/blink/web_tests/http/tests/loading/link-preload-image-sizes-2x-expected.txt
index 1afa143..2b37f122 100644
--- a/third_party/blink/web_tests/http/tests/loading/link-preload-image-sizes-2x-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/link-preload-image-sizes-2x-expected.txt
@@ -5,6 +5,7 @@
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/link-preload-image-sizes-2x.html', http method GET
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/link-preload-image-srcset-2x-expected.txt b/third_party/blink/web_tests/http/tests/loading/link-preload-image-srcset-2x-expected.txt
index accd792..b96c894 100644
--- a/third_party/blink/web_tests/http/tests/loading/link-preload-image-srcset-2x-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/link-preload-image-srcset-2x-expected.txt
@@ -5,6 +5,7 @@
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/link-preload-image-srcset-2x.html', http method GET
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/link-preload-image-srcset-expected.txt b/third_party/blink/web_tests/http/tests/loading/link-preload-image-srcset-expected.txt
index 734caa0..296b5d1 100644
--- a/third_party/blink/web_tests/http/tests/loading/link-preload-image-srcset-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/link-preload-image-srcset-expected.txt
@@ -5,6 +5,7 @@
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/link-preload-image-srcset.html', http method GET
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/onbeforeunload-detach-expected.txt b/third_party/blink/web_tests/http/tests/loading/onbeforeunload-detach-expected.txt
index 6b8125b..edfac1ec 100644
--- a/third_party/blink/web_tests/http/tests/loading/onbeforeunload-detach-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/onbeforeunload-detach-expected.txt
@@ -2,12 +2,14 @@
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
 frame "iframe" - didReceiveTitle: 
+frame "iframe" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/onbeforeunload-detach-iframe.html', http method GET
 frame "iframe" - DidStartNavigation
 main frame - didReceiveTitle: 
 main frame - didFinishDocumentLoadForFrame
 frame "iframe" - ReadyToCommitNavigation
 frame "iframe" - didCommitLoadForFrame
 CONSOLE MESSAGE: line 12: iframe: clicking
+frame "iframe" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/onbeforeunload-detach-iframe.html?done', http method GET
 CONSOLE MESSAGE: line 5: iframe: onbeforeunload
 frame "iframe" - didFailLoadWithError
 main frame - didHandleOnloadEventsForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/onload-vs-immediate-refresh-expected.txt b/third_party/blink/web_tests/http/tests/loading/onload-vs-immediate-refresh-expected.txt
index 7b4f834..01bf9784 100644
--- a/third_party/blink/web_tests/http/tests/loading/onload-vs-immediate-refresh-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/onload-vs-immediate-refresh-expected.txt
@@ -6,6 +6,7 @@
 ALERT: SUCCESS
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/notify-success-on-load.html', http method GET
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/onreadystatechange-detach-expected.txt b/third_party/blink/web_tests/http/tests/loading/onreadystatechange-detach-expected.txt
index f6862843..b81bd2a4 100644
--- a/third_party/blink/web_tests/http/tests/loading/onreadystatechange-detach-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/onreadystatechange-detach-expected.txt
@@ -2,12 +2,14 @@
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
 frame "iframe" - didReceiveTitle: 
+frame "iframe" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/onreadystatechange-detach-iframe.html', http method GET
 frame "iframe" - DidStartNavigation
 main frame - didReceiveTitle: 
 main frame - didFinishDocumentLoadForFrame
 frame "iframe" - ReadyToCommitNavigation
 frame "iframe" - didCommitLoadForFrame
 CONSOLE MESSAGE: line 12: iframe: clicking
+frame "iframe" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/onreadystatechange-detach-iframe.html?done', http method GET
 frame "iframe" - DidStartNavigation
 CONSOLE MESSAGE: line 5: iframe: onreadystatechange
 frame "iframe" - didFailLoadWithError
diff --git a/third_party/blink/web_tests/http/tests/loading/pdf-commit-load-callbacks-expected.txt b/third_party/blink/web_tests/http/tests/loading/pdf-commit-load-callbacks-expected.txt
index 62dde80..f5df3586 100644
--- a/third_party/blink/web_tests/http/tests/loading/pdf-commit-load-callbacks-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/pdf-commit-load-callbacks-expected.txt
@@ -2,6 +2,7 @@
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
 frame "<!--framePath //<!--frame0-->-->" - didReceiveTitle: 
+frame "<!--framePath //<!--frame0-->-->" - BeginNavigation request to 'data:application/pdf;base64,', http method GET
 frame "<!--framePath //<!--frame0-->-->" - DidStartNavigation
 main frame - didReceiveTitle: 
 main frame - didFinishDocumentLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/pending-script-leak-expected.txt b/third_party/blink/web_tests/http/tests/loading/pending-script-leak-expected.txt
index 1a368692c..b8625b5 100644
--- a/third_party/blink/web_tests/http/tests/loading/pending-script-leak-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/pending-script-leak-expected.txt
@@ -2,6 +2,7 @@
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
 frame "<!--framePath //<!--frame0-->-->" - didReceiveTitle: 
+frame "<!--framePath //<!--frame0-->-->" - BeginNavigation request to 'about:blank', http method GET
 frame "<!--framePath //<!--frame0-->-->" - DidStartNavigation
 frame "<!--framePath //<!--frame0-->-->" - ReadyToCommitNavigation
 frame "<!--framePath //<!--frame0-->-->" - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/preload-image-sizes-2x-expected.txt b/third_party/blink/web_tests/http/tests/loading/preload-image-sizes-2x-expected.txt
index a7448ee..52d3bc53 100644
--- a/third_party/blink/web_tests/http/tests/loading/preload-image-sizes-2x-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/preload-image-sizes-2x-expected.txt
@@ -5,6 +5,7 @@
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/preload-image-sizes-2x.html', http method GET
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-2x-expected.txt b/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-2x-expected.txt
index 1a02c9e7..07258ac8 100644
--- a/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-2x-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-2x-expected.txt
@@ -5,6 +5,7 @@
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/preload-image-srcset-2x.html', http method GET
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-duplicate-expected.txt b/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-duplicate-expected.txt
index 7f70ae1..c4963ff1 100644
--- a/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-duplicate-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-duplicate-expected.txt
@@ -5,6 +5,7 @@
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/preload-image-srcset-duplicate.html', http method GET
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-expected.txt b/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-expected.txt
index 35a9a83..cf3ae5f 100644
--- a/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-expected.txt
@@ -5,6 +5,7 @@
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/preload-image-srcset.html', http method GET
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-reverse-order-expected.txt b/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-reverse-order-expected.txt
index 2a008fe..4cc7f818 100644
--- a/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-reverse-order-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-reverse-order-expected.txt
@@ -5,6 +5,7 @@
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/preload-image-srcset-reverse-order.html', http method GET
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-src-preloaded-expected.txt b/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-src-preloaded-expected.txt
index df9ed07a..0cf204af 100644
--- a/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-src-preloaded-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-src-preloaded-expected.txt
@@ -5,6 +5,7 @@
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/preload-image-srcset-src-preloaded.html', http method GET
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-src-preloaded-reverse-order-expected.txt b/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-src-preloaded-reverse-order-expected.txt
index 7ac6716..43adec7 100644
--- a/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-src-preloaded-reverse-order-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/preload-image-srcset-src-preloaded-reverse-order-expected.txt
@@ -5,6 +5,7 @@
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/preload-image-srcset-src-preloaded-reverse-order.html', http method GET
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/preload-picture-sizes-2x-expected.txt b/third_party/blink/web_tests/http/tests/loading/preload-picture-sizes-2x-expected.txt
index 0e0d220a..ef34984 100644
--- a/third_party/blink/web_tests/http/tests/loading/preload-picture-sizes-2x-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/preload-picture-sizes-2x-expected.txt
@@ -6,6 +6,7 @@
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/loading/preload-picture-sizes-2x.html', http method GET
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/redirect-methods-expected.txt b/third_party/blink/web_tests/http/tests/loading/redirect-methods-expected.txt
index 469a5cd..b6787c31 100644
--- a/third_party/blink/web_tests/http/tests/loading/redirect-methods-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/redirect-methods-expected.txt
@@ -6,6 +6,7 @@
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
 frame "0" - didReceiveTitle: 
+frame "0" - BeginNavigation request to 'about:blank', http method GET
 frame "0" - DidStartNavigation
 frame "0" - ReadyToCommitNavigation
 frame "0" - didCommitLoadForFrame
@@ -13,8 +14,8 @@
 frame "0" - didFinishDocumentLoadForFrame
 frame "0" - didHandleOnloadEventsForFrame
 frame "0" - didFinishLoadForFrame
+frame "0" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/redirect-methods-form.html', http method GET
 frame "0" - DidStartNavigation
-http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-form.html, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method GET>
 frame "0" - ReadyToCommitNavigation
 http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-form.html, http status code 200>
 frame "0" - didCommitLoadForFrame
@@ -22,14 +23,15 @@
 frame "0" - didFinishDocumentLoadForFrame
 frame "0" - didHandleOnloadEventsForFrame
 frame "0" - didFinishLoadForFrame
+frame "0" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/redirect-methods-result.php', http method POST
 frame "0" - DidStartNavigation
-http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method POST>
 frame "0" - ReadyToCommitNavigation
 http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, http status code 200>
 frame "0" - didCommitLoadForFrame
 frame "0" - didReceiveTitle: 
 frame "0" - didFinishDocumentLoadForFrame
 frame "1" - didReceiveTitle: 
+frame "1" - BeginNavigation request to 'about:blank', http method GET
 frame "1" - DidStartNavigation
 frame "1" - ReadyToCommitNavigation
 frame "1" - didCommitLoadForFrame
@@ -39,8 +41,8 @@
 frame "1" - didFinishLoadForFrame
 frame "0" - didHandleOnloadEventsForFrame
 frame "0" - didFinishLoadForFrame
+frame "1" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/redirect-methods-form.html', http method GET
 frame "1" - DidStartNavigation
-http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-form.html, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method GET>
 frame "1" - ReadyToCommitNavigation
 http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-form.html, http status code 200>
 frame "1" - didCommitLoadForFrame
@@ -48,14 +50,15 @@
 frame "1" - didFinishDocumentLoadForFrame
 frame "1" - didHandleOnloadEventsForFrame
 frame "1" - didFinishLoadForFrame
+frame "1" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/redirect-methods-result.php', http method POST
 frame "1" - DidStartNavigation
-http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method POST>
 frame "1" - ReadyToCommitNavigation
 http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, http status code 200>
 frame "1" - didCommitLoadForFrame
 frame "1" - didReceiveTitle: 
 frame "1" - didFinishDocumentLoadForFrame
 frame "2" - didReceiveTitle: 
+frame "2" - BeginNavigation request to 'about:blank', http method GET
 frame "2" - DidStartNavigation
 frame "2" - ReadyToCommitNavigation
 frame "2" - didCommitLoadForFrame
@@ -65,8 +68,8 @@
 frame "2" - didFinishLoadForFrame
 frame "1" - didHandleOnloadEventsForFrame
 frame "1" - didFinishLoadForFrame
+frame "2" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/redirect-methods-form.html', http method GET
 frame "2" - DidStartNavigation
-http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-form.html, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method GET>
 frame "2" - ReadyToCommitNavigation
 http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-form.html, http status code 200>
 frame "2" - didCommitLoadForFrame
@@ -74,14 +77,15 @@
 frame "2" - didFinishDocumentLoadForFrame
 frame "2" - didHandleOnloadEventsForFrame
 frame "2" - didFinishLoadForFrame
+frame "2" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/redirect-methods-result.php', http method POST
 frame "2" - DidStartNavigation
-http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method POST>
 frame "2" - ReadyToCommitNavigation
 http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, http status code 200>
 frame "2" - didCommitLoadForFrame
 frame "2" - didReceiveTitle: 
 frame "2" - didFinishDocumentLoadForFrame
 frame "3" - didReceiveTitle: 
+frame "3" - BeginNavigation request to 'about:blank', http method GET
 frame "3" - DidStartNavigation
 frame "3" - ReadyToCommitNavigation
 frame "3" - didCommitLoadForFrame
@@ -91,8 +95,8 @@
 frame "3" - didFinishLoadForFrame
 frame "2" - didHandleOnloadEventsForFrame
 frame "2" - didFinishLoadForFrame
+frame "3" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/redirect-methods-form.html', http method GET
 frame "3" - DidStartNavigation
-http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-form.html, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method GET>
 frame "3" - ReadyToCommitNavigation
 http://127.0.0.1:8000/loading/resources/redirect-methods-form.html - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-form.html, http status code 200>
 frame "3" - didCommitLoadForFrame
@@ -100,8 +104,8 @@
 frame "3" - didFinishDocumentLoadForFrame
 frame "3" - didHandleOnloadEventsForFrame
 frame "3" - didFinishLoadForFrame
+frame "3" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/redirect-methods-result.php', http method POST
 frame "3" - DidStartNavigation
-http://127.0.0.1:8000/loading/resources/redirect-methods-result.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/loading/resources/redirect-methods-result.php, main document URL http://127.0.0.1:8000/loading/redirect-methods.html, http method POST>
 frame "3" - ReadyToCommitNavigation
 http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/loading/resources/redirect-methods-result.php?redirected=true, http status code 200>
 frame "3" - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/redirect-with-no-location-crash-expected.txt b/third_party/blink/web_tests/http/tests/loading/redirect-with-no-location-crash-expected.txt
index 884c935c..b182c59 100644
--- a/third_party/blink/web_tests/http/tests/loading/redirect-with-no-location-crash-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/redirect-with-no-location-crash-expected.txt
@@ -3,6 +3,7 @@
 main frame - didCommitLoadForFrame
 main frame - didReceiveTitle: Test for https://bugs.webkit.org/show_bug.cgi?id=29293
 frame "<!--framePath //<!--frame0-->-->" - didReceiveTitle: 
+frame "<!--framePath //<!--frame0-->-->" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/redirect-with-no-location-crash.php', http method GET
 frame "<!--framePath //<!--frame0-->-->" - DidStartNavigation
 main frame - didFinishDocumentLoadForFrame
 frame "<!--framePath //<!--frame0-->-->" - ReadyToCommitNavigation
diff --git a/third_party/blink/web_tests/http/tests/loading/simple-subframe-expected.txt b/third_party/blink/web_tests/http/tests/loading/simple-subframe-expected.txt
index 2d92bb7..dc0dbde 100644
--- a/third_party/blink/web_tests/http/tests/loading/simple-subframe-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/simple-subframe-expected.txt
@@ -2,6 +2,7 @@
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
 frame "f1" - didReceiveTitle: 
+frame "f1" - BeginNavigation request to 'data:text/html,<b>test</b>', http method GET
 frame "f1" - DidStartNavigation
 main frame - didReceiveTitle: 
 main frame - didFinishDocumentLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/slow-parsing-subframe-expected.txt b/third_party/blink/web_tests/http/tests/loading/slow-parsing-subframe-expected.txt
index caf4b7a9..8b0d31a 100644
--- a/third_party/blink/web_tests/http/tests/loading/slow-parsing-subframe-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/slow-parsing-subframe-expected.txt
@@ -2,6 +2,7 @@
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
 frame "f1" - didReceiveTitle: 
+frame "f1" - BeginNavigation request to 'http://127.0.0.1:8000/misc/resources/200.html', http method GET
 frame "f1" - DidStartNavigation
 main frame - didReceiveTitle: 
 main frame - didFinishDocumentLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/stop-load-at-commit-expected.txt b/third_party/blink/web_tests/http/tests/loading/stop-load-at-commit-expected.txt
index dc9a22c..cccc8d2 100644
--- a/third_party/blink/web_tests/http/tests/loading/stop-load-at-commit-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/stop-load-at-commit-expected.txt
@@ -5,6 +5,7 @@
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/navigation/resources/pass-and-notify-done.html', http method GET
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/text-content-type-with-binary-extension-expected.txt b/third_party/blink/web_tests/http/tests/loading/text-content-type-with-binary-extension-expected.txt
index a7731b1f..5be2db91 100644
--- a/third_party/blink/web_tests/http/tests/loading/text-content-type-with-binary-extension-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/text-content-type-with-binary-extension-expected.txt
@@ -2,6 +2,7 @@
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
 frame "iframe" - didReceiveTitle: 
+frame "iframe" - BeginNavigation request to 'http://127.0.0.1:8000/loading/resources/binaryData.sitx', http method GET
 frame "iframe" - DidStartNavigation
 main frame - didReceiveTitle: 
 main frame - didFinishDocumentLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/loading/window-open-onblur-reentrancy-expected.txt b/third_party/blink/web_tests/http/tests/loading/window-open-onblur-reentrancy-expected.txt
index 1a28e0f..eece2654 100644
--- a/third_party/blink/web_tests/http/tests/loading/window-open-onblur-reentrancy-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/window-open-onblur-reentrancy-expected.txt
@@ -2,6 +2,7 @@
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
 frame "i" - didReceiveTitle: 
+frame "i" - BeginNavigation request to 'about:blank', http method GET
 frame "i" - DidStartNavigation
 frame "i" - ReadyToCommitNavigation
 frame "i" - didCommitLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/misc/window-dot-stop-expected.txt b/third_party/blink/web_tests/http/tests/misc/window-dot-stop-expected.txt
index e462f91..4666741 100644
--- a/third_party/blink/web_tests/http/tests/misc/window-dot-stop-expected.txt
+++ b/third_party/blink/web_tests/http/tests/misc/window-dot-stop-expected.txt
@@ -1,4 +1,3 @@
-http://127.0.0.1:8000/incremental/slow-utf8-text.pl - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/incremental/slow-utf8-text.pl, main document URL http://127.0.0.1:8000/misc/window-dot-stop.html, http method GET>
 This tests for the successful use of window.stop()
 
 
diff --git a/third_party/blink/web_tests/http/tests/navigation/location-reload-after-post-expected.txt b/third_party/blink/web_tests/http/tests/navigation/location-reload-after-post-expected.txt
index 079ef41..bbf3a8a 100644
--- a/third_party/blink/web_tests/http/tests/navigation/location-reload-after-post-expected.txt
+++ b/third_party/blink/web_tests/http/tests/navigation/location-reload-after-post-expected.txt
@@ -1,5 +1,21 @@
-http://127.0.0.1:8000/navigation/location-reload-after-post.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/location-reload-after-post.php, main document URL http://127.0.0.1:8000/navigation/location-reload-after-post.php, http method POST>
-http://127.0.0.1:8000/navigation/location-reload-after-post.php - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/navigation/location-reload-after-post.php, http status code 200>
-http://127.0.0.1:8000/navigation/location-reload-after-post.php - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/navigation/location-reload-after-post.php, main document URL http://127.0.0.1:8000/navigation/location-reload-after-post.php, http method POST>
-http://127.0.0.1:8000/navigation/location-reload-after-post.php - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/navigation/location-reload-after-post.php, http status code 200>
+main frame - didReceiveTitle: 
+main frame - didFinishDocumentLoadForFrame
+main frame - didHandleOnloadEventsForFrame
+main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/navigation/location-reload-after-post.php', http method POST
+main frame - DidStartNavigation
+main frame - ReadyToCommitNavigation
+main frame - didCommitLoadForFrame
+main frame - didReceiveTitle: 
+main frame - didFinishDocumentLoadForFrame
+main frame - didHandleOnloadEventsForFrame
+main frame - didFinishLoadForFrame
+main frame - BeginNavigation request to 'http://127.0.0.1:8000/navigation/location-reload-after-post.php', http method POST
+main frame - DidStartNavigation
+main frame - ReadyToCommitNavigation
+main frame - didCommitLoadForFrame
+main frame - didReceiveTitle: 
+main frame - didFinishDocumentLoadForFrame
+main frame - didHandleOnloadEventsForFrame
+main frame - didFinishLoadForFrame
 
diff --git a/third_party/blink/web_tests/http/tests/navigation/location-reload-after-post.php b/third_party/blink/web_tests/http/tests/navigation/location-reload-after-post.php
index b511f2b..614aa2f 100644
--- a/third_party/blink/web_tests/http/tests/navigation/location-reload-after-post.php
+++ b/third_party/blink/web_tests/http/tests/navigation/location-reload-after-post.php
@@ -5,7 +5,7 @@
 <script>
 if (window.testRunner) {
     testRunner.dumpAsText();
-    testRunner.dumpResourceLoadCallbacks();
+    testRunner.dumpFrameLoadCallbacks();
     testRunner.waitUntilDone();
 }
 
diff --git a/third_party/blink/web_tests/http/tests/security/mixedContent/insecure-iframe-with-hsts.https-expected.txt b/third_party/blink/web_tests/http/tests/security/mixedContent/insecure-iframe-with-hsts.https-expected.txt
index 752ae76..a457f73 100644
--- a/third_party/blink/web_tests/http/tests/security/mixedContent/insecure-iframe-with-hsts.https-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/mixedContent/insecure-iframe-with-hsts.https-expected.txt
@@ -3,6 +3,7 @@
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
 frame "<!--framePath //<!--frame0-->-->" - didReceiveTitle: 
+frame "<!--framePath //<!--frame0-->-->" - BeginNavigation request to 'http://hsts-example.test:8443/security/resources/hsts.php', http method GET
 frame "<!--framePath //<!--frame0-->-->" - DidStartNavigation
 CONSOLE ERROR: line 18: Mixed Content: The page at 'https://127.0.0.1:8443/security/mixedContent/insecure-iframe-with-hsts.https.html' was loaded over HTTPS, but requested an insecure resource 'http://hsts-example.test:8443/security/resources/hsts.php'. This request has been blocked; the content must be served over HTTPS.
 frame "<!--framePath //<!--frame0-->-->" - didFailProvisionalLoadWithError
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png
index af5f21f1..bd478a62 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png
index f2469d0..7c7e327 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/12-55-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/12-55-expected.png
index f38df4d..1f91feda 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/12-55-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/12-55-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/182-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/182-expected.png
index f9ea39f..61887f59 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/182-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/182-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/2-dht-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/2-dht-expected.png
index 483b603..a3f6eaf 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/2-dht-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/2-dht-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/23-55-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/23-55-expected.png
index 06fa592..fedf2451 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/23-55-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/23-55-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/55-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/55-expected.png
index 6762251..a388772 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/55-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/55-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
index 2368484..1acaaf0 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-srgb-to-srgb-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-srgb-to-srgb-expected.png
index 746dd01..bea8973 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-srgb-to-srgb-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/color-profile-munsell-srgb-to-srgb-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/cross-fade-svg-size-diff-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/cross-fade-svg-size-diff-expected.png
index a2a7e4f..43f64621 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/cross-fade-svg-size-diff-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/cross-fade-svg-size-diff-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/cross-fade-svg-size-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/cross-fade-svg-size-expected.png
index 71492a8..fb927f7 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/cross-fade-svg-size-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/cross-fade-svg-size-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/exif-orientation-css-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/exif-orientation-css-expected.png
index 5f34bcf..a3018ee 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/exif-orientation-css-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/exif-orientation-css-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/exif-orientation-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/exif-orientation-expected.png
index de03609..ae08025b 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/exif-orientation-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/exif-orientation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/exif-orientation-image-document-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/exif-orientation-image-document-expected.png
index ba74f14..26d18f7 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/exif-orientation-image-document-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/exif-orientation-image-document-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/favicon-as-image-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/favicon-as-image-expected.png
index 3bf27c1..f14e1330 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/favicon-as-image-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/favicon-as-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-edge-cases-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-edge-cases-expected.png
index 81a0dfa9..9879c7d 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-edge-cases-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-edge-cases-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.png
index da6882a..aa60ad5 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-forced-layout-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-forced-layout-expected.png
index c2ca27a3..ad4cdc6 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-forced-layout-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-forced-layout-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-responsive-image-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-responsive-image-expected.png
index 0e70bc8..6cb1553 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-responsive-image-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-responsive-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-styles-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-styles-expected.png
index 5c18807..21cb653 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-styles-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/feature-policy-oversized-images-styles-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/image-map-anchor-children-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/image-map-anchor-children-expected.png
index 5da2590..1557bdf5 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/image-map-anchor-children-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/image-map-anchor-children-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-circle-focus-ring-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-circle-focus-ring-expected.png
index d18d15c..8bc8e30 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-circle-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-circle-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-expected.png
index 9e0c2cc..b855fae2 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-in-positioned-container-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-in-positioned-container-expected.png
index 8521d6ba..6df2bc3 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-in-positioned-container-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-in-positioned-container-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png
index 7db3caa..d11b4b18 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png
index 7bc1471..2123c16 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-with-paint-root-offset-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-with-paint-root-offset-expected.png
index 80ae5b78..368152fc 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-with-paint-root-offset-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-with-paint-root-offset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-with-scale-transform-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-with-scale-transform-expected.png
index 6e0a7aa..2a102ee 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-with-scale-transform-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-with-scale-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-zero-outline-width-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-zero-outline-width-expected.png
index 41cdec4..b023864 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-zero-outline-width-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-zero-outline-width-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-zoom-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-zoom-expected.png
index 4a7edaee..d08378ab 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-zoom-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-focus-ring-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-overflowing-circle-focus-ring-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-overflowing-circle-focus-ring-expected.png
index 97253a14..201244f5 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-overflowing-circle-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-overflowing-circle-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring-expected.png
index aada43e..eb32dbc 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-polygon-focus-ring-expected.png
index db6cafd..b47f876 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-polygon-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/imagemap-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/pixel-crack-image-background-webkit-transform-scale-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/pixel-crack-image-background-webkit-transform-scale-expected.png
index c9b5810..b3939dc 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/pixel-crack-image-background-webkit-transform-scale-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/pixel-crack-image-background-webkit-transform-scale-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-0px-images-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-0px-images-expected.png
index f6aac27..d62551f 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-0px-images-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-0px-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-0px-images-quirk-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-0px-images-quirk-expected.png
index 7a901aeb..6c0766a 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-0px-images-quirk-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-0px-images-quirk-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-10px-images-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-10px-images-expected.png
index 5e04d3c..23e531e 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-10px-images-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-10px-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-16px-images-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-16px-images-expected.png
index fedf2f9..ee9b5c5f 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-16px-images-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-16px-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-1px-images-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-1px-images-expected.png
index d96e05d6..8bbb7e4 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-1px-images-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-1px-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-block-flow-images-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-block-flow-images-expected.png
index 64b9c59b..42fa90e 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-block-flow-images-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-block-flow-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-images-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-images-expected.png
index 92dfb008..ad300ea 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-images-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/rendering-broken-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll_customization/fast/events/touch/multi-touch-user-gesture-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/scroll_customization/fast/events/touch/multi-touch-user-gesture-expected.txt
deleted file mode 100644
index 61a5134..0000000
--- a/third_party/blink/web_tests/platform/linux/virtual/scroll_customization/fast/events/touch/multi-touch-user-gesture-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test user gesture behavior during multi-finger touch events. assert_equals: expected "touchstart@target1(false), touchstart@target2(false), touchmove@target1(false), touchmove@target2(false), touchend@target1(true), touchend@target2(true)" but got "touchstart@target1(false), touchstart@target2(false), touchmove@target2(false), touchmove@target1(false), touchend@target1(true), touchend@target2(true)"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.txt
deleted file mode 100644
index e294d225..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
diff --git a/third_party/blink/web_tests/platform/mac/fast/events/touch/multi-touch-user-gesture-expected.txt b/third_party/blink/web_tests/platform/mac/fast/events/touch/multi-touch-user-gesture-expected.txt
deleted file mode 100644
index 61a5134..0000000
--- a/third_party/blink/web_tests/platform/mac/fast/events/touch/multi-touch-user-gesture-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test user gesture behavior during multi-finger touch events. assert_equals: expected "touchstart@target1(false), touchstart@target2(false), touchmove@target1(false), touchmove@target2(false), touchend@target1(true), touchend@target2(true)" but got "touchstart@target1(false), touchstart@target2(false), touchmove@target2(false), touchmove@target1(false), touchend@target1(true), touchend@target2(true)"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png
index 5bbaf24..396cceda0 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png
index e3d3e15..b0ce6b9 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/cross-fade-svg-size-diff-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/cross-fade-svg-size-diff-expected.png
index ca93bc953..a736ed1 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/cross-fade-svg-size-diff-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/cross-fade-svg-size-diff-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/cross-fade-svg-size-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/cross-fade-svg-size-expected.png
index fdb18a28..1caf1f5 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/cross-fade-svg-size-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/cross-fade-svg-size-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.png
index d42a7941..1918867 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/image-map-anchor-children-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/image-map-anchor-children-expected.png
index 30a3c0ba..4f1c80e 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/image-map-anchor-children-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/image-map-anchor-children-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-circle-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-circle-focus-ring-expected.png
index f5c8a71..db7d836f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-circle-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-circle-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-expected.png
index 2b82dcf..1ff122a 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-in-positioned-container-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-in-positioned-container-expected.png
index e727603..03884e6 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-in-positioned-container-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-in-positioned-container-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-expected.png
index 3d9b736..7e7ff5b7 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png
index 6ab669dd..96e8a35 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-explicitly-inherited-from-map-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png
index 705df7f..0c6a756 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-with-paint-root-offset-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-with-paint-root-offset-expected.png
index 890e7744..7a4bdb74 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-with-paint-root-offset-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-with-paint-root-offset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-with-scale-transform-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-with-scale-transform-expected.png
index fa4e40f3..47a71898 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-with-scale-transform-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-with-scale-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-zoom-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-zoom-expected.png
index 3de2dbf..281176ed 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-zoom-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-focus-ring-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-overflowing-circle-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-overflowing-circle-focus-ring-expected.png
index a3d58a6..50a38bc 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-overflowing-circle-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-overflowing-circle-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring-expected.png
index a3a6752..1495b74 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-polygon-focus-ring-expected.png
index 44982e9..9b79ee5 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-polygon-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/imagemap-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png
index e59f7e4f..0aeb2da 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png
index eb1456c4..356ea4f85 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/cross-fade-svg-size-diff-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/cross-fade-svg-size-diff-expected.png
index 2616aa00..5bdaf81 100644
--- a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/cross-fade-svg-size-diff-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/cross-fade-svg-size-diff-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/cross-fade-svg-size-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/cross-fade-svg-size-expected.png
index c7bd016..c631562 100644
--- a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/cross-fade-svg-size-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/cross-fade-svg-size-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-circle-focus-ring-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-circle-focus-ring-expected.png
index 3c75d67..4769870 100644
--- a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-circle-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-circle-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-expected.png
index 94ac255..3be9597 100644
--- a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-in-positioned-container-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-in-positioned-container-expected.png
index 8f58f48..e713bcb 100644
--- a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-in-positioned-container-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-in-positioned-container-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png
index 5b6e63e..2834530 100644
--- a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-outline-color-not-inherited-from-map-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-with-paint-root-offset-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-with-paint-root-offset-expected.png
index efca9837..49d3b534 100644
--- a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-with-paint-root-offset-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-with-paint-root-offset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-with-scale-transform-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-with-scale-transform-expected.png
index 425e555e..4c4385c 100644
--- a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-with-scale-transform-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-with-scale-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-zoom-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-zoom-expected.png
index 7e99a0be..cccfc99 100644
--- a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-zoom-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-focus-ring-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-overflowing-circle-focus-ring-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-overflowing-circle-focus-ring-expected.png
index b3756a6..2858fa6 100644
--- a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-overflowing-circle-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-overflowing-circle-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring-expected.png
index 4274da1..6929b29 100644
--- a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-overflowing-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-polygon-focus-ring-expected.png
index 8414dc3..066f33b 100644
--- a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-polygon-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/imagemap-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.png b/third_party/blink/web_tests/platform/win7/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.png
deleted file mode 100644
index 266834369..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.txt b/third_party/blink/web_tests/platform/win7/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.txt
deleted file mode 100644
index e294d225..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/exotic-color-space/images/feature-policy-oversized-images-expected.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
-CONSOLE ERROR: Feature policy violation: oversized-images is not allowed in this document.
diff --git a/third_party/blink/web_tests/svg/filters/feImage-preserveAspectRatio-all-expected.png b/third_party/blink/web_tests/svg/filters/feImage-preserveAspectRatio-all-expected.png
index d52e71d..7c626e7 100644
--- a/third_party/blink/web_tests/svg/filters/feImage-preserveAspectRatio-all-expected.png
+++ b/third_party/blink/web_tests/svg/filters/feImage-preserveAspectRatio-all-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/feImage-preserveAspectratio-expected.png b/third_party/blink/web_tests/svg/filters/feImage-preserveAspectratio-expected.png
index 6336afe1..cfe069d 100644
--- a/third_party/blink/web_tests/svg/filters/feImage-preserveAspectratio-expected.png
+++ b/third_party/blink/web_tests/svg/filters/feImage-preserveAspectratio-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/filteredImage-expected.png b/third_party/blink/web_tests/svg/filters/filteredImage-expected.png
index aa1a9b3..fec75dc 100644
--- a/third_party/blink/web_tests/svg/filters/filteredImage-expected.png
+++ b/third_party/blink/web_tests/svg/filters/filteredImage-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/dark-mode/paint/dark-mode/image-filter-all/image-invert-expected.png b/third_party/blink/web_tests/virtual/dark-mode/paint/dark-mode/image-filter-all/image-invert-expected.png
index 2aa2c0b8..bc6b96e 100644
--- a/third_party/blink/web_tests/virtual/dark-mode/paint/dark-mode/image-filter-all/image-invert-expected.png
+++ b/third_party/blink/web_tests/virtual/dark-mode/paint/dark-mode/image-filter-all/image-invert-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/exotic-color-space/images/cross-fade-invalidation-expected.png b/third_party/blink/web_tests/virtual/exotic-color-space/images/cross-fade-invalidation-expected.png
index e2cbbdf..212a5e11 100644
--- a/third_party/blink/web_tests/virtual/exotic-color-space/images/cross-fade-invalidation-expected.png
+++ b/third_party/blink/web_tests/virtual/exotic-color-space/images/cross-fade-invalidation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/exotic-color-space/images/cross-fade-overflow-position-expected.png b/third_party/blink/web_tests/virtual/exotic-color-space/images/cross-fade-overflow-position-expected.png
index 42c84084..0e6cc0a 100644
--- a/third_party/blink/web_tests/virtual/exotic-color-space/images/cross-fade-overflow-position-expected.png
+++ b/third_party/blink/web_tests/virtual/exotic-color-space/images/cross-fade-overflow-position-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/exotic-color-space/images/exif-orientation-height-image-document-expected.png b/third_party/blink/web_tests/virtual/exotic-color-space/images/exif-orientation-height-image-document-expected.png
index 3a286c2..45c5653 100644
--- a/third_party/blink/web_tests/virtual/exotic-color-space/images/exif-orientation-height-image-document-expected.png
+++ b/third_party/blink/web_tests/virtual/exotic-color-space/images/exif-orientation-height-image-document-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index f54c843..df01222 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -10467,23 +10467,18 @@
     attribute @@toStringTag
     getter session
     method constructor
-    method getInputPose
     method getPose
     method getViewerPose
 interface XRHitResult
     attribute @@toStringTag
     getter hitMatrix
     method constructor
-interface XRInputPose
-    attribute @@toStringTag
-    getter emulatedPosition
-    getter gripTransform
-    getter targetRay
-    method constructor
 interface XRInputSource
     attribute @@toStringTag
+    getter gripSpace
     getter handedness
     getter targetRayMode
+    getter targetRaySpace
     method constructor
 interface XRInputSourceEvent : Event
     attribute @@toStringTag
diff --git a/third_party/blink/web_tests/xr/getInputPose_hand.html b/third_party/blink/web_tests/xr/getInputPose_hand.html
index 414d5dab..e5e9cd69 100644
--- a/third_party/blink/web_tests/xr/getInputPose_hand.html
+++ b/third_party/blink/web_tests/xr/getInputPose_hand.html
@@ -48,13 +48,12 @@
 
       function CheckInvalidGrip(time, xrFrame) {
         let source = session.getInputSources()[0];
-
-        let input_pose = xrFrame.getInputPose(source, referenceSpace);
+        let grip_pose = xrFrame.getPose(source.gripSpace, referenceSpace);
 
         t.step( () => {
           // The input pose should be null when no grip matrix is provided.
           assert_equals(source.targetRayMode, "tracked-pointer");
-          assert_equals(input_pose, null);
+          assert_equals(grip_pose, null);
         });
 
         input_source.grip = VALID_GRIP;
@@ -65,16 +64,18 @@
       function CheckValidGrip(time, xrFrame) {
         let source = session.getInputSources()[0];
 
-        let input_pose = xrFrame.getInputPose(source, referenceSpace);
+        let grip_pose = xrFrame.getPose(source.gripSpace, referenceSpace);
+
+        let input_pose = xrFrame.getPose(source.targetRaySpace, referenceSpace);
 
         t.step( () => {
           // When a grip matrix is present but no pointer offset is specified,
           // the grip and pointer matrices should be the same.
-          assert_not_equals(input_pose.gripTransform, null);
-          assert_matrices_approx_equal(input_pose.gripTransform.matrix, VALID_GRIP,
+          assert_not_equals(grip_pose, null);
+          assert_matrices_approx_equal(grip_pose.transform.matrix, VALID_GRIP,
             FLOAT_EPSILON, "Grip matrix is not equal to input.");
-          assert_matrices_approx_equal(input_pose.targetRay.matrix,
-            input_pose.gripTransform.matrix, FLOAT_EPSILON,
+          assert_matrices_approx_equal(input_pose.transform.matrix,
+            grip_pose.transform.matrix, FLOAT_EPSILON,
             "Grip matrix is not equal to target ray matrix.");
         });
 
@@ -86,16 +87,17 @@
       function CheckValidGripAndPointer(time, xrFrame) {
         let source = session.getInputSources()[0];
 
-        let input_pose = xrFrame.getInputPose(source, referenceSpace);
+        let grip_pose = xrFrame.getPose(source.gripSpace, referenceSpace);
+        let input_pose = xrFrame.getPose(source.targetRaySpace, referenceSpace);
 
         t.step( () => {
           // When a grip matrix and pointer offset are specified,
           // pointer matrix should be grip matrix multiplied with the pointer
           // offset.
-          assert_not_equals(input_pose.gripTransform, null);
-          assert_matrices_approx_equal(input_pose.gripTransform.matrix, VALID_GRIP,
+          assert_not_equals(grip_pose, null);
+          assert_matrices_approx_equal(grip_pose.transform.matrix, VALID_GRIP,
             FLOAT_EPSILON, "Grip matrix is not equal to input valid grip.");
-          assert_matrices_approx_equal(input_pose.targetRay.matrix,
+          assert_matrices_approx_equal(input_pose.transform.matrix,
             VALID_GRIP_WITH_POINTER_OFFSET, FLOAT_EPSILON,
             "Grip matrix not multipled properly.");
         });
diff --git a/third_party/blink/web_tests/xr/getInputPose_ray.html b/third_party/blink/web_tests/xr/getInputPose_ray.html
index 3b7c910..ce0cdee 100644
--- a/third_party/blink/web_tests/xr/getInputPose_ray.html
+++ b/third_party/blink/web_tests/xr/getInputPose_ray.html
@@ -47,23 +47,27 @@
       function CheckTargetRayNoOffset(time, xrFrame) {
         let source = session.getInputSources()[0];
 
-        let input_pose = xrFrame.getInputPose(source, referenceSpace);
+        let grip_pose = xrFrame.getPose(source.gripSpace, referenceSpace);
+        assert_not_equals(grip_pose, null);
+
+        let input_pose = xrFrame.getPose(source.targetRaySpace, referenceSpace);
+        assert_not_equals(input_pose, null);
+        let targetRay = new XRRay(input_pose.transform);
 
         t.step( () => {
-          assert_not_equals(input_pose.gripTransform, null);
-          assert_matrices_approx_equal(input_pose.targetRay.matrix,
-            input_pose.gripTransform.matrix, FLOAT_EPSILON,
+          assert_matrices_approx_equal(targetRay.matrix,
+            grip_pose.transform.matrix, FLOAT_EPSILON,
             "Target ray matrix is incorrect.");
 
-          assert_equals(input_pose.targetRay.origin.x, 4.0);
-          assert_equals(input_pose.targetRay.origin.y, 3.0);
-          assert_equals(input_pose.targetRay.origin.z, 2.0);
-          assert_equals(input_pose.targetRay.origin.w, 1.0);
+          assert_equals(targetRay.origin.x, 4.0);
+          assert_equals(targetRay.origin.y, 3.0);
+          assert_equals(targetRay.origin.z, 2.0);
+          assert_equals(targetRay.origin.w, 1.0);
 
-          assert_equals(input_pose.targetRay.direction.x, 0.0);
-          assert_equals(input_pose.targetRay.direction.y, 0.0);
-          assert_equals(input_pose.targetRay.direction.z, -1.0);
-          assert_equals(input_pose.targetRay.direction.w, 0.0);
+          assert_equals(targetRay.direction.x, 0.0);
+          assert_equals(targetRay.direction.y, 0.0);
+          assert_equals(targetRay.direction.z, -1.0);
+          assert_equals(targetRay.direction.w, 0.0);
         }, "Target ray computed properly with no pointer offset");
 
         input_source.pointerOffset = VALID_POINTER_OFFSET;
@@ -74,22 +78,27 @@
       function CheckTargetRayOffset(time, xrFrame) {
         let source = session.getInputSources()[0];
 
-        let input_pose = xrFrame.getInputPose(source, referenceSpace);
+        let grip_pose = xrFrame.getPose(source.gripSpace, referenceSpace);
+        assert_not_equals(grip_pose, null);
+
+        let input_pose = xrFrame.getPose(source.targetRaySpace, referenceSpace);
+        assert_not_equals(input_pose, null);
+        let targetRay = new XRRay(input_pose.transform);
 
         t.step( () => {
-          assert_matrices_approx_equal(input_pose.targetRay.matrix,
+          assert_matrices_approx_equal(targetRay.matrix,
             VALID_GRIP_WITH_POINTER_OFFSET, FLOAT_EPSILON,
             "Target ray matrix is not offset properly.");
 
-          assert_equals(input_pose.targetRay.origin.x, 4.0);
-          assert_equals(input_pose.targetRay.origin.y, 3.0);
-          assert_equals(input_pose.targetRay.origin.z, 3.0);
-          assert_equals(input_pose.targetRay.origin.w, 1.0);
+          assert_equals(targetRay.origin.x, 4.0);
+          assert_equals(targetRay.origin.y, 3.0);
+          assert_equals(targetRay.origin.z, 3.0);
+          assert_equals(targetRay.origin.w, 1.0);
 
-          assert_equals(input_pose.targetRay.direction.x, 0.0);
-          assert_equals(input_pose.targetRay.direction.y, 0.0);
-          assert_equals(input_pose.targetRay.direction.z, -1.0);
-          assert_equals(input_pose.targetRay.direction.w, 0.0);
+          assert_equals(targetRay.direction.x, 0.0);
+          assert_equals(targetRay.direction.y, 0.0);
+          assert_equals(targetRay.direction.z, -1.0);
+          assert_equals(targetRay.direction.w, 0.0);
         }, "Target ray computed properly with a pointer offset");
 
         resolve();
diff --git a/third_party/blink/web_tests/xr/xrReferenceSpace_originOffset.html b/third_party/blink/web_tests/xr/xrReferenceSpace_originOffset.html
new file mode 100644
index 0000000..67c9e2c
--- /dev/null
+++ b/third_party/blink/web_tests/xr/xrReferenceSpace_originOffset.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
+<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
+<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script>
+<script src="../xr/resources/xr-internal-device-mocking.js"></script>
+<script src="../xr/resources/xr-test-utils.js"></script>
+<canvas id="webgl-canvas"></canvas>
+
+<script>
+
+// Can't go in external WPT tests because this test uses MockXRInputSource which
+// is not available there.
+let testName = "Updating XRReferenceSpace origin offset updates view and input matrices.";
+
+let fakeDeviceInitParams = { supportsImmersive: true };
+
+let requestSessionOptions =  [{ mode: 'immersive-vr' }];
+
+let testFunction =
+  (session, t, fakeDeviceController) => new Promise((resolve) => {
+    // Session must have a baseLayer or frame requests will be ignored.
+    session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) });
+
+    // Need to have a valid pose or input events don't process.
+    const VIEW_MATRIX_WITH_ROTATION = [
+      1, 0, 0, 0, // 1st col
+      0, 0, 1, 0, // 2nd col
+      0, -1, 0, 0, // 3rd col
+      4, 3, 2, 1 // 4th col
+    ];
+
+    const GRIP_MATRIX_WITH_ROTATION = [
+      0, 0, -1, 0, // 1st col
+      0, 1, 0, 0, // 2nd col
+      1, 0, 0, 0, // 3rd col
+      1, 2, 3, 1 // 4th col
+    ];
+
+    const POINTER_OFFSET_WITH_ROTATION = [
+      0, 1, 0, 0, // 1st col
+      -1, 0, 0, 0, // 2nd col
+      0, 0, 1, 0, // 3rd col
+      2, 0, 1, 1 // 4th col
+    ]
+
+    fakeDeviceController.setXRPresentationFrameData(VALID_POSE_MATRIX, [{
+        eye:"left",
+        projectionMatrix: VALID_PROJECTION_MATRIX,
+        viewMatrix: VIEW_MATRIX_WITH_ROTATION
+      }, {
+        eye:"right",
+        projectionMatrix: VALID_PROJECTION_MATRIX,
+        viewMatrix: VIEW_MATRIX_WITH_ROTATION
+      }]);
+
+    let input_source = new MockXRInputSource();
+    input_source.targetRayMode = "tracked-pointer";
+    input_source.handedness = "right";
+    input_source.grip = GRIP_MATRIX_WITH_ROTATION;
+    input_source.pointerOffset = POINTER_OFFSET_WITH_ROTATION;
+    fakeDeviceController.addInputSource(input_source);
+
+    const EXPECTED_VIEW_MATRIX_1 = [0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, -1, -1, -1, 1];
+    const EXPECTED_GRIP_MATRIX_1 = [0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 2, 3, 1];
+    const EXPECTED_RAY_MATRIX_1 = [0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 2, 1, 1];
+
+    const EXPECTED_VIEW_MATRIX_2 = [0.7419161200523376, 0.6434604525566101, -0.1884651929140091, 0, -0.1884651929140091, -0.06961867958307266, -0.9796091318130493, 0, -0.6434604525566101, 0.7623069882392883, 0.06961867958307266, 0, -4, 4, 9, 1];
+    const EXPECTED_GRIP_MATRIX_2 = [-0.6434604525566101, 0.06961867958307266, -0.7623069882392883, 0, 0.7419161200523376, -0.1884651929140091, -0.6434604525566101, 0, -0.1884651929140091, -0.9796091318130493, 0.06961867958307266, 0, 4.118846416473389, 8.01339340209961, -5.368484020233154, 1];
+    const EXPECTED_RAY_MATRIX_2 = [0.7419161200523376, -0.1884651929140091, -0.6434604525566101, 0, 0.6434604525566101, -0.06961867958307266, 0.7623069882392883, 0, -0.1884651929140091, -0.9796091318130493, 0.06961867958307266, 0, 2.643460512161255, 7.1730217933654785, -6.823479652404785, 1];
+
+    // Must have a reference space to get input poses. eye-level doesn't apply
+    // any transforms to the given matrix.
+    session.requestReferenceSpace({ type: "stationary", subtype: "eye-level" }).then( (referenceSpace) => {
+      function OnFrame(time, frame) {
+        let source = session.getInputSources()[0];
+
+        function CheckState(expected_view_matrix, expected_grip_matrix, expected_ray_matrix) {
+          let pose = frame.getViewerPose(referenceSpace);
+          let grip_pose = frame.getPose(source.gripSpace, referenceSpace);
+          let input_pose = frame.getPose(source.targetRaySpace, referenceSpace);
+
+          let view_matrix = pose.views[0].viewMatrix;
+          let grip_matrix = grip_pose.transform.matrix;
+          let ray_matrix = input_pose.transform.matrix;
+
+          assert_matrices_approx_equal(view_matrix, expected_view_matrix);
+          assert_matrices_approx_equal(grip_matrix, expected_grip_matrix);
+          assert_matrices_approx_equal(ray_matrix, expected_ray_matrix);
+        }
+
+        CheckState(EXPECTED_VIEW_MATRIX_1, EXPECTED_GRIP_MATRIX_1, EXPECTED_RAY_MATRIX_1);
+
+        const new_position = {
+          x : 10,
+          y : -3,
+          z : 5
+        };
+
+        const degrees_45 = Math.PI / 4;
+        const rotation = Math.sin(degrees_45 / 2);
+        const new_orientation = {
+          x : rotation,
+          y : rotation * -1,
+          z : rotation * 3,
+          w : Math.cos(degrees_45 / 2)
+        };
+
+        referenceSpace.originOffset = new XRRigidTransform(new_position, new_orientation);
+        CheckState(EXPECTED_VIEW_MATRIX_2, EXPECTED_GRIP_MATRIX_2, EXPECTED_RAY_MATRIX_2);
+        resolve();
+      }
+
+      // Can only request input poses in an xr frame.
+      session.requestAnimationFrame(OnFrame);
+    });
+  });
+
+xr_session_promise_test(
+  testFunction, fakeDeviceInitParams, requestSessionOptions, testName);
+
+</script>
diff --git a/third_party/inspector_protocol/BUILD.gn b/third_party/inspector_protocol/BUILD.gn
index ddbe626..0cf1a98 100644
--- a/third_party/inspector_protocol/BUILD.gn
+++ b/third_party/inspector_protocol/BUILD.gn
@@ -2,15 +2,109 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-static_library("encoding") {
+# All build targets below are experimental and not used within the
+# Chromium / V8 / etc. trees yet thus far. Do not depend on anything.
+
+import("//testing/test.gni")
+
+static_library("json_parser") {
   sources = [
-    "encoding/encoding.cc",
-    "encoding/encoding.h",
+    "encoding/json_parser.cc",
+    "encoding/json_parser.h",
+    "encoding/json_parser_handler.h",
+    "encoding/platform.h",
+    "encoding/span.h",
+    "encoding/status.h",
+    "encoding/str_util.cc",
+    "encoding/str_util.h",
   ]
 }
 
-# encoding/encoding_test.cc:
-# There's no target for this file here, instead it is included
-# in //content/test:content_unittest
-# via //content/browser/devtools:inspector_protocol_encoding_test.
+static_library("linux_dev_platform") {
+  sources = [
+    "encoding/linux_dev_platform.cc",
+    "encoding/linux_dev_platform.h",
+    "encoding/platform.h",
+  ]
+}
 
+test("json_parser_test") {
+  sources = [
+    "encoding/json_parser_test.cc",
+  ]
+  deps = [
+    ":json_parser",
+    ":linux_dev_platform",
+    "//base",
+    "//third_party/googletest:gmock",
+    "//third_party/googletest:gtest",
+    "//third_party/googletest:gtest_main",
+  ]
+}
+
+static_library("cbor") {
+  sources = [
+    "encoding/cbor.cc",
+    "encoding/cbor.h",
+    "encoding/json_parser_handler.h",
+    "encoding/span.h",
+    "encoding/status.h",
+  ]
+  deps = [
+    ":json_parser",
+  ]
+}
+
+test("cbor_test") {
+  sources = [
+    "encoding/cbor_test.cc",
+  ]
+  deps = [
+    ":cbor",
+    ":json_parser",
+    ":json_std_string_writer",
+    ":linux_dev_platform",
+    "//base",
+    "//third_party/googletest:gmock",
+    "//third_party/googletest:gtest",
+    "//third_party/googletest:gtest_main",
+  ]
+}
+
+test("span_test") {
+  sources = [
+    "encoding/span.h",
+    "encoding/span_test.cc",
+  ]
+  deps = [
+    "//base",
+    "//third_party/googletest:gmock",
+    "//third_party/googletest:gtest",
+    "//third_party/googletest:gtest_main",
+  ]
+}
+
+static_library("json_std_string_writer") {
+  sources = [
+    "encoding/json_parser_handler.h",
+    "encoding/json_std_string_writer.cc",
+    "encoding/json_std_string_writer.h",
+    "encoding/platform.h",
+    "encoding/span.h",
+    "encoding/status.h",
+  ]
+}
+
+test("json_std_string_writer_test") {
+  sources = [
+    "encoding/json_std_string_writer_test.cc",
+  ]
+  deps = [
+    ":json_std_string_writer",
+    ":linux_dev_platform",
+    "//base",
+    "//third_party/googletest:gmock",
+    "//third_party/googletest:gtest",
+    "//third_party/googletest:gtest_main",
+  ]
+}
diff --git a/third_party/inspector_protocol/DEPS b/third_party/inspector_protocol/DEPS
index 20785c0..81c9b082 100644
--- a/third_party/inspector_protocol/DEPS
+++ b/third_party/inspector_protocol/DEPS
@@ -6,7 +6,7 @@
 specific_include_rules = {
   '^.*_test\.cc$': [
     '+base',
-    '+testing/gtest/include',
-    '+testing/gmock/include',
+    '+gmock',
+    '+gtest',
   ],
 }
diff --git a/third_party/inspector_protocol/README.chromium b/third_party/inspector_protocol/README.chromium
index f68de23..89f754b6 100644
--- a/third_party/inspector_protocol/README.chromium
+++ b/third_party/inspector_protocol/README.chromium
@@ -2,7 +2,7 @@
 Short Name: inspector_protocol
 URL: https://chromium.googlesource.com/deps/inspector_protocol/
 Version: 0
-Revision: a6bdf8a7cc95ee954ba2f701d10f4ecf03e86539
+Revision: be5f927f77f7d4670a02f16ed026db0a3768980a
 License: BSD
 License File: LICENSE
 Security Critical: no
diff --git a/third_party/inspector_protocol/code_generator.py b/third_party/inspector_protocol/code_generator.py
index 18777d0f..fb9959d 100755
--- a/third_party/inspector_protocol/code_generator.py
+++ b/third_party/inspector_protocol/code_generator.py
@@ -632,7 +632,7 @@
             "Array_h.template",
             "DispatcherBase_h.template",
             "Parser_h.template",
-            "encoding_h.template",
+            "CBOR_h.template",
         ]
 
         protocol_cpp_templates = [
@@ -642,7 +642,7 @@
             "Object_cpp.template",
             "DispatcherBase_cpp.template",
             "Parser_cpp.template",
-            "encoding_cpp.template",
+            "CBOR_cpp.template",
         ]
 
         forward_h_templates = [
diff --git a/third_party/inspector_protocol/encoding/cbor.cc b/third_party/inspector_protocol/encoding/cbor.cc
new file mode 100644
index 0000000..f771f5b
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/cbor.cc
@@ -0,0 +1,821 @@
+// 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 "cbor.h"
+
+#include <cassert>
+#include <limits>
+#include "json_parser_handler.h"
+
+namespace inspector_protocol {
+using namespace cbor;
+
+namespace {
+
+// See RFC 7049 Section 2.3, Table 2.
+static constexpr uint8_t kEncodedTrue =
+    EncodeInitialByte(MajorType::SIMPLE_VALUE, 21);
+static constexpr uint8_t kEncodedFalse =
+    EncodeInitialByte(MajorType::SIMPLE_VALUE, 20);
+static constexpr uint8_t kEncodedNull =
+    EncodeInitialByte(MajorType::SIMPLE_VALUE, 22);
+static constexpr uint8_t kInitialByteForDouble =
+    EncodeInitialByte(MajorType::SIMPLE_VALUE, 27);
+
+}  // namespace
+
+uint8_t EncodeTrue() { return kEncodedTrue; }
+uint8_t EncodeFalse() { return kEncodedFalse; }
+uint8_t EncodeNull() { return kEncodedNull; }
+
+uint8_t EncodeIndefiniteLengthArrayStart() {
+  return kInitialByteIndefiniteLengthArray;
+}
+
+uint8_t EncodeIndefiniteLengthMapStart() {
+  return kInitialByteIndefiniteLengthMap;
+}
+
+uint8_t EncodeStop() { return kStopByte; }
+
+namespace {
+// See RFC 7049 Table 3 and Section 2.4.4.2. This is used as a prefix for
+// arbitrary binary data encoded as BYTE_STRING.
+static constexpr uint8_t kExpectedConversionToBase64Tag =
+    EncodeInitialByte(MajorType::TAG, 22);
+
+// When parsing CBOR, we limit recursion depth for objects and arrays
+// to this constant.
+static constexpr int kStackLimit = 1000;
+
+// Writes the bytes for |v| to |out|, starting with the most significant byte.
+// See also: https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html
+template <typename T>
+void WriteBytesMostSignificantByteFirst(T v, std::vector<uint8_t>* out) {
+  for (int shift_bytes = sizeof(T) - 1; shift_bytes >= 0; --shift_bytes)
+    out->push_back(0xff & (v >> (shift_bytes * 8)));
+}
+}  // namespace
+
+namespace cbor_internals {
+// Writes the start of a token with |type|. The |value| may indicate the size,
+// or it may be the payload if the value is an unsigned integer.
+void WriteTokenStart(MajorType type, uint64_t value,
+                     std::vector<uint8_t>* encoded) {
+  if (value < 24) {
+    // Values 0-23 are encoded directly into the additional info of the
+    // initial byte.
+    encoded->push_back(EncodeInitialByte(type, /*additional_info=*/value));
+    return;
+  }
+  if (value <= std::numeric_limits<uint8_t>::max()) {
+    // Values 24-255 are encoded with one initial byte, followed by the value.
+    encoded->push_back(EncodeInitialByte(type, kAdditionalInformation1Byte));
+    encoded->push_back(value);
+    return;
+  }
+  if (value <= std::numeric_limits<uint16_t>::max()) {
+    // Values 256-65535: 1 initial byte + 2 bytes payload.
+    encoded->push_back(EncodeInitialByte(type, kAdditionalInformation2Bytes));
+    WriteBytesMostSignificantByteFirst<uint16_t>(value, encoded);
+    return;
+  }
+  if (value <= std::numeric_limits<uint32_t>::max()) {
+    // 32 bit uint: 1 initial byte + 4 bytes payload.
+    encoded->push_back(EncodeInitialByte(type, kAdditionalInformation4Bytes));
+    WriteBytesMostSignificantByteFirst<uint32_t>(static_cast<uint32_t>(value),
+                                                 encoded);
+    return;
+  }
+  // 64 bit uint: 1 initial byte + 8 bytes payload.
+  encoded->push_back(EncodeInitialByte(type, kAdditionalInformation8Bytes));
+  WriteBytesMostSignificantByteFirst<uint64_t>(value, encoded);
+}
+}  // namespace cbor_internals
+
+namespace {
+// Extracts sizeof(T) bytes from |in| to extract a value of type T
+// (e.g. uint64_t, uint32_t, ...), most significant byte first.
+// See also: https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html
+template <typename T>
+T ReadBytesMostSignificantByteFirst(span<uint8_t> in) {
+  assert(static_cast<std::size_t>(in.size()) >= sizeof(T));
+  T result = 0;
+  for (std::size_t shift_bytes = 0; shift_bytes < sizeof(T); ++shift_bytes)
+    result |= T(in[sizeof(T) - 1 - shift_bytes]) << (shift_bytes * 8);
+  return result;
+}
+}  // namespace
+
+namespace cbor_internals {
+int8_t ReadTokenStart(span<uint8_t> bytes, MajorType* type, uint64_t* value) {
+  if (bytes.empty()) return -1;
+  uint8_t initial_byte = bytes[0];
+  *type = MajorType((initial_byte & kMajorTypeMask) >> kMajorTypeBitShift);
+
+  uint8_t additional_information = initial_byte & kAdditionalInformationMask;
+  if (additional_information < 24) {
+    // Values 0-23 are encoded directly into the additional info of the
+    // initial byte.
+    *value = additional_information;
+    return 1;
+  }
+  if (additional_information == kAdditionalInformation1Byte) {
+    // Values 24-255 are encoded with one initial byte, followed by the value.
+    if (bytes.size() < 2) return -1;
+    *value = ReadBytesMostSignificantByteFirst<uint8_t>(bytes.subspan(1));
+    return 2;
+  }
+  if (additional_information == kAdditionalInformation2Bytes) {
+    // Values 256-65535: 1 initial byte + 2 bytes payload.
+    if (static_cast<std::size_t>(bytes.size()) < 1 + sizeof(uint16_t))
+      return -1;
+    *value = ReadBytesMostSignificantByteFirst<uint16_t>(bytes.subspan(1));
+    return 3;
+  }
+  if (additional_information == kAdditionalInformation4Bytes) {
+    // 32 bit uint: 1 initial byte + 4 bytes payload.
+    if (static_cast<std::size_t>(bytes.size()) < 1 + sizeof(uint32_t))
+      return -1;
+    *value = ReadBytesMostSignificantByteFirst<uint32_t>(bytes.subspan(1));
+    return 5;
+  }
+  if (additional_information == kAdditionalInformation8Bytes) {
+    // 64 bit uint: 1 initial byte + 8 bytes payload.
+    if (static_cast<std::size_t>(bytes.size()) < 1 + sizeof(uint64_t))
+      return -1;
+    *value = ReadBytesMostSignificantByteFirst<uint64_t>(bytes.subspan(1));
+    return 9;
+  }
+  return -1;
+}
+}  // namespace cbor_internals
+
+using cbor_internals::WriteTokenStart;
+using cbor_internals::ReadTokenStart;
+
+void EncodeInt32(int32_t value, std::vector<uint8_t>* out) {
+  if (value >= 0) {
+    WriteTokenStart(MajorType::UNSIGNED, value, out);
+  } else {
+    uint64_t representation = static_cast<uint64_t>(-(value + 1));
+    WriteTokenStart(MajorType::NEGATIVE, representation, out);
+  }
+}
+
+void EncodeString16(span<uint16_t> in, std::vector<uint8_t>* out) {
+  uint64_t byte_length = static_cast<uint64_t>(in.size_bytes());
+  WriteTokenStart(MajorType::BYTE_STRING, byte_length, out);
+  // When emitting UTF16 characters, we always write the least significant byte
+  // first; this is because it's the native representation for X86.
+  // TODO(johannes): Implement a more efficient thing here later, e.g.
+  // casting *iff* the machine has this byte order.
+  // The wire format for UTF16 chars will probably remain the same
+  // (least significant byte first) since this way we can have
+  // golden files, unittests, etc. that port easily and universally.
+  // See also:
+  // https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html
+  for (const uint16_t two_bytes : in) {
+    out->push_back(two_bytes);
+    out->push_back(two_bytes >> 8);
+  }
+}
+
+void EncodeString8(span<uint8_t> in, std::vector<uint8_t>* out) {
+  WriteTokenStart(MajorType::STRING, static_cast<uint64_t>(in.size_bytes()),
+                  out);
+  out->insert(out->end(), in.begin(), in.end());
+}
+
+void EncodeFromLatin1(span<uint8_t> latin1, std::vector<uint8_t>* out) {
+  for (std::ptrdiff_t ii = 0; ii < latin1.size(); ++ii) {
+    if (latin1[ii] <= 127)
+      continue;
+    // If there's at least one non-ASCII char, convert to UTF8.
+    std::vector<uint8_t> utf8(latin1.begin(), latin1.begin() + ii);
+    for (; ii < latin1.size(); ++ii) {
+      if (latin1[ii] <= 127) {
+        utf8.push_back(latin1[ii]);
+      } else {
+        // 0xC0 means it's a UTF8 sequence with 2 bytes.
+        utf8.push_back((latin1[ii] >> 6) | 0xc0);
+        utf8.push_back((latin1[ii] | 0x80) & 0xbf);
+      }
+    }
+    EncodeString8(span<uint8_t>(utf8.data(), utf8.size()), out);
+    return;
+  }
+  EncodeString8(latin1, out);
+}
+
+void EncodeFromUTF16(span<uint16_t> utf16, std::vector<uint8_t>* out) {
+  // If there's at least one non-ASCII char, encode as STRING16 (UTF16).
+  for (uint16_t ch : utf16) {
+    if (ch <= 127)
+      continue;
+    EncodeString16(utf16, out);
+    return;
+  }
+  // It's all US-ASCII, strip out every second byte and encode as UTF8.
+  WriteTokenStart(MajorType::STRING, static_cast<uint64_t>(utf16.size()), out);
+  out->insert(out->end(), utf16.begin(), utf16.end());
+}
+
+void EncodeBinary(span<uint8_t> in, std::vector<uint8_t>* out) {
+  out->push_back(kExpectedConversionToBase64Tag);
+  uint64_t byte_length = static_cast<uint64_t>(in.size_bytes());
+  WriteTokenStart(MajorType::BYTE_STRING, byte_length, out);
+  out->insert(out->end(), in.begin(), in.end());
+}
+
+// A double is encoded with a specific initial byte
+// (kInitialByteForDouble) plus the 64 bits of payload for its value.
+constexpr std::ptrdiff_t kEncodedDoubleSize = 1 + sizeof(uint64_t);
+
+// An envelope is encoded with a specific initial byte
+// (kInitialByteForEnvelope), plus the start byte for a BYTE_STRING with a 32
+// bit wide length, plus a 32 bit length for that string.
+constexpr std::ptrdiff_t kEncodedEnvelopeHeaderSize = 1 + 1 + sizeof(uint32_t);
+
+void EncodeDouble(double value, std::vector<uint8_t>* out) {
+  // The additional_info=27 indicates 64 bits for the double follow.
+  // See RFC 7049 Section 2.3, Table 1.
+  out->push_back(kInitialByteForDouble);
+  union {
+    double from_double;
+    uint64_t to_uint64;
+  } reinterpret;
+  reinterpret.from_double = value;
+  WriteBytesMostSignificantByteFirst<uint64_t>(reinterpret.to_uint64, out);
+}
+
+void EnvelopeEncoder::EncodeStart(std::vector<uint8_t>* out) {
+  assert(byte_size_pos_ == 0);
+  out->push_back(kInitialByteForEnvelope);
+  out->push_back(kInitialByteFor32BitLengthByteString);
+  byte_size_pos_ = out->size();
+  out->resize(out->size() + sizeof(uint32_t));
+}
+
+bool EnvelopeEncoder::EncodeStop(std::vector<uint8_t>* out) {
+  assert(byte_size_pos_ != 0);
+  // The byte size is the size of the payload, that is, all the
+  // bytes that were written past the byte size position itself.
+  uint64_t byte_size = out->size() - (byte_size_pos_ + sizeof(uint32_t));
+  // We store exactly 4 bytes, so at most INT32MAX, with most significant
+  // byte first.
+  if (byte_size > std::numeric_limits<uint32_t>::max()) return false;
+  for (int shift_bytes = sizeof(uint32_t) - 1; shift_bytes >= 0;
+       --shift_bytes) {
+    (*out)[byte_size_pos_++] = 0xff & (byte_size >> (shift_bytes * 8));
+  }
+  return true;
+}
+
+namespace {
+class JSONToCBOREncoder : public JSONParserHandler {
+ public:
+  JSONToCBOREncoder(std::vector<uint8_t>* out, Status* status)
+      : out_(out), status_(status) {
+    *status_ = Status();
+  }
+
+  void HandleObjectBegin() override {
+    envelopes_.emplace_back();
+    envelopes_.back().EncodeStart(out_);
+    out_->push_back(kInitialByteIndefiniteLengthMap);
+  }
+
+  void HandleObjectEnd() override {
+    out_->push_back(kStopByte);
+    assert(!envelopes_.empty());
+    envelopes_.back().EncodeStop(out_);
+    envelopes_.pop_back();
+  }
+
+  void HandleArrayBegin() override {
+    envelopes_.emplace_back();
+    envelopes_.back().EncodeStart(out_);
+    out_->push_back(kInitialByteIndefiniteLengthArray);
+  }
+
+  void HandleArrayEnd() override {
+    out_->push_back(kStopByte);
+    assert(!envelopes_.empty());
+    envelopes_.back().EncodeStop(out_);
+    envelopes_.pop_back();
+  }
+
+  void HandleString8(span<uint8_t> chars) override {
+    EncodeString8(chars, out_);
+  }
+
+  void HandleString16(span<uint16_t> chars) override {
+    for (uint16_t ch : chars) {
+      if (ch >= 0x7f) {
+        // If there's at least one non-7bit character, we encode as UTF16.
+        EncodeString16(chars, out_);
+        return;
+      }
+    }
+    std::vector<uint8_t> sevenbit_chars(chars.begin(), chars.end());
+    EncodeString8(span<uint8_t>(sevenbit_chars.data(), sevenbit_chars.size()),
+                  out_);
+  }
+
+  void HandleBinary(std::vector<uint8_t> bytes) override {
+    EncodeBinary(span<uint8_t>(bytes.data(), bytes.size()), out_);
+  }
+
+  void HandleDouble(double value) override { EncodeDouble(value, out_); }
+
+  void HandleInt32(int32_t value) override { EncodeInt32(value, out_); }
+
+  void HandleBool(bool value) override {
+    // See RFC 7049 Section 2.3, Table 2.
+    out_->push_back(value ? kEncodedTrue : kEncodedFalse);
+  }
+
+  void HandleNull() override {
+    // See RFC 7049 Section 2.3, Table 2.
+    out_->push_back(kEncodedNull);
+  }
+
+  void HandleError(Status error) override {
+    assert(!error.ok());
+    *status_ = error;
+    out_->clear();
+  }
+
+ private:
+  std::vector<uint8_t>* out_;
+  std::vector<EnvelopeEncoder> envelopes_;
+  Status* status_;
+};
+}  // namespace
+
+std::unique_ptr<JSONParserHandler> NewJSONToCBOREncoder(
+    std::vector<uint8_t>* out, Status* status) {
+  return std::unique_ptr<JSONParserHandler>(new JSONToCBOREncoder(out, status));
+}
+
+namespace {
+// Below are three parsing routines for CBOR, which cover enough
+// to roundtrip JSON messages.
+bool ParseMap(int32_t stack_depth, CBORTokenizer* tokenizer,
+              JSONParserHandler* out);
+bool ParseArray(int32_t stack_depth, CBORTokenizer* tokenizer,
+                JSONParserHandler* out);
+bool ParseValue(int32_t stack_depth, CBORTokenizer* tokenizer,
+                JSONParserHandler* out);
+
+void ParseUTF16String(CBORTokenizer* tokenizer, JSONParserHandler* out) {
+  std::vector<uint16_t> value;
+  span<uint8_t> rep = tokenizer->GetString16WireRep();
+  for (std::ptrdiff_t ii = 0; ii < rep.size(); ii += 2)
+    value.push_back((rep[ii + 1] << 8) | rep[ii]);
+  out->HandleString16(span<uint16_t>(value.data(), value.size()));
+  tokenizer->Next();
+}
+
+bool ParseUTF8String(CBORTokenizer* tokenizer, JSONParserHandler* out) {
+  assert(tokenizer->TokenTag() == CBORTokenTag::STRING8);
+  out->HandleString8(tokenizer->GetString8());
+  tokenizer->Next();
+  return true;
+}
+
+bool ParseValue(int32_t stack_depth, CBORTokenizer* tokenizer,
+                JSONParserHandler* out) {
+  if (stack_depth > kStackLimit) {
+    out->HandleError(
+        Status{Error::CBOR_STACK_LIMIT_EXCEEDED, tokenizer->Status().pos});
+    return false;
+  }
+  // Skip past the envelope to get to what's inside.
+  if (tokenizer->TokenTag() == CBORTokenTag::ENVELOPE)
+    tokenizer->EnterEnvelope();
+  switch (tokenizer->TokenTag()) {
+    case CBORTokenTag::ERROR_VALUE:
+      out->HandleError(tokenizer->Status());
+      return false;
+    case CBORTokenTag::DONE:
+      out->HandleError(Status{Error::CBOR_UNEXPECTED_EOF_EXPECTED_VALUE,
+                              tokenizer->Status().pos});
+      return false;
+    case CBORTokenTag::TRUE_VALUE:
+      out->HandleBool(true);
+      tokenizer->Next();
+      return true;
+    case CBORTokenTag::FALSE_VALUE:
+      out->HandleBool(false);
+      tokenizer->Next();
+      return true;
+    case CBORTokenTag::NULL_VALUE:
+      out->HandleNull();
+      tokenizer->Next();
+      return true;
+    case CBORTokenTag::INT32:
+      out->HandleInt32(tokenizer->GetInt32());
+      tokenizer->Next();
+      return true;
+    case CBORTokenTag::DOUBLE:
+      out->HandleDouble(tokenizer->GetDouble());
+      tokenizer->Next();
+      return true;
+    case CBORTokenTag::STRING8:
+      return ParseUTF8String(tokenizer, out);
+    case CBORTokenTag::STRING16:
+      ParseUTF16String(tokenizer, out);
+      return true;
+    case CBORTokenTag::BINARY: {
+      span<uint8_t> binary = tokenizer->GetBinary();
+      out->HandleBinary(std::vector<uint8_t>(binary.begin(), binary.end()));
+      tokenizer->Next();
+      return true;
+    }
+    case CBORTokenTag::MAP_START:
+      return ParseMap(stack_depth + 1, tokenizer, out);
+    case CBORTokenTag::ARRAY_START:
+      return ParseArray(stack_depth + 1, tokenizer, out);
+    default:
+      out->HandleError(
+          Status{Error::CBOR_UNSUPPORTED_VALUE, tokenizer->Status().pos});
+      return false;
+  }
+}
+
+// |bytes| must start with the indefinite length array byte, so basically,
+// ParseArray may only be called after an indefinite length array has been
+// detected.
+bool ParseArray(int32_t stack_depth, CBORTokenizer* tokenizer,
+                JSONParserHandler* out) {
+  assert(tokenizer->TokenTag() == CBORTokenTag::ARRAY_START);
+  tokenizer->Next();
+  out->HandleArrayBegin();
+  while (tokenizer->TokenTag() != CBORTokenTag::STOP) {
+    if (tokenizer->TokenTag() == CBORTokenTag::DONE) {
+      out->HandleError(
+          Status{Error::CBOR_UNEXPECTED_EOF_IN_ARRAY, tokenizer->Status().pos});
+      return false;
+    }
+    if (tokenizer->TokenTag() == CBORTokenTag::ERROR_VALUE) {
+      out->HandleError(tokenizer->Status());
+      return false;
+    }
+    // Parse value.
+    if (!ParseValue(stack_depth, tokenizer, out)) return false;
+  }
+  out->HandleArrayEnd();
+  tokenizer->Next();
+  return true;
+}
+
+// |bytes| must start with the indefinite length array byte, so basically,
+// ParseArray may only be called after an indefinite length array has been
+// detected.
+bool ParseMap(int32_t stack_depth, CBORTokenizer* tokenizer,
+              JSONParserHandler* out) {
+  assert(tokenizer->TokenTag() == CBORTokenTag::MAP_START);
+  out->HandleObjectBegin();
+  tokenizer->Next();
+  while (tokenizer->TokenTag() != CBORTokenTag::STOP) {
+    if (tokenizer->TokenTag() == CBORTokenTag::DONE) {
+      out->HandleError(
+          Status{Error::CBOR_UNEXPECTED_EOF_IN_MAP, tokenizer->Status().pos});
+      return false;
+    }
+    if (tokenizer->TokenTag() == CBORTokenTag::ERROR_VALUE) {
+      out->HandleError(tokenizer->Status());
+      return false;
+    }
+    // Parse key.
+    if (tokenizer->TokenTag() == CBORTokenTag::STRING8) {
+      if (!ParseUTF8String(tokenizer, out))
+        return false;
+    } else if (tokenizer->TokenTag() == CBORTokenTag::STRING16) {
+      ParseUTF16String(tokenizer, out);
+    } else {
+      out->HandleError(
+          Status{Error::CBOR_INVALID_MAP_KEY, tokenizer->Status().pos});
+      return false;
+    }
+    // Parse value.
+    if (!ParseValue(stack_depth, tokenizer, out)) return false;
+  }
+  out->HandleObjectEnd();
+  tokenizer->Next();
+  return true;
+}
+}  // namespace
+
+void ParseCBOR(span<uint8_t> bytes, JSONParserHandler* json_out) {
+  if (bytes.empty()) {
+    json_out->HandleError(Status{Error::CBOR_NO_INPUT, 0});
+    return;
+  }
+  if (bytes[0] != kInitialByteForEnvelope) {
+    json_out->HandleError(Status{Error::CBOR_INVALID_START_BYTE, 0});
+    return;
+  }
+  CBORTokenizer tokenizer(bytes);
+  if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) {
+    json_out->HandleError(tokenizer.Status());
+    return;
+  }
+  // We checked for the envelope start byte above, so the tokenizer
+  // must agree here, since it's not an error.
+  assert(tokenizer.TokenTag() == CBORTokenTag::ENVELOPE);
+  tokenizer.EnterEnvelope();
+  if (tokenizer.TokenTag() != CBORTokenTag::MAP_START) {
+    json_out->HandleError(
+        Status{Error::CBOR_MAP_START_EXPECTED, tokenizer.Status().pos});
+    return;
+  }
+  if (!ParseMap(/*stack_depth=*/1, &tokenizer, json_out)) return;
+  if (tokenizer.TokenTag() == CBORTokenTag::DONE) return;
+  if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) {
+    json_out->HandleError(tokenizer.Status());
+    return;
+  }
+  json_out->HandleError(
+      Status{Error::CBOR_TRAILING_JUNK, tokenizer.Status().pos});
+}
+
+CBORTokenizer::CBORTokenizer(span<uint8_t> bytes) : bytes_(bytes) {
+  ReadNextToken(/*enter_envelope=*/false);
+}
+CBORTokenizer::~CBORTokenizer() {}
+
+CBORTokenTag CBORTokenizer::TokenTag() const { return token_tag_; }
+
+void CBORTokenizer::Next() {
+  if (token_tag_ == CBORTokenTag::ERROR_VALUE || token_tag_ == CBORTokenTag::DONE)
+    return;
+  ReadNextToken(/*enter_envelope=*/false);
+}
+
+void CBORTokenizer::EnterEnvelope() {
+  assert(token_tag_ == CBORTokenTag::ENVELOPE);
+  ReadNextToken(/*enter_envelope=*/true);
+}
+
+Status CBORTokenizer::Status() const { return status_; }
+
+int32_t CBORTokenizer::GetInt32() const {
+  assert(token_tag_ == CBORTokenTag::INT32);
+  // The range checks happen in ::ReadNextToken().
+  return static_cast<uint32_t>(
+      token_start_type_ == MajorType::UNSIGNED
+          ? token_start_internal_value_
+          : -static_cast<int64_t>(token_start_internal_value_) - 1);
+}
+
+double CBORTokenizer::GetDouble() const {
+  assert(token_tag_ == CBORTokenTag::DOUBLE);
+  union {
+    uint64_t from_uint64;
+    double to_double;
+  } reinterpret;
+  reinterpret.from_uint64 = ReadBytesMostSignificantByteFirst<uint64_t>(
+      bytes_.subspan(status_.pos + 1));
+  return reinterpret.to_double;
+}
+
+span<uint8_t> CBORTokenizer::GetString8() const {
+  assert(token_tag_ == CBORTokenTag::STRING8);
+  auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
+  return bytes_.subspan(status_.pos + (token_byte_length_ - length), length);
+}
+
+span<uint8_t> CBORTokenizer::GetString16WireRep() const {
+  assert(token_tag_ == CBORTokenTag::STRING16);
+  auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
+  return bytes_.subspan(status_.pos + (token_byte_length_ - length), length);
+}
+
+span<uint8_t> CBORTokenizer::GetBinary() const {
+  assert(token_tag_ == CBORTokenTag::BINARY);
+  auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
+  return bytes_.subspan(status_.pos + (token_byte_length_ - length), length);
+}
+
+void CBORTokenizer::ReadNextToken(bool enter_envelope) {
+  if (enter_envelope) {
+    status_.pos += kEncodedEnvelopeHeaderSize;
+  } else {
+    status_.pos =
+        status_.pos == Status::npos() ? 0 : status_.pos + token_byte_length_;
+  }
+  status_.error = Error::OK;
+  if (status_.pos >= bytes_.size()) {
+    token_tag_ = CBORTokenTag::DONE;
+    return;
+  }
+  switch (bytes_[status_.pos]) {
+    case kStopByte:
+      SetToken(CBORTokenTag::STOP, 1);
+      return;
+    case kInitialByteIndefiniteLengthMap:
+      SetToken(CBORTokenTag::MAP_START, 1);
+      return;
+    case kInitialByteIndefiniteLengthArray:
+      SetToken(CBORTokenTag::ARRAY_START, 1);
+      return;
+    case kEncodedTrue:
+      SetToken(CBORTokenTag::TRUE_VALUE, 1);
+      return;
+    case kEncodedFalse:
+      SetToken(CBORTokenTag::FALSE_VALUE, 1);
+      return;
+    case kEncodedNull:
+      SetToken(CBORTokenTag::NULL_VALUE, 1);
+      return;
+    case kExpectedConversionToBase64Tag: {  // BINARY
+      int8_t bytes_read =
+          ReadTokenStart(bytes_.subspan(status_.pos + 1), &token_start_type_,
+                         &token_start_internal_value_);
+      int64_t token_byte_length = 1 + bytes_read + token_start_internal_value_;
+      if (-1 == bytes_read || token_start_type_ != MajorType::BYTE_STRING ||
+          status_.pos + token_byte_length > bytes_.size()) {
+        SetError(Error::CBOR_INVALID_BINARY);
+        return;
+      }
+      SetToken(CBORTokenTag::BINARY,
+               static_cast<std::ptrdiff_t>(token_byte_length));
+      return;
+    }
+    case kInitialByteForDouble: {  // DOUBLE
+      if (status_.pos + kEncodedDoubleSize > bytes_.size()) {
+        SetError(Error::CBOR_INVALID_DOUBLE);
+        return;
+      }
+      SetToken(CBORTokenTag::DOUBLE, kEncodedDoubleSize);
+      return;
+    }
+    case kInitialByteForEnvelope: {  // ENVELOPE
+      if (status_.pos + kEncodedEnvelopeHeaderSize > bytes_.size()) {
+        SetError(Error::CBOR_INVALID_ENVELOPE);
+        return;
+      }
+      // The envelope must be a byte string with 32 bit length.
+      if (bytes_[status_.pos + 1] != kInitialByteFor32BitLengthByteString) {
+        SetError(Error::CBOR_INVALID_ENVELOPE);
+        return;
+      }
+      // Read the length of the byte string.
+      token_start_internal_value_ = ReadBytesMostSignificantByteFirst<uint32_t>(
+          bytes_.subspan(status_.pos + 2));
+      // Make sure the payload is contained within the message.
+      if (token_start_internal_value_ + kEncodedEnvelopeHeaderSize +
+              status_.pos >
+          static_cast<std::size_t>(bytes_.size())) {
+        SetError(Error::CBOR_INVALID_ENVELOPE);
+        return;
+      }
+      auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
+      SetToken(CBORTokenTag::ENVELOPE,
+               kEncodedEnvelopeHeaderSize + length);
+      return;
+    }
+    default: {
+      span<uint8_t> remainder =
+          bytes_.subspan(status_.pos, bytes_.size() - status_.pos);
+      assert(!remainder.empty());
+      int8_t token_start_length = ReadTokenStart(remainder, &token_start_type_,
+                                                 &token_start_internal_value_);
+      bool success = token_start_length != -1;
+      switch (token_start_type_) {
+        case MajorType::UNSIGNED:  // INT32.
+          if (!success || std::numeric_limits<int32_t>::max() <
+                              token_start_internal_value_) {
+            SetError(Error::CBOR_INVALID_INT32);
+            return;
+          }
+          SetToken(CBORTokenTag::INT32, token_start_length);
+          return;
+        case MajorType::NEGATIVE:  // INT32.
+          if (!success ||
+              std::numeric_limits<int32_t>::min() >
+                  -static_cast<int64_t>(token_start_internal_value_) - 1) {
+            SetError(Error::CBOR_INVALID_INT32);
+            return;
+          }
+          SetToken(CBORTokenTag::INT32, token_start_length);
+          return;
+        case MajorType::STRING: {  // STRING8.
+          if (!success || remainder.size() < static_cast<int64_t>(
+                                                 token_start_internal_value_)) {
+            SetError(Error::CBOR_INVALID_STRING8);
+            return;
+          }
+          auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
+          SetToken(CBORTokenTag::STRING8, token_start_length + length);
+          return;
+        }
+        case MajorType::BYTE_STRING: {  // STRING16.
+          if (!success ||
+              remainder.size() <
+                  static_cast<int64_t>(token_start_internal_value_) ||
+              // Must be divisible by 2 since UTF16 is 2 bytes per character.
+              token_start_internal_value_ & 1) {
+            SetError(Error::CBOR_INVALID_STRING16);
+            return;
+          }
+          auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
+          SetToken(CBORTokenTag::STRING16, token_start_length + length);
+          return;
+        }
+        case MajorType::ARRAY:
+        case MajorType::MAP:
+        case MajorType::TAG:
+        case MajorType::SIMPLE_VALUE:
+          SetError(Error::CBOR_UNSUPPORTED_VALUE);
+          return;
+      }
+    }
+  }
+}
+
+void CBORTokenizer::SetToken(CBORTokenTag token_tag,
+                             std::ptrdiff_t token_byte_length) {
+  token_tag_ = token_tag;
+  token_byte_length_ = token_byte_length;
+}
+
+void CBORTokenizer::SetError(Error error) {
+  token_tag_ = CBORTokenTag::ERROR_VALUE;
+  status_.error = error;
+}
+
+#if 0
+void DumpCBOR(span<uint8_t> cbor) {
+  std::string indent;
+  CBORTokenizer tokenizer(cbor);
+  while (true) {
+    fprintf(stderr, "%s", indent.c_str());
+    switch (tokenizer.TokenTag()) {
+      case CBORTokenTag::ERROR_VALUE:
+        fprintf(stderr, "ERROR {status.error=%d, status.pos=%ld}\n",
+               tokenizer.Status().error, tokenizer.Status().pos);
+        return;
+      case CBORTokenTag::DONE:
+        fprintf(stderr, "DONE\n");
+        return;
+      case CBORTokenTag::TRUE_VALUE:
+        fprintf(stderr, "TRUE_VALUE\n");
+        break;
+      case CBORTokenTag::FALSE_VALUE:
+        fprintf(stderr, "FALSE_VALUE\n");
+        break;
+      case CBORTokenTag::NULL_VALUE:
+        fprintf(stderr, "NULL_VALUE\n");
+        break;
+      case CBORTokenTag::INT32:
+        fprintf(stderr, "INT32 [%d]\n", tokenizer.GetInt32());
+        break;
+      case CBORTokenTag::DOUBLE:
+        fprintf(stderr, "DOUBLE [%lf]\n", tokenizer.GetDouble());
+        break;
+      case CBORTokenTag::STRING8: {
+        span<uint8_t> v = tokenizer.GetString8();
+        std::string t(v.begin(), v.end());
+        fprintf(stderr, "STRING8 [%s]\n", t.c_str());
+        break;
+      }
+      case CBORTokenTag::STRING16: {
+        span<uint8_t> v = tokenizer.GetString16WireRep();
+        std::string t(v.begin(), v.end());
+        fprintf(stderr, "STRING16 [%s]\n", t.c_str());
+        break;
+      }
+      case CBORTokenTag::BINARY: {
+        span<uint8_t> v = tokenizer.GetBinary();
+        std::string t(v.begin(), v.end());
+        fprintf(stderr, "BINARY [%s]\n", t.c_str());
+        break;
+      }
+      case CBORTokenTag::MAP_START:
+        fprintf(stderr, "MAP_START\n");
+        indent += "  ";
+        break;
+      case CBORTokenTag::ARRAY_START:
+        fprintf(stderr, "ARRAY_START\n");
+        indent += "  ";
+        break;
+      case CBORTokenTag::STOP:
+        fprintf(stderr, "STOP\n");
+        indent.erase(0, 2);
+        break;
+      case CBORTokenTag::ENVELOPE:
+        fprintf(stderr, "ENVELOPE\n");
+        tokenizer.EnterEnvelope();
+        continue;
+    }
+    tokenizer.Next();
+  }
+}
+#endif
+
+}  // namespace inspector_protocol
diff --git a/third_party/inspector_protocol/encoding/cbor.h b/third_party/inspector_protocol/encoding/cbor.h
new file mode 100644
index 0000000..2785f633
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/cbor.h
@@ -0,0 +1,280 @@
+// 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 INSPECTOR_PROTOCOL_ENCODING_CBOR_H_
+#define INSPECTOR_PROTOCOL_ENCODING_CBOR_H_
+
+#include <cstdint>
+#include <memory>
+#include <vector>
+#include "cbor_internals.h"
+#include "json_parser_handler.h"
+#include "span.h"
+#include "status.h"
+
+namespace inspector_protocol {
+
+namespace cbor {
+
+// The major types from RFC 7049 Section 2.1.
+enum class MajorType {
+  UNSIGNED = 0,
+  NEGATIVE = 1,
+  BYTE_STRING = 2,
+  STRING = 3,
+  ARRAY = 4,
+  MAP = 5,
+  TAG = 6,
+  SIMPLE_VALUE = 7
+};
+
+// Indicates the number of bits the "initial byte" needs to be shifted to the
+// right after applying |kMajorTypeMask| to produce the major type in the
+// lowermost bits.
+static constexpr uint8_t kMajorTypeBitShift = 5u;
+// Mask selecting the low-order 5 bits of the "initial byte", which is where
+// the additional information is encoded.
+static constexpr uint8_t kAdditionalInformationMask = 0x1f;
+// Mask selecting the high-order 3 bits of the "initial byte", which indicates
+// the major type of the encoded value.
+static constexpr uint8_t kMajorTypeMask = 0xe0;
+// Indicates the integer is in the following byte.
+static constexpr uint8_t kAdditionalInformation1Byte = 24u;
+// Indicates the integer is in the next 2 bytes.
+static constexpr uint8_t kAdditionalInformation2Bytes = 25u;
+// Indicates the integer is in the next 4 bytes.
+static constexpr uint8_t kAdditionalInformation4Bytes = 26u;
+// Indicates the integer is in the next 8 bytes.
+static constexpr uint8_t kAdditionalInformation8Bytes = 27u;
+
+// Encodes the initial byte, consisting of the |type| in the first 3 bits
+// followed by 5 bits of |additional_info|.
+constexpr uint8_t EncodeInitialByte(MajorType type, uint8_t additional_info) {
+  return (static_cast<uint8_t>(type) << kMajorTypeBitShift) |
+         (additional_info & kAdditionalInformationMask);
+}
+
+// TAG 24 indicates that what follows is a byte string which is
+// encoded in CBOR format. We use this as a wrapper for
+// maps and arrays, allowing us to skip them, because the
+// byte string carries its size (byte length).
+// https://tools.ietf.org/html/rfc7049#section-2.4.4.1
+static constexpr uint8_t kInitialByteForEnvelope =
+    EncodeInitialByte(MajorType::TAG, 24);
+// The initial byte for a byte string with at most 2^32 bytes
+// of payload. This is used for envelope encoding, even if
+// the byte string is shorter.
+static constexpr uint8_t kInitialByteFor32BitLengthByteString =
+    EncodeInitialByte(MajorType::BYTE_STRING, 26);
+
+// See RFC 7049 Section 2.2.1, indefinite length arrays / maps have additional
+// info = 31.
+static constexpr uint8_t kInitialByteIndefiniteLengthArray =
+    EncodeInitialByte(MajorType::ARRAY, 31);
+static constexpr uint8_t kInitialByteIndefiniteLengthMap =
+    EncodeInitialByte(MajorType::MAP, 31);
+// See RFC 7049 Section 2.3, Table 1; this is used for finishing indefinite
+// length maps / arrays.
+static constexpr uint8_t kStopByte =
+    EncodeInitialByte(MajorType::SIMPLE_VALUE, 31);
+
+}  // namespace cbor
+
+// The binary encoding for the inspector protocol follows the CBOR specification
+// (RFC 7049). Additional constraints:
+// - Only indefinite length maps and arrays are supported.
+// - Maps and arrays are wrapped with an envelope, that is, a
+//   CBOR tag with value 24 followed by a byte string specifying
+//   the byte length of the enclosed map / array. The byte string
+//   must use a 32 bit wide length.
+// - At the top level, a message must be an indefinite length map
+//   wrapped by an envelope.
+// - Maximal size for messages is 2^32 (4 GB).
+// - For scalars, we support only the int32_t range, encoded as
+//   UNSIGNED/NEGATIVE (major types 0 / 1).
+// - UTF16 strings, including with unbalanced surrogate pairs, are encoded
+//   as CBOR BYTE_STRING (major type 2). For such strings, the number of
+//   bytes encoded must be even.
+// - UTF8 strings (major type 3) are supported.
+// - 7 bit US-ASCII strings must always be encoded as UTF8 strings, not
+//   as UTF16 strings.
+// - Arbitrary byte arrays, in the inspector protocol called 'binary',
+//   are encoded as BYTE_STRING (major type 2), prefixed with a byte
+//   indicating base64 when rendered as JSON.
+
+// Encodes |value| as |UNSIGNED| (major type 0) iff >= 0, or |NEGATIVE|
+// (major type 1) iff < 0.
+void EncodeInt32(int32_t value, std::vector<uint8_t>* out);
+
+// Encodes a UTF16 string as a BYTE_STRING (major type 2). Each utf16
+// character in |in| is emitted with most significant byte first,
+// appending to |out|.
+void EncodeString16(span<uint16_t> in, std::vector<uint8_t>* out);
+
+// Encodes a UTF8 string |in| as STRING (major type 3).
+void EncodeString8(span<uint8_t> in, std::vector<uint8_t>* out);
+
+// Encodes the given |latin1| string as STRING8.
+// If any non-ASCII character is present, it will be represented
+// as a 2 byte UTF8 sequence.
+void EncodeFromLatin1(span<uint8_t> latin1, std::vector<uint8_t>* out);
+
+// Encodes the given |utf16| string as STRING8 if it's entirely US-ASCII.
+// Otherwise, encodes as STRING16.
+void EncodeFromUTF16(span<uint16_t> utf16, std::vector<uint8_t>* out);
+
+// Encodes arbitrary binary data in |in| as a BYTE_STRING (major type 2) with
+// definitive length, prefixed with tag 22 indicating expected conversion to
+// base64 (see RFC 7049, Table 3 and Section 2.4.4.2).
+void EncodeBinary(span<uint8_t> in, std::vector<uint8_t>* out);
+
+// Encodes / decodes a double as Major type 7 (SIMPLE_VALUE),
+// with additional info = 27, followed by 8 bytes in big endian.
+void EncodeDouble(double value, std::vector<uint8_t>* out);
+
+// Some constants for CBOR tokens that only take a single byte on the wire.
+uint8_t EncodeTrue();
+uint8_t EncodeFalse();
+uint8_t EncodeNull();
+uint8_t EncodeIndefiniteLengthArrayStart();
+uint8_t EncodeIndefiniteLengthMapStart();
+uint8_t EncodeStop();
+
+// An envelope indicates the byte length of a wrapped item.
+// We use this for maps and array, which allows the decoder
+// to skip such (nested) values whole sale.
+// It's implemented as a CBOR tag (major type 6) with additional
+// info = 24, followed by a byte string with a 32 bit length value;
+// so the maximal structure that we can wrap is 2^32 bits long.
+// See also: https://tools.ietf.org/html/rfc7049#section-2.4.4.1
+class EnvelopeEncoder {
+ public:
+  // Emits the envelope start bytes and records the position for the
+  // byte size in |byte_size_pos_|. Also emits empty bytes for the
+  // byte sisze so that encoding can continue.
+  void EncodeStart(std::vector<uint8_t>* out);
+  // This records the current size in |out| at position byte_size_pos_.
+  // Returns true iff successful.
+  bool EncodeStop(std::vector<uint8_t>* out);
+
+ private:
+  std::size_t byte_size_pos_ = 0;
+};
+
+// This can be used to convert from JSON to CBOR, by passing the
+// return value to the routines in json_parser.h.  The handler will encode into
+// |out|, and iff an error occurs it will set |status| to an error and clear
+// |out|. Otherwise, |status.ok()| will be |true|.
+std::unique_ptr<JSONParserHandler> NewJSONToCBOREncoder(
+    std::vector<uint8_t>* out, Status* status);
+
+// Parses a CBOR encoded message from |bytes|, sending JSON events to
+// |json_out|. If an error occurs, sends |out->HandleError|, and parsing stops.
+// The client is responsible for discarding the already received information in
+// that case.
+void ParseCBOR(span<uint8_t> bytes, JSONParserHandler* json_out);
+
+// Tags for the tokens within a CBOR message that CBORStream understands.
+// Note that this is not the same terminology as the CBOR spec (RFC 7049),
+// but rather, our adaptation. For instance, we lump unsigned and signed
+// major type into INT32 here (and disallow values outside the int32_t range).
+enum class CBORTokenTag {
+  // Encountered an error in the structure of the message. Consult
+  // status() for details.
+  ERROR_VALUE,
+  // Booleans and NULL.
+  TRUE_VALUE,
+  FALSE_VALUE,
+  NULL_VALUE,
+  // An int32_t (signed 32 bit integer).
+  INT32,
+  // A double (64 bit floating point).
+  DOUBLE,
+  // A UTF8 string.
+  STRING8,
+  // A UTF16 string.
+  STRING16,
+  // A binary string.
+  BINARY,
+  // Starts an indefinite length map; after the map start we expect
+  // alternating keys and values, followed by STOP.
+  MAP_START,
+  // Starts an indefinite length array; after the array start we
+  // expect values, followed by STOP.
+  ARRAY_START,
+  // Ends a map or an array.
+  STOP,
+  // An envelope indicator, wrapping a map or array.
+  // Internally this carries the byte length of the wrapped
+  // map or array. While CBORTokenizer::Next() will read / skip the entire
+  // envelope, CBORTokenizer::EnterEnvelope() reads the tokens
+  // inside of it.
+  ENVELOPE,
+  // We've reached the end there is nothing else to read.
+  DONE,
+};
+
+// CBORTokenizer segments a CBOR message, presenting the tokens therein as
+// numbers, strings, etc. This is not a complete CBOR parser, but makes it much
+// easier to implement one (e.g. ParseCBOR, above). It can also be used to parse
+// messages partially.
+class CBORTokenizer {
+ public:
+  explicit CBORTokenizer(span<uint8_t> bytes);
+  ~CBORTokenizer();
+
+  // Identifies the current token that we're looking at,
+  // or ERROR_VALUE (in which ase ::Status() has details)
+  // or DONE (if we're past the last token).
+  CBORTokenTag TokenTag() const;
+
+  // Advances to the next token.
+  void Next();
+  // Can only be called if TokenTag() == CBORTokenTag::ENVELOPE.
+  // While Next() would skip past the entire envelope / what it's
+  // wrapping, EnterEnvelope positions the cursor inside of the envelope,
+  // letting the client explore the nested structure.
+  void EnterEnvelope();
+
+  // If TokenTag() is CBORTokenTag::ERROR_VALUE, then Status().error describes
+  // the error more precisely; otherwise it'll be set to Error::OK.
+  // In either case, Status().pos is the current position.
+  struct Status Status() const;
+
+  // The following methods retrieve the token values. They can only
+  // be called if TokenTag() matches.
+
+  // To be called only if ::TokenTag() == CBORTokenTag::INT32.
+  int32_t GetInt32() const;
+
+  // To be called only if ::TokenTag() == CBORTokenTag::DOUBLE.
+  double GetDouble() const;
+
+  // To be called only if ::TokenTag() == CBORTokenTag::STRING8.
+  span<uint8_t> GetString8() const;
+
+  // Wire representation for STRING16 is low byte first (little endian).
+  // To be called only if ::TokenTag() == CBORTokenTag::STRING16.
+  span<uint8_t> GetString16WireRep() const;
+
+  // To be called only if ::TokenTag() == CBORTokenTag::BINARY.
+  span<uint8_t> GetBinary() const;
+
+ private:
+  void ReadNextToken(bool enter_envelope);
+  void SetToken(CBORTokenTag token, std::ptrdiff_t token_byte_length);
+  void SetError(Error error);
+
+  span<uint8_t> bytes_;
+  CBORTokenTag token_tag_;
+  struct Status status_;
+  std::ptrdiff_t token_byte_length_;
+  cbor::MajorType token_start_type_;
+  uint64_t token_start_internal_value_;
+};
+
+void DumpCBOR(span<uint8_t> cbor);
+
+}  // namespace inspector_protocol
+#endif  // INSPECTOR_PROTOCOL_ENCODING_CBOR_H_
diff --git a/third_party/inspector_protocol/encoding/cbor_internals.h b/third_party/inspector_protocol/encoding/cbor_internals.h
new file mode 100644
index 0000000..e2621d89
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/cbor_internals.h
@@ -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.
+
+#ifndef INSPECTOR_PROTOCOL_ENCODING_CBOR_INTERNALS_H_
+#define INSPECTOR_PROTOCOL_ENCODING_CBOR_INTERNALS_H_
+
+#include <cstdint>
+#include <vector>
+#include "span.h"
+#include "status.h"
+
+// These internals are exposed for testing and implementing cbor.h.
+// Never directly depend on them from other production code.
+namespace inspector_protocol {
+namespace cbor {
+enum class MajorType;
+}
+
+namespace cbor_internals {
+
+// Reads the start of a token with definitive size from |bytes|.
+// |type| is the major type as specified in RFC 7049 Section 2.1.
+// |value| is the payload (e.g. for MajorType::UNSIGNED) or is the size
+// (e.g. for BYTE_STRING).
+// If successful, returns the number of bytes read. Otherwise returns -1.
+int8_t ReadTokenStart(span<uint8_t> bytes,
+                      cbor::MajorType* type,
+                      uint64_t* value);
+
+// Writes the start of a token with |type|. The |value| may indicate the size,
+// or it may be the payload if the value is an unsigned integer.
+void WriteTokenStart(cbor::MajorType type,
+                     uint64_t value,
+                     std::vector<uint8_t>* encoded);
+}  // namespace cbor_internals
+}  // namespace inspector_protocol
+
+#endif  // INSPECTOR_PROTOCOL_ENCODING_CBOR_H_
diff --git a/third_party/inspector_protocol/encoding/cbor_test.cc b/third_party/inspector_protocol/encoding/cbor_test.cc
new file mode 100644
index 0000000..9f6201f
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/cbor_test.cc
@@ -0,0 +1,994 @@
+// 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 "cbor.h"
+
+#include <array>
+#include <cmath>
+#include <string>
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "json_parser.h"
+#include "json_std_string_writer.h"
+#include "linux_dev_platform.h"
+
+using testing::ElementsAreArray;
+
+namespace inspector_protocol {
+
+using cbor::MajorType;
+
+//
+// EncodeInt32 / CBORTokenTag::INT32
+//
+TEST(EncodeDecodeInt32Test, Roundtrips23) {
+  // This roundtrips the int32_t value 23 through the pair of EncodeInt32 /
+  // CBORTokenizer; this is interesting since 23 is encoded as a single byte.
+  std::vector<uint8_t> encoded;
+  EncodeInt32(23, &encoded);
+  // first three bits: major type = 0; remaining five bits: additional info =
+  // value 23.
+  EXPECT_THAT(encoded, ElementsAreArray(std::array<uint8_t, 1>{{23}}));
+
+  // Reverse direction: decode with CBORTokenizer.
+  CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+  EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag());
+  EXPECT_EQ(23, tokenizer.GetInt32());
+  tokenizer.Next();
+  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
+}
+
+TEST(EncodeDecodeInt32Test, RoundtripsUint8) {
+  // This roundtrips the int32_t value 42 through the pair of EncodeInt32 /
+  // CBORTokenizer. This is different from Roundtrip23 because 42 is encoded
+  // in an extra byte after the initial one.
+  std::vector<uint8_t> encoded;
+  EncodeInt32(42, &encoded);
+  // first three bits: major type = 0;
+  // remaining five bits: additional info = 24, indicating payload is uint8.
+  EXPECT_THAT(encoded, ElementsAreArray(std::array<uint8_t, 2>{{24, 42}}));
+
+  // Reverse direction: decode with CBORTokenizer.
+  CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+  EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag());
+  EXPECT_EQ(42, tokenizer.GetInt32());
+  tokenizer.Next();
+  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
+}
+
+TEST(EncodeDecodeInt32Test, RoundtripsUint16) {
+  // 500 is encoded as a uint16 after the initial byte.
+  std::vector<uint8_t> encoded;
+  EncodeInt32(500, &encoded);
+  // 1 for initial byte, 2 for uint16.
+  EXPECT_EQ(static_cast<std::size_t>(3), encoded.size());
+  // first three bits: major type = 0;
+  // remaining five bits: additional info = 25, indicating payload is uint16.
+  EXPECT_EQ(25, encoded[0]);
+  EXPECT_EQ(0x01, encoded[1]);
+  EXPECT_EQ(0xf4, encoded[2]);
+
+  // Reverse direction: decode with CBORTokenizer.
+  CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+  EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag());
+  EXPECT_EQ(500, tokenizer.GetInt32());
+  tokenizer.Next();
+  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
+}
+
+TEST(EncodeDecodeInt32Test, RoundtripsInt32Max) {
+  // std::numeric_limits<int32_t> is encoded as a uint32 after the initial byte.
+  std::vector<uint8_t> encoded;
+  EncodeInt32(std::numeric_limits<int32_t>::max(), &encoded);
+  // 1 for initial byte, 4 for the uint32.
+  // first three bits: major type = 0;
+  // remaining five bits: additional info = 26, indicating payload is uint32.
+  EXPECT_THAT(
+      encoded,
+      ElementsAreArray(std::array<uint8_t, 5>{{26, 0x7f, 0xff, 0xff, 0xff}}));
+
+  // Reverse direction: decode with CBORTokenizer.
+  CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+  EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag());
+  EXPECT_EQ(std::numeric_limits<int32_t>::max(), tokenizer.GetInt32());
+  tokenizer.Next();
+  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
+}
+
+TEST(EncodeDecodeInt32Test, CantRoundtripUint32) {
+  // 0xdeadbeef is a value which does not fit below
+  // std::numerical_limits<int32_t>::max(), so we can't encode
+  // it with EncodeInt32. However, CBOR does support this, so we
+  // encode it here manually with the internal routine, just to observe
+  // that it's considered an invalid int32 by CBORTokenizer.
+  std::vector<uint8_t> encoded;
+  cbor_internals::WriteTokenStart(MajorType::UNSIGNED, 0xdeadbeef, &encoded);
+  // 1 for initial byte, 4 for the uint32.
+  // first three bits: major type = 0;
+  // remaining five bits: additional info = 26, indicating payload is uint32.
+  EXPECT_THAT(
+      encoded,
+      ElementsAreArray(std::array<uint8_t, 5>{{26, 0xde, 0xad, 0xbe, 0xef}}));
+
+  // Now try to decode; we treat this as an invalid INT32.
+  CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+  // 0xdeadbeef is > std::numerical_limits<int32_t>::max().
+  EXPECT_EQ(CBORTokenTag::ERROR_VALUE, tokenizer.TokenTag());
+  EXPECT_EQ(Error::CBOR_INVALID_INT32, tokenizer.Status().error);
+}
+
+TEST(EncodeDecodeInt32Test, DecodeErrorCases) {
+  struct TestCase {
+    std::vector<uint8_t> data;
+    std::string msg;
+  };
+  std::vector<TestCase> tests{
+      {TestCase{
+           {24},
+           "additional info = 24 would require 1 byte of payload (but it's 0)"},
+       TestCase{{27, 0xaa, 0xbb, 0xcc},
+                "additional info = 27 would require 8 bytes of payload (but "
+                "it's 3)"},
+       TestCase{{29}, "additional info = 29 isn't recognized"}}};
+
+  for (const TestCase& test : tests) {
+    SCOPED_TRACE(test.msg);
+    span<uint8_t> encoded_bytes(&test.data[0], test.data.size());
+    CBORTokenizer tokenizer(
+        span<uint8_t>(&encoded_bytes[0], encoded_bytes.size()));
+    EXPECT_EQ(CBORTokenTag::ERROR_VALUE, tokenizer.TokenTag());
+    EXPECT_EQ(Error::CBOR_INVALID_INT32, tokenizer.Status().error);
+  }
+}
+
+TEST(EncodeDecodeInt32Test, RoundtripsMinus24) {
+  // This roundtrips the int32_t value -24 through the pair of EncodeInt32 /
+  // CBORTokenizer; this is interesting since -24 is encoded as
+  // a single byte as NEGATIVE, and it tests the specific encoding
+  // (note how for unsigned the single byte covers values up to 23).
+  // Additional examples are covered in RoundtripsAdditionalExamples.
+  std::vector<uint8_t> encoded;
+  EncodeInt32(-24, &encoded);
+  // first three bits: major type = 1; remaining five bits: additional info =
+  // value 23.
+  EXPECT_THAT(encoded, ElementsAreArray(std::array<uint8_t, 1>{{1 << 5 | 23}}));
+
+  // Reverse direction: decode with CBORTokenizer.
+  CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+  EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag());
+  EXPECT_EQ(-24, tokenizer.GetInt32());
+  tokenizer.Next();
+  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
+}
+
+TEST(EncodeDecodeInt32Test, RoundtripsAdditionalNegativeExamples) {
+  std::vector<int32_t> examples = {-1,
+                                   -10,
+                                   -24,
+                                   -25,
+                                   -300,
+                                   -30000,
+                                   -300 * 1000,
+                                   -1000 * 1000,
+                                   -1000 * 1000 * 1000,
+                                   std::numeric_limits<int32_t>::min()};
+  for (int32_t example : examples) {
+    SCOPED_TRACE(base::StringPrintf("example %d", example));
+    std::vector<uint8_t> encoded;
+    EncodeInt32(example, &encoded);
+    CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+    EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag());
+    EXPECT_EQ(example, tokenizer.GetInt32());
+    tokenizer.Next();
+    EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
+  }
+}
+
+//
+// EncodeString16 / CBORTokenTag::STRING16
+//
+TEST(EncodeDecodeString16Test, RoundtripsEmpty) {
+  // This roundtrips the empty utf16 string through the pair of EncodeString16 /
+  // CBORTokenizer.
+  std::vector<uint8_t> encoded;
+  EncodeString16(span<uint16_t>(), &encoded);
+  EXPECT_EQ(static_cast<std::size_t>(1), encoded.size());
+  // first three bits: major type = 2; remaining five bits: additional info =
+  // size 0.
+  EXPECT_EQ(2 << 5, encoded[0]);
+
+  // Reverse direction: decode with CBORTokenizer.
+  CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+  EXPECT_EQ(CBORTokenTag::STRING16, tokenizer.TokenTag());
+  span<uint8_t> decoded_string16_wirerep = tokenizer.GetString16WireRep();
+  EXPECT_TRUE(decoded_string16_wirerep.empty());
+  tokenizer.Next();
+  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
+}
+
+// On the wire, we STRING16 is encoded as little endian (least
+// significant byte first). The host may or may not be little endian,
+// so this routine follows the advice in
+// https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html.
+std::vector<uint16_t> String16WireRepToHost(span<uint8_t> in) {
+  assert((in.size() & 1) == 0);  // must be even number of bytes.
+  std::vector<uint16_t> host_out;
+  for (std::ptrdiff_t ii = 0; ii < in.size(); ii += 2)
+    host_out.push_back(in[ii + 1] << 8 | in[ii]);
+  return host_out;
+}
+
+TEST(EncodeDecodeString16Test, RoundtripsHelloWorld) {
+  // This roundtrips the hello world message which is given here in utf16
+  // characters. 0xd83c, 0xdf0e: UTF16 encoding for the "Earth Globe Americas"
+  // character, 🌎.
+  std::array<uint16_t, 10> msg{
+      {'H', 'e', 'l', 'l', 'o', ',', ' ', 0xd83c, 0xdf0e, '.'}};
+  std::vector<uint8_t> encoded;
+  EncodeString16(span<uint16_t>(msg.data(), msg.size()), &encoded);
+  // This will be encoded as BYTE_STRING of length 20, so the 20 is encoded in
+  // the additional info part of the initial byte. Payload is two bytes for each
+  // UTF16 character.
+  uint8_t initial_byte = /*major type=*/2 << 5 | /*additional info=*/20;
+  std::array<uint8_t, 21> encoded_expected = {
+      {initial_byte, 'H', 0,   'e', 0,    'l',  0,    'l',  0,   'o', 0,
+       ',',          0,   ' ', 0,   0x3c, 0xd8, 0x0e, 0xdf, '.', 0}};
+  EXPECT_THAT(encoded, ElementsAreArray(encoded_expected));
+
+  // Now decode to complete the roundtrip.
+  CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+  EXPECT_EQ(CBORTokenTag::STRING16, tokenizer.TokenTag());
+  std::vector<uint16_t> decoded =
+      String16WireRepToHost(tokenizer.GetString16WireRep());
+  EXPECT_THAT(decoded, ElementsAreArray(msg));
+  tokenizer.Next();
+  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
+
+  // For bonus points, we look at the decoded message in UTF8 as well so we can
+  // easily see it on the terminal screen.
+  std::string utf8_decoded =
+      base::UTF16ToUTF8(base::StringPiece16(decoded.data(), decoded.size()));
+  EXPECT_EQ("Hello, 🌎.", utf8_decoded);
+}
+
+TEST(EncodeDecodeString16Test, Roundtrips500) {
+  // We roundtrip a message that has 250 16 bit values. Each of these are just
+  // set to their index. 250 is interesting because the cbor spec uses a
+  // BYTE_STRING of length 500 for one of their examples of how to encode the
+  // start of it (section 2.1) so it's easy for us to look at the first three
+  // bytes closely.
+  std::vector<uint16_t> two_fifty;
+  for (uint16_t ii = 0; ii < 250; ++ii) two_fifty.push_back(ii);
+  std::vector<uint8_t> encoded;
+  EncodeString16(span<uint16_t>(two_fifty.data(), two_fifty.size()), &encoded);
+  EXPECT_EQ(static_cast<std::size_t>(3 + 250 * 2), encoded.size());
+  // Now check the first three bytes:
+  // Major type: 2 (BYTE_STRING)
+  // Additional information: 25, indicating size is represented by 2 bytes.
+  // Bytes 1 and 2 encode 500 (0x01f4).
+  EXPECT_EQ(2 << 5 | 25, encoded[0]);
+  EXPECT_EQ(0x01, encoded[1]);
+  EXPECT_EQ(0xf4, encoded[2]);
+
+  // Now decode to complete the roundtrip.
+  CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+  EXPECT_EQ(CBORTokenTag::STRING16, tokenizer.TokenTag());
+  std::vector<uint16_t> decoded =
+      String16WireRepToHost(tokenizer.GetString16WireRep());
+  EXPECT_THAT(decoded, ElementsAreArray(two_fifty));
+  tokenizer.Next();
+  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
+}
+
+TEST(EncodeDecodeString16Test, ErrorCases) {
+  struct TestCase {
+    std::vector<uint8_t> data;
+    std::string msg;
+  };
+  std::vector<TestCase> tests{
+      {TestCase{{2 << 5 | 1, 'a'},
+                "length must be divisible by 2 (but it's 1)"},
+       TestCase{{2 << 5 | 29}, "additional info = 29 isn't recognized"}}};
+  for (const TestCase& test : tests) {
+    SCOPED_TRACE(test.msg);
+    CBORTokenizer tokenizer(span<uint8_t>(&test.data[0], test.data.size()));
+    EXPECT_EQ(CBORTokenTag::ERROR_VALUE, tokenizer.TokenTag());
+    EXPECT_EQ(Error::CBOR_INVALID_STRING16, tokenizer.Status().error);
+  }
+}
+
+//
+// EncodeString8 / CBORTokenTag::STRING8
+//
+TEST(EncodeDecodeString8Test, RoundtripsHelloWorld) {
+  // This roundtrips the hello world message which is given here in utf8
+  // characters. 🌎 is a four byte utf8 character.
+  std::string utf8_msg = "Hello, 🌎.";
+  std::vector<uint8_t> msg(utf8_msg.begin(), utf8_msg.end());
+  std::vector<uint8_t> encoded;
+  EncodeString8(span<uint8_t>(msg.data(), msg.size()), &encoded);
+  // This will be encoded as STRING of length 12, so the 12 is encoded in
+  // the additional info part of the initial byte. Payload is one byte per
+  // utf8 byte.
+  uint8_t initial_byte = /*major type=*/3 << 5 | /*additional info=*/12;
+  std::array<uint8_t, 13> encoded_expected = {{initial_byte, 'H', 'e', 'l', 'l',
+                                               'o', ',', ' ', 0xF0, 0x9f, 0x8c,
+                                               0x8e, '.'}};
+  EXPECT_THAT(encoded, ElementsAreArray(encoded_expected));
+
+  // Now decode to complete the roundtrip.
+  CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+  EXPECT_EQ(CBORTokenTag::STRING8, tokenizer.TokenTag());
+  std::vector<uint8_t> decoded(tokenizer.GetString8().begin(),
+                               tokenizer.GetString8().end());
+  EXPECT_THAT(decoded, ElementsAreArray(msg));
+  tokenizer.Next();
+  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
+}
+
+TEST(EncodeFromLatin1Test, ConvertsToUTF8IfNeeded) {
+  std::vector<std::pair<std::string, std::string>> examples = {
+      {"Hello, world.", "Hello, world."},
+      {"Above: \xDC"
+       "ber",
+       "Above: Über"},
+      {"\xA5 500 are about \xA3 3.50; a y with umlaut is \xFF",
+       "¥ 500 are about £ 3.50; a y with umlaut is ÿ"}};
+
+  for (const auto& example : examples) {
+    const std::string& latin1 = example.first;
+    const std::string& expected_utf8 = example.second;
+    std::vector<uint8_t> encoded;
+    EncodeFromLatin1(
+        span<uint8_t>(reinterpret_cast<const uint8_t*>(latin1.data()),
+                      latin1.size()),
+        &encoded);
+    CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+    EXPECT_EQ(CBORTokenTag::STRING8, tokenizer.TokenTag());
+    std::vector<uint8_t> decoded(tokenizer.GetString8().begin(),
+                                 tokenizer.GetString8().end());
+    std::string decoded_str(decoded.begin(), decoded.end());
+    EXPECT_THAT(decoded_str, testing::Eq(expected_utf8));
+  }
+}
+
+TEST(EncodeFromUTF16Test, ConvertsToUTF8IfEasy) {
+  std::vector<uint16_t> ascii = {'e', 'a', 's', 'y'};
+  std::vector<uint8_t> encoded;
+  EncodeFromUTF16(span<uint16_t>(ascii.data(), ascii.size()), &encoded);
+
+  CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+  EXPECT_EQ(CBORTokenTag::STRING8, tokenizer.TokenTag());
+  std::vector<uint8_t> decoded(tokenizer.GetString8().begin(),
+                               tokenizer.GetString8().end());
+  std::string decoded_str(decoded.begin(), decoded.end());
+  EXPECT_THAT(decoded_str, testing::Eq("easy"));
+}
+
+TEST(EncodeFromUTF16Test, EncodesAsString16IfNeeded) {
+  // Since this message contains non-ASCII characters, the routine is
+  // forced to encode as UTF16. We see this below by checking that the
+  // token tag is STRING16.
+  std::vector<uint16_t> msg = {'H', 'e', 'l',    'l',    'o',
+                               ',', ' ', 0xd83c, 0xdf0e, '.'};
+  std::vector<uint8_t> encoded;
+  EncodeFromUTF16(span<uint16_t>(msg.data(), msg.size()), &encoded);
+
+  CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+  EXPECT_EQ(CBORTokenTag::STRING16, tokenizer.TokenTag());
+  std::vector<uint16_t> decoded =
+      String16WireRepToHost(tokenizer.GetString16WireRep());
+  std::string utf8_decoded =
+      base::UTF16ToUTF8(base::StringPiece16(decoded.data(), decoded.size()));
+  EXPECT_EQ("Hello, 🌎.", utf8_decoded);
+}
+
+//
+// EncodeBinary / CBORTokenTag::BINARY
+//
+TEST(EncodeDecodeBinaryTest, RoundtripsHelloWorld) {
+  std::vector<uint8_t> binary = {'H', 'e', 'l', 'l', 'o', ',', ' ',
+                                 'w', 'o', 'r', 'l', 'd', '.'};
+  std::vector<uint8_t> encoded;
+  EncodeBinary(span<uint8_t>(binary.data(), binary.size()), &encoded);
+  // So, on the wire we see that the binary blob travels unmodified.
+  EXPECT_THAT(
+      encoded,
+      ElementsAreArray(std::array<uint8_t, 15>{
+          {(6 << 5 | 22),  // tag 22 indicating base64 interpretation in JSON
+           (2 << 5 | 13),  // BYTE_STRING (type 2) of length 13
+           'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '.'}}));
+  std::vector<uint8_t> decoded;
+  CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+  EXPECT_EQ(CBORTokenTag::BINARY, tokenizer.TokenTag());
+  EXPECT_EQ(0, int(tokenizer.Status().error));
+  decoded = std::vector<uint8_t>(tokenizer.GetBinary().begin(),
+                                 tokenizer.GetBinary().end());
+  EXPECT_THAT(decoded, ElementsAreArray(binary));
+  tokenizer.Next();
+  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
+}
+
+//
+// EncodeDouble / CBORTokenTag::DOUBLE
+//
+TEST(EncodeDecodeDoubleTest, RoundtripsWikipediaExample) {
+  // https://en.wikipedia.org/wiki/Double-precision_floating-point_format
+  // provides the example of a hex representation 3FD5 5555 5555 5555, which
+  // approximates 1/3.
+
+  const double kOriginalValue = 1.0 / 3;
+  std::vector<uint8_t> encoded;
+  EncodeDouble(kOriginalValue, &encoded);
+  // first three bits: major type = 7; remaining five bits: additional info =
+  // value 27. This is followed by 8 bytes of payload (which match Wikipedia).
+  EXPECT_THAT(
+      encoded,
+      ElementsAreArray(std::array<uint8_t, 9>{
+          {7 << 5 | 27, 0x3f, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55}}));
+
+  // Reverse direction: decode and compare with original value.
+  CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+  EXPECT_EQ(CBORTokenTag::DOUBLE, tokenizer.TokenTag());
+  EXPECT_THAT(tokenizer.GetDouble(), testing::DoubleEq(kOriginalValue));
+  tokenizer.Next();
+  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
+}
+
+TEST(EncodeDecodeDoubleTest, RoundtripsAdditionalExamples) {
+  std::vector<double> examples = {0.0,
+                                  1.0,
+                                  -1.0,
+                                  3.1415,
+                                  std::numeric_limits<double>::min(),
+                                  std::numeric_limits<double>::max(),
+                                  std::numeric_limits<double>::infinity(),
+                                  std::numeric_limits<double>::quiet_NaN()};
+  for (double example : examples) {
+    SCOPED_TRACE(base::StringPrintf("example %lf", example));
+    std::vector<uint8_t> encoded;
+    EncodeDouble(example, &encoded);
+    span<uint8_t> encoded_bytes(&encoded[0], encoded.size());
+    CBORTokenizer tokenizer(span<uint8_t>(&encoded[0], encoded.size()));
+    EXPECT_EQ(CBORTokenTag::DOUBLE, tokenizer.TokenTag());
+    if (std::isnan(example))
+      EXPECT_TRUE(std::isnan(tokenizer.GetDouble()));
+    else
+      EXPECT_THAT(tokenizer.GetDouble(), testing::DoubleEq(example));
+    tokenizer.Next();
+    EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
+  }
+}
+
+//
+// NewJSONToCBOREncoder
+//
+void EncodeUTF8ForTest(const std::string& key, std::vector<uint8_t>* out) {
+  EncodeString8(
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(key.data()), key.size()),
+      out);
+}
+
+TEST(JSONToCBOREncoderTest, SevenBitStrings) {
+  // When a string can be represented as 7 bit ASCII, the encoder will use the
+  // STRING (major Type 3) type, so the actual characters end up as bytes on the
+  // wire.
+  std::vector<uint8_t> encoded;
+  Status status;
+  std::unique_ptr<JSONParserHandler> encoder =
+      NewJSONToCBOREncoder(&encoded, &status);
+  std::vector<uint16_t> utf16 = {'f', 'o', 'o'};
+  encoder->HandleString16(span<uint16_t>(utf16.data(), utf16.size()));
+  EXPECT_EQ(Error::OK, status.error);
+  // Here we assert that indeed, seven bit strings are represented as
+  // bytes on the wire, "foo" is just "foo".
+  EXPECT_THAT(encoded,
+              ElementsAreArray(std::array<uint8_t, 4>{
+                  {/*major type 3*/ 3 << 5 | /*length*/ 3, 'f', 'o', 'o'}}));
+}
+
+TEST(JsonCborRoundtrip, EncodingDecoding) {
+  // Hits all the cases except binary and error in JSONParserHandler, first
+  // parsing a JSON message into CBOR, then parsing it back from CBOR into JSON.
+  std::string json =
+      "{"
+      "\"string\":\"Hello, \\ud83c\\udf0e.\","
+      "\"double\":3.1415,"
+      "\"int\":1,"
+      "\"negative int\":-1,"
+      "\"bool\":true,"
+      "\"null\":null,"
+      "\"array\":[1,2,3]"
+      "}";
+  std::vector<uint8_t> encoded;
+  Status status;
+  std::unique_ptr<JSONParserHandler> encoder =
+      NewJSONToCBOREncoder(&encoded, &status);
+  span<uint8_t> ascii_in(reinterpret_cast<const uint8_t*>(json.data()),
+                         json.size());
+  ParseJSONChars(GetLinuxDevPlatform(), ascii_in, encoder.get());
+  std::vector<uint8_t> expected = {
+      0xd8,            // envelope
+      0x5a,            // byte string with 32 bit length
+      0,    0, 0, 94,  // length is 94 bytes
+  };
+  expected.push_back(0xbf);  // indef length map start
+  EncodeUTF8ForTest("string", &expected);
+  // This is followed by the encoded string for "Hello, 🌎."
+  // So, it's the same bytes that we tested above in
+  // EncodeDecodeString16Test.RoundtripsHelloWorld.
+  expected.push_back(/*major type=*/2 << 5 | /*additional info=*/20);
+  for (uint8_t ch : std::array<uint8_t, 20>{
+           {'H', 0, 'e', 0, 'l',  0,    'l',  0,    'o', 0,
+            ',', 0, ' ', 0, 0x3c, 0xd8, 0x0e, 0xdf, '.', 0}})
+    expected.push_back(ch);
+  EncodeUTF8ForTest("double", &expected);
+  EncodeDouble(3.1415, &expected);
+  EncodeUTF8ForTest("int", &expected);
+  EncodeInt32(1, &expected);
+  EncodeUTF8ForTest("negative int", &expected);
+  EncodeInt32(-1, &expected);
+  EncodeUTF8ForTest("bool", &expected);
+  expected.push_back(7 << 5 | 21);  // RFC 7049 Section 2.3, Table 2: true
+  EncodeUTF8ForTest("null", &expected);
+  expected.push_back(7 << 5 | 22);  // RFC 7049 Section 2.3, Table 2: null
+  EncodeUTF8ForTest("array", &expected);
+  expected.push_back(0xd8);  // envelope
+  expected.push_back(0x5a);  // byte string with 32 bit length
+  // the length is 5 bytes (that's up to end indef length array below).
+  for (uint8_t ch : std::array<uint8_t, 4>{{0, 0, 0, 5}})
+    expected.push_back(ch);
+  expected.push_back(0x9f);  // RFC 7049 Section 2.2.1, indef length array start
+  expected.push_back(1);     // Three UNSIGNED values (easy since Major Type 0)
+  expected.push_back(2);
+  expected.push_back(3);
+  expected.push_back(0xff);  // End indef length array
+  expected.push_back(0xff);  // End indef length map
+  EXPECT_TRUE(status.ok());
+  EXPECT_THAT(encoded, ElementsAreArray(expected));
+
+  // And now we roundtrip, decoding the message we just encoded.
+  std::string decoded;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &decoded, &status);
+  ParseCBOR(span<uint8_t>(encoded.data(), encoded.size()), json_writer.get());
+  EXPECT_EQ(Error::OK, status.error);
+  EXPECT_EQ(json, decoded);
+}
+
+TEST(JsonCborRoundtrip, MoreRoundtripExamples) {
+  std::vector<std::string> examples = {
+      // Tests that after closing a nested objects, additional key/value pairs
+      // are considered.
+      "{\"foo\":{\"bar\":1},\"baz\":2}", "{\"foo\":[1,2,3],\"baz\":2}"};
+  for (const std::string& json : examples) {
+    SCOPED_TRACE(std::string("example: ") + json);
+    std::vector<uint8_t> encoded;
+    Status status;
+    std::unique_ptr<JSONParserHandler> encoder =
+        NewJSONToCBOREncoder(&encoded, &status);
+    span<uint8_t> ascii_in(reinterpret_cast<const uint8_t*>(json.data()),
+                           json.size());
+    ParseJSONChars(GetLinuxDevPlatform(), ascii_in, encoder.get());
+    std::string decoded;
+    std::unique_ptr<JSONParserHandler> json_writer =
+        NewJSONWriter(GetLinuxDevPlatform(), &decoded, &status);
+    ParseCBOR(span<uint8_t>(encoded.data(), encoded.size()), json_writer.get());
+    EXPECT_EQ(Error::OK, status.error);
+    EXPECT_EQ(json, decoded);
+  }
+}
+
+TEST(JSONToCBOREncoderTest, HelloWorldBinary_WithTripToJson) {
+  // The JSONParserHandler::HandleBinary is a special case: The JSON parser will
+  // never call this method, because JSON does not natively support the binary
+  // type. So, we can't fully roundtrip. However, the other direction works:
+  // binary will be rendered in JSON, as a base64 string. So, we make calls to
+  // the encoder directly here, to construct a message, and one of these calls
+  // is ::HandleBinary, to which we pass a "binary" string containing "Hello,
+  // world.".
+  std::vector<uint8_t> encoded;
+  Status status;
+  std::unique_ptr<JSONParserHandler> encoder =
+      NewJSONToCBOREncoder(&encoded, &status);
+  encoder->HandleObjectBegin();
+  // Emit a key.
+  std::vector<uint16_t> key = {'f', 'o', 'o'};
+  encoder->HandleString16(span<uint16_t>(key.data(), key.size()));
+  // Emit the binary payload, an arbitrary array of bytes that happens to
+  // be the ascii message "Hello, world.".
+  encoder->HandleBinary(std::vector<uint8_t>{'H', 'e', 'l', 'l', 'o', ',', ' ',
+                                             'w', 'o', 'r', 'l', 'd', '.'});
+  encoder->HandleObjectEnd();
+  EXPECT_EQ(Error::OK, status.error);
+
+  // Now drive the json writer via the CBOR decoder.
+  std::string decoded;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &decoded, &status);
+  ParseCBOR(span<uint8_t>(encoded.data(), encoded.size()), json_writer.get());
+  EXPECT_EQ(Error::OK, status.error);
+  EXPECT_EQ(Status::npos(), status.pos);
+  // "Hello, world." in base64 is "SGVsbG8sIHdvcmxkLg==".
+  EXPECT_EQ("{\"foo\":\"SGVsbG8sIHdvcmxkLg==\"}", decoded);
+}
+
+//
+// ParseCBOR
+//
+TEST(ParseCBORTest, ParseEmptyCBORMessage) {
+  // An envelope starting with 0xd8, 0x5a, with the byte length
+  // of 2, containing a map that's empty (0xbf for map
+  // start, and 0xff for map end).
+  std::vector<uint8_t> in = {0xd8, 0x5a, 0, 0, 0, 2, 0xbf, 0xff};
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(in.data(), in.size()), json_writer.get());
+  EXPECT_EQ(Error::OK, status.error);
+  EXPECT_EQ("{}", out);
+}
+
+TEST(ParseCBORTest, ParseCBORHelloWorld) {
+  const uint8_t kPayloadLen = 27;
+  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen};
+  bytes.push_back(0xbf);                       // start indef length map.
+  EncodeUTF8ForTest("msg", &bytes);            // key: msg
+  // Now write the value, the familiar "Hello, 🌎." where the globe is expressed
+  // as two utf16 chars.
+  bytes.push_back(/*major type=*/2 << 5 | /*additional info=*/20);
+  for (uint8_t ch : std::array<uint8_t, 20>{
+           {'H', 0, 'e', 0, 'l',  0,    'l',  0,    'o', 0,
+            ',', 0, ' ', 0, 0x3c, 0xd8, 0x0e, 0xdf, '.', 0}})
+    bytes.push_back(ch);
+  bytes.push_back(0xff);  // stop byte
+  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
+
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+  EXPECT_EQ(Error::OK, status.error);
+  EXPECT_EQ("{\"msg\":\"Hello, \\ud83c\\udf0e.\"}", out);
+}
+
+TEST(ParseCBORTest, UTF8IsSupportedInKeys) {
+  const uint8_t kPayloadLen = 11;
+  std::vector<uint8_t> bytes = {cbor::kInitialByteForEnvelope,
+                                cbor::kInitialByteFor32BitLengthByteString,
+                                0,
+                                0,
+                                0,
+                                kPayloadLen};
+  bytes.push_back(cbor::kInitialByteIndefiniteLengthMap);
+  EncodeUTF8ForTest("🌎", &bytes);  // Two UTF16 chars.
+  EncodeUTF8ForTest("☾", &bytes);  // Can be encoded as a single UTF16 char.
+  bytes.push_back(cbor::kStopByte);
+  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
+
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+  EXPECT_EQ(Error::OK, status.error);
+  EXPECT_EQ("{\"\\ud83c\\udf0e\":\"\\u263e\"}", out);
+}
+
+TEST(ParseCBORTest, NoInputError) {
+  std::vector<uint8_t> in = {};
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(in.data(), in.size()), json_writer.get());
+  EXPECT_EQ(Error::CBOR_NO_INPUT, status.error);
+  EXPECT_EQ("", out);
+}
+
+TEST(ParseCBORTest, InvalidStartByteError) {
+  // Here we test that some actual json, which usually starts with {,
+  // is not considered CBOR. CBOR messages must start with 0x5a, the
+  // envelope start byte.
+  std::string json = "{\"msg\": \"Hello, world.\"}";
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      json_writer.get());
+  EXPECT_EQ(Error::CBOR_INVALID_START_BYTE, status.error);
+  EXPECT_EQ("", out);
+}
+
+TEST(ParseCBORTest, UnexpectedEofExpectedValueError) {
+  constexpr uint8_t kPayloadLen = 5;
+  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
+                                0xbf};                             // map start
+  EncodeUTF8ForTest("key", &bytes);  // A key; so value would be next.
+  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+  EXPECT_EQ(Error::CBOR_UNEXPECTED_EOF_EXPECTED_VALUE, status.error);
+  EXPECT_EQ(static_cast<int64_t>(bytes.size()), status.pos);
+  EXPECT_EQ("", out);
+}
+
+TEST(ParseCBORTest, UnexpectedEofInArrayError) {
+  constexpr uint8_t kPayloadLen = 8;
+  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
+                                0xbf};  // The byte for starting a map.
+  EncodeUTF8ForTest("array", &bytes);   // A key; so value would be next.
+  bytes.push_back(0x9f);  // byte for indefinite length array start.
+  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+  EXPECT_EQ(Error::CBOR_UNEXPECTED_EOF_IN_ARRAY, status.error);
+  EXPECT_EQ(static_cast<int64_t>(bytes.size()), status.pos);
+  EXPECT_EQ("", out);
+}
+
+TEST(ParseCBORTest, UnexpectedEofInMapError) {
+  constexpr uint8_t kPayloadLen = 1;
+  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
+                                0xbf};  // The byte for starting a map.
+  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+  EXPECT_EQ(Error::CBOR_UNEXPECTED_EOF_IN_MAP, status.error);
+  EXPECT_EQ(7, status.pos);
+  EXPECT_EQ("", out);
+}
+
+TEST(ParseCBORTest, InvalidMapKeyError) {
+  constexpr uint8_t kPayloadLen = 2;
+  std::vector<uint8_t> bytes = {0xd8,       0x5a, 0,
+                                0,          0,    kPayloadLen,  // envelope
+                                0xbf,                           // map start
+                                7 << 5 | 22};  // null (not a valid map key)
+  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+  EXPECT_EQ(Error::CBOR_INVALID_MAP_KEY, status.error);
+  EXPECT_EQ(7, status.pos);
+  EXPECT_EQ("", out);
+}
+
+std::vector<uint8_t> MakeNestedCBOR(int depth) {
+  std::vector<uint8_t> bytes;
+  std::vector<EnvelopeEncoder> envelopes;
+  for (int ii = 0; ii < depth; ++ii) {
+    envelopes.emplace_back();
+    envelopes.back().EncodeStart(&bytes);
+    bytes.push_back(0xbf);  // indef length map start
+    EncodeUTF8ForTest("key", &bytes);
+  }
+  EncodeUTF8ForTest("innermost_value", &bytes);
+  for (int ii = 0; ii < depth; ++ii) {
+    bytes.push_back(0xff);  // stop byte, finishes map.
+    envelopes.back().EncodeStop(&bytes);
+    envelopes.pop_back();
+  }
+  return bytes;
+}
+
+TEST(ParseCBORTest, StackLimitExceededError) {
+  {  // Depth 3: no stack limit exceeded error and is easy to inspect.
+    std::vector<uint8_t> bytes = MakeNestedCBOR(3);
+    std::string out;
+    Status status;
+    std::unique_ptr<JSONParserHandler> json_writer =
+        NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+    ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+    EXPECT_EQ(Error::OK, status.error);
+    EXPECT_EQ(Status::npos(), status.pos);
+    EXPECT_EQ("{\"key\":{\"key\":{\"key\":\"innermost_value\"}}}", out);
+  }
+  {  // Depth 1000: no stack limit exceeded.
+    std::vector<uint8_t> bytes = MakeNestedCBOR(1000);
+    std::string out;
+    Status status;
+    std::unique_ptr<JSONParserHandler> json_writer =
+        NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+    ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+    EXPECT_EQ(Error::OK, status.error);
+    EXPECT_EQ(Status::npos(), status.pos);
+  }
+
+  // We just want to know the length of one opening map so we can compute
+  // where the error is encountered. So we look at a small example and find
+  // the second envelope start.
+  std::vector<uint8_t> small_example = MakeNestedCBOR(3);
+  int64_t opening_segment_size = 1;  // Start after the first envelope start.
+  while (opening_segment_size < static_cast<int64_t>(small_example.size()) &&
+         small_example[opening_segment_size] != 0xd8)
+    opening_segment_size++;
+
+  {  // Depth 1001: limit exceeded.
+    std::vector<uint8_t> bytes = MakeNestedCBOR(1001);
+    std::string out;
+    Status status;
+    std::unique_ptr<JSONParserHandler> json_writer =
+        NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+    ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+    EXPECT_EQ(Error::CBOR_STACK_LIMIT_EXCEEDED, status.error);
+    EXPECT_EQ(opening_segment_size * 1001, status.pos);
+  }
+  {  // Depth 1200: still limit exceeded, and at the same pos as for 1001
+    std::vector<uint8_t> bytes = MakeNestedCBOR(1200);
+    std::string out;
+    Status status;
+    std::unique_ptr<JSONParserHandler> json_writer =
+        NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+    ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+    EXPECT_EQ(Error::CBOR_STACK_LIMIT_EXCEEDED, status.error);
+    EXPECT_EQ(opening_segment_size * 1001, status.pos);
+  }
+}
+
+TEST(ParseCBORTest, UnsupportedValueError) {
+  constexpr uint8_t kPayloadLen = 6;
+  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
+                                0xbf};                             // map start
+  EncodeUTF8ForTest("key", &bytes);
+  int64_t error_pos = bytes.size();
+  bytes.push_back(6 << 5 | 5);  // tags aren't supported yet.
+  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
+
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+  EXPECT_EQ(Error::CBOR_UNSUPPORTED_VALUE, status.error);
+  EXPECT_EQ(error_pos, status.pos);
+  EXPECT_EQ("", out);
+}
+
+TEST(ParseCBORTest, InvalidString16Error) {
+  constexpr uint8_t kPayloadLen = 11;
+  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
+                                0xbf};                             // map start
+  EncodeUTF8ForTest("key", &bytes);
+  int64_t error_pos = bytes.size();
+  // a BYTE_STRING of length 5 as value; since we interpret these as string16,
+  // it's going to be invalid as each character would need two bytes, but
+  // 5 isn't divisible by 2.
+  bytes.push_back(2 << 5 | 5);
+  for (int ii = 0; ii < 5; ++ii) bytes.push_back(' ');
+  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+  EXPECT_EQ(Error::CBOR_INVALID_STRING16, status.error);
+  EXPECT_EQ(error_pos, status.pos);
+  EXPECT_EQ("", out);
+}
+
+TEST(ParseCBORTest, InvalidString8Error) {
+  constexpr uint8_t kPayloadLen = 6;
+  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
+                                0xbf};                             // map start
+  EncodeUTF8ForTest("key", &bytes);
+  int64_t error_pos = bytes.size();
+  // a STRING of length 5 as value, but we're at the end of the bytes array
+  // so it can't be decoded successfully.
+  bytes.push_back(3 << 5 | 5);
+  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+  EXPECT_EQ(Error::CBOR_INVALID_STRING8, status.error);
+  EXPECT_EQ(error_pos, status.pos);
+  EXPECT_EQ("", out);
+}
+
+TEST(ParseCBORTest, InvalidBinaryError) {
+  constexpr uint8_t kPayloadLen = 9;
+  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
+                                0xbf};                             // map start
+  EncodeUTF8ForTest("key", &bytes);
+  int64_t error_pos = bytes.size();
+  bytes.push_back(6 << 5 | 22);  // base64 hint for JSON; indicates binary
+  bytes.push_back(2 << 5 | 10);  // BYTE_STRING (major type 2) of length 10
+  // Just two garbage bytes, not enough for the binary.
+  bytes.push_back(0x31);
+  bytes.push_back(0x23);
+  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+  EXPECT_EQ(Error::CBOR_INVALID_BINARY, status.error);
+  EXPECT_EQ(error_pos, status.pos);
+  EXPECT_EQ("", out);
+}
+
+TEST(ParseCBORTest, InvalidDoubleError) {
+  constexpr uint8_t kPayloadLen = 8;
+  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
+                                0xbf};                             // map start
+  EncodeUTF8ForTest("key", &bytes);
+  int64_t error_pos = bytes.size();
+  bytes.push_back(7 << 5 | 27);  // initial byte for double
+  // Just two garbage bytes, not enough to represent an actual double.
+  bytes.push_back(0x31);
+  bytes.push_back(0x23);
+  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+  EXPECT_EQ(Error::CBOR_INVALID_DOUBLE, status.error);
+  EXPECT_EQ(error_pos, status.pos);
+  EXPECT_EQ("", out);
+}
+
+TEST(ParseCBORTest, InvalidSignedError) {
+  constexpr uint8_t kPayloadLen = 14;
+  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
+                                0xbf};                             // map start
+  EncodeUTF8ForTest("key", &bytes);
+  int64_t error_pos = bytes.size();
+  // uint64_t max is a perfectly fine value to encode as CBOR unsigned,
+  // but we don't support this since we only cover the int32_t range.
+  cbor_internals::WriteTokenStart(MajorType::UNSIGNED,
+                                  std::numeric_limits<uint64_t>::max(), &bytes);
+  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+  EXPECT_EQ(Error::CBOR_INVALID_INT32, status.error);
+  EXPECT_EQ(error_pos, status.pos);
+  EXPECT_EQ("", out);
+}
+
+TEST(ParseCBORTest, TrailingJunk) {
+  constexpr uint8_t kPayloadLen = 35;
+  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
+                                0xbf};                             // map start
+  EncodeUTF8ForTest("key", &bytes);
+  EncodeUTF8ForTest("value", &bytes);
+  bytes.push_back(0xff);  // Up to here, it's a perfectly fine msg.
+  int64_t error_pos = bytes.size();
+  EncodeUTF8ForTest("trailing junk", &bytes);
+
+  cbor_internals::WriteTokenStart(MajorType::UNSIGNED,
+                                  std::numeric_limits<uint64_t>::max(), &bytes);
+  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> json_writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+  EXPECT_EQ(Error::CBOR_TRAILING_JUNK, status.error);
+  EXPECT_EQ(error_pos, status.pos);
+  EXPECT_EQ("", out);
+}
+}  // namespace inspector_protocol
diff --git a/third_party/inspector_protocol/encoding/encoding.cc b/third_party/inspector_protocol/encoding/encoding.cc
deleted file mode 100644
index b02a36a..0000000
--- a/third_party/inspector_protocol/encoding/encoding.cc
+++ /dev/null
@@ -1,1796 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "encoding.h"
-
-#include <cassert>
-#include <cstring>
-#include <limits>
-#include <stack>
-
-namespace inspector_protocol_encoding {
-namespace cbor {
-namespace {
-// Indicates the number of bits the "initial byte" needs to be shifted to the
-// right after applying |kMajorTypeMask| to produce the major type in the
-// lowermost bits.
-static constexpr uint8_t kMajorTypeBitShift = 5u;
-// Mask selecting the low-order 5 bits of the "initial byte", which is where
-// the additional information is encoded.
-static constexpr uint8_t kAdditionalInformationMask = 0x1f;
-// Mask selecting the high-order 3 bits of the "initial byte", which indicates
-// the major type of the encoded value.
-static constexpr uint8_t kMajorTypeMask = 0xe0;
-// Indicates the integer is in the following byte.
-static constexpr uint8_t kAdditionalInformation1Byte = 24u;
-// Indicates the integer is in the next 2 bytes.
-static constexpr uint8_t kAdditionalInformation2Bytes = 25u;
-// Indicates the integer is in the next 4 bytes.
-static constexpr uint8_t kAdditionalInformation4Bytes = 26u;
-// Indicates the integer is in the next 8 bytes.
-static constexpr uint8_t kAdditionalInformation8Bytes = 27u;
-
-// Encodes the initial byte, consisting of the |type| in the first 3 bits
-// followed by 5 bits of |additional_info|.
-constexpr uint8_t EncodeInitialByte(MajorType type, uint8_t additional_info) {
-  return (static_cast<uint8_t>(type) << kMajorTypeBitShift) |
-         (additional_info & kAdditionalInformationMask);
-}
-
-// TAG 24 indicates that what follows is a byte string which is
-// encoded in CBOR format. We use this as a wrapper for
-// maps and arrays, allowing us to skip them, because the
-// byte string carries its size (byte length).
-// https://tools.ietf.org/html/rfc7049#section-2.4.4.1
-static constexpr uint8_t kInitialByteForEnvelope =
-    EncodeInitialByte(MajorType::TAG, 24);
-// The initial byte for a byte string with at most 2^32 bytes
-// of payload. This is used for envelope encoding, even if
-// the byte string is shorter.
-static constexpr uint8_t kInitialByteFor32BitLengthByteString =
-    EncodeInitialByte(MajorType::BYTE_STRING, 26);
-
-// See RFC 7049 Section 2.2.1, indefinite length arrays / maps have additional
-// info = 31.
-static constexpr uint8_t kInitialByteIndefiniteLengthArray =
-    EncodeInitialByte(MajorType::ARRAY, 31);
-static constexpr uint8_t kInitialByteIndefiniteLengthMap =
-    EncodeInitialByte(MajorType::MAP, 31);
-// See RFC 7049 Section 2.3, Table 1; this is used for finishing indefinite
-// length maps / arrays.
-static constexpr uint8_t kStopByte =
-    EncodeInitialByte(MajorType::SIMPLE_VALUE, 31);
-
-// See RFC 7049 Section 2.3, Table 2.
-static constexpr uint8_t kEncodedTrue =
-    EncodeInitialByte(MajorType::SIMPLE_VALUE, 21);
-static constexpr uint8_t kEncodedFalse =
-    EncodeInitialByte(MajorType::SIMPLE_VALUE, 20);
-static constexpr uint8_t kEncodedNull =
-    EncodeInitialByte(MajorType::SIMPLE_VALUE, 22);
-static constexpr uint8_t kInitialByteForDouble =
-    EncodeInitialByte(MajorType::SIMPLE_VALUE, 27);
-
-// See RFC 7049 Table 3 and Section 2.4.4.2. This is used as a prefix for
-// arbitrary binary data encoded as BYTE_STRING.
-static constexpr uint8_t kExpectedConversionToBase64Tag =
-    EncodeInitialByte(MajorType::TAG, 22);
-
-// Writes the bytes for |v| to |out|, starting with the most significant byte.
-// See also: https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html
-template <typename T>
-void WriteBytesMostSignificantByteFirst(T v, std::vector<uint8_t>* out) {
-  for (int shift_bytes = sizeof(T) - 1; shift_bytes >= 0; --shift_bytes)
-    out->push_back(0xff & (v >> (shift_bytes * 8)));
-}
-
-// Extracts sizeof(T) bytes from |in| to extract a value of type T
-// (e.g. uint64_t, uint32_t, ...), most significant byte first.
-// See also: https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html
-template <typename T>
-T ReadBytesMostSignificantByteFirst(span<uint8_t> in) {
-  assert(static_cast<std::size_t>(in.size()) >= sizeof(T));
-  T result = 0;
-  for (std::size_t shift_bytes = 0; shift_bytes < sizeof(T); ++shift_bytes)
-    result |= T(in[sizeof(T) - 1 - shift_bytes]) << (shift_bytes * 8);
-  return result;
-}
-}  // namespace
-
-namespace internals {
-// Reads the start of a token with definitive size from |bytes|.
-// |type| is the major type as specified in RFC 7049 Section 2.1.
-// |value| is the payload (e.g. for MajorType::UNSIGNED) or is the size
-// (e.g. for BYTE_STRING).
-// If successful, returns the number of bytes read. Otherwise returns -1.
-int8_t ReadTokenStart(span<uint8_t> bytes, MajorType* type, uint64_t* value) {
-  if (bytes.empty())
-    return -1;
-  uint8_t initial_byte = bytes[0];
-  *type = MajorType((initial_byte & kMajorTypeMask) >> kMajorTypeBitShift);
-
-  uint8_t additional_information = initial_byte & kAdditionalInformationMask;
-  if (additional_information < 24) {
-    // Values 0-23 are encoded directly into the additional info of the
-    // initial byte.
-    *value = additional_information;
-    return 1;
-  }
-  if (additional_information == kAdditionalInformation1Byte) {
-    // Values 24-255 are encoded with one initial byte, followed by the value.
-    if (bytes.size() < 2)
-      return -1;
-    *value = ReadBytesMostSignificantByteFirst<uint8_t>(bytes.subspan(1));
-    return 2;
-  }
-  if (additional_information == kAdditionalInformation2Bytes) {
-    // Values 256-65535: 1 initial byte + 2 bytes payload.
-    if (static_cast<std::size_t>(bytes.size()) < 1 + sizeof(uint16_t))
-      return -1;
-    *value = ReadBytesMostSignificantByteFirst<uint16_t>(bytes.subspan(1));
-    return 3;
-  }
-  if (additional_information == kAdditionalInformation4Bytes) {
-    // 32 bit uint: 1 initial byte + 4 bytes payload.
-    if (static_cast<std::size_t>(bytes.size()) < 1 + sizeof(uint32_t))
-      return -1;
-    *value = ReadBytesMostSignificantByteFirst<uint32_t>(bytes.subspan(1));
-    return 5;
-  }
-  if (additional_information == kAdditionalInformation8Bytes) {
-    // 64 bit uint: 1 initial byte + 8 bytes payload.
-    if (static_cast<std::size_t>(bytes.size()) < 1 + sizeof(uint64_t))
-      return -1;
-    *value = ReadBytesMostSignificantByteFirst<uint64_t>(bytes.subspan(1));
-    return 9;
-  }
-  return -1;
-}
-
-// Writes the start of a token with |type|. The |value| may indicate the size,
-// or it may be the payload if the value is an unsigned integer.
-void WriteTokenStart(MajorType type,
-                     uint64_t value,
-                     std::vector<uint8_t>* encoded) {
-  if (value < 24) {
-    // Values 0-23 are encoded directly into the additional info of the
-    // initial byte.
-    encoded->push_back(EncodeInitialByte(type, /*additional_info=*/value));
-    return;
-  }
-  if (value <= std::numeric_limits<uint8_t>::max()) {
-    // Values 24-255 are encoded with one initial byte, followed by the value.
-    encoded->push_back(EncodeInitialByte(type, kAdditionalInformation1Byte));
-    encoded->push_back(value);
-    return;
-  }
-  if (value <= std::numeric_limits<uint16_t>::max()) {
-    // Values 256-65535: 1 initial byte + 2 bytes payload.
-    encoded->push_back(EncodeInitialByte(type, kAdditionalInformation2Bytes));
-    WriteBytesMostSignificantByteFirst<uint16_t>(value, encoded);
-    return;
-  }
-  if (value <= std::numeric_limits<uint32_t>::max()) {
-    // 32 bit uint: 1 initial byte + 4 bytes payload.
-    encoded->push_back(EncodeInitialByte(type, kAdditionalInformation4Bytes));
-    WriteBytesMostSignificantByteFirst<uint32_t>(static_cast<uint32_t>(value),
-                                                 encoded);
-    return;
-  }
-  // 64 bit uint: 1 initial byte + 8 bytes payload.
-  encoded->push_back(EncodeInitialByte(type, kAdditionalInformation8Bytes));
-  WriteBytesMostSignificantByteFirst<uint64_t>(value, encoded);
-}
-}  // namespace internals
-
-// =============================================================================
-// Detecting CBOR content
-// =============================================================================
-
-uint8_t InitialByteForEnvelope() {
-  return kInitialByteForEnvelope;
-}
-uint8_t InitialByteFor32BitLengthByteString() {
-  return kInitialByteFor32BitLengthByteString;
-}
-bool IsCBORMessage(span<uint8_t> msg) {
-  return msg.size() >= 6 && msg[0] == InitialByteForEnvelope() &&
-         msg[1] == InitialByteFor32BitLengthByteString();
-}
-
-// =============================================================================
-// Encoding invidiual CBOR items
-// =============================================================================
-
-uint8_t EncodeTrue() {
-  return kEncodedTrue;
-}
-uint8_t EncodeFalse() {
-  return kEncodedFalse;
-}
-uint8_t EncodeNull() {
-  return kEncodedNull;
-}
-
-uint8_t EncodeIndefiniteLengthArrayStart() {
-  return kInitialByteIndefiniteLengthArray;
-}
-
-uint8_t EncodeIndefiniteLengthMapStart() {
-  return kInitialByteIndefiniteLengthMap;
-}
-
-uint8_t EncodeStop() {
-  return kStopByte;
-}
-
-void EncodeInt32(int32_t value, std::vector<uint8_t>* out) {
-  if (value >= 0) {
-    internals::WriteTokenStart(MajorType::UNSIGNED, value, out);
-  } else {
-    uint64_t representation = static_cast<uint64_t>(-(value + 1));
-    internals::WriteTokenStart(MajorType::NEGATIVE, representation, out);
-  }
-}
-
-void EncodeString16(span<uint16_t> in, std::vector<uint8_t>* out) {
-  uint64_t byte_length = static_cast<uint64_t>(in.size_bytes());
-  internals::WriteTokenStart(MajorType::BYTE_STRING, byte_length, out);
-  // When emitting UTF16 characters, we always write the least significant byte
-  // first; this is because it's the native representation for X86.
-  // TODO(johannes): Implement a more efficient thing here later, e.g.
-  // casting *iff* the machine has this byte order.
-  // The wire format for UTF16 chars will probably remain the same
-  // (least significant byte first) since this way we can have
-  // golden files, unittests, etc. that port easily and universally.
-  // See also:
-  // https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html
-  for (const uint16_t two_bytes : in) {
-    out->push_back(two_bytes);
-    out->push_back(two_bytes >> 8);
-  }
-}
-
-void EncodeString8(span<uint8_t> in, std::vector<uint8_t>* out) {
-  internals::WriteTokenStart(MajorType::STRING,
-                             static_cast<uint64_t>(in.size_bytes()), out);
-  out->insert(out->end(), in.begin(), in.end());
-}
-
-void EncodeFromLatin1(span<uint8_t> latin1, std::vector<uint8_t>* out) {
-  for (std::ptrdiff_t ii = 0; ii < latin1.size(); ++ii) {
-    if (latin1[ii] <= 127)
-      continue;
-    // If there's at least one non-ASCII char, convert to UTF8.
-    std::vector<uint8_t> utf8(latin1.begin(), latin1.begin() + ii);
-    for (; ii < latin1.size(); ++ii) {
-      if (latin1[ii] <= 127) {
-        utf8.push_back(latin1[ii]);
-      } else {
-        // 0xC0 means it's a UTF8 sequence with 2 bytes.
-        utf8.push_back((latin1[ii] >> 6) | 0xc0);
-        utf8.push_back((latin1[ii] | 0x80) & 0xbf);
-      }
-    }
-    EncodeString8(SpanFromVector(utf8), out);
-    return;
-  }
-  EncodeString8(latin1, out);
-}
-
-void EncodeFromUTF16(span<uint16_t> utf16, std::vector<uint8_t>* out) {
-  // If there's at least one non-ASCII char, encode as STRING16 (UTF16).
-  for (uint16_t ch : utf16) {
-    if (ch <= 127)
-      continue;
-    EncodeString16(utf16, out);
-    return;
-  }
-  // It's all US-ASCII, strip out every second byte and encode as UTF8.
-  internals::WriteTokenStart(MajorType::STRING,
-                             static_cast<uint64_t>(utf16.size()), out);
-  out->insert(out->end(), utf16.begin(), utf16.end());
-}
-
-void EncodeBinary(span<uint8_t> in, std::vector<uint8_t>* out) {
-  out->push_back(kExpectedConversionToBase64Tag);
-  uint64_t byte_length = static_cast<uint64_t>(in.size_bytes());
-  internals::WriteTokenStart(MajorType::BYTE_STRING, byte_length, out);
-  out->insert(out->end(), in.begin(), in.end());
-}
-
-// A double is encoded with a specific initial byte
-// (kInitialByteForDouble) plus the 64 bits of payload for its value.
-constexpr std::ptrdiff_t kEncodedDoubleSize = 1 + sizeof(uint64_t);
-
-// An envelope is encoded with a specific initial byte
-// (kInitialByteForEnvelope), plus the start byte for a BYTE_STRING with a 32
-// bit wide length, plus a 32 bit length for that string.
-constexpr std::ptrdiff_t kEncodedEnvelopeHeaderSize = 1 + 1 + sizeof(uint32_t);
-
-void EncodeDouble(double value, std::vector<uint8_t>* out) {
-  // The additional_info=27 indicates 64 bits for the double follow.
-  // See RFC 7049 Section 2.3, Table 1.
-  out->push_back(kInitialByteForDouble);
-  union {
-    double from_double;
-    uint64_t to_uint64;
-  } reinterpret;
-  reinterpret.from_double = value;
-  WriteBytesMostSignificantByteFirst<uint64_t>(reinterpret.to_uint64, out);
-}
-
-// =============================================================================
-// cbor::EnvelopeEncoder - for wrapping submessages
-// =============================================================================
-
-void EnvelopeEncoder::EncodeStart(std::vector<uint8_t>* out) {
-  assert(byte_size_pos_ == 0);
-  out->push_back(kInitialByteForEnvelope);
-  out->push_back(kInitialByteFor32BitLengthByteString);
-  byte_size_pos_ = out->size();
-  out->resize(out->size() + sizeof(uint32_t));
-}
-
-bool EnvelopeEncoder::EncodeStop(std::vector<uint8_t>* out) {
-  assert(byte_size_pos_ != 0);
-  // The byte size is the size of the payload, that is, all the
-  // bytes that were written past the byte size position itself.
-  uint64_t byte_size = out->size() - (byte_size_pos_ + sizeof(uint32_t));
-  // We store exactly 4 bytes, so at most INT32MAX, with most significant
-  // byte first.
-  if (byte_size > std::numeric_limits<uint32_t>::max())
-    return false;
-  for (int shift_bytes = sizeof(uint32_t) - 1; shift_bytes >= 0;
-       --shift_bytes) {
-    (*out)[byte_size_pos_++] = 0xff & (byte_size >> (shift_bytes * 8));
-  }
-  return true;
-}
-
-// =============================================================================
-// cbor::NewCBOREncoder - for encoding from a streaming parser
-// =============================================================================
-
-namespace {
-class CBOREncoder : public StreamingParserHandler {
- public:
-  CBOREncoder(std::vector<uint8_t>* out, Status* status)
-      : out_(out), status_(status) {
-    *status_ = Status();
-  }
-
-  void HandleMapBegin() override {
-    envelopes_.emplace_back();
-    envelopes_.back().EncodeStart(out_);
-    out_->push_back(kInitialByteIndefiniteLengthMap);
-  }
-
-  void HandleMapEnd() override {
-    out_->push_back(kStopByte);
-    assert(!envelopes_.empty());
-    envelopes_.back().EncodeStop(out_);
-    envelopes_.pop_back();
-  }
-
-  void HandleArrayBegin() override {
-    envelopes_.emplace_back();
-    envelopes_.back().EncodeStart(out_);
-    out_->push_back(kInitialByteIndefiniteLengthArray);
-  }
-
-  void HandleArrayEnd() override {
-    out_->push_back(kStopByte);
-    assert(!envelopes_.empty());
-    envelopes_.back().EncodeStop(out_);
-    envelopes_.pop_back();
-  }
-
-  void HandleString8(span<uint8_t> chars) override {
-    EncodeString8(chars, out_);
-  }
-
-  void HandleString16(span<uint16_t> chars) override {
-    EncodeFromUTF16(chars, out_);
-  }
-
-  void HandleBinary(span<uint8_t> bytes) override { EncodeBinary(bytes, out_); }
-
-  void HandleDouble(double value) override { EncodeDouble(value, out_); }
-
-  void HandleInt32(int32_t value) override { EncodeInt32(value, out_); }
-
-  void HandleBool(bool value) override {
-    // See RFC 7049 Section 2.3, Table 2.
-    out_->push_back(value ? kEncodedTrue : kEncodedFalse);
-  }
-
-  void HandleNull() override {
-    // See RFC 7049 Section 2.3, Table 2.
-    out_->push_back(kEncodedNull);
-  }
-
-  void HandleError(Status error) override {
-    assert(!error.ok());
-    *status_ = error;
-    out_->clear();
-  }
-
- private:
-  std::vector<uint8_t>* out_;
-  std::vector<EnvelopeEncoder> envelopes_;
-  Status* status_;
-};
-}  // namespace
-
-std::unique_ptr<StreamingParserHandler> NewCBOREncoder(
-    std::vector<uint8_t>* out,
-    Status* status) {
-  return std::unique_ptr<StreamingParserHandler>(new CBOREncoder(out, status));
-}
-
-// =============================================================================
-// cbor::CBORTokenizer - for parsing individual CBOR items
-// =============================================================================
-
-CBORTokenizer::CBORTokenizer(span<uint8_t> bytes) : bytes_(bytes) {
-  ReadNextToken(/*enter_envelope=*/false);
-}
-CBORTokenizer::~CBORTokenizer() {}
-
-CBORTokenTag CBORTokenizer::TokenTag() const {
-  return token_tag_;
-}
-
-void CBORTokenizer::Next() {
-  if (token_tag_ == CBORTokenTag::ERROR_VALUE ||
-      token_tag_ == CBORTokenTag::DONE)
-    return;
-  ReadNextToken(/*enter_envelope=*/false);
-}
-
-void CBORTokenizer::EnterEnvelope() {
-  assert(token_tag_ == CBORTokenTag::ENVELOPE);
-  ReadNextToken(/*enter_envelope=*/true);
-}
-
-Status CBORTokenizer::Status() const {
-  return status_;
-}
-
-int32_t CBORTokenizer::GetInt32() const {
-  assert(token_tag_ == CBORTokenTag::INT32);
-  // The range checks happen in ::ReadNextToken().
-  return static_cast<uint32_t>(
-      token_start_type_ == MajorType::UNSIGNED
-          ? token_start_internal_value_
-          : -static_cast<int64_t>(token_start_internal_value_) - 1);
-}
-
-double CBORTokenizer::GetDouble() const {
-  assert(token_tag_ == CBORTokenTag::DOUBLE);
-  union {
-    uint64_t from_uint64;
-    double to_double;
-  } reinterpret;
-  reinterpret.from_uint64 = ReadBytesMostSignificantByteFirst<uint64_t>(
-      bytes_.subspan(status_.pos + 1));
-  return reinterpret.to_double;
-}
-
-span<uint8_t> CBORTokenizer::GetString8() const {
-  assert(token_tag_ == CBORTokenTag::STRING8);
-  auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
-  return bytes_.subspan(status_.pos + (token_byte_length_ - length), length);
-}
-
-span<uint8_t> CBORTokenizer::GetString16WireRep() const {
-  assert(token_tag_ == CBORTokenTag::STRING16);
-  auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
-  return bytes_.subspan(status_.pos + (token_byte_length_ - length), length);
-}
-
-span<uint8_t> CBORTokenizer::GetBinary() const {
-  assert(token_tag_ == CBORTokenTag::BINARY);
-  auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
-  return bytes_.subspan(status_.pos + (token_byte_length_ - length), length);
-}
-
-span<uint8_t> CBORTokenizer::GetEnvelopeContents() const {
-  assert(token_tag_ == CBORTokenTag::ENVELOPE);
-  auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
-  return bytes_.subspan(status_.pos + kEncodedEnvelopeHeaderSize, length);
-}
-
-void CBORTokenizer::ReadNextToken(bool enter_envelope) {
-  if (enter_envelope) {
-    status_.pos += kEncodedEnvelopeHeaderSize;
-  } else {
-    status_.pos =
-        status_.pos == Status::npos() ? 0 : status_.pos + token_byte_length_;
-  }
-  status_.error = Error::OK;
-  if (status_.pos >= bytes_.size()) {
-    token_tag_ = CBORTokenTag::DONE;
-    return;
-  }
-  switch (bytes_[status_.pos]) {
-    case kStopByte:
-      SetToken(CBORTokenTag::STOP, 1);
-      return;
-    case kInitialByteIndefiniteLengthMap:
-      SetToken(CBORTokenTag::MAP_START, 1);
-      return;
-    case kInitialByteIndefiniteLengthArray:
-      SetToken(CBORTokenTag::ARRAY_START, 1);
-      return;
-    case kEncodedTrue:
-      SetToken(CBORTokenTag::TRUE_VALUE, 1);
-      return;
-    case kEncodedFalse:
-      SetToken(CBORTokenTag::FALSE_VALUE, 1);
-      return;
-    case kEncodedNull:
-      SetToken(CBORTokenTag::NULL_VALUE, 1);
-      return;
-    case kExpectedConversionToBase64Tag: {  // BINARY
-      int8_t bytes_read = internals::ReadTokenStart(
-          bytes_.subspan(status_.pos + 1), &token_start_type_,
-          &token_start_internal_value_);
-      int64_t token_byte_length = 1 + bytes_read + token_start_internal_value_;
-      if (-1 == bytes_read || token_start_type_ != MajorType::BYTE_STRING ||
-          status_.pos + token_byte_length > bytes_.size()) {
-        SetError(Error::CBOR_INVALID_BINARY);
-        return;
-      }
-      SetToken(CBORTokenTag::BINARY,
-               static_cast<std::ptrdiff_t>(token_byte_length));
-      return;
-    }
-    case kInitialByteForDouble: {  // DOUBLE
-      if (status_.pos + kEncodedDoubleSize > bytes_.size()) {
-        SetError(Error::CBOR_INVALID_DOUBLE);
-        return;
-      }
-      SetToken(CBORTokenTag::DOUBLE, kEncodedDoubleSize);
-      return;
-    }
-    case kInitialByteForEnvelope: {  // ENVELOPE
-      if (status_.pos + kEncodedEnvelopeHeaderSize > bytes_.size()) {
-        SetError(Error::CBOR_INVALID_ENVELOPE);
-        return;
-      }
-      // The envelope must be a byte string with 32 bit length.
-      if (bytes_[status_.pos + 1] != kInitialByteFor32BitLengthByteString) {
-        SetError(Error::CBOR_INVALID_ENVELOPE);
-        return;
-      }
-      // Read the length of the byte string.
-      token_start_internal_value_ = ReadBytesMostSignificantByteFirst<uint32_t>(
-          bytes_.subspan(status_.pos + 2));
-      // Make sure the payload is contained within the message.
-      if (token_start_internal_value_ + kEncodedEnvelopeHeaderSize +
-              status_.pos >
-          static_cast<std::size_t>(bytes_.size())) {
-        SetError(Error::CBOR_INVALID_ENVELOPE);
-        return;
-      }
-      auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
-      SetToken(CBORTokenTag::ENVELOPE, kEncodedEnvelopeHeaderSize + length);
-      return;
-    }
-    default: {
-      span<uint8_t> remainder =
-          bytes_.subspan(status_.pos, bytes_.size() - status_.pos);
-      assert(!remainder.empty());
-      int8_t token_start_length = internals::ReadTokenStart(
-          remainder, &token_start_type_, &token_start_internal_value_);
-      bool success = token_start_length != -1;
-      switch (token_start_type_) {
-        case MajorType::UNSIGNED:  // INT32.
-          if (!success || std::numeric_limits<int32_t>::max() <
-                              token_start_internal_value_) {
-            SetError(Error::CBOR_INVALID_INT32);
-            return;
-          }
-          SetToken(CBORTokenTag::INT32, token_start_length);
-          return;
-        case MajorType::NEGATIVE:  // INT32.
-          if (!success ||
-              std::numeric_limits<int32_t>::min() >
-                  -static_cast<int64_t>(token_start_internal_value_) - 1) {
-            SetError(Error::CBOR_INVALID_INT32);
-            return;
-          }
-          SetToken(CBORTokenTag::INT32, token_start_length);
-          return;
-        case MajorType::STRING: {  // STRING8.
-          if (!success || remainder.size() < static_cast<int64_t>(
-                                                 token_start_internal_value_)) {
-            SetError(Error::CBOR_INVALID_STRING8);
-            return;
-          }
-          auto length =
-              static_cast<std::ptrdiff_t>(token_start_internal_value_);
-          SetToken(CBORTokenTag::STRING8, token_start_length + length);
-          return;
-        }
-        case MajorType::BYTE_STRING: {  // STRING16.
-          if (!success ||
-              remainder.size() <
-                  static_cast<int64_t>(token_start_internal_value_) ||
-              // Must be divisible by 2 since UTF16 is 2 bytes per character.
-              token_start_internal_value_ & 1) {
-            SetError(Error::CBOR_INVALID_STRING16);
-            return;
-          }
-          auto length =
-              static_cast<std::ptrdiff_t>(token_start_internal_value_);
-          SetToken(CBORTokenTag::STRING16, token_start_length + length);
-          return;
-        }
-        case MajorType::ARRAY:
-        case MajorType::MAP:
-        case MajorType::TAG:
-        case MajorType::SIMPLE_VALUE:
-          SetError(Error::CBOR_UNSUPPORTED_VALUE);
-          return;
-      }
-    }
-  }
-}
-
-void CBORTokenizer::SetToken(CBORTokenTag token_tag,
-                             std::ptrdiff_t token_byte_length) {
-  token_tag_ = token_tag;
-  token_byte_length_ = token_byte_length;
-}
-
-void CBORTokenizer::SetError(Error error) {
-  token_tag_ = CBORTokenTag::ERROR_VALUE;
-  status_.error = error;
-}
-
-// =============================================================================
-// cbor::ParseCBOR - for receiving streaming parser events for CBOR messages
-// =============================================================================
-
-namespace {
-// When parsing CBOR, we limit recursion depth for objects and arrays
-// to this constant.
-static constexpr int kStackLimit = 1000;
-
-// Below are three parsing routines for CBOR, which cover enough
-// to roundtrip JSON messages.
-bool ParseMap(int32_t stack_depth,
-              CBORTokenizer* tokenizer,
-              StreamingParserHandler* out);
-bool ParseArray(int32_t stack_depth,
-                CBORTokenizer* tokenizer,
-                StreamingParserHandler* out);
-bool ParseValue(int32_t stack_depth,
-                CBORTokenizer* tokenizer,
-                StreamingParserHandler* out);
-
-void ParseUTF16String(CBORTokenizer* tokenizer, StreamingParserHandler* out) {
-  std::vector<uint16_t> value;
-  span<uint8_t> rep = tokenizer->GetString16WireRep();
-  for (std::ptrdiff_t ii = 0; ii < rep.size(); ii += 2)
-    value.push_back((rep[ii + 1] << 8) | rep[ii]);
-  out->HandleString16(span<uint16_t>(value.data(), value.size()));
-  tokenizer->Next();
-}
-
-bool ParseUTF8String(CBORTokenizer* tokenizer, StreamingParserHandler* out) {
-  assert(tokenizer->TokenTag() == CBORTokenTag::STRING8);
-  out->HandleString8(tokenizer->GetString8());
-  tokenizer->Next();
-  return true;
-}
-
-bool ParseValue(int32_t stack_depth,
-                CBORTokenizer* tokenizer,
-                StreamingParserHandler* out) {
-  if (stack_depth > kStackLimit) {
-    out->HandleError(
-        Status{Error::CBOR_STACK_LIMIT_EXCEEDED, tokenizer->Status().pos});
-    return false;
-  }
-  // Skip past the envelope to get to what's inside.
-  if (tokenizer->TokenTag() == CBORTokenTag::ENVELOPE)
-    tokenizer->EnterEnvelope();
-  switch (tokenizer->TokenTag()) {
-    case CBORTokenTag::ERROR_VALUE:
-      out->HandleError(tokenizer->Status());
-      return false;
-    case CBORTokenTag::DONE:
-      out->HandleError(Status{Error::CBOR_UNEXPECTED_EOF_EXPECTED_VALUE,
-                              tokenizer->Status().pos});
-      return false;
-    case CBORTokenTag::TRUE_VALUE:
-      out->HandleBool(true);
-      tokenizer->Next();
-      return true;
-    case CBORTokenTag::FALSE_VALUE:
-      out->HandleBool(false);
-      tokenizer->Next();
-      return true;
-    case CBORTokenTag::NULL_VALUE:
-      out->HandleNull();
-      tokenizer->Next();
-      return true;
-    case CBORTokenTag::INT32:
-      out->HandleInt32(tokenizer->GetInt32());
-      tokenizer->Next();
-      return true;
-    case CBORTokenTag::DOUBLE:
-      out->HandleDouble(tokenizer->GetDouble());
-      tokenizer->Next();
-      return true;
-    case CBORTokenTag::STRING8:
-      return ParseUTF8String(tokenizer, out);
-    case CBORTokenTag::STRING16:
-      ParseUTF16String(tokenizer, out);
-      return true;
-    case CBORTokenTag::BINARY: {
-      out->HandleBinary(tokenizer->GetBinary());
-      tokenizer->Next();
-      return true;
-    }
-    case CBORTokenTag::MAP_START:
-      return ParseMap(stack_depth + 1, tokenizer, out);
-    case CBORTokenTag::ARRAY_START:
-      return ParseArray(stack_depth + 1, tokenizer, out);
-    default:
-      out->HandleError(
-          Status{Error::CBOR_UNSUPPORTED_VALUE, tokenizer->Status().pos});
-      return false;
-  }
-}
-
-// |bytes| must start with the indefinite length array byte, so basically,
-// ParseArray may only be called after an indefinite length array has been
-// detected.
-bool ParseArray(int32_t stack_depth,
-                CBORTokenizer* tokenizer,
-                StreamingParserHandler* out) {
-  assert(tokenizer->TokenTag() == CBORTokenTag::ARRAY_START);
-  tokenizer->Next();
-  out->HandleArrayBegin();
-  while (tokenizer->TokenTag() != CBORTokenTag::STOP) {
-    if (tokenizer->TokenTag() == CBORTokenTag::DONE) {
-      out->HandleError(
-          Status{Error::CBOR_UNEXPECTED_EOF_IN_ARRAY, tokenizer->Status().pos});
-      return false;
-    }
-    if (tokenizer->TokenTag() == CBORTokenTag::ERROR_VALUE) {
-      out->HandleError(tokenizer->Status());
-      return false;
-    }
-    // Parse value.
-    if (!ParseValue(stack_depth, tokenizer, out))
-      return false;
-  }
-  out->HandleArrayEnd();
-  tokenizer->Next();
-  return true;
-}
-
-// |bytes| must start with the indefinite length array byte, so basically,
-// ParseArray may only be called after an indefinite length array has been
-// detected.
-bool ParseMap(int32_t stack_depth,
-              CBORTokenizer* tokenizer,
-              StreamingParserHandler* out) {
-  assert(tokenizer->TokenTag() == CBORTokenTag::MAP_START);
-  out->HandleMapBegin();
-  tokenizer->Next();
-  while (tokenizer->TokenTag() != CBORTokenTag::STOP) {
-    if (tokenizer->TokenTag() == CBORTokenTag::DONE) {
-      out->HandleError(
-          Status{Error::CBOR_UNEXPECTED_EOF_IN_MAP, tokenizer->Status().pos});
-      return false;
-    }
-    if (tokenizer->TokenTag() == CBORTokenTag::ERROR_VALUE) {
-      out->HandleError(tokenizer->Status());
-      return false;
-    }
-    // Parse key.
-    if (tokenizer->TokenTag() == CBORTokenTag::STRING8) {
-      if (!ParseUTF8String(tokenizer, out))
-        return false;
-    } else if (tokenizer->TokenTag() == CBORTokenTag::STRING16) {
-      ParseUTF16String(tokenizer, out);
-    } else {
-      out->HandleError(
-          Status{Error::CBOR_INVALID_MAP_KEY, tokenizer->Status().pos});
-      return false;
-    }
-    // Parse value.
-    if (!ParseValue(stack_depth, tokenizer, out))
-      return false;
-  }
-  out->HandleMapEnd();
-  tokenizer->Next();
-  return true;
-}
-}  // namespace
-
-void ParseCBOR(span<uint8_t> bytes, StreamingParserHandler* out) {
-  if (bytes.empty()) {
-    out->HandleError(Status{Error::CBOR_NO_INPUT, 0});
-    return;
-  }
-  if (bytes[0] != kInitialByteForEnvelope) {
-    out->HandleError(Status{Error::CBOR_INVALID_START_BYTE, 0});
-    return;
-  }
-  CBORTokenizer tokenizer(bytes);
-  if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) {
-    out->HandleError(tokenizer.Status());
-    return;
-  }
-  // We checked for the envelope start byte above, so the tokenizer
-  // must agree here, since it's not an error.
-  assert(tokenizer.TokenTag() == CBORTokenTag::ENVELOPE);
-  tokenizer.EnterEnvelope();
-  if (tokenizer.TokenTag() != CBORTokenTag::MAP_START) {
-    out->HandleError(
-        Status{Error::CBOR_MAP_START_EXPECTED, tokenizer.Status().pos});
-    return;
-  }
-  if (!ParseMap(/*stack_depth=*/1, &tokenizer, out))
-    return;
-  if (tokenizer.TokenTag() == CBORTokenTag::DONE)
-    return;
-  if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) {
-    out->HandleError(tokenizer.Status());
-    return;
-  }
-  out->HandleError(Status{Error::CBOR_TRAILING_JUNK, tokenizer.Status().pos});
-}
-}  // namespace cbor
-
-namespace json {
-
-// =============================================================================
-// json::NewJSONEncoder - for encoding streaming parser events as JSON
-// =============================================================================
-
-namespace {
-// Prints |value| to |out| with 4 hex digits, most significant chunk first.
-void PrintHex(uint16_t value, std::string* out) {
-  for (int ii = 3; ii >= 0; --ii) {
-    int four_bits = 0xf & (value >> (4 * ii));
-    out->append(1, four_bits + ((four_bits <= 9) ? '0' : ('a' - 10)));
-  }
-}
-
-// In the writer below, we maintain a stack of State instances.
-// It is just enough to emit the appropriate delimiters and brackets
-// in JSON.
-enum class Container {
-  // Used for the top-level, initial state.
-  NONE,
-  // Inside a JSON object.
-  MAP,
-  // Inside a JSON array.
-  ARRAY
-};
-class State {
- public:
-  explicit State(Container container) : container_(container) {}
-  void StartElement(std::string* out) {
-    assert(container_ != Container::NONE || size_ == 0);
-    if (size_ != 0) {
-      char delim = (!(size_ & 1) || container_ == Container::ARRAY) ? ',' : ':';
-      out->append(1, delim);
-    }
-    ++size_;
-  }
-  Container container() const { return container_; }
-
- private:
-  Container container_ = Container::NONE;
-  int size_ = 0;
-};
-
-constexpr char kBase64Table[] =
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-    "abcdefghijklmnopqrstuvwxyz0123456789+/";
-
-void Base64Encode(const span<uint8_t>& in, std::string* out) {
-  // The following three cases are based on the tables in the example
-  // section in https://en.wikipedia.org/wiki/Base64. We process three
-  // input bytes at a time, emitting 4 output bytes at a time.
-  std::ptrdiff_t ii = 0;
-
-  // While possible, process three input bytes.
-  for (; ii + 3 <= in.size(); ii += 3) {
-    uint32_t twentyfour_bits = (in[ii] << 16) | (in[ii + 1] << 8) | in[ii + 2];
-    out->push_back(kBase64Table[(twentyfour_bits >> 18)]);
-    out->push_back(kBase64Table[(twentyfour_bits >> 12) & 0x3f]);
-    out->push_back(kBase64Table[(twentyfour_bits >> 6) & 0x3f]);
-    out->push_back(kBase64Table[twentyfour_bits & 0x3f]);
-  }
-  if (ii + 2 <= in.size()) {  // Process two input bytes.
-    uint32_t twentyfour_bits = (in[ii] << 16) | (in[ii + 1] << 8);
-    out->push_back(kBase64Table[(twentyfour_bits >> 18)]);
-    out->push_back(kBase64Table[(twentyfour_bits >> 12) & 0x3f]);
-    out->push_back(kBase64Table[(twentyfour_bits >> 6) & 0x3f]);
-    out->push_back('=');  // Emit padding.
-    return;
-  }
-  if (ii + 1 <= in.size()) {  // Process a single input byte.
-    uint32_t twentyfour_bits = (in[ii] << 16);
-    out->push_back(kBase64Table[(twentyfour_bits >> 18)]);
-    out->push_back(kBase64Table[(twentyfour_bits >> 12) & 0x3f]);
-    out->push_back('=');  // Emit padding.
-    out->push_back('=');  // Emit padding.
-  }
-}
-
-// Implements a handler for JSON parser events to emit a JSON string.
-class JSONEncoder : public StreamingParserHandler {
- public:
-  JSONEncoder(const Platform* platform, std::string* out, Status* status)
-      : platform_(platform), out_(out), status_(status) {
-    *status_ = Status();
-    state_.emplace(Container::NONE);
-  }
-
-  void HandleMapBegin() override {
-    if (!status_->ok())
-      return;
-    assert(!state_.empty());
-    state_.top().StartElement(out_);
-    state_.emplace(Container::MAP);
-    out_->append("{");
-  }
-
-  void HandleMapEnd() override {
-    if (!status_->ok())
-      return;
-    assert(state_.size() >= 2 && state_.top().container() == Container::MAP);
-    state_.pop();
-    out_->append("}");
-  }
-
-  void HandleArrayBegin() override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    state_.emplace(Container::ARRAY);
-    out_->append("[");
-  }
-
-  void HandleArrayEnd() override {
-    if (!status_->ok())
-      return;
-    assert(state_.size() >= 2 && state_.top().container() == Container::ARRAY);
-    state_.pop();
-    out_->append("]");
-  }
-
-  void HandleString16(span<uint16_t> chars) override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    out_->append("\"");
-    for (const uint16_t ch : chars) {
-      if (ch == '"') {
-        out_->append("\\\"");
-      } else if (ch == '\\') {
-        out_->append("\\\\");
-      } else if (ch == '\b') {
-        out_->append("\\b");
-      } else if (ch == '\f') {
-        out_->append("\\f");
-      } else if (ch == '\n') {
-        out_->append("\\n");
-      } else if (ch == '\r') {
-        out_->append("\\r");
-      } else if (ch == '\t') {
-        out_->append("\\t");
-      } else if (ch >= 32 && ch <= 126) {
-        out_->append(1, ch);
-      } else {
-        out_->append("\\u");
-        PrintHex(ch, out_);
-      }
-    }
-    out_->append("\"");
-  }
-
-  void HandleString8(span<uint8_t> chars) override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    out_->append("\"");
-    for (std::ptrdiff_t ii = 0; ii < chars.size(); ++ii) {
-      uint8_t c = chars[ii];
-      if (c == '"') {
-        out_->append("\\\"");
-      } else if (c == '\\') {
-        out_->append("\\\\");
-      } else if (c == '\b') {
-        out_->append("\\b");
-      } else if (c == '\f') {
-        out_->append("\\f");
-      } else if (c == '\n') {
-        out_->append("\\n");
-      } else if (c == '\r') {
-        out_->append("\\r");
-      } else if (c == '\t') {
-        out_->append("\\t");
-      } else if (c >= 32 && c <= 126) {
-        out_->append(1, c);
-      } else if (c < 32) {
-        out_->append("\\u");
-        PrintHex(static_cast<uint16_t>(c), out_);
-      } else {
-        // Inspect the leading byte to figure out how long the utf8
-        // byte sequence is; while doing this initialize |codepoint|
-        // with the first few bits.
-        // See table in: https://en.wikipedia.org/wiki/UTF-8
-        // byte one is 110x xxxx -> 2 byte utf8 sequence
-        // byte one is 1110 xxxx -> 3 byte utf8 sequence
-        // byte one is 1111 0xxx -> 4 byte utf8 sequence
-        uint32_t codepoint;
-        int num_bytes_left;
-        if ((c & 0xe0) == 0xc0) {  // 2 byte utf8 sequence
-          num_bytes_left = 1;
-          codepoint = c & 0x1f;
-        } else if ((c & 0xf0) == 0xe0) {  // 3 byte utf8 sequence
-          num_bytes_left = 2;
-          codepoint = c & 0x0f;
-        } else if ((c & 0xf8) == 0xf0) {  // 4 byte utf8 sequence
-          codepoint = c & 0x07;
-          num_bytes_left = 3;
-        } else {
-          continue;  // invalid leading byte
-        }
-
-        // If we have enough bytes in our input, decode the remaining ones
-        // belonging to this Unicode character into |codepoint|.
-        if (ii + num_bytes_left > chars.size())
-          continue;
-        while (num_bytes_left > 0) {
-          c = chars[++ii];
-          --num_bytes_left;
-          // Check the next byte is a continuation byte, that is 10xx xxxx.
-          if ((c & 0xc0) != 0x80)
-            continue;
-          codepoint = (codepoint << 6) | (c & 0x3f);
-        }
-
-        // Disallow overlong encodings for ascii characters, as these
-        // would include " and other characters significant to JSON
-        // string termination / control.
-        if (codepoint < 0x7f)
-          continue;
-        // Invalid in UTF8, and can't be represented in UTF16 anyway.
-        if (codepoint > 0x10ffff)
-          continue;
-
-        // So, now we transcode to UTF16,
-        // using the math described at https://en.wikipedia.org/wiki/UTF-16,
-        // for either one or two 16 bit characters.
-        if (codepoint < 0xffff) {
-          out_->append("\\u");
-          PrintHex(static_cast<uint16_t>(codepoint), out_);
-          continue;
-        }
-        codepoint -= 0x10000;
-        // high surrogate
-        out_->append("\\u");
-        PrintHex(static_cast<uint16_t>((codepoint >> 10) + 0xd800), out_);
-        // low surrogate
-        out_->append("\\u");
-        PrintHex(static_cast<uint16_t>((codepoint & 0x3ff) + 0xdc00), out_);
-      }
-    }
-    out_->append("\"");
-  }
-
-  void HandleBinary(span<uint8_t> bytes) override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    out_->append("\"");
-    Base64Encode(bytes, out_);
-    out_->append("\"");
-  }
-
-  void HandleDouble(double value) override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    std::unique_ptr<char[]> str_value = platform_->DToStr(value);
-
-    // DToStr may fail to emit a 0 before the decimal dot. E.g. this is
-    // the case in base::NumberToString in Chromium (which is based on
-    // dmg_fp). So, much like
-    // https://cs.chromium.org/chromium/src/base/json/json_writer.cc
-    // we probe for this and emit the leading 0 anyway if necessary.
-    const char* chars = str_value.get();
-    if (chars[0] == '.') {
-      out_->append("0");
-    } else if (chars[0] == '-' && chars[1] == '.') {
-      out_->append("-0");
-      ++chars;
-    }
-    out_->append(chars);
-  }
-
-  void HandleInt32(int32_t value) override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    out_->append(std::to_string(value));
-  }
-
-  void HandleBool(bool value) override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    out_->append(value ? "true" : "false");
-  }
-
-  void HandleNull() override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    out_->append("null");
-  }
-
-  void HandleError(Status error) override {
-    assert(!error.ok());
-    *status_ = error;
-    out_->clear();
-  }
-
- private:
-  const Platform* platform_;
-  std::string* out_;
-  Status* status_;
-  std::stack<State> state_;
-};
-}  // namespace
-
-std::unique_ptr<StreamingParserHandler> NewJSONEncoder(const Platform* platform,
-                                                       std::string* out,
-                                                       Status* status) {
-  return std::unique_ptr<StreamingParserHandler>(
-      new JSONEncoder(platform, out, status));
-}
-
-// =============================================================================
-// json::ParseJSON - for receiving streaming parser events for JSON.
-// =============================================================================
-
-namespace {
-const int kStackLimit = 1000;
-
-enum Token {
-  ObjectBegin,
-  ObjectEnd,
-  ArrayBegin,
-  ArrayEnd,
-  StringLiteral,
-  Number,
-  BoolTrue,
-  BoolFalse,
-  NullToken,
-  ListSeparator,
-  ObjectPairSeparator,
-  InvalidToken,
-  NoInput
-};
-
-const char* const kNullString = "null";
-const char* const kTrueString = "true";
-const char* const kFalseString = "false";
-
-template <typename Char>
-class JsonParser {
- public:
-  JsonParser(const Platform* platform, StreamingParserHandler* handler)
-      : platform_(platform), handler_(handler) {}
-
-  void Parse(const Char* start, std::size_t length) {
-    start_pos_ = start;
-    const Char* end = start + length;
-    const Char* tokenEnd;
-    ParseValue(start, end, &tokenEnd, 0);
-    if (tokenEnd != end) {
-      HandleError(Error::JSON_PARSER_UNPROCESSED_INPUT_REMAINS, tokenEnd);
-    }
-  }
-
- private:
-  bool CharsToDouble(const uint16_t* chars,
-                     std::size_t length,
-                     double* result) {
-    std::string buffer;
-    buffer.reserve(length + 1);
-    for (std::size_t ii = 0; ii < length; ++ii) {
-      bool is_ascii = !(chars[ii] & ~0x7F);
-      if (!is_ascii)
-        return false;
-      buffer.push_back(static_cast<char>(chars[ii]));
-    }
-    return platform_->StrToD(buffer.c_str(), result);
-  }
-
-  bool CharsToDouble(const uint8_t* chars, std::size_t length, double* result) {
-    std::string buffer(reinterpret_cast<const char*>(chars), length);
-    return platform_->StrToD(buffer.c_str(), result);
-  }
-
-  static bool ParseConstToken(const Char* start,
-                              const Char* end,
-                              const Char** token_end,
-                              const char* token) {
-    // |token| is \0 terminated, it's one of the constants at top of the file.
-    while (start < end && *token != '\0' && *start++ == *token++) {
-    }
-    if (*token != '\0')
-      return false;
-    *token_end = start;
-    return true;
-  }
-
-  static bool ReadInt(const Char* start,
-                      const Char* end,
-                      const Char** token_end,
-                      bool allow_leading_zeros) {
-    if (start == end)
-      return false;
-    bool has_leading_zero = '0' == *start;
-    int length = 0;
-    while (start < end && '0' <= *start && *start <= '9') {
-      ++start;
-      ++length;
-    }
-    if (!length)
-      return false;
-    if (!allow_leading_zeros && length > 1 && has_leading_zero)
-      return false;
-    *token_end = start;
-    return true;
-  }
-
-  static bool ParseNumberToken(const Char* start,
-                               const Char* end,
-                               const Char** token_end) {
-    // We just grab the number here. We validate the size in DecodeNumber.
-    // According to RFC4627, a valid number is: [minus] int [frac] [exp]
-    if (start == end)
-      return false;
-    Char c = *start;
-    if ('-' == c)
-      ++start;
-
-    if (!ReadInt(start, end, &start, /*allow_leading_zeros=*/false))
-      return false;
-    if (start == end) {
-      *token_end = start;
-      return true;
-    }
-
-    // Optional fraction part
-    c = *start;
-    if ('.' == c) {
-      ++start;
-      if (!ReadInt(start, end, &start, /*allow_leading_zeros=*/true))
-        return false;
-      if (start == end) {
-        *token_end = start;
-        return true;
-      }
-      c = *start;
-    }
-
-    // Optional exponent part
-    if ('e' == c || 'E' == c) {
-      ++start;
-      if (start == end)
-        return false;
-      c = *start;
-      if ('-' == c || '+' == c) {
-        ++start;
-        if (start == end)
-          return false;
-      }
-      if (!ReadInt(start, end, &start, /*allow_leading_zeros=*/true))
-        return false;
-    }
-
-    *token_end = start;
-    return true;
-  }
-
-  static bool ReadHexDigits(const Char* start,
-                            const Char* end,
-                            const Char** token_end,
-                            int digits) {
-    if (end - start < digits)
-      return false;
-    for (int i = 0; i < digits; ++i) {
-      Char c = *start++;
-      if (!(('0' <= c && c <= '9') || ('a' <= c && c <= 'f') ||
-            ('A' <= c && c <= 'F')))
-        return false;
-    }
-    *token_end = start;
-    return true;
-  }
-
-  static bool ParseStringToken(const Char* start,
-                               const Char* end,
-                               const Char** token_end) {
-    while (start < end) {
-      Char c = *start++;
-      if ('\\' == c) {
-        if (start == end)
-          return false;
-        c = *start++;
-        // Make sure the escaped char is valid.
-        switch (c) {
-          case 'x':
-            if (!ReadHexDigits(start, end, &start, 2))
-              return false;
-            break;
-          case 'u':
-            if (!ReadHexDigits(start, end, &start, 4))
-              return false;
-            break;
-          case '\\':
-          case '/':
-          case 'b':
-          case 'f':
-          case 'n':
-          case 'r':
-          case 't':
-          case 'v':
-          case '"':
-            break;
-          default:
-            return false;
-        }
-      } else if ('"' == c) {
-        *token_end = start;
-        return true;
-      }
-    }
-    return false;
-  }
-
-  static bool SkipComment(const Char* start,
-                          const Char* end,
-                          const Char** comment_end) {
-    if (start == end)
-      return false;
-
-    if (*start != '/' || start + 1 >= end)
-      return false;
-    ++start;
-
-    if (*start == '/') {
-      // Single line comment, read to newline.
-      for (++start; start < end; ++start) {
-        if (*start == '\n' || *start == '\r') {
-          *comment_end = start + 1;
-          return true;
-        }
-      }
-      *comment_end = end;
-      // Comment reaches end-of-input, which is fine.
-      return true;
-    }
-
-    if (*start == '*') {
-      Char previous = '\0';
-      // Block comment, read until end marker.
-      for (++start; start < end; previous = *start++) {
-        if (previous == '*' && *start == '/') {
-          *comment_end = start + 1;
-          return true;
-        }
-      }
-      // Block comment must close before end-of-input.
-      return false;
-    }
-
-    return false;
-  }
-
-  static bool IsSpaceOrNewLine(Char c) {
-    // \v = vertial tab; \f = form feed page break.
-    return c == ' ' || c == '\n' || c == '\v' || c == '\f' || c == '\r' ||
-           c == '\t';
-  }
-
-  static void SkipWhitespaceAndComments(const Char* start,
-                                        const Char* end,
-                                        const Char** whitespace_end) {
-    while (start < end) {
-      if (IsSpaceOrNewLine(*start)) {
-        ++start;
-      } else if (*start == '/') {
-        const Char* comment_end;
-        if (!SkipComment(start, end, &comment_end))
-          break;
-        start = comment_end;
-      } else {
-        break;
-      }
-    }
-    *whitespace_end = start;
-  }
-
-  static Token ParseToken(const Char* start,
-                          const Char* end,
-                          const Char** tokenStart,
-                          const Char** token_end) {
-    SkipWhitespaceAndComments(start, end, tokenStart);
-    start = *tokenStart;
-
-    if (start == end)
-      return NoInput;
-
-    switch (*start) {
-      case 'n':
-        if (ParseConstToken(start, end, token_end, kNullString))
-          return NullToken;
-        break;
-      case 't':
-        if (ParseConstToken(start, end, token_end, kTrueString))
-          return BoolTrue;
-        break;
-      case 'f':
-        if (ParseConstToken(start, end, token_end, kFalseString))
-          return BoolFalse;
-        break;
-      case '[':
-        *token_end = start + 1;
-        return ArrayBegin;
-      case ']':
-        *token_end = start + 1;
-        return ArrayEnd;
-      case ',':
-        *token_end = start + 1;
-        return ListSeparator;
-      case '{':
-        *token_end = start + 1;
-        return ObjectBegin;
-      case '}':
-        *token_end = start + 1;
-        return ObjectEnd;
-      case ':':
-        *token_end = start + 1;
-        return ObjectPairSeparator;
-      case '0':
-      case '1':
-      case '2':
-      case '3':
-      case '4':
-      case '5':
-      case '6':
-      case '7':
-      case '8':
-      case '9':
-      case '-':
-        if (ParseNumberToken(start, end, token_end))
-          return Number;
-        break;
-      case '"':
-        if (ParseStringToken(start + 1, end, token_end))
-          return StringLiteral;
-        break;
-    }
-    return InvalidToken;
-  }
-
-  static int HexToInt(Char c) {
-    if ('0' <= c && c <= '9')
-      return c - '0';
-    if ('A' <= c && c <= 'F')
-      return c - 'A' + 10;
-    if ('a' <= c && c <= 'f')
-      return c - 'a' + 10;
-    assert(false);  // Unreachable.
-    return 0;
-  }
-
-  static bool DecodeString(const Char* start,
-                           const Char* end,
-                           std::vector<uint16_t>* output) {
-    if (start == end)
-      return true;
-    if (start > end)
-      return false;
-    output->reserve(end - start);
-    while (start < end) {
-      uint16_t c = *start++;
-      // If the |Char| we're dealing with is really a byte, then
-      // we have utf8 here, and we need to check for multibyte characters
-      // and transcode them to utf16 (either one or two utf16 chars).
-      if (sizeof(Char) == sizeof(uint8_t) && c >= 0x7f) {
-        // Inspect the leading byte to figure out how long the utf8
-        // byte sequence is; while doing this initialize |codepoint|
-        // with the first few bits.
-        // See table in: https://en.wikipedia.org/wiki/UTF-8
-        // byte one is 110x xxxx -> 2 byte utf8 sequence
-        // byte one is 1110 xxxx -> 3 byte utf8 sequence
-        // byte one is 1111 0xxx -> 4 byte utf8 sequence
-        uint32_t codepoint;
-        int num_bytes_left;
-        if ((c & 0xe0) == 0xc0) {  // 2 byte utf8 sequence
-          num_bytes_left = 1;
-          codepoint = c & 0x1f;
-        } else if ((c & 0xf0) == 0xe0) {  // 3 byte utf8 sequence
-          num_bytes_left = 2;
-          codepoint = c & 0x0f;
-        } else if ((c & 0xf8) == 0xf0) {  // 4 byte utf8 sequence
-          codepoint = c & 0x07;
-          num_bytes_left = 3;
-        } else {
-          return false;  // invalid leading byte
-        }
-
-        // If we have enough bytes in our inpput, decode the remaining ones
-        // belonging to this Unicode character into |codepoint|.
-        if (start + num_bytes_left > end)
-          return false;
-        while (num_bytes_left > 0) {
-          c = *start++;
-          --num_bytes_left;
-          // Check the next byte is a continuation byte, that is 10xx xxxx.
-          if ((c & 0xc0) != 0x80)
-            return false;
-          codepoint = (codepoint << 6) | (c & 0x3f);
-        }
-
-        // Disallow overlong encodings for ascii characters, as these
-        // would include " and other characters significant to JSON
-        // string termination / control.
-        if (codepoint < 0x7f)
-          return false;
-        // Invalid in UTF8, and can't be represented in UTF16 anyway.
-        if (codepoint > 0x10ffff)
-          return false;
-
-        // So, now we transcode to UTF16,
-        // using the math described at https://en.wikipedia.org/wiki/UTF-16,
-        // for either one or two 16 bit characters.
-        if (codepoint < 0xffff) {
-          output->push_back(codepoint);
-          continue;
-        }
-        codepoint -= 0x10000;
-        output->push_back((codepoint >> 10) + 0xd800);    // high surrogate
-        output->push_back((codepoint & 0x3ff) + 0xdc00);  // low surrogate
-        continue;
-      }
-      if ('\\' != c) {
-        output->push_back(c);
-        continue;
-      }
-      if (start == end)
-        return false;
-      c = *start++;
-
-      if (c == 'x') {
-        // \x is not supported.
-        return false;
-      }
-
-      switch (c) {
-        case '"':
-        case '/':
-        case '\\':
-          break;
-        case 'b':
-          c = '\b';
-          break;
-        case 'f':
-          c = '\f';
-          break;
-        case 'n':
-          c = '\n';
-          break;
-        case 'r':
-          c = '\r';
-          break;
-        case 't':
-          c = '\t';
-          break;
-        case 'v':
-          c = '\v';
-          break;
-        case 'u':
-          c = (HexToInt(*start) << 12) + (HexToInt(*(start + 1)) << 8) +
-              (HexToInt(*(start + 2)) << 4) + HexToInt(*(start + 3));
-          start += 4;
-          break;
-        default:
-          return false;
-      }
-      output->push_back(c);
-    }
-    return true;
-  }
-
-  void ParseValue(const Char* start,
-                  const Char* end,
-                  const Char** value_token_end,
-                  int depth) {
-    if (depth > kStackLimit) {
-      HandleError(Error::JSON_PARSER_STACK_LIMIT_EXCEEDED, start);
-      return;
-    }
-    const Char* token_start;
-    const Char* token_end;
-    Token token = ParseToken(start, end, &token_start, &token_end);
-    switch (token) {
-      case NoInput:
-        HandleError(Error::JSON_PARSER_NO_INPUT, token_start);
-        return;
-      case InvalidToken:
-        HandleError(Error::JSON_PARSER_INVALID_TOKEN, token_start);
-        return;
-      case NullToken:
-        handler_->HandleNull();
-        break;
-      case BoolTrue:
-        handler_->HandleBool(true);
-        break;
-      case BoolFalse:
-        handler_->HandleBool(false);
-        break;
-      case Number: {
-        double value;
-        if (!CharsToDouble(token_start, token_end - token_start, &value)) {
-          HandleError(Error::JSON_PARSER_INVALID_NUMBER, token_start);
-          return;
-        }
-        if (value >= std::numeric_limits<int32_t>::min() &&
-            value <= std::numeric_limits<int32_t>::max() &&
-            static_cast<int32_t>(value) == value)
-          handler_->HandleInt32(static_cast<int32_t>(value));
-        else
-          handler_->HandleDouble(value);
-        break;
-      }
-      case StringLiteral: {
-        std::vector<uint16_t> value;
-        bool ok = DecodeString(token_start + 1, token_end - 1, &value);
-        if (!ok) {
-          HandleError(Error::JSON_PARSER_INVALID_STRING, token_start);
-          return;
-        }
-        handler_->HandleString16(span<uint16_t>(value.data(), value.size()));
-        break;
-      }
-      case ArrayBegin: {
-        handler_->HandleArrayBegin();
-        start = token_end;
-        token = ParseToken(start, end, &token_start, &token_end);
-        while (token != ArrayEnd) {
-          ParseValue(start, end, &token_end, depth + 1);
-          if (error_)
-            return;
-
-          // After a list value, we expect a comma or the end of the list.
-          start = token_end;
-          token = ParseToken(start, end, &token_start, &token_end);
-          if (token == ListSeparator) {
-            start = token_end;
-            token = ParseToken(start, end, &token_start, &token_end);
-            if (token == ArrayEnd) {
-              HandleError(Error::JSON_PARSER_UNEXPECTED_ARRAY_END, token_start);
-              return;
-            }
-          } else if (token != ArrayEnd) {
-            // Unexpected value after list value. Bail out.
-            HandleError(Error::JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED,
-                        token_start);
-            return;
-          }
-        }
-        handler_->HandleArrayEnd();
-        break;
-      }
-      case ObjectBegin: {
-        handler_->HandleMapBegin();
-        start = token_end;
-        token = ParseToken(start, end, &token_start, &token_end);
-        while (token != ObjectEnd) {
-          if (token != StringLiteral) {
-            HandleError(Error::JSON_PARSER_STRING_LITERAL_EXPECTED,
-                        token_start);
-            return;
-          }
-          std::vector<uint16_t> key;
-          if (!DecodeString(token_start + 1, token_end - 1, &key)) {
-            HandleError(Error::JSON_PARSER_INVALID_STRING, token_start);
-            return;
-          }
-          handler_->HandleString16(span<uint16_t>(key.data(), key.size()));
-          start = token_end;
-
-          token = ParseToken(start, end, &token_start, &token_end);
-          if (token != ObjectPairSeparator) {
-            HandleError(Error::JSON_PARSER_COLON_EXPECTED, token_start);
-            return;
-          }
-          start = token_end;
-
-          ParseValue(start, end, &token_end, depth + 1);
-          if (error_)
-            return;
-          start = token_end;
-
-          // After a key/value pair, we expect a comma or the end of the
-          // object.
-          token = ParseToken(start, end, &token_start, &token_end);
-          if (token == ListSeparator) {
-            start = token_end;
-            token = ParseToken(start, end, &token_start, &token_end);
-            if (token == ObjectEnd) {
-              HandleError(Error::JSON_PARSER_UNEXPECTED_MAP_END, token_start);
-              return;
-            }
-          } else if (token != ObjectEnd) {
-            // Unexpected value after last object value. Bail out.
-            HandleError(Error::JSON_PARSER_COMMA_OR_MAP_END_EXPECTED,
-                        token_start);
-            return;
-          }
-        }
-        handler_->HandleMapEnd();
-        break;
-      }
-
-      default:
-        // We got a token that's not a value.
-        HandleError(Error::JSON_PARSER_VALUE_EXPECTED, token_start);
-        return;
-    }
-
-    SkipWhitespaceAndComments(token_end, end, value_token_end);
-  }
-
-  void HandleError(Error error, const Char* pos) {
-    assert(error != Error::OK);
-    if (!error_) {
-      handler_->HandleError(Status{error, pos - start_pos_});
-      error_ = true;
-    }
-  }
-
-  const Char* start_pos_ = nullptr;
-  bool error_ = false;
-  const Platform* platform_;
-  StreamingParserHandler* handler_;
-};
-}  // namespace
-
-void ParseJSON(const Platform* platform,
-               span<uint8_t> chars,
-               StreamingParserHandler* handler) {
-  JsonParser<uint8_t> parser(platform, handler);
-  parser.Parse(chars.data(), chars.size());
-}
-
-void ParseJSON(const Platform* platform,
-               span<uint16_t> chars,
-               StreamingParserHandler* handler) {
-  JsonParser<uint16_t> parser(platform, handler);
-  parser.Parse(chars.data(), chars.size());
-}
-}  // namespace json
-}  // namespace inspector_protocol_encoding
diff --git a/third_party/inspector_protocol/encoding/encoding_test.cc b/third_party/inspector_protocol/encoding/encoding_test.cc
deleted file mode 100644
index 6efe83d..0000000
--- a/third_party/inspector_protocol/encoding/encoding_test.cc
+++ /dev/null
@@ -1,1595 +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 "encoding.h"
-
-#include <array>
-#include <clocale>
-#include <cmath>
-#include <cstdlib>
-#include <cstring>
-#include <iomanip>
-#include <iostream>
-#include <sstream>
-#include <string>
-
-#include "base/logging.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using testing::ElementsAreArray;
-
-namespace inspector_protocol_encoding {
-
-std::string UTF16ToUTF8(span<uint16_t> in) {
-  std::string out;
-  bool success = base::UTF16ToUTF8(
-      reinterpret_cast<const base::char16*>(in.data()), in.size(), &out);
-  CHECK(success);
-  return out;
-}
-
-std::vector<uint16_t> UTF8ToUTF16(span<uint8_t> in) {
-  base::string16 tmp;
-  bool success = base::UTF8ToUTF16(reinterpret_cast<const char*>(in.data()),
-                                   in.size(), &tmp);
-  CHECK(success);
-  return std::vector<uint16_t>(tmp.begin(), tmp.end());
-}
-
-class TestPlatform : public json::Platform {
-  bool StrToD(const char* str, double* result) const override {
-    // This is not thread-safe
-    // (see https://en.cppreference.com/w/cpp/locale/setlocale)
-    // but good enough for a unittest.
-    const char* saved_locale = std::setlocale(LC_NUMERIC, nullptr);
-    char* end;
-    *result = std::strtod(str, &end);
-    std::setlocale(LC_NUMERIC, saved_locale);
-    if (errno == ERANGE) {
-      // errno must be reset, e.g. see the example here:
-      // https://en.cppreference.com/w/cpp/string/byte/strtof
-      errno = 0;
-      return false;
-    }
-    return end == str + strlen(str);
-  }
-
-  std::unique_ptr<char[]> DToStr(double value) const override {
-    std::stringstream ss;
-    ss.imbue(std::locale("C"));
-    ss << value;
-    std::string str = ss.str();
-    std::unique_ptr<char[]> result(new char[str.size() + 1]);
-    memcpy(result.get(), str.c_str(), str.size() + 1);
-    return result;
-  }
-};
-
-json::Platform* GetTestPlatform() {
-  static TestPlatform* platform = new TestPlatform;
-  return platform;
-}
-
-// =============================================================================
-// span - sequence of bytes
-// =============================================================================
-
-template <typename T>
-class SpanTest : public ::testing::Test {};
-
-using TestTypes = ::testing::Types<uint8_t, uint16_t>;
-TYPED_TEST_SUITE(SpanTest, TestTypes);
-
-TYPED_TEST(SpanTest, Empty) {
-  span<TypeParam> empty;
-  EXPECT_TRUE(empty.empty());
-  EXPECT_EQ(0, empty.size());
-  EXPECT_EQ(0, empty.size_bytes());
-  EXPECT_EQ(empty.begin(), empty.end());
-}
-
-TYPED_TEST(SpanTest, SingleItem) {
-  TypeParam single_item = 42;
-  span<TypeParam> singular(&single_item, 1);
-  EXPECT_FALSE(singular.empty());
-  EXPECT_EQ(1, singular.size());
-  EXPECT_EQ(sizeof(TypeParam), static_cast<size_t>(singular.size_bytes()));
-  EXPECT_EQ(singular.begin() + 1, singular.end());
-  EXPECT_EQ(42, singular[0]);
-}
-
-TYPED_TEST(SpanTest, FiveItems) {
-  std::vector<TypeParam> test_input = {31, 32, 33, 34, 35};
-  span<TypeParam> five_items(test_input.data(), 5);
-  EXPECT_FALSE(five_items.empty());
-  EXPECT_EQ(5, five_items.size());
-  EXPECT_EQ(sizeof(TypeParam) * 5,
-            static_cast<size_t>(five_items.size_bytes()));
-  EXPECT_EQ(five_items.begin() + 5, five_items.end());
-  EXPECT_EQ(31, five_items[0]);
-  EXPECT_EQ(32, five_items[1]);
-  EXPECT_EQ(33, five_items[2]);
-  EXPECT_EQ(34, five_items[3]);
-  EXPECT_EQ(35, five_items[4]);
-  span<TypeParam> three_items = five_items.subspan(2);
-  EXPECT_EQ(3, three_items.size());
-  EXPECT_EQ(33, three_items[0]);
-  EXPECT_EQ(34, three_items[1]);
-  EXPECT_EQ(35, three_items[2]);
-  span<TypeParam> two_items = five_items.subspan(2, 2);
-  EXPECT_EQ(2, two_items.size());
-  EXPECT_EQ(33, two_items[0]);
-  EXPECT_EQ(34, two_items[1]);
-}
-
-namespace cbor {
-
-// =============================================================================
-// Detecting CBOR content
-// =============================================================================
-
-TEST(IsCBORMessage, SomeSmokeTests) {
-  std::vector<uint8_t> empty;
-  EXPECT_FALSE(IsCBORMessage(SpanFromVector(empty)));
-  std::vector<uint8_t> hello = {'H', 'e', 'l', 'o', ' ', 't',
-                                'h', 'e', 'r', 'e', '!'};
-  EXPECT_FALSE(IsCBORMessage(SpanFromVector(hello)));
-  std::vector<uint8_t> example = {0xd8, 0x5a, 0, 0, 0, 0};
-  EXPECT_TRUE(IsCBORMessage(SpanFromVector(example)));
-  std::vector<uint8_t> one = {0xd8, 0x5a, 0, 0, 0, 1, 1};
-  EXPECT_TRUE(IsCBORMessage(SpanFromVector(one)));
-}
-
-// =============================================================================
-// Encoding individual CBOR items
-// cbor::CBORTokenizer - for parsing individual CBOR items
-// =============================================================================
-
-//
-// EncodeInt32 / CBORTokenTag::INT32
-//
-TEST(EncodeDecodeInt32Test, Roundtrips23) {
-  // This roundtrips the int32_t value 23 through the pair of EncodeInt32 /
-  // CBORTokenizer; this is interesting since 23 is encoded as a single byte.
-  std::vector<uint8_t> encoded;
-  EncodeInt32(23, &encoded);
-  // first three bits: major type = 0; remaining five bits: additional info =
-  // value 23.
-  EXPECT_THAT(encoded, ElementsAreArray(std::array<uint8_t, 1>{{23}}));
-
-  // Reverse direction: decode with CBORTokenizer.
-  CBORTokenizer tokenizer(SpanFromVector(encoded));
-  EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag());
-  EXPECT_EQ(23, tokenizer.GetInt32());
-  tokenizer.Next();
-  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
-}
-
-TEST(EncodeDecodeInt32Test, RoundtripsUint8) {
-  // This roundtrips the int32_t value 42 through the pair of EncodeInt32 /
-  // CBORTokenizer. This is different from Roundtrip23 because 42 is encoded
-  // in an extra byte after the initial one.
-  std::vector<uint8_t> encoded;
-  EncodeInt32(42, &encoded);
-  // first three bits: major type = 0;
-  // remaining five bits: additional info = 24, indicating payload is uint8.
-  EXPECT_THAT(encoded, ElementsAreArray(std::array<uint8_t, 2>{{24, 42}}));
-
-  // Reverse direction: decode with CBORTokenizer.
-  CBORTokenizer tokenizer(SpanFromVector(encoded));
-  EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag());
-  EXPECT_EQ(42, tokenizer.GetInt32());
-  tokenizer.Next();
-  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
-}
-
-TEST(EncodeDecodeInt32Test, RoundtripsUint16) {
-  // 500 is encoded as a uint16 after the initial byte.
-  std::vector<uint8_t> encoded;
-  EncodeInt32(500, &encoded);
-  // 1 for initial byte, 2 for uint16.
-  EXPECT_EQ(static_cast<std::size_t>(3), encoded.size());
-  // first three bits: major type = 0;
-  // remaining five bits: additional info = 25, indicating payload is uint16.
-  EXPECT_EQ(25, encoded[0]);
-  EXPECT_EQ(0x01, encoded[1]);
-  EXPECT_EQ(0xf4, encoded[2]);
-
-  // Reverse direction: decode with CBORTokenizer.
-  CBORTokenizer tokenizer(SpanFromVector(encoded));
-  EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag());
-  EXPECT_EQ(500, tokenizer.GetInt32());
-  tokenizer.Next();
-  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
-}
-
-TEST(EncodeDecodeInt32Test, RoundtripsInt32Max) {
-  // std::numeric_limits<int32_t> is encoded as a uint32 after the initial byte.
-  std::vector<uint8_t> encoded;
-  EncodeInt32(std::numeric_limits<int32_t>::max(), &encoded);
-  // 1 for initial byte, 4 for the uint32.
-  // first three bits: major type = 0;
-  // remaining five bits: additional info = 26, indicating payload is uint32.
-  EXPECT_THAT(
-      encoded,
-      ElementsAreArray(std::array<uint8_t, 5>{{26, 0x7f, 0xff, 0xff, 0xff}}));
-
-  // Reverse direction: decode with CBORTokenizer.
-  CBORTokenizer tokenizer(SpanFromVector(encoded));
-  EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag());
-  EXPECT_EQ(std::numeric_limits<int32_t>::max(), tokenizer.GetInt32());
-  tokenizer.Next();
-  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
-}
-
-TEST(EncodeDecodeInt32Test, CantRoundtripUint32) {
-  // 0xdeadbeef is a value which does not fit below
-  // std::numerical_limits<int32_t>::max(), so we can't encode
-  // it with EncodeInt32. However, CBOR does support this, so we
-  // encode it here manually with the internal routine, just to observe
-  // that it's considered an invalid int32 by CBORTokenizer.
-  std::vector<uint8_t> encoded;
-  internals::WriteTokenStart(MajorType::UNSIGNED, 0xdeadbeef, &encoded);
-  // 1 for initial byte, 4 for the uint32.
-  // first three bits: major type = 0;
-  // remaining five bits: additional info = 26, indicating payload is uint32.
-  EXPECT_THAT(
-      encoded,
-      ElementsAreArray(std::array<uint8_t, 5>{{26, 0xde, 0xad, 0xbe, 0xef}}));
-
-  // Now try to decode; we treat this as an invalid INT32.
-  CBORTokenizer tokenizer(SpanFromVector(encoded));
-  // 0xdeadbeef is > std::numerical_limits<int32_t>::max().
-  EXPECT_EQ(CBORTokenTag::ERROR_VALUE, tokenizer.TokenTag());
-  EXPECT_EQ(Error::CBOR_INVALID_INT32, tokenizer.Status().error);
-}
-
-TEST(EncodeDecodeInt32Test, DecodeErrorCases) {
-  struct TestCase {
-    std::vector<uint8_t> data;
-    std::string msg;
-  };
-  std::vector<TestCase> tests{
-      {TestCase{
-           {24},
-           "additional info = 24 would require 1 byte of payload (but it's 0)"},
-       TestCase{{27, 0xaa, 0xbb, 0xcc},
-                "additional info = 27 would require 8 bytes of payload (but "
-                "it's 3)"},
-       TestCase{{29}, "additional info = 29 isn't recognized"}}};
-
-  for (const TestCase& test : tests) {
-    SCOPED_TRACE(test.msg);
-    CBORTokenizer tokenizer(SpanFromVector(test.data));
-    EXPECT_EQ(CBORTokenTag::ERROR_VALUE, tokenizer.TokenTag());
-    EXPECT_EQ(Error::CBOR_INVALID_INT32, tokenizer.Status().error);
-  }
-}
-
-TEST(EncodeDecodeInt32Test, RoundtripsMinus24) {
-  // This roundtrips the int32_t value -24 through the pair of EncodeInt32 /
-  // CBORTokenizer; this is interesting since -24 is encoded as
-  // a single byte as NEGATIVE, and it tests the specific encoding
-  // (note how for unsigned the single byte covers values up to 23).
-  // Additional examples are covered in RoundtripsAdditionalExamples.
-  std::vector<uint8_t> encoded;
-  EncodeInt32(-24, &encoded);
-  // first three bits: major type = 1; remaining five bits: additional info =
-  // value 23.
-  EXPECT_THAT(encoded, ElementsAreArray(std::array<uint8_t, 1>{{1 << 5 | 23}}));
-
-  // Reverse direction: decode with CBORTokenizer.
-  CBORTokenizer tokenizer(SpanFromVector(encoded));
-  EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag());
-  EXPECT_EQ(-24, tokenizer.GetInt32());
-  tokenizer.Next();
-  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
-}
-
-TEST(EncodeDecodeInt32Test, RoundtripsAdditionalNegativeExamples) {
-  std::vector<int32_t> examples = {-1,
-                                   -10,
-                                   -24,
-                                   -25,
-                                   -300,
-                                   -30000,
-                                   -300 * 1000,
-                                   -1000 * 1000,
-                                   -1000 * 1000 * 1000,
-                                   std::numeric_limits<int32_t>::min()};
-  for (int32_t example : examples) {
-    SCOPED_TRACE(std::string("example ") + std::to_string(example));
-    std::vector<uint8_t> encoded;
-    EncodeInt32(example, &encoded);
-    CBORTokenizer tokenizer(SpanFromVector(encoded));
-    EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag());
-    EXPECT_EQ(example, tokenizer.GetInt32());
-    tokenizer.Next();
-    EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
-  }
-}
-
-//
-// EncodeString16 / CBORTokenTag::STRING16
-//
-TEST(EncodeDecodeString16Test, RoundtripsEmpty) {
-  // This roundtrips the empty utf16 string through the pair of EncodeString16 /
-  // CBORTokenizer.
-  std::vector<uint8_t> encoded;
-  EncodeString16(span<uint16_t>(), &encoded);
-  EXPECT_EQ(static_cast<std::size_t>(1), encoded.size());
-  // first three bits: major type = 2; remaining five bits: additional info =
-  // size 0.
-  EXPECT_EQ(2 << 5, encoded[0]);
-
-  // Reverse direction: decode with CBORTokenizer.
-  CBORTokenizer tokenizer(SpanFromVector(encoded));
-  EXPECT_EQ(CBORTokenTag::STRING16, tokenizer.TokenTag());
-  span<uint8_t> decoded_string16_wirerep = tokenizer.GetString16WireRep();
-  EXPECT_TRUE(decoded_string16_wirerep.empty());
-  tokenizer.Next();
-  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
-}
-
-// On the wire, we STRING16 is encoded as little endian (least
-// significant byte first). The host may or may not be little endian,
-// so this routine follows the advice in
-// https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html.
-std::vector<uint16_t> String16WireRepToHost(span<uint8_t> in) {
-  CHECK_EQ(in.size() & 1, 0);  // must be even number of bytes.
-  std::vector<uint16_t> host_out;
-  for (std::ptrdiff_t ii = 0; ii < in.size(); ii += 2)
-    host_out.push_back(in[ii + 1] << 8 | in[ii]);
-  return host_out;
-}
-
-TEST(EncodeDecodeString16Test, RoundtripsHelloWorld) {
-  // This roundtrips the hello world message which is given here in utf16
-  // characters. 0xd83c, 0xdf0e: UTF16 encoding for the "Earth Globe Americas"
-  // character, 🌎.
-  std::array<uint16_t, 10> msg{
-      {'H', 'e', 'l', 'l', 'o', ',', ' ', 0xd83c, 0xdf0e, '.'}};
-  std::vector<uint8_t> encoded;
-  EncodeString16(span<uint16_t>(msg.data(), msg.size()), &encoded);
-  // This will be encoded as BYTE_STRING of length 20, so the 20 is encoded in
-  // the additional info part of the initial byte. Payload is two bytes for each
-  // UTF16 character.
-  uint8_t initial_byte = /*major type=*/2 << 5 | /*additional info=*/20;
-  std::array<uint8_t, 21> encoded_expected = {
-      {initial_byte, 'H', 0,   'e', 0,    'l',  0,    'l',  0,   'o', 0,
-       ',',          0,   ' ', 0,   0x3c, 0xd8, 0x0e, 0xdf, '.', 0}};
-  EXPECT_THAT(encoded, ElementsAreArray(encoded_expected));
-
-  // Now decode to complete the roundtrip.
-  CBORTokenizer tokenizer(SpanFromVector(encoded));
-  EXPECT_EQ(CBORTokenTag::STRING16, tokenizer.TokenTag());
-  std::vector<uint16_t> decoded =
-      String16WireRepToHost(tokenizer.GetString16WireRep());
-  EXPECT_THAT(decoded, ElementsAreArray(msg));
-  tokenizer.Next();
-  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
-
-  // For bonus points, we look at the decoded message in UTF8 as well so we can
-  // easily see it on the terminal screen.
-  std::string utf8_decoded = UTF16ToUTF8(SpanFromVector(decoded));
-  EXPECT_EQ("Hello, 🌎.", utf8_decoded);
-}
-
-TEST(EncodeDecodeString16Test, Roundtrips500) {
-  // We roundtrip a message that has 250 16 bit values. Each of these are just
-  // set to their index. 250 is interesting because the cbor spec uses a
-  // BYTE_STRING of length 500 for one of their examples of how to encode the
-  // start of it (section 2.1) so it's easy for us to look at the first three
-  // bytes closely.
-  std::vector<uint16_t> two_fifty;
-  for (uint16_t ii = 0; ii < 250; ++ii)
-    two_fifty.push_back(ii);
-  std::vector<uint8_t> encoded;
-  EncodeString16(span<uint16_t>(two_fifty.data(), two_fifty.size()), &encoded);
-  EXPECT_EQ(static_cast<std::size_t>(3 + 250 * 2), encoded.size());
-  // Now check the first three bytes:
-  // Major type: 2 (BYTE_STRING)
-  // Additional information: 25, indicating size is represented by 2 bytes.
-  // Bytes 1 and 2 encode 500 (0x01f4).
-  EXPECT_EQ(2 << 5 | 25, encoded[0]);
-  EXPECT_EQ(0x01, encoded[1]);
-  EXPECT_EQ(0xf4, encoded[2]);
-
-  // Now decode to complete the roundtrip.
-  CBORTokenizer tokenizer(SpanFromVector(encoded));
-  EXPECT_EQ(CBORTokenTag::STRING16, tokenizer.TokenTag());
-  std::vector<uint16_t> decoded =
-      String16WireRepToHost(tokenizer.GetString16WireRep());
-  EXPECT_THAT(decoded, ElementsAreArray(two_fifty));
-  tokenizer.Next();
-  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
-}
-
-TEST(EncodeDecodeString16Test, ErrorCases) {
-  struct TestCase {
-    std::vector<uint8_t> data;
-    std::string msg;
-  };
-  std::vector<TestCase> tests{
-      {TestCase{{2 << 5 | 1, 'a'},
-                "length must be divisible by 2 (but it's 1)"},
-       TestCase{{2 << 5 | 29}, "additional info = 29 isn't recognized"}}};
-  for (const TestCase& test : tests) {
-    SCOPED_TRACE(test.msg);
-    CBORTokenizer tokenizer(SpanFromVector(test.data));
-    EXPECT_EQ(CBORTokenTag::ERROR_VALUE, tokenizer.TokenTag());
-    EXPECT_EQ(Error::CBOR_INVALID_STRING16, tokenizer.Status().error);
-  }
-}
-
-//
-// EncodeString8 / CBORTokenTag::STRING8
-//
-TEST(EncodeDecodeString8Test, RoundtripsHelloWorld) {
-  // This roundtrips the hello world message which is given here in utf8
-  // characters. 🌎 is a four byte utf8 character.
-  std::string utf8_msg = "Hello, 🌎.";
-  std::vector<uint8_t> msg(utf8_msg.begin(), utf8_msg.end());
-  std::vector<uint8_t> encoded;
-  EncodeString8(SpanFromStdString(utf8_msg), &encoded);
-  // This will be encoded as STRING of length 12, so the 12 is encoded in
-  // the additional info part of the initial byte. Payload is one byte per
-  // utf8 byte.
-  uint8_t initial_byte = /*major type=*/3 << 5 | /*additional info=*/12;
-  std::array<uint8_t, 13> encoded_expected = {{initial_byte, 'H', 'e', 'l', 'l',
-                                               'o', ',', ' ', 0xF0, 0x9f, 0x8c,
-                                               0x8e, '.'}};
-  EXPECT_THAT(encoded, ElementsAreArray(encoded_expected));
-
-  // Now decode to complete the roundtrip.
-  CBORTokenizer tokenizer(SpanFromVector(encoded));
-  EXPECT_EQ(CBORTokenTag::STRING8, tokenizer.TokenTag());
-  std::vector<uint8_t> decoded(tokenizer.GetString8().begin(),
-                               tokenizer.GetString8().end());
-  EXPECT_THAT(decoded, ElementsAreArray(msg));
-  tokenizer.Next();
-  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
-}
-
-TEST(EncodeFromLatin1Test, ConvertsToUTF8IfNeeded) {
-  std::vector<std::pair<std::string, std::string>> examples = {
-      {"Hello, world.", "Hello, world."},
-      {"Above: \xDC"
-       "ber",
-       "Above: Über"},
-      {"\xA5 500 are about \xA3 3.50; a y with umlaut is \xFF",
-       "¥ 500 are about £ 3.50; a y with umlaut is ÿ"}};
-
-  for (const auto& example : examples) {
-    const std::string& latin1 = example.first;
-    const std::string& expected_utf8 = example.second;
-    std::vector<uint8_t> encoded;
-    EncodeFromLatin1(SpanFromStdString(latin1), &encoded);
-    CBORTokenizer tokenizer(SpanFromVector(encoded));
-    EXPECT_EQ(CBORTokenTag::STRING8, tokenizer.TokenTag());
-    std::vector<uint8_t> decoded(tokenizer.GetString8().begin(),
-                                 tokenizer.GetString8().end());
-    std::string decoded_str(decoded.begin(), decoded.end());
-    EXPECT_THAT(decoded_str, testing::Eq(expected_utf8));
-  }
-}
-
-TEST(EncodeFromUTF16Test, ConvertsToUTF8IfEasy) {
-  std::vector<uint16_t> ascii = {'e', 'a', 's', 'y'};
-  std::vector<uint8_t> encoded;
-  EncodeFromUTF16(span<uint16_t>(ascii.data(), ascii.size()), &encoded);
-
-  CBORTokenizer tokenizer(SpanFromVector(encoded));
-  EXPECT_EQ(CBORTokenTag::STRING8, tokenizer.TokenTag());
-  std::vector<uint8_t> decoded(tokenizer.GetString8().begin(),
-                               tokenizer.GetString8().end());
-  std::string decoded_str(decoded.begin(), decoded.end());
-  EXPECT_THAT(decoded_str, testing::Eq("easy"));
-}
-
-TEST(EncodeFromUTF16Test, EncodesAsString16IfNeeded) {
-  // Since this message contains non-ASCII characters, the routine is
-  // forced to encode as UTF16. We see this below by checking that the
-  // token tag is STRING16.
-  std::vector<uint16_t> msg = {'H', 'e', 'l',    'l',    'o',
-                               ',', ' ', 0xd83c, 0xdf0e, '.'};
-  std::vector<uint8_t> encoded;
-  EncodeFromUTF16(span<uint16_t>(msg.data(), msg.size()), &encoded);
-
-  CBORTokenizer tokenizer(SpanFromVector(encoded));
-  EXPECT_EQ(CBORTokenTag::STRING16, tokenizer.TokenTag());
-  std::vector<uint16_t> decoded =
-      String16WireRepToHost(tokenizer.GetString16WireRep());
-  std::string utf8_decoded = UTF16ToUTF8(SpanFromVector(decoded));
-  EXPECT_EQ("Hello, 🌎.", utf8_decoded);
-}
-
-//
-// EncodeBinary / CBORTokenTag::BINARY
-//
-TEST(EncodeDecodeBinaryTest, RoundtripsHelloWorld) {
-  std::vector<uint8_t> binary = {'H', 'e', 'l', 'l', 'o', ',', ' ',
-                                 'w', 'o', 'r', 'l', 'd', '.'};
-  std::vector<uint8_t> encoded;
-  EncodeBinary(span<uint8_t>(binary.data(), binary.size()), &encoded);
-  // So, on the wire we see that the binary blob travels unmodified.
-  EXPECT_THAT(
-      encoded,
-      ElementsAreArray(std::array<uint8_t, 15>{
-          {(6 << 5 | 22),  // tag 22 indicating base64 interpretation in JSON
-           (2 << 5 | 13),  // BYTE_STRING (type 2) of length 13
-           'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '.'}}));
-  std::vector<uint8_t> decoded;
-  CBORTokenizer tokenizer(SpanFromVector(encoded));
-  EXPECT_EQ(CBORTokenTag::BINARY, tokenizer.TokenTag());
-  EXPECT_EQ(0, int(tokenizer.Status().error));
-  decoded = std::vector<uint8_t>(tokenizer.GetBinary().begin(),
-                                 tokenizer.GetBinary().end());
-  EXPECT_THAT(decoded, ElementsAreArray(binary));
-  tokenizer.Next();
-  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
-}
-
-//
-// EncodeDouble / CBORTokenTag::DOUBLE
-//
-TEST(EncodeDecodeDoubleTest, RoundtripsWikipediaExample) {
-  // https://en.wikipedia.org/wiki/Double-precision_floating-point_format
-  // provides the example of a hex representation 3FD5 5555 5555 5555, which
-  // approximates 1/3.
-
-  const double kOriginalValue = 1.0 / 3;
-  std::vector<uint8_t> encoded;
-  EncodeDouble(kOriginalValue, &encoded);
-  // first three bits: major type = 7; remaining five bits: additional info =
-  // value 27. This is followed by 8 bytes of payload (which match Wikipedia).
-  EXPECT_THAT(
-      encoded,
-      ElementsAreArray(std::array<uint8_t, 9>{
-          {7 << 5 | 27, 0x3f, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55}}));
-
-  // Reverse direction: decode and compare with original value.
-  CBORTokenizer tokenizer(SpanFromVector(encoded));
-  EXPECT_EQ(CBORTokenTag::DOUBLE, tokenizer.TokenTag());
-  EXPECT_THAT(tokenizer.GetDouble(), testing::DoubleEq(kOriginalValue));
-  tokenizer.Next();
-  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
-}
-
-TEST(EncodeDecodeDoubleTest, RoundtripsAdditionalExamples) {
-  std::vector<double> examples = {0.0,
-                                  1.0,
-                                  -1.0,
-                                  3.1415,
-                                  std::numeric_limits<double>::min(),
-                                  std::numeric_limits<double>::max(),
-                                  std::numeric_limits<double>::infinity(),
-                                  std::numeric_limits<double>::quiet_NaN()};
-  for (double example : examples) {
-    SCOPED_TRACE(std::string("example ") + std::to_string(example));
-    std::vector<uint8_t> encoded;
-    EncodeDouble(example, &encoded);
-    CBORTokenizer tokenizer(SpanFromVector(encoded));
-    EXPECT_EQ(CBORTokenTag::DOUBLE, tokenizer.TokenTag());
-    if (std::isnan(example))
-      EXPECT_TRUE(std::isnan(tokenizer.GetDouble()));
-    else
-      EXPECT_THAT(tokenizer.GetDouble(), testing::DoubleEq(example));
-    tokenizer.Next();
-    EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
-  }
-}
-
-// =============================================================================
-// cbor::NewCBOREncoder - for encoding from a streaming parser
-// =============================================================================
-
-void EncodeUTF8ForTest(const std::string& key, std::vector<uint8_t>* out) {
-  EncodeString8(SpanFromStdString(key), out);
-}
-TEST(JSONToCBOREncoderTest, SevenBitStrings) {
-  // When a string can be represented as 7 bit ASCII, the encoder will use the
-  // STRING (major Type 3) type, so the actual characters end up as bytes on the
-  // wire.
-  std::vector<uint8_t> encoded;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> encoder =
-      NewCBOREncoder(&encoded, &status);
-  std::vector<uint16_t> utf16 = {'f', 'o', 'o'};
-  encoder->HandleString16(span<uint16_t>(utf16.data(), utf16.size()));
-  EXPECT_EQ(Error::OK, status.error);
-  // Here we assert that indeed, seven bit strings are represented as
-  // bytes on the wire, "foo" is just "foo".
-  EXPECT_THAT(encoded,
-              ElementsAreArray(std::array<uint8_t, 4>{
-                  {/*major type 3*/ 3 << 5 | /*length*/ 3, 'f', 'o', 'o'}}));
-}
-
-TEST(JsonCborRoundtrip, EncodingDecoding) {
-  // Hits all the cases except binary and error in StreamingParserHandler, first
-  // parsing a JSON message into CBOR, then parsing it back from CBOR into JSON.
-  std::string json =
-      "{"
-      "\"string\":\"Hello, \\ud83c\\udf0e.\","
-      "\"double\":3.1415,"
-      "\"int\":1,"
-      "\"negative int\":-1,"
-      "\"bool\":true,"
-      "\"null\":null,"
-      "\"array\":[1,2,3]"
-      "}";
-  std::vector<uint8_t> encoded;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> encoder =
-      NewCBOREncoder(&encoded, &status);
-  span<uint8_t> ascii_in = SpanFromStdString(json);
-  json::ParseJSON(GetTestPlatform(), ascii_in, encoder.get());
-  std::vector<uint8_t> expected = {
-      0xd8,            // envelope
-      0x5a,            // byte string with 32 bit length
-      0,    0, 0, 94,  // length is 94 bytes
-  };
-  expected.push_back(0xbf);  // indef length map start
-  EncodeString8(SpanFromStdString("string"), &expected);
-  // This is followed by the encoded string for "Hello, 🌎."
-  // So, it's the same bytes that we tested above in
-  // EncodeDecodeString16Test.RoundtripsHelloWorld.
-  expected.push_back(/*major type=*/2 << 5 | /*additional info=*/20);
-  for (uint8_t ch : std::array<uint8_t, 20>{
-           {'H', 0, 'e', 0, 'l',  0,    'l',  0,    'o', 0,
-            ',', 0, ' ', 0, 0x3c, 0xd8, 0x0e, 0xdf, '.', 0}})
-    expected.push_back(ch);
-  EncodeString8(SpanFromStdString("double"), &expected);
-  EncodeDouble(3.1415, &expected);
-  EncodeString8(SpanFromStdString("int"), &expected);
-  EncodeInt32(1, &expected);
-  EncodeString8(SpanFromStdString("negative int"), &expected);
-  EncodeInt32(-1, &expected);
-  EncodeString8(SpanFromStdString("bool"), &expected);
-  expected.push_back(7 << 5 | 21);  // RFC 7049 Section 2.3, Table 2: true
-  EncodeString8(SpanFromStdString("null"), &expected);
-  expected.push_back(7 << 5 | 22);  // RFC 7049 Section 2.3, Table 2: null
-  EncodeString8(SpanFromStdString("array"), &expected);
-  expected.push_back(0xd8);  // envelope
-  expected.push_back(0x5a);  // byte string with 32 bit length
-  // the length is 5 bytes (that's up to end indef length array below).
-  for (uint8_t ch : std::array<uint8_t, 4>{{0, 0, 0, 5}})
-    expected.push_back(ch);
-  expected.push_back(0x9f);  // RFC 7049 Section 2.2.1, indef length array start
-  expected.push_back(1);     // Three UNSIGNED values (easy since Major Type 0)
-  expected.push_back(2);
-  expected.push_back(3);
-  expected.push_back(0xff);  // End indef length array
-  expected.push_back(0xff);  // End indef length map
-  EXPECT_TRUE(status.ok());
-  EXPECT_THAT(encoded, ElementsAreArray(expected));
-
-  // And now we roundtrip, decoding the message we just encoded.
-  std::string decoded;
-  std::unique_ptr<StreamingParserHandler> json_encoder =
-      NewJSONEncoder(GetTestPlatform(), &decoded, &status);
-  ParseCBOR(span<uint8_t>(encoded.data(), encoded.size()), json_encoder.get());
-  EXPECT_EQ(Error::OK, status.error);
-  EXPECT_EQ(json, decoded);
-}
-
-TEST(JsonCborRoundtrip, MoreRoundtripExamples) {
-  std::vector<std::string> examples = {
-      // Tests that after closing a nested objects, additional key/value pairs
-      // are considered.
-      "{\"foo\":{\"bar\":1},\"baz\":2}", "{\"foo\":[1,2,3],\"baz\":2}"};
-  for (const std::string& json : examples) {
-    SCOPED_TRACE(std::string("example: ") + json);
-    std::vector<uint8_t> encoded;
-    Status status;
-    std::unique_ptr<StreamingParserHandler> encoder =
-        NewCBOREncoder(&encoded, &status);
-    span<uint8_t> ascii_in = SpanFromStdString(json);
-    ParseJSON(GetTestPlatform(), ascii_in, encoder.get());
-    std::string decoded;
-    std::unique_ptr<StreamingParserHandler> json_writer =
-        NewJSONEncoder(GetTestPlatform(), &decoded, &status);
-    ParseCBOR(span<uint8_t>(encoded.data(), encoded.size()), json_writer.get());
-    EXPECT_EQ(Error::OK, status.error);
-    EXPECT_EQ(json, decoded);
-  }
-}
-
-TEST(JSONToCBOREncoderTest, HelloWorldBinary_WithTripToJson) {
-  // The StreamingParserHandler::HandleBinary is a special case: The JSON parser
-  // will never call this method, because JSON does not natively support the
-  // binary type. So, we can't fully roundtrip. However, the other direction
-  // works: binary will be rendered in JSON, as a base64 string. So, we make
-  // calls to the encoder directly here, to construct a message, and one of
-  // these calls is ::HandleBinary, to which we pass a "binary" string
-  // containing "Hello, world.".
-  std::vector<uint8_t> encoded;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> encoder =
-      NewCBOREncoder(&encoded, &status);
-  encoder->HandleMapBegin();
-  // Emit a key.
-  std::vector<uint16_t> key = {'f', 'o', 'o'};
-  encoder->HandleString16(SpanFromVector(key));
-  // Emit the binary payload, an arbitrary array of bytes that happens to
-  // be the ascii message "Hello, world.".
-  encoder->HandleBinary(SpanFromVector(std::vector<uint8_t>{
-      'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '.'}));
-  encoder->HandleMapEnd();
-  EXPECT_EQ(Error::OK, status.error);
-
-  // Now drive the json writer via the CBOR decoder.
-  std::string decoded;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &decoded, &status);
-  ParseCBOR(SpanFromVector(encoded), json_writer.get());
-  EXPECT_EQ(Error::OK, status.error);
-  EXPECT_EQ(Status::npos(), status.pos);
-  // "Hello, world." in base64 is "SGVsbG8sIHdvcmxkLg==".
-  EXPECT_EQ("{\"foo\":\"SGVsbG8sIHdvcmxkLg==\"}", decoded);
-}
-
-// =============================================================================
-// cbor::ParseCBOR - for receiving streaming parser events for CBOR messages
-// =============================================================================
-
-TEST(ParseCBORTest, ParseEmptyCBORMessage) {
-  // An envelope starting with 0xd8, 0x5a, with the byte length
-  // of 2, containing a map that's empty (0xbf for map
-  // start, and 0xff for map end).
-  std::vector<uint8_t> in = {0xd8, 0x5a, 0, 0, 0, 2, 0xbf, 0xff};
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(in.data(), in.size()), json_writer.get());
-  EXPECT_EQ(Error::OK, status.error);
-  EXPECT_EQ("{}", out);
-}
-
-TEST(ParseCBORTest, ParseCBORHelloWorld) {
-  const uint8_t kPayloadLen = 27;
-  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen};
-  bytes.push_back(0xbf);                            // start indef length map.
-  EncodeString8(SpanFromStdString("msg"), &bytes);  // key: msg
-  // Now write the value, the familiar "Hello, 🌎." where the globe is expressed
-  // as two utf16 chars.
-  bytes.push_back(/*major type=*/2 << 5 | /*additional info=*/20);
-  for (uint8_t ch : std::array<uint8_t, 20>{
-           {'H', 0, 'e', 0, 'l',  0,    'l',  0,    'o', 0,
-            ',', 0, ' ', 0, 0x3c, 0xd8, 0x0e, 0xdf, '.', 0}})
-    bytes.push_back(ch);
-  bytes.push_back(0xff);  // stop byte
-  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
-
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-  EXPECT_EQ(Error::OK, status.error);
-  EXPECT_EQ("{\"msg\":\"Hello, \\ud83c\\udf0e.\"}", out);
-}
-
-TEST(ParseCBORTest, UTF8IsSupportedInKeys) {
-  const uint8_t kPayloadLen = 11;
-  std::vector<uint8_t> bytes = {cbor::InitialByteForEnvelope(),
-                                cbor::InitialByteFor32BitLengthByteString(),
-                                0,
-                                0,
-                                0,
-                                kPayloadLen};
-  bytes.push_back(cbor::EncodeIndefiniteLengthMapStart());
-  // Two UTF16 chars.
-  EncodeString8(SpanFromStdString("🌎"), &bytes);
-  // Can be encoded as a single UTF16 char.
-  EncodeString8(SpanFromStdString("☾"), &bytes);
-  bytes.push_back(cbor::EncodeStop());
-  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
-
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-  EXPECT_EQ(Error::OK, status.error);
-  EXPECT_EQ("{\"\\ud83c\\udf0e\":\"\\u263e\"}", out);
-}
-
-TEST(ParseCBORTest, NoInputError) {
-  std::vector<uint8_t> in = {};
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(in.data(), in.size()), json_writer.get());
-  EXPECT_EQ(Error::CBOR_NO_INPUT, status.error);
-  EXPECT_EQ("", out);
-}
-
-TEST(ParseCBORTest, InvalidStartByteError) {
-  // Here we test that some actual json, which usually starts with {,
-  // is not considered CBOR. CBOR messages must start with 0x5a, the
-  // envelope start byte.
-  std::string json = "{\"msg\": \"Hello, world.\"}";
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(SpanFromStdString(json), json_writer.get());
-  EXPECT_EQ(Error::CBOR_INVALID_START_BYTE, status.error);
-  EXPECT_EQ("", out);
-}
-
-TEST(ParseCBORTest, UnexpectedEofExpectedValueError) {
-  constexpr uint8_t kPayloadLen = 5;
-  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
-                                0xbf};                             // map start
-  // A key; so value would be next.
-  EncodeString8(SpanFromStdString("key"), &bytes);
-  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-  EXPECT_EQ(Error::CBOR_UNEXPECTED_EOF_EXPECTED_VALUE, status.error);
-  EXPECT_EQ(static_cast<int64_t>(bytes.size()), status.pos);
-  EXPECT_EQ("", out);
-}
-
-TEST(ParseCBORTest, UnexpectedEofInArrayError) {
-  constexpr uint8_t kPayloadLen = 8;
-  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
-                                0xbf};  // The byte for starting a map.
-  // A key; so value would be next.
-  EncodeString8(SpanFromStdString("array"), &bytes);
-  bytes.push_back(0x9f);  // byte for indefinite length array start.
-  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-  EXPECT_EQ(Error::CBOR_UNEXPECTED_EOF_IN_ARRAY, status.error);
-  EXPECT_EQ(static_cast<int64_t>(bytes.size()), status.pos);
-  EXPECT_EQ("", out);
-}
-
-TEST(ParseCBORTest, UnexpectedEofInMapError) {
-  constexpr uint8_t kPayloadLen = 1;
-  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
-                                0xbf};  // The byte for starting a map.
-  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-  EXPECT_EQ(Error::CBOR_UNEXPECTED_EOF_IN_MAP, status.error);
-  EXPECT_EQ(7, status.pos);
-  EXPECT_EQ("", out);
-}
-
-TEST(ParseCBORTest, InvalidMapKeyError) {
-  constexpr uint8_t kPayloadLen = 2;
-  std::vector<uint8_t> bytes = {0xd8,       0x5a, 0,
-                                0,          0,    kPayloadLen,  // envelope
-                                0xbf,                           // map start
-                                7 << 5 | 22};  // null (not a valid map key)
-  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-  EXPECT_EQ(Error::CBOR_INVALID_MAP_KEY, status.error);
-  EXPECT_EQ(7, status.pos);
-  EXPECT_EQ("", out);
-}
-
-std::vector<uint8_t> MakeNestedCBOR(int depth) {
-  std::vector<uint8_t> bytes;
-  std::vector<EnvelopeEncoder> envelopes;
-  for (int ii = 0; ii < depth; ++ii) {
-    envelopes.emplace_back();
-    envelopes.back().EncodeStart(&bytes);
-    bytes.push_back(0xbf);  // indef length map start
-    EncodeString8(SpanFromStdString("key"), &bytes);
-  }
-  EncodeString8(SpanFromStdString("innermost_value"), &bytes);
-  for (int ii = 0; ii < depth; ++ii) {
-    bytes.push_back(0xff);  // stop byte, finishes map.
-    envelopes.back().EncodeStop(&bytes);
-    envelopes.pop_back();
-  }
-  return bytes;
-}
-
-TEST(ParseCBORTest, StackLimitExceededError) {
-  {  // Depth 3: no stack limit exceeded error and is easy to inspect.
-    std::vector<uint8_t> bytes = MakeNestedCBOR(3);
-    std::string out;
-    Status status;
-    std::unique_ptr<StreamingParserHandler> json_writer =
-        NewJSONEncoder(GetTestPlatform(), &out, &status);
-    ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-    EXPECT_EQ(Error::OK, status.error);
-    EXPECT_EQ(Status::npos(), status.pos);
-    EXPECT_EQ("{\"key\":{\"key\":{\"key\":\"innermost_value\"}}}", out);
-  }
-  {  // Depth 1000: no stack limit exceeded.
-    std::vector<uint8_t> bytes = MakeNestedCBOR(1000);
-    std::string out;
-    Status status;
-    std::unique_ptr<StreamingParserHandler> json_writer =
-        NewJSONEncoder(GetTestPlatform(), &out, &status);
-    ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-    EXPECT_EQ(Error::OK, status.error);
-    EXPECT_EQ(Status::npos(), status.pos);
-  }
-
-  // We just want to know the length of one opening map so we can compute
-  // where the error is encountered. So we look at a small example and find
-  // the second envelope start.
-  std::vector<uint8_t> small_example = MakeNestedCBOR(3);
-  int64_t opening_segment_size = 1;  // Start after the first envelope start.
-  while (opening_segment_size < static_cast<int64_t>(small_example.size()) &&
-         small_example[opening_segment_size] != 0xd8)
-    opening_segment_size++;
-
-  {  // Depth 1001: limit exceeded.
-    std::vector<uint8_t> bytes = MakeNestedCBOR(1001);
-    std::string out;
-    Status status;
-    std::unique_ptr<StreamingParserHandler> json_writer =
-        NewJSONEncoder(GetTestPlatform(), &out, &status);
-    ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-    EXPECT_EQ(Error::CBOR_STACK_LIMIT_EXCEEDED, status.error);
-    EXPECT_EQ(opening_segment_size * 1001, status.pos);
-  }
-  {  // Depth 1200: still limit exceeded, and at the same pos as for 1001
-    std::vector<uint8_t> bytes = MakeNestedCBOR(1200);
-    std::string out;
-    Status status;
-    std::unique_ptr<StreamingParserHandler> json_writer =
-        NewJSONEncoder(GetTestPlatform(), &out, &status);
-    ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-    EXPECT_EQ(Error::CBOR_STACK_LIMIT_EXCEEDED, status.error);
-    EXPECT_EQ(opening_segment_size * 1001, status.pos);
-  }
-}
-
-TEST(ParseCBORTest, UnsupportedValueError) {
-  constexpr uint8_t kPayloadLen = 6;
-  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
-                                0xbf};                             // map start
-  EncodeString8(SpanFromStdString("key"), &bytes);
-  int64_t error_pos = bytes.size();
-  bytes.push_back(6 << 5 | 5);  // tags aren't supported yet.
-  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
-
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-  EXPECT_EQ(Error::CBOR_UNSUPPORTED_VALUE, status.error);
-  EXPECT_EQ(error_pos, status.pos);
-  EXPECT_EQ("", out);
-}
-
-TEST(ParseCBORTest, InvalidString16Error) {
-  constexpr uint8_t kPayloadLen = 11;
-  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
-                                0xbf};                             // map start
-  EncodeString8(SpanFromStdString("key"), &bytes);
-  int64_t error_pos = bytes.size();
-  // a BYTE_STRING of length 5 as value; since we interpret these as string16,
-  // it's going to be invalid as each character would need two bytes, but
-  // 5 isn't divisible by 2.
-  bytes.push_back(2 << 5 | 5);
-  for (int ii = 0; ii < 5; ++ii)
-    bytes.push_back(' ');
-  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-  EXPECT_EQ(Error::CBOR_INVALID_STRING16, status.error);
-  EXPECT_EQ(error_pos, status.pos);
-  EXPECT_EQ("", out);
-}
-
-TEST(ParseCBORTest, InvalidString8Error) {
-  constexpr uint8_t kPayloadLen = 6;
-  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
-                                0xbf};                             // map start
-  EncodeString8(SpanFromStdString("key"), &bytes);
-  int64_t error_pos = bytes.size();
-  // a STRING of length 5 as value, but we're at the end of the bytes array
-  // so it can't be decoded successfully.
-  bytes.push_back(3 << 5 | 5);
-  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-  EXPECT_EQ(Error::CBOR_INVALID_STRING8, status.error);
-  EXPECT_EQ(error_pos, status.pos);
-  EXPECT_EQ("", out);
-}
-
-TEST(ParseCBORTest, InvalidBinaryError) {
-  constexpr uint8_t kPayloadLen = 9;
-  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
-                                0xbf};                             // map start
-  EncodeString8(SpanFromStdString("key"), &bytes);
-  int64_t error_pos = bytes.size();
-  bytes.push_back(6 << 5 | 22);  // base64 hint for JSON; indicates binary
-  bytes.push_back(2 << 5 | 10);  // BYTE_STRING (major type 2) of length 10
-  // Just two garbage bytes, not enough for the binary.
-  bytes.push_back(0x31);
-  bytes.push_back(0x23);
-  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-  EXPECT_EQ(Error::CBOR_INVALID_BINARY, status.error);
-  EXPECT_EQ(error_pos, status.pos);
-  EXPECT_EQ("", out);
-}
-
-TEST(ParseCBORTest, InvalidDoubleError) {
-  constexpr uint8_t kPayloadLen = 8;
-  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
-                                0xbf};                             // map start
-  EncodeString8(SpanFromStdString("key"), &bytes);
-  int64_t error_pos = bytes.size();
-  bytes.push_back(7 << 5 | 27);  // initial byte for double
-  // Just two garbage bytes, not enough to represent an actual double.
-  bytes.push_back(0x31);
-  bytes.push_back(0x23);
-  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-  EXPECT_EQ(Error::CBOR_INVALID_DOUBLE, status.error);
-  EXPECT_EQ(error_pos, status.pos);
-  EXPECT_EQ("", out);
-}
-
-TEST(ParseCBORTest, InvalidSignedError) {
-  constexpr uint8_t kPayloadLen = 14;
-  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
-                                0xbf};                             // map start
-  EncodeString8(SpanFromStdString("key"), &bytes);
-  int64_t error_pos = bytes.size();
-  // uint64_t max is a perfectly fine value to encode as CBOR unsigned,
-  // but we don't support this since we only cover the int32_t range.
-  internals::WriteTokenStart(MajorType::UNSIGNED,
-                             std::numeric_limits<uint64_t>::max(), &bytes);
-  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-  EXPECT_EQ(Error::CBOR_INVALID_INT32, status.error);
-  EXPECT_EQ(error_pos, status.pos);
-  EXPECT_EQ("", out);
-}
-
-TEST(ParseCBORTest, TrailingJunk) {
-  constexpr uint8_t kPayloadLen = 35;
-  std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
-                                0xbf};                             // map start
-  EncodeString8(SpanFromStdString("key"), &bytes);
-  EncodeString8(SpanFromStdString("value"), &bytes);
-  bytes.push_back(0xff);  // Up to here, it's a perfectly fine msg.
-  int64_t error_pos = bytes.size();
-  EncodeString8(SpanFromStdString("trailing junk"), &bytes);
-
-  internals::WriteTokenStart(MajorType::UNSIGNED,
-                             std::numeric_limits<uint64_t>::max(), &bytes);
-  EXPECT_EQ(kPayloadLen, bytes.size() - 6);
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> json_writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
-  EXPECT_EQ(Error::CBOR_TRAILING_JUNK, status.error);
-  EXPECT_EQ(error_pos, status.pos);
-  EXPECT_EQ("", out);
-}
-}  // namespace cbor
-
-namespace json {
-
-// =============================================================================
-// json::NewJSONEncoder - for encoding streaming parser events as JSON
-// =============================================================================
-
-void WriteUTF8AsUTF16(StreamingParserHandler* writer, const std::string& utf8) {
-  writer->HandleString16(SpanFromVector(UTF8ToUTF16(SpanFromStdString(utf8))));
-}
-
-TEST(JsonStdStringWriterTest, HelloWorld) {
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  writer->HandleMapBegin();
-  WriteUTF8AsUTF16(writer.get(), "msg1");
-  WriteUTF8AsUTF16(writer.get(), "Hello, 🌎.");
-  std::string key = "msg1-as-utf8";
-  std::string value = "Hello, 🌎.";
-  writer->HandleString8(SpanFromStdString(key));
-  writer->HandleString8(SpanFromStdString(value));
-  WriteUTF8AsUTF16(writer.get(), "msg2");
-  WriteUTF8AsUTF16(writer.get(), "\\\b\r\n\t\f\"");
-  WriteUTF8AsUTF16(writer.get(), "nested");
-  writer->HandleMapBegin();
-  WriteUTF8AsUTF16(writer.get(), "double");
-  writer->HandleDouble(3.1415);
-  WriteUTF8AsUTF16(writer.get(), "int");
-  writer->HandleInt32(-42);
-  WriteUTF8AsUTF16(writer.get(), "bool");
-  writer->HandleBool(false);
-  WriteUTF8AsUTF16(writer.get(), "null");
-  writer->HandleNull();
-  writer->HandleMapEnd();
-  WriteUTF8AsUTF16(writer.get(), "array");
-  writer->HandleArrayBegin();
-  writer->HandleInt32(1);
-  writer->HandleInt32(2);
-  writer->HandleInt32(3);
-  writer->HandleArrayEnd();
-  writer->HandleMapEnd();
-  EXPECT_TRUE(status.ok());
-  EXPECT_EQ(
-      "{\"msg1\":\"Hello, \\ud83c\\udf0e.\","
-      "\"msg1-as-utf8\":\"Hello, \\ud83c\\udf0e.\","
-      "\"msg2\":\"\\\\\\b\\r\\n\\t\\f\\\"\","
-      "\"nested\":{\"double\":3.1415,\"int\":-42,"
-      "\"bool\":false,\"null\":null},\"array\":[1,2,3]}",
-      out);
-}
-
-TEST(JsonStdStringWriterTest, BinaryEncodedAsJsonString) {
-  // The encoder emits binary submitted to StreamingParserHandler::HandleBinary
-  // as base64. The following three examples are taken from
-  // https://en.wikipedia.org/wiki/Base64.
-  {
-    std::string out;
-    Status status;
-    std::unique_ptr<StreamingParserHandler> writer =
-        NewJSONEncoder(GetTestPlatform(), &out, &status);
-    writer->HandleBinary(SpanFromVector(std::vector<uint8_t>({'M', 'a', 'n'})));
-    EXPECT_TRUE(status.ok());
-    EXPECT_EQ("\"TWFu\"", out);
-  }
-  {
-    std::string out;
-    Status status;
-    std::unique_ptr<StreamingParserHandler> writer =
-        NewJSONEncoder(GetTestPlatform(), &out, &status);
-    writer->HandleBinary(SpanFromVector(std::vector<uint8_t>({'M', 'a'})));
-    EXPECT_TRUE(status.ok());
-    EXPECT_EQ("\"TWE=\"", out);
-  }
-  {
-    std::string out;
-    Status status;
-    std::unique_ptr<StreamingParserHandler> writer =
-        NewJSONEncoder(GetTestPlatform(), &out, &status);
-    writer->HandleBinary(SpanFromVector(std::vector<uint8_t>({'M'})));
-    EXPECT_TRUE(status.ok());
-    EXPECT_EQ("\"TQ==\"", out);
-  }
-  {  // "Hello, world.", verified with base64decode.org.
-    std::string out;
-    Status status;
-    std::unique_ptr<StreamingParserHandler> writer =
-        NewJSONEncoder(GetTestPlatform(), &out, &status);
-    writer->HandleBinary(SpanFromVector(std::vector<uint8_t>(
-        {'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '.'})));
-    EXPECT_TRUE(status.ok());
-    EXPECT_EQ("\"SGVsbG8sIHdvcmxkLg==\"", out);
-  }
-}
-
-TEST(JsonStdStringWriterTest, HandlesErrors) {
-  // When an error is sent via HandleError, it saves it in the provided
-  // status and clears the output.
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> writer =
-      NewJSONEncoder(GetTestPlatform(), &out, &status);
-  writer->HandleMapBegin();
-  WriteUTF8AsUTF16(writer.get(), "msg1");
-  writer->HandleError(Status{Error::JSON_PARSER_VALUE_EXPECTED, 42});
-  EXPECT_EQ(Error::JSON_PARSER_VALUE_EXPECTED, status.error);
-  EXPECT_EQ(42, status.pos);
-  EXPECT_EQ("", out);
-}
-
-// We'd use Gmock but unfortunately it only handles copyable return types.
-class MockPlatform : public Platform {
- public:
-  // Not implemented.
-  bool StrToD(const char* str, double* result) const override { return false; }
-
-  // A map with pre-registered responses for DToSTr.
-  std::map<double, std::string> dtostr_responses;
-
-  std::unique_ptr<char[]> DToStr(double value) const override {
-    auto it = dtostr_responses.find(value);
-    CHECK(it != dtostr_responses.end());
-    const std::string& str = it->second;
-    std::unique_ptr<char[]> response(new char[str.size() + 1]);
-    memcpy(response.get(), str.c_str(), str.size() + 1);
-    return response;
-  }
-};
-
-TEST(JsonStdStringWriterTest, DoubleToString) {
-  // This "broken" platform responds without the leading 0 before the
-  // decimal dot, so it'd be invalid JSON.
-  MockPlatform platform;
-  platform.dtostr_responses[.1] = ".1";
-  platform.dtostr_responses[-.7] = "-.7";
-
-  std::string out;
-  Status status;
-  std::unique_ptr<StreamingParserHandler> writer =
-      NewJSONEncoder(&platform, &out, &status);
-  writer->HandleArrayBegin();
-  writer->HandleDouble(.1);
-  writer->HandleDouble(-.7);
-  writer->HandleArrayEnd();
-  EXPECT_EQ("[0.1,-0.7]", out);
-}
-
-// =============================================================================
-// json::ParseJSON - for receiving streaming parser events for JSON
-// =============================================================================
-
-class Log : public StreamingParserHandler {
- public:
-  void HandleMapBegin() override { log_ << "map begin\n"; }
-
-  void HandleMapEnd() override { log_ << "map end\n"; }
-
-  void HandleArrayBegin() override { log_ << "array begin\n"; }
-
-  void HandleArrayEnd() override { log_ << "array end\n"; }
-
-  void HandleString8(span<uint8_t> chars) override {
-    log_ << "string8: " << std::string(chars.begin(), chars.end()) << "\n";
-  }
-
-  void HandleString16(span<uint16_t> chars) override {
-    log_ << "string16: " << UTF16ToUTF8(chars) << "\n";
-  }
-
-  void HandleBinary(span<uint8_t> bytes) override {
-    // JSON doesn't have native support for arbitrary bytes, so our parser will
-    // never call this.
-    CHECK(false);
-  }
-
-  void HandleDouble(double value) override {
-    log_ << "double: " << value << "\n";
-  }
-
-  void HandleInt32(int32_t value) override { log_ << "int: " << value << "\n"; }
-
-  void HandleBool(bool value) override { log_ << "bool: " << value << "\n"; }
-
-  void HandleNull() override { log_ << "null\n"; }
-
-  void HandleError(Status status) override { status_ = status; }
-
-  std::string str() const { return status_.ok() ? log_.str() : ""; }
-
-  Status status() const { return status_; }
-
- private:
-  std::ostringstream log_;
-  Status status_;
-};
-
-class JsonParserTest : public ::testing::Test {
- protected:
-  Log log_;
-};
-
-TEST_F(JsonParserTest, SimpleDictionary) {
-  std::string json = "{\"foo\": 42}";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_TRUE(log_.status().ok());
-  EXPECT_EQ(
-      "map begin\n"
-      "string16: foo\n"
-      "int: 42\n"
-      "map end\n",
-      log_.str());
-}
-
-TEST_F(JsonParserTest, Whitespace) {
-  std::string json = "\n  {\n\"msg\"\n: \v\"Hello, world.\"\t\r}\t";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_TRUE(log_.status().ok());
-  EXPECT_EQ(
-      "map begin\n"
-      "string16: msg\n"
-      "string16: Hello, world.\n"
-      "map end\n",
-      log_.str());
-}
-
-TEST_F(JsonParserTest, NestedDictionary) {
-  std::string json = "{\"foo\": {\"bar\": {\"baz\": 1}, \"bar2\": 2}}";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_TRUE(log_.status().ok());
-  EXPECT_EQ(
-      "map begin\n"
-      "string16: foo\n"
-      "map begin\n"
-      "string16: bar\n"
-      "map begin\n"
-      "string16: baz\n"
-      "int: 1\n"
-      "map end\n"
-      "string16: bar2\n"
-      "int: 2\n"
-      "map end\n"
-      "map end\n",
-      log_.str());
-}
-
-TEST_F(JsonParserTest, Doubles) {
-  std::string json = "{\"foo\": 3.1415, \"bar\": 31415e-4}";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_TRUE(log_.status().ok());
-  EXPECT_EQ(
-      "map begin\n"
-      "string16: foo\n"
-      "double: 3.1415\n"
-      "string16: bar\n"
-      "double: 3.1415\n"
-      "map end\n",
-      log_.str());
-}
-
-TEST_F(JsonParserTest, Unicode) {
-  // Globe character. 0xF0 0x9F 0x8C 0x8E in utf8, 0xD83C 0xDF0E in utf16.
-  std::string json = "{\"msg\": \"Hello, \\uD83C\\uDF0E.\"}";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_TRUE(log_.status().ok());
-  EXPECT_EQ(
-      "map begin\n"
-      "string16: msg\n"
-      "string16: Hello, 🌎.\n"
-      "map end\n",
-      log_.str());
-}
-
-TEST_F(JsonParserTest, Unicode_ParseUtf16) {
-  // Globe character. utf8: 0xF0 0x9F 0x8C 0x8E; utf16: 0xD83C 0xDF0E.
-  // Crescent moon character. utf8: 0xF0 0x9F 0x8C 0x99; utf16: 0xD83C 0xDF19.
-
-  // We provide the moon with json escape, but the earth as utf16 input.
-  // Either way they arrive as utf8 (after decoding in log_.str()).
-  std::vector<uint16_t> json =
-      UTF8ToUTF16(SpanFromStdString("{\"space\": \"🌎 \\uD83C\\uDF19.\"}"));
-  ParseJSON(GetTestPlatform(), SpanFromVector(json), &log_);
-  EXPECT_TRUE(log_.status().ok());
-  EXPECT_EQ(
-      "map begin\n"
-      "string16: space\n"
-      "string16: 🌎 🌙.\n"
-      "map end\n",
-      log_.str());
-}
-
-TEST_F(JsonParserTest, Unicode_ParseUtf8) {
-  // Used below:
-  // гласность - example for 2 byte utf8, Russian word "glasnost"
-  // 屋 - example for 3 byte utf8, Chinese word for "house"
-  // 🌎 - example for 4 byte utf8: 0xF0 0x9F 0x8C 0x8E; utf16: 0xD83C 0xDF0E.
-  // 🌙 - example for escapes: utf8: 0xF0 0x9F 0x8C 0x99; utf16: 0xD83C 0xDF19.
-
-  // We provide the moon with json escape, but the earth as utf8 input.
-  // Either way they arrive as utf8 (after decoding in log_.str()).
-  std::string json =
-      "{"
-      "\"escapes\": \"\\uD83C\\uDF19\","
-      "\"2 byte\":\"гласность\","
-      "\"3 byte\":\"屋\","
-      "\"4 byte\":\"🌎\""
-      "}";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_TRUE(log_.status().ok());
-  EXPECT_EQ(
-      "map begin\n"
-      "string16: escapes\n"
-      "string16: 🌙\n"
-      "string16: 2 byte\n"
-      "string16: гласность\n"
-      "string16: 3 byte\n"
-      "string16: 屋\n"
-      "string16: 4 byte\n"
-      "string16: 🌎\n"
-      "map end\n",
-      log_.str());
-}
-
-TEST_F(JsonParserTest, UnprocessedInputRemainsError) {
-  // Trailing junk after the valid JSON.
-  std::string json = "{\"foo\": 3.1415} junk";
-  int64_t junk_idx = json.find("junk");
-  EXPECT_GT(junk_idx, 0);
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_EQ(Error::JSON_PARSER_UNPROCESSED_INPUT_REMAINS, log_.status().error);
-  EXPECT_EQ(junk_idx, log_.status().pos);
-  EXPECT_EQ("", log_.str());
-}
-
-std::string MakeNestedJson(int depth) {
-  std::string json;
-  for (int ii = 0; ii < depth; ++ii)
-    json += "{\"foo\":";
-  json += "42";
-  for (int ii = 0; ii < depth; ++ii)
-    json += "}";
-  return json;
-}
-
-TEST_F(JsonParserTest, StackLimitExceededError) {
-  // kStackLimit is 1000 (see json_parser.cc). First let's
-  // try with a small nested example.
-  std::string json_3 = MakeNestedJson(3);
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json_3), &log_);
-  EXPECT_TRUE(log_.status().ok());
-  EXPECT_EQ(
-      "map begin\n"
-      "string16: foo\n"
-      "map begin\n"
-      "string16: foo\n"
-      "map begin\n"
-      "string16: foo\n"
-      "int: 42\n"
-      "map end\n"
-      "map end\n"
-      "map end\n",
-      log_.str());
-
-  // Now with kStackLimit (1000).
-  log_ = Log();
-  std::string json_limit = MakeNestedJson(1000);
-  ParseJSON(GetTestPlatform(),
-            span<uint8_t>(reinterpret_cast<const uint8_t*>(json_limit.data()),
-                          json_limit.size()),
-            &log_);
-  EXPECT_TRUE(log_.status().ok());
-  // Now with kStackLimit + 1 (1001) - it exceeds in the innermost instance.
-  log_ = Log();
-  std::string exceeded = MakeNestedJson(1001);
-  ParseJSON(GetTestPlatform(), SpanFromStdString(exceeded), &log_);
-  EXPECT_EQ(Error::JSON_PARSER_STACK_LIMIT_EXCEEDED, log_.status().error);
-  EXPECT_EQ(static_cast<std::ptrdiff_t>(strlen("{\"foo\":") * 1001),
-            log_.status().pos);
-  // Now way past the limit. Still, the point of exceeding is 1001.
-  log_ = Log();
-  std::string far_out = MakeNestedJson(10000);
-  ParseJSON(GetTestPlatform(), SpanFromStdString(far_out), &log_);
-  EXPECT_EQ(Error::JSON_PARSER_STACK_LIMIT_EXCEEDED, log_.status().error);
-  EXPECT_EQ(static_cast<std::ptrdiff_t>(strlen("{\"foo\":") * 1001),
-            log_.status().pos);
-}
-
-TEST_F(JsonParserTest, NoInputError) {
-  std::string json = "";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_EQ(Error::JSON_PARSER_NO_INPUT, log_.status().error);
-  EXPECT_EQ(0, log_.status().pos);
-  EXPECT_EQ("", log_.str());
-}
-
-TEST_F(JsonParserTest, InvalidTokenError) {
-  std::string json = "|";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_EQ(Error::JSON_PARSER_INVALID_TOKEN, log_.status().error);
-  EXPECT_EQ(0, log_.status().pos);
-  EXPECT_EQ("", log_.str());
-}
-
-TEST_F(JsonParserTest, InvalidNumberError) {
-  // Mantissa exceeds max (the constant used here is int64_t max).
-  std::string json = "1E9223372036854775807";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_EQ(Error::JSON_PARSER_INVALID_NUMBER, log_.status().error);
-  EXPECT_EQ(0, log_.status().pos);
-  EXPECT_EQ("", log_.str());
-}
-
-TEST_F(JsonParserTest, InvalidStringError) {
-  // \x22 is an unsupported escape sequence
-  std::string json = "\"foo\\x22\"";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_EQ(Error::JSON_PARSER_INVALID_STRING, log_.status().error);
-  EXPECT_EQ(0, log_.status().pos);
-  EXPECT_EQ("", log_.str());
-}
-
-TEST_F(JsonParserTest, UnexpectedArrayEndError) {
-  std::string json = "[1,2,]";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_EQ(Error::JSON_PARSER_UNEXPECTED_ARRAY_END, log_.status().error);
-  EXPECT_EQ(5, log_.status().pos);
-  EXPECT_EQ("", log_.str());
-}
-
-TEST_F(JsonParserTest, CommaOrArrayEndExpectedError) {
-  std::string json = "[1,2 2";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_EQ(Error::JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED,
-            log_.status().error);
-  EXPECT_EQ(5, log_.status().pos);
-  EXPECT_EQ("", log_.str());
-}
-
-TEST_F(JsonParserTest, StringLiteralExpectedError) {
-  // There's an error because the key bar, a string, is not terminated.
-  std::string json = "{\"foo\": 3.1415, \"bar: 31415e-4}";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_EQ(Error::JSON_PARSER_STRING_LITERAL_EXPECTED, log_.status().error);
-  EXPECT_EQ(16, log_.status().pos);
-  EXPECT_EQ("", log_.str());
-}
-
-TEST_F(JsonParserTest, ColonExpectedError) {
-  std::string json = "{\"foo\", 42}";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_EQ(Error::JSON_PARSER_COLON_EXPECTED, log_.status().error);
-  EXPECT_EQ(6, log_.status().pos);
-  EXPECT_EQ("", log_.str());
-}
-
-TEST_F(JsonParserTest, UnexpectedMapEndError) {
-  std::string json = "{\"foo\": 42, }";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_EQ(Error::JSON_PARSER_UNEXPECTED_MAP_END, log_.status().error);
-  EXPECT_EQ(12, log_.status().pos);
-  EXPECT_EQ("", log_.str());
-}
-
-TEST_F(JsonParserTest, CommaOrMapEndExpectedError) {
-  // The second separator should be a comma.
-  std::string json = "{\"foo\": 3.1415: \"bar\": 0}";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_EQ(Error::JSON_PARSER_COMMA_OR_MAP_END_EXPECTED, log_.status().error);
-  EXPECT_EQ(14, log_.status().pos);
-  EXPECT_EQ("", log_.str());
-}
-
-TEST_F(JsonParserTest, ValueExpectedError) {
-  std::string json = "}";
-  ParseJSON(GetTestPlatform(), SpanFromStdString(json), &log_);
-  EXPECT_EQ(Error::JSON_PARSER_VALUE_EXPECTED, log_.status().error);
-  EXPECT_EQ(0, log_.status().pos);
-  EXPECT_EQ("", log_.str());
-}
-}  // namespace json
-}  // namespace inspector_protocol_encoding
diff --git a/third_party/inspector_protocol/encoding/json_parser.cc b/third_party/inspector_protocol/encoding/json_parser.cc
new file mode 100644
index 0000000..27a1f23
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/json_parser.cc
@@ -0,0 +1,588 @@
+// 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 "json_parser.h"
+
+#include <cassert>
+#include <limits>
+#include <string>
+#include "status.h"
+
+namespace inspector_protocol {
+namespace {
+const int kStackLimit = 1000;
+
+enum Token {
+  ObjectBegin,
+  ObjectEnd,
+  ArrayBegin,
+  ArrayEnd,
+  StringLiteral,
+  Number,
+  BoolTrue,
+  BoolFalse,
+  NullToken,
+  ListSeparator,
+  ObjectPairSeparator,
+  InvalidToken,
+  NoInput
+};
+
+const char* const kNullString = "null";
+const char* const kTrueString = "true";
+const char* const kFalseString = "false";
+
+template <typename Char>
+class JsonParser {
+ public:
+  JsonParser(const Platform* platform, JSONParserHandler* handler)
+      : platform_(platform), handler_(handler) {}
+
+  void Parse(const Char* start, std::size_t length) {
+    start_pos_ = start;
+    const Char* end = start + length;
+    const Char* tokenEnd;
+    ParseValue(start, end, &tokenEnd, 0);
+    if (tokenEnd != end) {
+      HandleError(Error::JSON_PARSER_UNPROCESSED_INPUT_REMAINS, tokenEnd);
+    }
+  }
+
+ private:
+  bool CharsToDouble(const uint16_t* chars,
+                     std::size_t length,
+                     double* result) {
+    std::string buffer;
+    buffer.reserve(length + 1);
+    for (std::size_t ii = 0; ii < length; ++ii) {
+      bool is_ascii = !(chars[ii] & ~0x7F);
+      if (!is_ascii) return false;
+      buffer.push_back(static_cast<char>(chars[ii]));
+    }
+    return platform_->StrToD(buffer.c_str(), result);
+  }
+
+  bool CharsToDouble(const uint8_t* chars, std::size_t length, double* result) {
+    std::string buffer(reinterpret_cast<const char*>(chars), length);
+    return platform_->StrToD(buffer.c_str(), result);
+  }
+
+  static bool ParseConstToken(const Char* start, const Char* end,
+                              const Char** token_end, const char* token) {
+    // |token| is \0 terminated, it's one of the constants at top of the file.
+    while (start < end && *token != '\0' && *start++ == *token++) {
+    }
+    if (*token != '\0') return false;
+    *token_end = start;
+    return true;
+  }
+
+  static bool ReadInt(const Char* start, const Char* end,
+                      const Char** token_end, bool allow_leading_zeros) {
+    if (start == end) return false;
+    bool has_leading_zero = '0' == *start;
+    int length = 0;
+    while (start < end && '0' <= *start && *start <= '9') {
+      ++start;
+      ++length;
+    }
+    if (!length) return false;
+    if (!allow_leading_zeros && length > 1 && has_leading_zero) return false;
+    *token_end = start;
+    return true;
+  }
+
+  static bool ParseNumberToken(const Char* start, const Char* end,
+                               const Char** token_end) {
+    // We just grab the number here. We validate the size in DecodeNumber.
+    // According to RFC4627, a valid number is: [minus] int [frac] [exp]
+    if (start == end) return false;
+    Char c = *start;
+    if ('-' == c) ++start;
+
+    if (!ReadInt(start, end, &start, /*allow_leading_zeros=*/false))
+      return false;
+    if (start == end) {
+      *token_end = start;
+      return true;
+    }
+
+    // Optional fraction part
+    c = *start;
+    if ('.' == c) {
+      ++start;
+      if (!ReadInt(start, end, &start, /*allow_leading_zeros=*/true))
+        return false;
+      if (start == end) {
+        *token_end = start;
+        return true;
+      }
+      c = *start;
+    }
+
+    // Optional exponent part
+    if ('e' == c || 'E' == c) {
+      ++start;
+      if (start == end) return false;
+      c = *start;
+      if ('-' == c || '+' == c) {
+        ++start;
+        if (start == end) return false;
+      }
+      if (!ReadInt(start, end, &start, /*allow_leading_zeros=*/true))
+        return false;
+    }
+
+    *token_end = start;
+    return true;
+  }
+
+  static bool ReadHexDigits(const Char* start, const Char* end,
+                            const Char** token_end, int digits) {
+    if (end - start < digits) return false;
+    for (int i = 0; i < digits; ++i) {
+      Char c = *start++;
+      if (!(('0' <= c && c <= '9') || ('a' <= c && c <= 'f') ||
+            ('A' <= c && c <= 'F')))
+        return false;
+    }
+    *token_end = start;
+    return true;
+  }
+
+  static bool ParseStringToken(const Char* start, const Char* end,
+                               const Char** token_end) {
+    while (start < end) {
+      Char c = *start++;
+      if ('\\' == c) {
+        if (start == end) return false;
+        c = *start++;
+        // Make sure the escaped char is valid.
+        switch (c) {
+          case 'x':
+            if (!ReadHexDigits(start, end, &start, 2)) return false;
+            break;
+          case 'u':
+            if (!ReadHexDigits(start, end, &start, 4)) return false;
+            break;
+          case '\\':
+          case '/':
+          case 'b':
+          case 'f':
+          case 'n':
+          case 'r':
+          case 't':
+          case 'v':
+          case '"':
+            break;
+          default:
+            return false;
+        }
+      } else if ('"' == c) {
+        *token_end = start;
+        return true;
+      }
+    }
+    return false;
+  }
+
+  static bool SkipComment(const Char* start, const Char* end,
+                          const Char** comment_end) {
+    if (start == end) return false;
+
+    if (*start != '/' || start + 1 >= end) return false;
+    ++start;
+
+    if (*start == '/') {
+      // Single line comment, read to newline.
+      for (++start; start < end; ++start) {
+        if (*start == '\n' || *start == '\r') {
+          *comment_end = start + 1;
+          return true;
+        }
+      }
+      *comment_end = end;
+      // Comment reaches end-of-input, which is fine.
+      return true;
+    }
+
+    if (*start == '*') {
+      Char previous = '\0';
+      // Block comment, read until end marker.
+      for (++start; start < end; previous = *start++) {
+        if (previous == '*' && *start == '/') {
+          *comment_end = start + 1;
+          return true;
+        }
+      }
+      // Block comment must close before end-of-input.
+      return false;
+    }
+
+    return false;
+  }
+
+  static bool IsSpaceOrNewLine(Char c) {
+    // \v = vertial tab; \f = form feed page break.
+    return c == ' ' || c == '\n' || c == '\v' || c == '\f' || c == '\r' ||
+           c == '\t';
+  }
+
+  static void SkipWhitespaceAndComments(const Char* start, const Char* end,
+                                        const Char** whitespace_end) {
+    while (start < end) {
+      if (IsSpaceOrNewLine(*start)) {
+        ++start;
+      } else if (*start == '/') {
+        const Char* comment_end;
+        if (!SkipComment(start, end, &comment_end)) break;
+        start = comment_end;
+      } else {
+        break;
+      }
+    }
+    *whitespace_end = start;
+  }
+
+  static Token ParseToken(const Char* start, const Char* end,
+                          const Char** tokenStart, const Char** token_end) {
+    SkipWhitespaceAndComments(start, end, tokenStart);
+    start = *tokenStart;
+
+    if (start == end) return NoInput;
+
+    switch (*start) {
+      case 'n':
+        if (ParseConstToken(start, end, token_end, kNullString))
+          return NullToken;
+        break;
+      case 't':
+        if (ParseConstToken(start, end, token_end, kTrueString))
+          return BoolTrue;
+        break;
+      case 'f':
+        if (ParseConstToken(start, end, token_end, kFalseString))
+          return BoolFalse;
+        break;
+      case '[':
+        *token_end = start + 1;
+        return ArrayBegin;
+      case ']':
+        *token_end = start + 1;
+        return ArrayEnd;
+      case ',':
+        *token_end = start + 1;
+        return ListSeparator;
+      case '{':
+        *token_end = start + 1;
+        return ObjectBegin;
+      case '}':
+        *token_end = start + 1;
+        return ObjectEnd;
+      case ':':
+        *token_end = start + 1;
+        return ObjectPairSeparator;
+      case '0':
+      case '1':
+      case '2':
+      case '3':
+      case '4':
+      case '5':
+      case '6':
+      case '7':
+      case '8':
+      case '9':
+      case '-':
+        if (ParseNumberToken(start, end, token_end)) return Number;
+        break;
+      case '"':
+        if (ParseStringToken(start + 1, end, token_end)) return StringLiteral;
+        break;
+    }
+    return InvalidToken;
+  }
+
+  static int HexToInt(Char c) {
+    if ('0' <= c && c <= '9') return c - '0';
+    if ('A' <= c && c <= 'F') return c - 'A' + 10;
+    if ('a' <= c && c <= 'f') return c - 'a' + 10;
+    assert(false);  // Unreachable.
+    return 0;
+  }
+
+  static bool DecodeString(const Char* start, const Char* end,
+                           std::vector<uint16_t>* output) {
+    if (start == end) return true;
+    if (start > end) return false;
+    output->reserve(end - start);
+    while (start < end) {
+      uint16_t c = *start++;
+      // If the |Char| we're dealing with is really a byte, then
+      // we have utf8 here, and we need to check for multibyte characters
+      // and transcode them to utf16 (either one or two utf16 chars).
+      if (sizeof(Char) == sizeof(uint8_t) && c >= 0x7f) {
+        // Inspect the leading byte to figure out how long the utf8
+        // byte sequence is; while doing this initialize |codepoint|
+        // with the first few bits.
+        // See table in: https://en.wikipedia.org/wiki/UTF-8
+        // byte one is 110x xxxx -> 2 byte utf8 sequence
+        // byte one is 1110 xxxx -> 3 byte utf8 sequence
+        // byte one is 1111 0xxx -> 4 byte utf8 sequence
+        uint32_t codepoint;
+        int num_bytes_left;
+        if ((c & 0xe0) == 0xc0) {  // 2 byte utf8 sequence
+          num_bytes_left = 1;
+          codepoint = c & 0x1f;
+        } else if ((c & 0xf0) == 0xe0) {  // 3 byte utf8 sequence
+          num_bytes_left = 2;
+          codepoint = c & 0x0f;
+        } else if ((c & 0xf8) == 0xf0) {  // 4 byte utf8 sequence
+          codepoint = c & 0x07;
+          num_bytes_left = 3;
+        } else {
+          return false;  // invalid leading byte
+        }
+
+        // If we have enough bytes in our inpput, decode the remaining ones
+        // belonging to this Unicode character into |codepoint|.
+        if (start + num_bytes_left > end) return false;
+        while (num_bytes_left > 0) {
+          c = *start++;
+          --num_bytes_left;
+          // Check the next byte is a continuation byte, that is 10xx xxxx.
+          if ((c & 0xc0) != 0x80) return false;
+          codepoint = (codepoint << 6) | (c & 0x3f);
+        }
+
+        // Disallow overlong encodings for ascii characters, as these
+        // would include " and other characters significant to JSON
+        // string termination / control.
+        if (codepoint < 0x7f) return false;
+        // Invalid in UTF8, and can't be represented in UTF16 anyway.
+        if (codepoint > 0x10ffff) return false;
+
+        // So, now we transcode to UTF16,
+        // using the math described at https://en.wikipedia.org/wiki/UTF-16,
+        // for either one or two 16 bit characters.
+        if (codepoint < 0xffff) {
+          output->push_back(codepoint);
+          continue;
+        }
+        codepoint -= 0x10000;
+        output->push_back((codepoint >> 10) + 0xd800);    // high surrogate
+        output->push_back((codepoint & 0x3ff) + 0xdc00);  // low surrogate
+        continue;
+      }
+      if ('\\' != c) {
+        output->push_back(c);
+        continue;
+      }
+      if (start == end) return false;
+      c = *start++;
+
+      if (c == 'x') {
+        // \x is not supported.
+        return false;
+      }
+
+      switch (c) {
+        case '"':
+        case '/':
+        case '\\':
+          break;
+        case 'b':
+          c = '\b';
+          break;
+        case 'f':
+          c = '\f';
+          break;
+        case 'n':
+          c = '\n';
+          break;
+        case 'r':
+          c = '\r';
+          break;
+        case 't':
+          c = '\t';
+          break;
+        case 'v':
+          c = '\v';
+          break;
+        case 'u':
+          c = (HexToInt(*start) << 12) + (HexToInt(*(start + 1)) << 8) +
+              (HexToInt(*(start + 2)) << 4) + HexToInt(*(start + 3));
+          start += 4;
+          break;
+        default:
+          return false;
+      }
+      output->push_back(c);
+    }
+    return true;
+  }
+
+  void ParseValue(const Char* start, const Char* end,
+                  const Char** value_token_end, int depth) {
+    if (depth > kStackLimit) {
+      HandleError(Error::JSON_PARSER_STACK_LIMIT_EXCEEDED, start);
+      return;
+    }
+    const Char* token_start;
+    const Char* token_end;
+    Token token = ParseToken(start, end, &token_start, &token_end);
+    switch (token) {
+      case NoInput:
+        HandleError(Error::JSON_PARSER_NO_INPUT, token_start);
+        return;
+      case InvalidToken:
+        HandleError(Error::JSON_PARSER_INVALID_TOKEN, token_start);
+        return;
+      case NullToken:
+        handler_->HandleNull();
+        break;
+      case BoolTrue:
+        handler_->HandleBool(true);
+        break;
+      case BoolFalse:
+        handler_->HandleBool(false);
+        break;
+      case Number: {
+        double value;
+        if (!CharsToDouble(token_start, token_end - token_start, &value)) {
+          HandleError(Error::JSON_PARSER_INVALID_NUMBER, token_start);
+          return;
+        }
+        if (value >= std::numeric_limits<int32_t>::min() &&
+            value <= std::numeric_limits<int32_t>::max() &&
+            static_cast<int32_t>(value) == value)
+          handler_->HandleInt32(static_cast<int32_t>(value));
+        else
+          handler_->HandleDouble(value);
+        break;
+      }
+      case StringLiteral: {
+        std::vector<uint16_t> value;
+        bool ok = DecodeString(token_start + 1, token_end - 1, &value);
+        if (!ok) {
+          HandleError(Error::JSON_PARSER_INVALID_STRING, token_start);
+          return;
+        }
+        handler_->HandleString16(span<uint16_t>(value.data(), value.size()));
+        break;
+      }
+      case ArrayBegin: {
+        handler_->HandleArrayBegin();
+        start = token_end;
+        token = ParseToken(start, end, &token_start, &token_end);
+        while (token != ArrayEnd) {
+          ParseValue(start, end, &token_end, depth + 1);
+          if (error_) return;
+
+          // After a list value, we expect a comma or the end of the list.
+          start = token_end;
+          token = ParseToken(start, end, &token_start, &token_end);
+          if (token == ListSeparator) {
+            start = token_end;
+            token = ParseToken(start, end, &token_start, &token_end);
+            if (token == ArrayEnd) {
+              HandleError(Error::JSON_PARSER_UNEXPECTED_ARRAY_END, token_start);
+              return;
+            }
+          } else if (token != ArrayEnd) {
+            // Unexpected value after list value. Bail out.
+            HandleError(Error::JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED,
+                        token_start);
+            return;
+          }
+        }
+        handler_->HandleArrayEnd();
+        break;
+      }
+      case ObjectBegin: {
+        handler_->HandleObjectBegin();
+        start = token_end;
+        token = ParseToken(start, end, &token_start, &token_end);
+        while (token != ObjectEnd) {
+          if (token != StringLiteral) {
+            HandleError(Error::JSON_PARSER_STRING_LITERAL_EXPECTED,
+                        token_start);
+            return;
+          }
+          std::vector<uint16_t> key;
+          if (!DecodeString(token_start + 1, token_end - 1, &key)) {
+            HandleError(Error::JSON_PARSER_INVALID_STRING, token_start);
+            return;
+          }
+          handler_->HandleString16(span<uint16_t>(key.data(), key.size()));
+          start = token_end;
+
+          token = ParseToken(start, end, &token_start, &token_end);
+          if (token != ObjectPairSeparator) {
+            HandleError(Error::JSON_PARSER_COLON_EXPECTED, token_start);
+            return;
+          }
+          start = token_end;
+
+          ParseValue(start, end, &token_end, depth + 1);
+          if (error_) return;
+          start = token_end;
+
+          // After a key/value pair, we expect a comma or the end of the
+          // object.
+          token = ParseToken(start, end, &token_start, &token_end);
+          if (token == ListSeparator) {
+            start = token_end;
+            token = ParseToken(start, end, &token_start, &token_end);
+            if (token == ObjectEnd) {
+              HandleError(Error::JSON_PARSER_UNEXPECTED_OBJECT_END,
+                          token_start);
+              return;
+            }
+          } else if (token != ObjectEnd) {
+            // Unexpected value after last object value. Bail out.
+            HandleError(Error::JSON_PARSER_COMMA_OR_OBJECT_END_EXPECTED,
+                        token_start);
+            return;
+          }
+        }
+        handler_->HandleObjectEnd();
+        break;
+      }
+
+      default:
+        // We got a token that's not a value.
+        HandleError(Error::JSON_PARSER_VALUE_EXPECTED, token_start);
+        return;
+    }
+
+    SkipWhitespaceAndComments(token_end, end, value_token_end);
+  }
+
+  void HandleError(Error error, const Char* pos) {
+    assert(error != Error::OK);
+    if (!error_) {
+      handler_->HandleError(Status{error, pos - start_pos_});
+      error_ = true;
+    }
+  }
+
+  const Char* start_pos_ = nullptr;
+  bool error_ = false;
+  const Platform* platform_;
+  JSONParserHandler* handler_;
+};
+}  // namespace
+
+void ParseJSONChars(const Platform* platform, span<uint8_t> chars,
+                    JSONParserHandler* handler) {
+  JsonParser<uint8_t> parser(platform, handler);
+  parser.Parse(chars.data(), chars.size());
+}
+
+void ParseJSONChars(const Platform* platform, span<uint16_t> chars,
+                    JSONParserHandler* handler) {
+  JsonParser<uint16_t> parser(platform, handler);
+  parser.Parse(chars.data(), chars.size());
+}
+}  // namespace inspector_protocol
diff --git a/third_party/inspector_protocol/encoding/json_parser.h b/third_party/inspector_protocol/encoding/json_parser.h
new file mode 100644
index 0000000..55384be
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/json_parser.h
@@ -0,0 +1,22 @@
+// 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 INSPECTOR_PROTOCOL_ENCODING_JSON_PARSER_H_
+#define INSPECTOR_PROTOCOL_ENCODING_JSON_PARSER_H_
+
+#include <cstdint>
+#include <vector>
+#include "json_parser_handler.h"
+#include "platform.h"
+#include "span.h"
+
+namespace inspector_protocol {
+// JSON parsing routines.
+void ParseJSONChars(const Platform* platform, span<uint8_t> chars,
+                    JSONParserHandler* handler);
+void ParseJSONChars(const Platform* platform, span<uint16_t> chars,
+                    JSONParserHandler* handler);
+}  // namespace inspector_protocol
+
+#endif  // INSPECTOR_PROTOCOL_ENCODING_JSON_PARSER_H_
diff --git a/third_party/inspector_protocol/encoding/json_parser_handler.h b/third_party/inspector_protocol/encoding/json_parser_handler.h
new file mode 100644
index 0000000..d90b65f7
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/json_parser_handler.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 INSPECTOR_PROTOCOL_ENCODING_JSON_PARSER_HANDLER_H_
+#define INSPECTOR_PROTOCOL_ENCODING_JSON_PARSER_HANDLER_H_
+
+#include <cstdint>
+#include <vector>
+#include "span.h"
+#include "status.h"
+
+namespace inspector_protocol {
+// Handler interface for JSON parser events. See also json_parser.h.
+class JSONParserHandler {
+ public:
+  virtual ~JSONParserHandler() = default;
+  virtual void HandleObjectBegin() = 0;
+  virtual void HandleObjectEnd() = 0;
+  virtual void HandleArrayBegin() = 0;
+  virtual void HandleArrayEnd() = 0;
+  virtual void HandleString8(span<uint8_t> chars) = 0;
+  virtual void HandleString16(span<uint16_t> chars) = 0;
+  virtual void HandleBinary(std::vector<uint8_t> bytes) = 0;
+  virtual void HandleDouble(double value) = 0;
+  virtual void HandleInt32(int32_t value) = 0;
+  virtual void HandleBool(bool value) = 0;
+  virtual void HandleNull() = 0;
+
+  // The parser may send one error even after other events have already
+  // been received. Client code is reponsible to then discard the
+  // already processed events.
+  // |error| must be an eror, as in, |error.is_ok()| can't be true.
+  virtual void HandleError(Status error) = 0;
+};
+}  // namespace inspector_protocol
+
+#endif  // INSPECTOR_PROTOCOL_ENCODING_JSON_PARSER_HANDLER_H_
diff --git a/third_party/inspector_protocol/encoding/json_parser_test.cc b/third_party/inspector_protocol/encoding/json_parser_test.cc
new file mode 100644
index 0000000..2e63129
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/json_parser_test.cc
@@ -0,0 +1,413 @@
+// 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 "json_parser.h"
+
+#include <iostream>
+#include <sstream>
+#include "base/strings/string16.h"
+#include "base/strings/utf_string_conversions.h"
+#include "gtest/gtest.h"
+#include "linux_dev_platform.h"
+
+namespace inspector_protocol {
+class Log : public JSONParserHandler {
+ public:
+  void HandleObjectBegin() override { log_ << "object begin\n"; }
+
+  void HandleObjectEnd() override { log_ << "object end\n"; }
+
+  void HandleArrayBegin() override { log_ << "array begin\n"; }
+
+  void HandleArrayEnd() override { log_ << "array end\n"; }
+
+  void HandleString8(span<uint8_t> chars) override {
+    base::StringPiece foo(reinterpret_cast<const char*>(chars.data()),
+                          chars.size());
+    log_ << "string8: " << foo << "\n";
+  }
+
+  void HandleString16(span<uint16_t> chars) override {
+    base::StringPiece16 foo(reinterpret_cast<const base::char16*>(chars.data()),
+                            chars.size());
+    log_ << "string16: " << base::UTF16ToUTF8(foo) << "\n";
+  }
+
+  void HandleBinary(std::vector<uint8_t> bytes) override {
+    // JSON doesn't have native support for arbitrary bytes, so our parser will
+    // never call this.
+    assert(false);
+  }
+
+  void HandleDouble(double value) override {
+    log_ << "double: " << value << "\n";
+  }
+
+  void HandleInt32(int32_t value) override { log_ << "int: " << value << "\n"; }
+
+  void HandleBool(bool value) override { log_ << "bool: " << value << "\n"; }
+
+  void HandleNull() override { log_ << "null\n"; }
+
+  void HandleError(Status status) override { status_ = status; }
+
+  std::string str() const { return status_.ok() ? log_.str() : ""; }
+
+  Status status() const { return status_; }
+
+ private:
+  std::ostringstream log_;
+  Status status_;
+};
+
+class JsonParserTest : public ::testing::Test {
+ protected:
+  Log log_;
+};
+
+TEST_F(JsonParserTest, SimpleDictionary) {
+  std::string json = "{\"foo\": 42}";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_TRUE(log_.status().ok());
+  EXPECT_EQ(
+      "object begin\n"
+      "string16: foo\n"
+      "int: 42\n"
+      "object end\n",
+      log_.str());
+}
+
+TEST_F(JsonParserTest, Whitespace) {
+  std::string json = "\n  {\n\"msg\"\n: \v\"Hello, world.\"\t\r}\t";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_TRUE(log_.status().ok());
+  EXPECT_EQ(
+      "object begin\n"
+      "string16: msg\n"
+      "string16: Hello, world.\n"
+      "object end\n",
+      log_.str());
+}
+
+TEST_F(JsonParserTest, NestedDictionary) {
+  std::string json = "{\"foo\": {\"bar\": {\"baz\": 1}, \"bar2\": 2}}";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_TRUE(log_.status().ok());
+  EXPECT_EQ(
+      "object begin\n"
+      "string16: foo\n"
+      "object begin\n"
+      "string16: bar\n"
+      "object begin\n"
+      "string16: baz\n"
+      "int: 1\n"
+      "object end\n"
+      "string16: bar2\n"
+      "int: 2\n"
+      "object end\n"
+      "object end\n",
+      log_.str());
+}
+
+TEST_F(JsonParserTest, Doubles) {
+  std::string json = "{\"foo\": 3.1415, \"bar\": 31415e-4}";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_TRUE(log_.status().ok());
+  EXPECT_EQ(
+      "object begin\n"
+      "string16: foo\n"
+      "double: 3.1415\n"
+      "string16: bar\n"
+      "double: 3.1415\n"
+      "object end\n",
+      log_.str());
+}
+
+TEST_F(JsonParserTest, Unicode) {
+  // Globe character. 0xF0 0x9F 0x8C 0x8E in utf8, 0xD83C 0xDF0E in utf16.
+  std::string json = "{\"msg\": \"Hello, \\uD83C\\uDF0E.\"}";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_TRUE(log_.status().ok());
+  EXPECT_EQ(
+      "object begin\n"
+      "string16: msg\n"
+      "string16: Hello, 🌎.\n"
+      "object end\n",
+      log_.str());
+}
+
+TEST_F(JsonParserTest, Unicode_ParseUtf16) {
+  // Globe character. utf8: 0xF0 0x9F 0x8C 0x8E; utf16: 0xD83C 0xDF0E.
+  // Crescent moon character. utf8: 0xF0 0x9F 0x8C 0x99; utf16: 0xD83C 0xDF19.
+
+  // We provide the moon with json escape, but the earth as utf16 input.
+  // Either way they arrive as utf8 (after decoding in log_.str()).
+  base::string16 json = base::UTF8ToUTF16("{\"space\": \"🌎 \\uD83C\\uDF19.\"}");
+  ParseJSONChars(GetLinuxDevPlatform(),
+                 span<uint16_t>(reinterpret_cast<const uint16_t*>(json.data()),
+                                json.size()),
+                 &log_);
+  EXPECT_TRUE(log_.status().ok());
+  EXPECT_EQ(
+      "object begin\n"
+      "string16: space\n"
+      "string16: 🌎 🌙.\n"
+      "object end\n",
+      log_.str());
+}
+
+TEST_F(JsonParserTest, Unicode_ParseUtf8) {
+  // Used below:
+  // гласность - example for 2 byte utf8, Russian word "glasnost"
+  // 屋 - example for 3 byte utf8, Chinese word for "house"
+  // 🌎 - example for 4 byte utf8: 0xF0 0x9F 0x8C 0x8E; utf16: 0xD83C 0xDF0E.
+  // 🌙 - example for escapes: utf8: 0xF0 0x9F 0x8C 0x99; utf16: 0xD83C 0xDF19.
+
+  // We provide the moon with json escape, but the earth as utf8 input.
+  // Either way they arrive as utf8 (after decoding in log_.str()).
+  std::string json =
+      "{"
+      "\"escapes\": \"\\uD83C\\uDF19\","
+      "\"2 byte\":\"гласность\","
+      "\"3 byte\":\"屋\","
+      "\"4 byte\":\"🌎\""
+      "}";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_TRUE(log_.status().ok());
+  EXPECT_EQ(
+      "object begin\n"
+      "string16: escapes\n"
+      "string16: 🌙\n"
+      "string16: 2 byte\n"
+      "string16: гласность\n"
+      "string16: 3 byte\n"
+      "string16: 屋\n"
+      "string16: 4 byte\n"
+      "string16: 🌎\n"
+      "object end\n",
+      log_.str());
+}
+
+TEST_F(JsonParserTest, UnprocessedInputRemainsError) {
+  // Trailing junk after the valid JSON.
+  std::string json = "{\"foo\": 3.1415} junk";
+  int64_t junk_idx = json.find("junk");
+  EXPECT_GT(junk_idx, 0);
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_EQ(Error::JSON_PARSER_UNPROCESSED_INPUT_REMAINS, log_.status().error);
+  EXPECT_EQ(junk_idx, log_.status().pos);
+  EXPECT_EQ("", log_.str());
+}
+
+std::string MakeNestedJson(int depth) {
+  std::string json;
+  for (int ii = 0; ii < depth; ++ii) json += "{\"foo\":";
+  json += "42";
+  for (int ii = 0; ii < depth; ++ii) json += "}";
+  return json;
+}
+
+TEST_F(JsonParserTest, StackLimitExceededError) {
+  // kStackLimit is 1000 (see json_parser.cc). First let's
+  // try with a small nested example.
+  std::string json_3 = MakeNestedJson(3);
+  ParseJSONChars(GetLinuxDevPlatform(),
+                 span<uint8_t>(reinterpret_cast<const uint8_t*>(json_3.data()),
+                               json_3.size()),
+                 &log_);
+  EXPECT_TRUE(log_.status().ok());
+  EXPECT_EQ(
+      "object begin\n"
+      "string16: foo\n"
+      "object begin\n"
+      "string16: foo\n"
+      "object begin\n"
+      "string16: foo\n"
+      "int: 42\n"
+      "object end\n"
+      "object end\n"
+      "object end\n",
+      log_.str());
+
+  // Now with kStackLimit (1000).
+  log_ = Log();
+  std::string json_limit = MakeNestedJson(1000);
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json_limit.data()),
+                    json_limit.size()),
+      &log_);
+  EXPECT_TRUE(log_.status().ok());
+  // Now with kStackLimit + 1 (1001) - it exceeds in the innermost instance.
+  log_ = Log();
+  std::string exceeded = MakeNestedJson(1001);
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(exceeded.data()),
+                    exceeded.size()),
+      &log_);
+  EXPECT_EQ(Error::JSON_PARSER_STACK_LIMIT_EXCEEDED, log_.status().error);
+  EXPECT_EQ(static_cast<std::ptrdiff_t>(strlen("{\"foo\":") * 1001),
+            log_.status().pos);
+  // Now way past the limit. Still, the point of exceeding is 1001.
+  log_ = Log();
+  std::string far_out = MakeNestedJson(10000);
+  ParseJSONChars(GetLinuxDevPlatform(),
+                 span<uint8_t>(reinterpret_cast<const uint8_t*>(far_out.data()),
+                               far_out.size()),
+                 &log_);
+  EXPECT_EQ(Error::JSON_PARSER_STACK_LIMIT_EXCEEDED, log_.status().error);
+  EXPECT_EQ(static_cast<std::ptrdiff_t>(strlen("{\"foo\":") * 1001),
+            log_.status().pos);
+}
+
+TEST_F(JsonParserTest, NoInputError) {
+  std::string json = "";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_EQ(Error::JSON_PARSER_NO_INPUT, log_.status().error);
+  EXPECT_EQ(0, log_.status().pos);
+  EXPECT_EQ("", log_.str());
+}
+
+TEST_F(JsonParserTest, InvalidTokenError) {
+  std::string json = "|";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_EQ(Error::JSON_PARSER_INVALID_TOKEN, log_.status().error);
+  EXPECT_EQ(0, log_.status().pos);
+  EXPECT_EQ("", log_.str());
+}
+
+TEST_F(JsonParserTest, InvalidNumberError) {
+  // Mantissa exceeds max (the constant used here is int64_t max).
+  std::string json = "1E9223372036854775807";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_EQ(Error::JSON_PARSER_INVALID_NUMBER, log_.status().error);
+  EXPECT_EQ(0, log_.status().pos);
+  EXPECT_EQ("", log_.str());
+}
+
+TEST_F(JsonParserTest, InvalidStringError) {
+  // \x22 is an unsupported escape sequence
+  std::string json = "\"foo\\x22\"";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_EQ(Error::JSON_PARSER_INVALID_STRING, log_.status().error);
+  EXPECT_EQ(0, log_.status().pos);
+  EXPECT_EQ("", log_.str());
+}
+
+TEST_F(JsonParserTest, UnexpectedArrayEndError) {
+  std::string json = "[1,2,]";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_EQ(Error::JSON_PARSER_UNEXPECTED_ARRAY_END, log_.status().error);
+  EXPECT_EQ(5, log_.status().pos);
+  EXPECT_EQ("", log_.str());
+}
+
+TEST_F(JsonParserTest, CommaOrArrayEndExpectedError) {
+  std::string json = "[1,2 2";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_EQ(Error::JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED,
+            log_.status().error);
+  EXPECT_EQ(5, log_.status().pos);
+  EXPECT_EQ("", log_.str());
+}
+
+TEST_F(JsonParserTest, StringLiteralExpectedError) {
+  // There's an error because the key bar, a string, is not terminated.
+  std::string json = "{\"foo\": 3.1415, \"bar: 31415e-4}";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_EQ(Error::JSON_PARSER_STRING_LITERAL_EXPECTED, log_.status().error);
+  EXPECT_EQ(16, log_.status().pos);
+  EXPECT_EQ("", log_.str());
+}
+
+TEST_F(JsonParserTest, ColonExpectedError) {
+  std::string json = "{\"foo\", 42}";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_EQ(Error::JSON_PARSER_COLON_EXPECTED, log_.status().error);
+  EXPECT_EQ(6, log_.status().pos);
+  EXPECT_EQ("", log_.str());
+}
+
+TEST_F(JsonParserTest, UnexpectedObjectEndError) {
+  std::string json = "{\"foo\": 42, }";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_EQ(Error::JSON_PARSER_UNEXPECTED_OBJECT_END, log_.status().error);
+  EXPECT_EQ(12, log_.status().pos);
+  EXPECT_EQ("", log_.str());
+}
+
+TEST_F(JsonParserTest, CommaOrObjectEndExpectedError) {
+  // The second separator should be a comma.
+  std::string json = "{\"foo\": 3.1415: \"bar\": 0}";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_EQ(Error::JSON_PARSER_COMMA_OR_OBJECT_END_EXPECTED,
+            log_.status().error);
+  EXPECT_EQ(14, log_.status().pos);
+  EXPECT_EQ("", log_.str());
+}
+
+TEST_F(JsonParserTest, ValueExpectedError) {
+  std::string json = "}";
+  ParseJSONChars(
+      GetLinuxDevPlatform(),
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(json.data()), json.size()),
+      &log_);
+  EXPECT_EQ(Error::JSON_PARSER_VALUE_EXPECTED, log_.status().error);
+  EXPECT_EQ(0, log_.status().pos);
+  EXPECT_EQ("", log_.str());
+}
+
+}  // namespace inspector_protocol
diff --git a/third_party/inspector_protocol/encoding/json_std_string_writer.cc b/third_party/inspector_protocol/encoding/json_std_string_writer.cc
new file mode 100644
index 0000000..1c849cc
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/json_std_string_writer.cc
@@ -0,0 +1,306 @@
+// 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 "json_std_string_writer.h"
+#include <cassert>
+#include <stack>
+
+namespace inspector_protocol {
+namespace {
+// Prints |value| to |out| with 4 hex digits, most significant chunk first.
+void PrintHex(uint16_t value, std::string* out) {
+  for (int ii = 3; ii >= 0; --ii) {
+    int four_bits = 0xf & (value >> (4 * ii));
+    out->append(1, four_bits + ((four_bits <= 9) ? '0' : ('a' - 10)));
+  }
+}
+
+// In the writer below, we maintain a stack of State instances.
+// It is just enough to emit the appropriate delimiters and brackets
+// in JSON.
+enum class Container {
+  // Used for the top-level, initial state.
+  NONE,
+  // Inside a JSON object.
+  OBJECT,
+  // Inside a JSON array.
+  ARRAY
+};
+class State {
+ public:
+  explicit State(Container container) : container_(container) {}
+  void StartElement(std::string* out) {
+    assert(container_ != Container::NONE || size_ == 0);
+    if (size_ != 0) {
+      char delim = (!(size_ & 1) || container_ == Container::ARRAY) ? ',' : ':';
+      out->append(1, delim);
+    }
+    ++size_;
+  }
+  Container container() const { return container_; }
+
+ private:
+  Container container_ = Container::NONE;
+  int size_ = 0;
+};
+
+constexpr char kBase64Table[] =
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    "abcdefghijklmnopqrstuvwxyz0123456789+/";
+
+void Base64Encode(const std::vector<uint8_t>& in, std::string* out) {
+  // The following three cases are based on the tables in the example
+  // section in https://en.wikipedia.org/wiki/Base64. We process three
+  // input bytes at a time, emitting 4 output bytes at a time.
+  std::size_t ii = 0;
+
+  // While possible, process three input bytes.
+  for (; ii + 3 <= in.size(); ii += 3) {
+    uint32_t twentyfour_bits = (in[ii] << 16) | (in[ii + 1] << 8) | in[ii + 2];
+    out->push_back(kBase64Table[(twentyfour_bits >> 18)]);
+    out->push_back(kBase64Table[(twentyfour_bits >> 12) & 0x3f]);
+    out->push_back(kBase64Table[(twentyfour_bits >> 6) & 0x3f]);
+    out->push_back(kBase64Table[twentyfour_bits & 0x3f]);
+  }
+  if (ii + 2 <= in.size()) {  // Process two input bytes.
+    uint32_t twentyfour_bits = (in[ii] << 16) | (in[ii + 1] << 8);
+    out->push_back(kBase64Table[(twentyfour_bits >> 18)]);
+    out->push_back(kBase64Table[(twentyfour_bits >> 12) & 0x3f]);
+    out->push_back(kBase64Table[(twentyfour_bits >> 6) & 0x3f]);
+    out->push_back('=');  // Emit padding.
+    return;
+  }
+  if (ii + 1 <= in.size()) {  // Process a single input byte.
+    uint32_t twentyfour_bits = (in[ii] << 16);
+    out->push_back(kBase64Table[(twentyfour_bits >> 18)]);
+    out->push_back(kBase64Table[(twentyfour_bits >> 12) & 0x3f]);
+    out->push_back('=');  // Emit padding.
+    out->push_back('=');  // Emit padding.
+  }
+}
+
+// Implements a handler for JSON parser events to emit a JSON string.
+class Writer : public JSONParserHandler {
+ public:
+  Writer(Platform* platform, std::string* out, Status* status)
+      : platform_(platform), out_(out), status_(status) {
+    *status_ = Status();
+    state_.emplace(Container::NONE);
+  }
+
+  void HandleObjectBegin() override {
+    if (!status_->ok()) return;
+    assert(!state_.empty());
+    state_.top().StartElement(out_);
+    state_.emplace(Container::OBJECT);
+    out_->append("{");
+  }
+
+  void HandleObjectEnd() override {
+    if (!status_->ok()) return;
+    assert(state_.size() >= 2 && state_.top().container() == Container::OBJECT);
+    state_.pop();
+    out_->append("}");
+  }
+
+  void HandleArrayBegin() override {
+    if (!status_->ok()) return;
+    state_.top().StartElement(out_);
+    state_.emplace(Container::ARRAY);
+    out_->append("[");
+  }
+
+  void HandleArrayEnd() override {
+    if (!status_->ok()) return;
+    assert(state_.size() >= 2 && state_.top().container() == Container::ARRAY);
+    state_.pop();
+    out_->append("]");
+  }
+
+  void HandleString16(span<uint16_t> chars) override {
+    if (!status_->ok()) return;
+    state_.top().StartElement(out_);
+    out_->append("\"");
+    for (const uint16_t ch : chars) {
+      if (ch == '"') {
+        out_->append("\\\"");
+      } else if (ch == '\\') {
+        out_->append("\\\\");
+      } else if (ch == '\b') {
+        out_->append("\\b");
+      } else if (ch == '\f') {
+        out_->append("\\f");
+      } else if (ch == '\n') {
+        out_->append("\\n");
+      } else if (ch == '\r') {
+        out_->append("\\r");
+      } else if (ch == '\t') {
+        out_->append("\\t");
+      } else if (ch >= 32 && ch <= 126) {
+        out_->append(1, ch);
+      } else {
+        out_->append("\\u");
+        PrintHex(ch, out_);
+      }
+    }
+    out_->append("\"");
+  }
+
+  void HandleString8(span<uint8_t> chars) override {
+    if (!status_->ok())
+      return;
+    state_.top().StartElement(out_);
+    out_->append("\"");
+    for (std::ptrdiff_t ii = 0; ii < chars.size(); ++ii) {
+      uint8_t c = chars[ii];
+      if (c == '"') {
+        out_->append("\\\"");
+      } else if (c == '\\') {
+        out_->append("\\\\");
+      } else if (c == '\b') {
+        out_->append("\\b");
+      } else if (c == '\f') {
+        out_->append("\\f");
+      } else if (c == '\n') {
+        out_->append("\\n");
+      } else if (c == '\r') {
+        out_->append("\\r");
+      } else if (c == '\t') {
+        out_->append("\\t");
+      } else if (c >= 32 && c <= 126) {
+        out_->append(1, c);
+      } else if (c < 32) {
+        out_->append("\\u");
+        PrintHex(static_cast<uint16_t>(c), out_);
+      } else {
+        // Inspect the leading byte to figure out how long the utf8
+        // byte sequence is; while doing this initialize |codepoint|
+        // with the first few bits.
+        // See table in: https://en.wikipedia.org/wiki/UTF-8
+        // byte one is 110x xxxx -> 2 byte utf8 sequence
+        // byte one is 1110 xxxx -> 3 byte utf8 sequence
+        // byte one is 1111 0xxx -> 4 byte utf8 sequence
+        uint32_t codepoint;
+        int num_bytes_left;
+        if ((c & 0xe0) == 0xc0) {  // 2 byte utf8 sequence
+          num_bytes_left = 1;
+          codepoint = c & 0x1f;
+        } else if ((c & 0xf0) == 0xe0) {  // 3 byte utf8 sequence
+          num_bytes_left = 2;
+          codepoint = c & 0x0f;
+        } else if ((c & 0xf8) == 0xf0) {  // 4 byte utf8 sequence
+          codepoint = c & 0x07;
+          num_bytes_left = 3;
+        } else {
+          continue;  // invalid leading byte
+        }
+
+        // If we have enough bytes in our input, decode the remaining ones
+        // belonging to this Unicode character into |codepoint|.
+        if (ii + num_bytes_left > chars.size())
+          continue;
+        while (num_bytes_left > 0) {
+          c = chars[++ii];
+          --num_bytes_left;
+          // Check the next byte is a continuation byte, that is 10xx xxxx.
+          if ((c & 0xc0) != 0x80)
+            continue;
+          codepoint = (codepoint << 6) | (c & 0x3f);
+        }
+
+        // Disallow overlong encodings for ascii characters, as these
+        // would include " and other characters significant to JSON
+        // string termination / control.
+        if (codepoint < 0x7f)
+          continue;
+        // Invalid in UTF8, and can't be represented in UTF16 anyway.
+        if (codepoint > 0x10ffff)
+          continue;
+
+        // So, now we transcode to UTF16,
+        // using the math described at https://en.wikipedia.org/wiki/UTF-16,
+        // for either one or two 16 bit characters.
+        if (codepoint < 0xffff) {
+          out_->append("\\u");
+          PrintHex(static_cast<uint16_t>(codepoint), out_);
+          continue;
+        }
+        codepoint -= 0x10000;
+        // high surrogate
+        out_->append("\\u");
+        PrintHex(static_cast<uint16_t>((codepoint >> 10) + 0xd800), out_);
+        // low surrogate
+        out_->append("\\u");
+        PrintHex(static_cast<uint16_t>((codepoint & 0x3ff) + 0xdc00), out_);
+      }
+    }
+    out_->append("\"");
+  }
+
+  void HandleBinary(std::vector<uint8_t> bytes) override {
+    if (!status_->ok()) return;
+    state_.top().StartElement(out_);
+    out_->append("\"");
+    Base64Encode(bytes, out_);
+    out_->append("\"");
+  }
+
+  void HandleDouble(double value) override {
+    if (!status_->ok()) return;
+    state_.top().StartElement(out_);
+    std::unique_ptr<char[]> str_value = platform_->DToStr(value);
+
+    // DToStr may fail to emit a 0 before the decimal dot. E.g. this is
+    // the case in base::NumberToString in Chromium (which is based on
+    // dmg_fp). So, much like
+    // https://cs.chromium.org/chromium/src/base/json/json_writer.cc
+    // we probe for this and emit the leading 0 anyway if necessary.
+    const char* chars = str_value.get();
+    if (chars[0] == '.') {
+      out_->append("0");
+    } else if (chars[0] == '-' && chars[1] == '.') {
+      out_->append("-0");
+      ++chars;
+    }
+    out_->append(chars);
+  }
+
+  void HandleInt32(int32_t value) override {
+    if (!status_->ok()) return;
+    state_.top().StartElement(out_);
+    out_->append(std::to_string(value));
+  }
+
+  void HandleBool(bool value) override {
+    if (!status_->ok()) return;
+    state_.top().StartElement(out_);
+    out_->append(value ? "true" : "false");
+  }
+
+  void HandleNull() override {
+    if (!status_->ok()) return;
+    state_.top().StartElement(out_);
+    out_->append("null");
+  }
+
+  void HandleError(Status error) override {
+    assert(!error.ok());
+    *status_ = error;
+    out_->clear();
+  }
+
+ private:
+  Platform* platform_;
+  std::string* out_;
+  Status* status_;
+  std::stack<State> state_;
+};
+}  // namespace
+
+std::unique_ptr<JSONParserHandler> NewJSONWriter(Platform* platform,
+                                                 std::string* out,
+                                                 Status* status) {
+  return std::unique_ptr<Writer>(new Writer(platform, out, status));
+}
+}  // namespace inspector_protocol
diff --git a/third_party/inspector_protocol/encoding/json_std_string_writer.h b/third_party/inspector_protocol/encoding/json_std_string_writer.h
new file mode 100644
index 0000000..b2c9b634
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/json_std_string_writer.h
@@ -0,0 +1,25 @@
+// 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 INSPECTOR_PROTOCOL_ENCODING_JSON_STD_STRING_WRITER_H_
+#define INSPECTOR_PROTOCOL_ENCODING_JSON_STD_STRING_WRITER_H_
+
+#include <memory>
+#include <string>
+#include "json_parser_handler.h"
+#include "platform.h"
+
+namespace inspector_protocol {
+// Returns a handler object which will write ascii characters to |out|.
+// |status->ok()| will be false iff the handler routine HandleError() is called.
+// In that case, we'll stop emitting output.
+// Except for calling the HandleError routine at any time, the client
+// code must call the Handle* methods in an order in which they'd occur
+// in valid JSON; otherwise we may crash (the code uses assert).
+std::unique_ptr<JSONParserHandler> NewJSONWriter(Platform* platform,
+                                                 std::string* out,
+                                                 Status* status);
+}  // namespace inspector_protocol
+
+#endif  // INSPECTOR_PROTOCOL_ENCODING_JSON_STD_STRING_WRITER_H_
diff --git a/third_party/inspector_protocol/encoding/json_std_string_writer_test.cc b/third_party/inspector_protocol/encoding/json_std_string_writer_test.cc
new file mode 100644
index 0000000..553f8b2
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/json_std_string_writer_test.cc
@@ -0,0 +1,162 @@
+// 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 "json_std_string_writer.h"
+
+#include "base/strings/string16.h"
+#include "base/strings/utf_string_conversions.h"
+#include "gtest/gtest.h"
+#include "linux_dev_platform.h"
+
+namespace inspector_protocol {
+std::vector<uint16_t> UTF16String(const std::string& utf8) {
+  base::string16 string16 = base::UTF8ToUTF16(utf8);
+  return std::vector<uint16_t>(string16.data(),
+                               string16.data() + string16.size());
+}
+
+void WriteUTF8AsUTF16(JSONParserHandler* writer, const std::string& utf8) {
+  std::vector<uint16_t> utf16 = UTF16String(utf8);
+  writer->HandleString16(span<uint16_t>(utf16.data(), utf16.size()));
+}
+
+TEST(JsonStdStringWriterTest, HelloWorld) {
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  writer->HandleObjectBegin();
+  WriteUTF8AsUTF16(writer.get(), "msg1");
+  WriteUTF8AsUTF16(writer.get(), "Hello, 🌎.");
+  std::string key = "msg1-as-utf8";
+  std::string value = "Hello, 🌎.";
+  writer->HandleString8(
+      span<uint8_t>(reinterpret_cast<const uint8_t*>(key.data()), key.size()));
+  writer->HandleString8(span<uint8_t>(
+      reinterpret_cast<const uint8_t*>(value.data()), value.size()));
+  WriteUTF8AsUTF16(writer.get(), "msg2");
+  WriteUTF8AsUTF16(writer.get(), "\\\b\r\n\t\f\"");
+  WriteUTF8AsUTF16(writer.get(), "nested");
+  writer->HandleObjectBegin();
+  WriteUTF8AsUTF16(writer.get(), "double");
+  writer->HandleDouble(3.1415);
+  WriteUTF8AsUTF16(writer.get(), "int");
+  writer->HandleInt32(-42);
+  WriteUTF8AsUTF16(writer.get(), "bool");
+  writer->HandleBool(false);
+  WriteUTF8AsUTF16(writer.get(), "null");
+  writer->HandleNull();
+  writer->HandleObjectEnd();
+  WriteUTF8AsUTF16(writer.get(), "array");
+  writer->HandleArrayBegin();
+  writer->HandleInt32(1);
+  writer->HandleInt32(2);
+  writer->HandleInt32(3);
+  writer->HandleArrayEnd();
+  writer->HandleObjectEnd();
+  EXPECT_TRUE(status.ok());
+  EXPECT_EQ(
+      "{\"msg1\":\"Hello, \\ud83c\\udf0e.\","
+      "\"msg1-as-utf8\":\"Hello, \\ud83c\\udf0e.\","
+      "\"msg2\":\"\\\\\\b\\r\\n\\t\\f\\\"\","
+      "\"nested\":{\"double\":3.1415,\"int\":-42,"
+      "\"bool\":false,\"null\":null},\"array\":[1,2,3]}",
+      out);
+}
+
+TEST(JsonStdStringWriterTest, BinaryEncodedAsJsonString) {
+  // The encoder emits binary submitted to JSONParserHandler::HandleBinary
+  // as base64. The following three examples are taken from
+  // https://en.wikipedia.org/wiki/Base64.
+  {
+    std::string out;
+    Status status;
+    std::unique_ptr<JSONParserHandler> writer =
+        NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+    writer->HandleBinary({'M', 'a', 'n'});
+    EXPECT_TRUE(status.ok());
+    EXPECT_EQ("\"TWFu\"", out);
+  }
+  {
+    std::string out;
+    Status status;
+    std::unique_ptr<JSONParserHandler> writer =
+        NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+    writer->HandleBinary({'M', 'a'});
+    EXPECT_TRUE(status.ok());
+    EXPECT_EQ("\"TWE=\"", out);
+  }
+  {
+    std::string out;
+    Status status;
+    std::unique_ptr<JSONParserHandler> writer =
+        NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+    writer->HandleBinary({'M'});
+    EXPECT_TRUE(status.ok());
+    EXPECT_EQ("\"TQ==\"", out);
+  }
+  {  // "Hello, world.", verified with base64decode.org.
+    std::string out;
+    Status status;
+    std::unique_ptr<JSONParserHandler> writer =
+        NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+    writer->HandleBinary(
+        {'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '.'});
+    EXPECT_TRUE(status.ok());
+    EXPECT_EQ("\"SGVsbG8sIHdvcmxkLg==\"", out);
+  }
+}
+
+TEST(JsonStdStringWriterTest, HandlesErrors) {
+  // When an error is sent via HandleError, it saves it in the provided
+  // status and clears the output.
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> writer =
+      NewJSONWriter(GetLinuxDevPlatform(), &out, &status);
+  writer->HandleObjectBegin();
+  WriteUTF8AsUTF16(writer.get(), "msg1");
+  writer->HandleError(Status{Error::JSON_PARSER_VALUE_EXPECTED, 42});
+  EXPECT_EQ(Error::JSON_PARSER_VALUE_EXPECTED, status.error);
+  EXPECT_EQ(42, status.pos);
+  EXPECT_EQ("", out);
+}
+
+// We'd use Gmock but unfortunately it only handles copyable return types.
+class MockPlatform : public Platform {
+ public:
+  // Not implemented.
+  bool StrToD(const char* str, double* result) const override { return false; }
+
+  // A map with pre-registered responses for DToSTr.
+  std::map<double, std::string> dtostr_responses;
+
+  std::unique_ptr<char[]> DToStr(double value) const override {
+    auto it = dtostr_responses.find(value);
+    assert(it != dtostr_responses.end());
+    const std::string& str = it->second;
+    std::unique_ptr<char[]> response(new char[str.size() + 1]);
+    memcpy(response.get(), str.c_str(), str.size() + 1);
+    return response;
+  }
+};
+
+TEST(JsonStdStringWriterTest, DoubleToString) {
+  // This "broken" platform responds without the leading 0 before the
+  // decimal dot, so it'd be invalid JSON.
+  MockPlatform platform;
+  platform.dtostr_responses[.1] = ".1";
+  platform.dtostr_responses[-.7] = "-.7";
+
+  std::string out;
+  Status status;
+  std::unique_ptr<JSONParserHandler> writer =
+      NewJSONWriter(&platform, &out, &status);
+  writer->HandleArrayBegin();
+  writer->HandleDouble(.1);
+  writer->HandleDouble(-.7);
+  writer->HandleArrayEnd();
+  EXPECT_EQ("[0.1,-0.7]", out);
+}
+}  // namespace inspector_protocol
diff --git a/third_party/inspector_protocol/encoding/linux_dev_platform.cc b/third_party/inspector_protocol/encoding/linux_dev_platform.cc
new file mode 100644
index 0000000..142ca086
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/linux_dev_platform.cc
@@ -0,0 +1,49 @@
+// 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 "linux_dev_platform.h"
+
+#include <clocale>
+#include <cstdlib>
+#include <cstring>
+#include <iomanip>
+#include <sstream>
+
+namespace inspector_protocol {
+namespace {
+class LinuxDevPlatform : public Platform {
+  bool StrToD(const char* str, double* result) const override {
+    // This is not thread-safe
+    // (see https://en.cppreference.com/w/cpp/locale/setlocale)
+    // but good enough for a unittest.
+    const char* saved_locale = std::setlocale(LC_NUMERIC, nullptr);
+    char* end;
+    *result = std::strtod(str, &end);
+    std::setlocale(LC_NUMERIC, saved_locale);
+    if (errno == ERANGE) {
+      // errno must be reset, e.g. see the example here:
+      // https://en.cppreference.com/w/cpp/string/byte/strtof
+      errno = 0;
+      return false;
+    }
+    return end == str + strlen(str);
+  }
+
+  std::unique_ptr<char[]> DToStr(double value) const override {
+    std::stringstream ss;
+    ss.imbue(std::locale("C"));
+    ss << value;
+    std::string str = ss.str();
+    std::unique_ptr<char[]> result(new char[str.size() + 1]);
+    memcpy(result.get(), str.c_str(), str.size() + 1);
+    return result;
+  }
+};
+}  // namespace
+
+Platform* GetLinuxDevPlatform() {
+  static Platform* deps = new LinuxDevPlatform;
+  return deps;
+}
+}  // namespace inspector_protocol
diff --git a/third_party/inspector_protocol/encoding/linux_dev_platform.h b/third_party/inspector_protocol/encoding/linux_dev_platform.h
new file mode 100644
index 0000000..cf5dfd5b
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/linux_dev_platform.h
@@ -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.
+
+#ifndef INSPECTOR_PROTOCOL_ENCODING_LINUX_DEV_PLATFORM_H_
+#define INSPECTOR_PROTOCOL_ENCODING_LINUX_DEV_PLATFORM_H_
+
+#include "platform.h"
+
+namespace inspector_protocol {
+// Returns an instance of the platform implementation that we're using for
+// development on Linux. This is intended and appropriate for tests for this
+// package, for now.
+Platform* GetLinuxDevPlatform();
+}  // namespace inspector_protocol
+
+#endif  // INSPECTOR_PROTOCOL_ENCODING_LINUX_DEV_PLATFORM_H_
diff --git a/third_party/inspector_protocol/encoding/platform.h b/third_party/inspector_protocol/encoding/platform.h
new file mode 100644
index 0000000..cfd2d5d
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/platform.h
@@ -0,0 +1,25 @@
+// 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 INSPECTOR_PROTOCOL_ENCODING_PLATFORM_H_
+#define INSPECTOR_PROTOCOL_ENCODING_PLATFORM_H_
+
+#include <memory>
+
+namespace inspector_protocol {
+// Client code must provide an instance. Implementation should delegate
+// to whatever is appropriate.
+class Platform {
+ public:
+  virtual ~Platform() = default;
+  // Parses |str| into |result|. Returns false iff there are
+  // leftover characters or parsing errors.
+  virtual bool StrToD(const char* str, double* result) const = 0;
+
+  // Prints |value| in a format suitable for JSON.
+  virtual std::unique_ptr<char[]> DToStr(double value) const = 0;
+};
+}  // namespace inspector_protocol
+
+#endif  // INSPECTOR_PROTOCOL_ENCODING_PLATFORM_H_
diff --git a/third_party/inspector_protocol/encoding/span.h b/third_party/inspector_protocol/encoding/span.h
new file mode 100644
index 0000000..052062cf
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/span.h
@@ -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.
+
+#ifndef INSPECTOR_PROTOCOL_ENCODING_SPAN_H_
+#define INSPECTOR_PROTOCOL_ENCODING_SPAN_H_
+
+#include <cstddef>
+
+namespace inspector_protocol {
+// This template is similar to std::span, which will be included in C++20.  Like
+// std::span it uses ptrdiff_t, which is signed (and thus a bit annoying
+// sometimes when comparing with size_t), but other than this it's much simpler.
+template <typename T>
+class span {
+ public:
+  using index_type = std::ptrdiff_t;
+
+  span() : data_(nullptr), size_(0) {}
+  span(const T* data, index_type size) : data_(data), size_(size) {}
+
+  const T* data() const { return data_; }
+
+  const T* begin() const { return data_; }
+  const T* end() const { return data_ + size_; }
+
+  const T& operator[](index_type idx) const { return data_[idx]; }
+
+  span<T> subspan(index_type offset, index_type count) const {
+    return span(data_ + offset, count);
+  }
+
+  span<T> subspan(index_type offset) const {
+    return span(data_ + offset, size_ - offset);
+  }
+
+  bool empty() const { return size_ == 0; }
+
+  index_type size() const { return size_; }
+  index_type size_bytes() const { return size_ * sizeof(T); }
+
+ private:
+  const T* data_;
+  index_type size_;
+};
+}  // namespace inspector_protocol
+#endif  // INSPECTOR_PROTOCOL_ENCODING_SPAN_H_
diff --git a/third_party/inspector_protocol/encoding/span_test.cc b/third_party/inspector_protocol/encoding/span_test.cc
new file mode 100644
index 0000000..48ee76d
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/span_test.cc
@@ -0,0 +1,57 @@
+// 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 "span.h"
+
+#include "gtest/gtest.h"
+
+namespace inspector_protocol {
+template <typename T>
+class SpanTest : public ::testing::Test {};
+
+using TestTypes = ::testing::Types<uint8_t, uint16_t>;
+TYPED_TEST_SUITE(SpanTest, TestTypes);
+
+TYPED_TEST(SpanTest, Empty) {
+  span<TypeParam> empty;
+  EXPECT_TRUE(empty.empty());
+  EXPECT_EQ(0, empty.size());
+  EXPECT_EQ(0, empty.size_bytes());
+  EXPECT_EQ(empty.begin(), empty.end());
+}
+
+TYPED_TEST(SpanTest, SingleItem) {
+  TypeParam single_item = 42;
+  span<TypeParam> singular(&single_item, 1);
+  EXPECT_FALSE(singular.empty());
+  EXPECT_EQ(1, singular.size());
+  EXPECT_EQ(sizeof(TypeParam), static_cast<size_t>(singular.size_bytes()));
+  EXPECT_EQ(singular.begin() + 1, singular.end());
+  EXPECT_EQ(42, singular[0]);
+}
+
+TYPED_TEST(SpanTest, FiveItems) {
+  std::vector<TypeParam> test_input = {31, 32, 33, 34, 35};
+  span<TypeParam> five_items(test_input.data(), 5);
+  EXPECT_FALSE(five_items.empty());
+  EXPECT_EQ(5, five_items.size());
+  EXPECT_EQ(sizeof(TypeParam) * 5,
+            static_cast<size_t>(five_items.size_bytes()));
+  EXPECT_EQ(five_items.begin() + 5, five_items.end());
+  EXPECT_EQ(31, five_items[0]);
+  EXPECT_EQ(32, five_items[1]);
+  EXPECT_EQ(33, five_items[2]);
+  EXPECT_EQ(34, five_items[3]);
+  EXPECT_EQ(35, five_items[4]);
+  span<TypeParam> three_items = five_items.subspan(2);
+  EXPECT_EQ(3, three_items.size());
+  EXPECT_EQ(33, three_items[0]);
+  EXPECT_EQ(34, three_items[1]);
+  EXPECT_EQ(35, three_items[2]);
+  span<TypeParam> two_items = five_items.subspan(2, 2);
+  EXPECT_EQ(2, two_items.size());
+  EXPECT_EQ(33, two_items[0]);
+  EXPECT_EQ(34, two_items[1]);
+}
+}  // namespace inspector_protocol
diff --git a/third_party/inspector_protocol/encoding/status.h b/third_party/inspector_protocol/encoding/status.h
new file mode 100644
index 0000000..ea4a3da
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/status.h
@@ -0,0 +1,61 @@
+// 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 INSPECTOR_PROTOCOL_ENCODING_STATUS_H_
+#define INSPECTOR_PROTOCOL_ENCODING_STATUS_H_
+
+#include <cstdint>
+
+namespace inspector_protocol {
+// Error codes.
+enum class Error {
+  OK = 0,
+  // JSON parsing errors - json_parser.{h,cc}.
+  JSON_PARSER_UNPROCESSED_INPUT_REMAINS = 0x01,
+  JSON_PARSER_STACK_LIMIT_EXCEEDED = 0x02,
+  JSON_PARSER_NO_INPUT = 0x03,
+  JSON_PARSER_INVALID_TOKEN = 0x04,
+  JSON_PARSER_INVALID_NUMBER = 0x05,
+  JSON_PARSER_INVALID_STRING = 0x06,
+  JSON_PARSER_UNEXPECTED_ARRAY_END = 0x07,
+  JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED = 0x08,
+  JSON_PARSER_STRING_LITERAL_EXPECTED = 0x09,
+  JSON_PARSER_COLON_EXPECTED = 0x0a,
+  JSON_PARSER_UNEXPECTED_OBJECT_END = 0x0b,
+  JSON_PARSER_COMMA_OR_OBJECT_END_EXPECTED = 0x0c,
+  JSON_PARSER_VALUE_EXPECTED = 0x0d,
+
+  CBOR_INVALID_INT32 = 0x0e,
+  CBOR_INVALID_DOUBLE = 0x0f,
+  CBOR_INVALID_ENVELOPE = 0x10,
+  CBOR_INVALID_STRING8 = 0x11,
+  CBOR_INVALID_STRING16 = 0x12,
+  CBOR_INVALID_BINARY = 0x13,
+  CBOR_UNSUPPORTED_VALUE = 0x14,
+  CBOR_NO_INPUT = 0x15,
+  CBOR_INVALID_START_BYTE = 0x16,
+  CBOR_UNEXPECTED_EOF_EXPECTED_VALUE = 0x17,
+  CBOR_UNEXPECTED_EOF_IN_ARRAY = 0x18,
+  CBOR_UNEXPECTED_EOF_IN_MAP = 0x19,
+  CBOR_INVALID_MAP_KEY = 0x1a,
+  CBOR_STACK_LIMIT_EXCEEDED = 0x1b,
+  CBOR_STRING8_MUST_BE_7BIT = 0x1c,
+  CBOR_TRAILING_JUNK = 0x1d,
+  CBOR_MAP_START_EXPECTED = 0x1e,
+};
+
+// A status value with position that can be copied. The default status
+// is OK. Usually, error status values should come with a valid position.
+struct Status {
+  static constexpr std::ptrdiff_t npos() { return -1; }
+
+  bool ok() const { return error == Error::OK; }
+
+  Error error = Error::OK;
+  std::ptrdiff_t pos = npos();
+  Status(Error error, std::ptrdiff_t pos) : error(error), pos(pos) {}
+  Status() = default;
+};
+}  // namespace inspector_protocol
+#endif  // INSPECTOR_PROTOCOL_ENCODING_STATUS_H_
diff --git a/third_party/inspector_protocol/encoding/str_util.cc b/third_party/inspector_protocol/encoding/str_util.cc
new file mode 100644
index 0000000..1f4be7c
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/str_util.cc
@@ -0,0 +1,20 @@
+// 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 "str_util.h"
+
+#include <cstring>
+
+namespace inspector_protocol {
+bool StrEq(span<uint8_t> left, span<uint8_t> right) {
+  return left.size() == right.size() &&
+         0 == memcmp(left.data(), right.data(), left.size());
+}
+
+bool StrEq(span<uint8_t> left, const char* null_terminated_right) {
+  return static_cast<std::size_t>(left.size()) ==
+             strlen(null_terminated_right) &&
+         0 == memcmp(left.data(), null_terminated_right, left.size());
+}
+}  // namespace inspector_protocol
diff --git a/third_party/inspector_protocol/encoding/str_util.h b/third_party/inspector_protocol/encoding/str_util.h
new file mode 100644
index 0000000..f377541
--- /dev/null
+++ b/third_party/inspector_protocol/encoding/str_util.h
@@ -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.
+
+#ifndef INSPECTOR_PROTOCOL_ENCODING_STR_UTIL_H_
+#define INSPECTOR_PROTOCOL_ENCODING_STR_UTIL_H_
+
+#include <cstdint>
+
+#include "span.h"
+
+namespace inspector_protocol {
+// Returns true iff |left| and right have the same contents, byte for byte.
+bool StrEq(span<uint8_t> left, span<uint8_t> right);
+bool StrEq(span<uint8_t> left, const char* null_terminated_right);
+}  // namespace inspector_protocol
+#endif  // INSPECTOR_PROTOCOL_ENCODING_STR_UTIL_H_
diff --git a/third_party/inspector_protocol/inspector_protocol.gni b/third_party/inspector_protocol/inspector_protocol.gni
index d612fb6a..ecee942 100644
--- a/third_party/inspector_protocol/inspector_protocol.gni
+++ b/third_party/inspector_protocol/inspector_protocol.gni
@@ -33,10 +33,10 @@
       invoker.config_file,
       "$inspector_protocol_dir/lib/base_string_adapter_cc.template",
       "$inspector_protocol_dir/lib/base_string_adapter_h.template",
-      "$inspector_protocol_dir/lib/encoding_h.template",
-      "$inspector_protocol_dir/lib/encoding_cpp.template",
       "$inspector_protocol_dir/lib/Allocator_h.template",
       "$inspector_protocol_dir/lib/Array_h.template",
+      "$inspector_protocol_dir/lib/CBOR_h.template",
+      "$inspector_protocol_dir/lib/CBOR_cpp.template",
       "$inspector_protocol_dir/lib/DispatcherBase_cpp.template",
       "$inspector_protocol_dir/lib/DispatcherBase_h.template",
       "$inspector_protocol_dir/lib/ErrorSupport_cpp.template",
diff --git a/third_party/inspector_protocol/inspector_protocol.gypi b/third_party/inspector_protocol/inspector_protocol.gypi
index d614474..3d0a60e 100644
--- a/third_party/inspector_protocol/inspector_protocol.gypi
+++ b/third_party/inspector_protocol/inspector_protocol.gypi
@@ -5,10 +5,10 @@
 {
   'variables': {
     'inspector_protocol_files': [
-      'lib/encoding_h.template',
-      'lib/encoding_cpp.template',
       'lib/Allocator_h.template',
       'lib/Array_h.template',
+      'lib/CBOR_h.template',
+      'lib/CBOR_cpp.template',
       'lib/DispatcherBase_cpp.template',
       'lib/DispatcherBase_h.template',
       'lib/ErrorSupport_cpp.template',
diff --git a/third_party/inspector_protocol/lib/CBOR_cpp.template b/third_party/inspector_protocol/lib/CBOR_cpp.template
new file mode 100644
index 0000000..d2375b6c
--- /dev/null
+++ b/third_party/inspector_protocol/lib/CBOR_cpp.template
@@ -0,0 +1,828 @@
+{# This template is generated by gen_cbor_templates.py. #}
+// Generated by lib/CBOR_cpp.template.
+
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+#include <cassert>
+#include <limits>
+
+{% for namespace in config.protocol.namespace %}
+namespace {{namespace}} {
+{% endfor %}
+
+// ===== encoding/cbor.cc =====
+
+using namespace cbor;
+
+namespace {
+
+// See RFC 7049 Section 2.3, Table 2.
+static constexpr uint8_t kEncodedTrue =
+    EncodeInitialByte(MajorType::SIMPLE_VALUE, 21);
+static constexpr uint8_t kEncodedFalse =
+    EncodeInitialByte(MajorType::SIMPLE_VALUE, 20);
+static constexpr uint8_t kEncodedNull =
+    EncodeInitialByte(MajorType::SIMPLE_VALUE, 22);
+static constexpr uint8_t kInitialByteForDouble =
+    EncodeInitialByte(MajorType::SIMPLE_VALUE, 27);
+
+}  // namespace
+
+uint8_t EncodeTrue() { return kEncodedTrue; }
+uint8_t EncodeFalse() { return kEncodedFalse; }
+uint8_t EncodeNull() { return kEncodedNull; }
+
+uint8_t EncodeIndefiniteLengthArrayStart() {
+  return kInitialByteIndefiniteLengthArray;
+}
+
+uint8_t EncodeIndefiniteLengthMapStart() {
+  return kInitialByteIndefiniteLengthMap;
+}
+
+uint8_t EncodeStop() { return kStopByte; }
+
+namespace {
+// See RFC 7049 Table 3 and Section 2.4.4.2. This is used as a prefix for
+// arbitrary binary data encoded as BYTE_STRING.
+static constexpr uint8_t kExpectedConversionToBase64Tag =
+    EncodeInitialByte(MajorType::TAG, 22);
+
+// When parsing CBOR, we limit recursion depth for objects and arrays
+// to this constant.
+static constexpr int kStackLimit = 1000;
+
+// Writes the bytes for |v| to |out|, starting with the most significant byte.
+// See also: https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html
+template <typename T>
+void WriteBytesMostSignificantByteFirst(T v, std::vector<uint8_t>* out) {
+  for (int shift_bytes = sizeof(T) - 1; shift_bytes >= 0; --shift_bytes)
+    out->push_back(0xff & (v >> (shift_bytes * 8)));
+}
+}  // namespace
+
+namespace cbor_internals {
+// Writes the start of a token with |type|. The |value| may indicate the size,
+// or it may be the payload if the value is an unsigned integer.
+void WriteTokenStart(MajorType type, uint64_t value,
+                     std::vector<uint8_t>* encoded) {
+  if (value < 24) {
+    // Values 0-23 are encoded directly into the additional info of the
+    // initial byte.
+    encoded->push_back(EncodeInitialByte(type, /*additional_info=*/value));
+    return;
+  }
+  if (value <= std::numeric_limits<uint8_t>::max()) {
+    // Values 24-255 are encoded with one initial byte, followed by the value.
+    encoded->push_back(EncodeInitialByte(type, kAdditionalInformation1Byte));
+    encoded->push_back(value);
+    return;
+  }
+  if (value <= std::numeric_limits<uint16_t>::max()) {
+    // Values 256-65535: 1 initial byte + 2 bytes payload.
+    encoded->push_back(EncodeInitialByte(type, kAdditionalInformation2Bytes));
+    WriteBytesMostSignificantByteFirst<uint16_t>(value, encoded);
+    return;
+  }
+  if (value <= std::numeric_limits<uint32_t>::max()) {
+    // 32 bit uint: 1 initial byte + 4 bytes payload.
+    encoded->push_back(EncodeInitialByte(type, kAdditionalInformation4Bytes));
+    WriteBytesMostSignificantByteFirst<uint32_t>(static_cast<uint32_t>(value),
+                                                 encoded);
+    return;
+  }
+  // 64 bit uint: 1 initial byte + 8 bytes payload.
+  encoded->push_back(EncodeInitialByte(type, kAdditionalInformation8Bytes));
+  WriteBytesMostSignificantByteFirst<uint64_t>(value, encoded);
+}
+}  // namespace cbor_internals
+
+namespace {
+// Extracts sizeof(T) bytes from |in| to extract a value of type T
+// (e.g. uint64_t, uint32_t, ...), most significant byte first.
+// See also: https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html
+template <typename T>
+T ReadBytesMostSignificantByteFirst(span<uint8_t> in) {
+  assert(static_cast<std::size_t>(in.size()) >= sizeof(T));
+  T result = 0;
+  for (std::size_t shift_bytes = 0; shift_bytes < sizeof(T); ++shift_bytes)
+    result |= T(in[sizeof(T) - 1 - shift_bytes]) << (shift_bytes * 8);
+  return result;
+}
+}  // namespace
+
+namespace cbor_internals {
+int8_t ReadTokenStart(span<uint8_t> bytes, MajorType* type, uint64_t* value) {
+  if (bytes.empty()) return -1;
+  uint8_t initial_byte = bytes[0];
+  *type = MajorType((initial_byte & kMajorTypeMask) >> kMajorTypeBitShift);
+
+  uint8_t additional_information = initial_byte & kAdditionalInformationMask;
+  if (additional_information < 24) {
+    // Values 0-23 are encoded directly into the additional info of the
+    // initial byte.
+    *value = additional_information;
+    return 1;
+  }
+  if (additional_information == kAdditionalInformation1Byte) {
+    // Values 24-255 are encoded with one initial byte, followed by the value.
+    if (bytes.size() < 2) return -1;
+    *value = ReadBytesMostSignificantByteFirst<uint8_t>(bytes.subspan(1));
+    return 2;
+  }
+  if (additional_information == kAdditionalInformation2Bytes) {
+    // Values 256-65535: 1 initial byte + 2 bytes payload.
+    if (static_cast<std::size_t>(bytes.size()) < 1 + sizeof(uint16_t))
+      return -1;
+    *value = ReadBytesMostSignificantByteFirst<uint16_t>(bytes.subspan(1));
+    return 3;
+  }
+  if (additional_information == kAdditionalInformation4Bytes) {
+    // 32 bit uint: 1 initial byte + 4 bytes payload.
+    if (static_cast<std::size_t>(bytes.size()) < 1 + sizeof(uint32_t))
+      return -1;
+    *value = ReadBytesMostSignificantByteFirst<uint32_t>(bytes.subspan(1));
+    return 5;
+  }
+  if (additional_information == kAdditionalInformation8Bytes) {
+    // 64 bit uint: 1 initial byte + 8 bytes payload.
+    if (static_cast<std::size_t>(bytes.size()) < 1 + sizeof(uint64_t))
+      return -1;
+    *value = ReadBytesMostSignificantByteFirst<uint64_t>(bytes.subspan(1));
+    return 9;
+  }
+  return -1;
+}
+}  // namespace cbor_internals
+
+using cbor_internals::WriteTokenStart;
+using cbor_internals::ReadTokenStart;
+
+void EncodeInt32(int32_t value, std::vector<uint8_t>* out) {
+  if (value >= 0) {
+    WriteTokenStart(MajorType::UNSIGNED, value, out);
+  } else {
+    uint64_t representation = static_cast<uint64_t>(-(value + 1));
+    WriteTokenStart(MajorType::NEGATIVE, representation, out);
+  }
+}
+
+void EncodeString16(span<uint16_t> in, std::vector<uint8_t>* out) {
+  uint64_t byte_length = static_cast<uint64_t>(in.size_bytes());
+  WriteTokenStart(MajorType::BYTE_STRING, byte_length, out);
+  // When emitting UTF16 characters, we always write the least significant byte
+  // first; this is because it's the native representation for X86.
+  // TODO(johannes): Implement a more efficient thing here later, e.g.
+  // casting *iff* the machine has this byte order.
+  // The wire format for UTF16 chars will probably remain the same
+  // (least significant byte first) since this way we can have
+  // golden files, unittests, etc. that port easily and universally.
+  // See also:
+  // https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html
+  for (const uint16_t two_bytes : in) {
+    out->push_back(two_bytes);
+    out->push_back(two_bytes >> 8);
+  }
+}
+
+void EncodeString8(span<uint8_t> in, std::vector<uint8_t>* out) {
+  WriteTokenStart(MajorType::STRING, static_cast<uint64_t>(in.size_bytes()),
+                  out);
+  out->insert(out->end(), in.begin(), in.end());
+}
+
+void EncodeFromLatin1(span<uint8_t> latin1, std::vector<uint8_t>* out) {
+  for (std::ptrdiff_t ii = 0; ii < latin1.size(); ++ii) {
+    if (latin1[ii] <= 127) continue;
+    // If there's at least one non-ASCII char, convert to UTF8.
+    std::vector<uint8_t> utf8(latin1.begin(), latin1.begin() + ii);
+    for (; ii < latin1.size(); ++ii) {
+      if (latin1[ii] <= 127) {
+        utf8.push_back(latin1[ii]);
+      } else {
+        // 0xC0 means it's a UTF8 sequence with 2 bytes.
+        utf8.push_back((latin1[ii] >> 6) | 0xc0);
+        utf8.push_back((latin1[ii] | 0x80) & 0xbf);
+      }
+    }
+    EncodeString8(span<uint8_t>(utf8.data(), utf8.size()), out);
+    return;
+  }
+  EncodeString8(latin1, out);
+}
+
+void EncodeFromUTF16(span<uint16_t> utf16, std::vector<uint8_t>* out) {
+  // If there's at least one non-ASCII char, encode as STRING16 (UTF16).
+  for (uint16_t ch : utf16) {
+    if (ch <= 127) continue;
+    EncodeString16(utf16, out);
+    return;
+  }
+  // It's all US-ASCII, strip out every second byte and encode as UTF8.
+  WriteTokenStart(MajorType::STRING, static_cast<uint64_t>(utf16.size()), out);
+  out->insert(out->end(), utf16.begin(), utf16.end());
+}
+
+void EncodeBinary(span<uint8_t> in, std::vector<uint8_t>* out) {
+  out->push_back(kExpectedConversionToBase64Tag);
+  uint64_t byte_length = static_cast<uint64_t>(in.size_bytes());
+  WriteTokenStart(MajorType::BYTE_STRING, byte_length, out);
+  out->insert(out->end(), in.begin(), in.end());
+}
+
+// A double is encoded with a specific initial byte
+// (kInitialByteForDouble) plus the 64 bits of payload for its value.
+constexpr std::ptrdiff_t kEncodedDoubleSize = 1 + sizeof(uint64_t);
+
+// An envelope is encoded with a specific initial byte
+// (kInitialByteForEnvelope), plus the start byte for a BYTE_STRING with a 32
+// bit wide length, plus a 32 bit length for that string.
+constexpr std::ptrdiff_t kEncodedEnvelopeHeaderSize = 1 + 1 + sizeof(uint32_t);
+
+void EncodeDouble(double value, std::vector<uint8_t>* out) {
+  // The additional_info=27 indicates 64 bits for the double follow.
+  // See RFC 7049 Section 2.3, Table 1.
+  out->push_back(kInitialByteForDouble);
+  union {
+    double from_double;
+    uint64_t to_uint64;
+  } reinterpret;
+  reinterpret.from_double = value;
+  WriteBytesMostSignificantByteFirst<uint64_t>(reinterpret.to_uint64, out);
+}
+
+void EnvelopeEncoder::EncodeStart(std::vector<uint8_t>* out) {
+  assert(byte_size_pos_ == 0);
+  out->push_back(kInitialByteForEnvelope);
+  out->push_back(kInitialByteFor32BitLengthByteString);
+  byte_size_pos_ = out->size();
+  out->resize(out->size() + sizeof(uint32_t));
+}
+
+bool EnvelopeEncoder::EncodeStop(std::vector<uint8_t>* out) {
+  assert(byte_size_pos_ != 0);
+  // The byte size is the size of the payload, that is, all the
+  // bytes that were written past the byte size position itself.
+  uint64_t byte_size = out->size() - (byte_size_pos_ + sizeof(uint32_t));
+  // We store exactly 4 bytes, so at most INT32MAX, with most significant
+  // byte first.
+  if (byte_size > std::numeric_limits<uint32_t>::max()) return false;
+  for (int shift_bytes = sizeof(uint32_t) - 1; shift_bytes >= 0;
+       --shift_bytes) {
+    (*out)[byte_size_pos_++] = 0xff & (byte_size >> (shift_bytes * 8));
+  }
+  return true;
+}
+
+namespace {
+class JSONToCBOREncoder : public JSONParserHandler {
+ public:
+  JSONToCBOREncoder(std::vector<uint8_t>* out, Status* status)
+      : out_(out), status_(status) {
+    *status_ = Status();
+  }
+
+  void HandleObjectBegin() override {
+    envelopes_.emplace_back();
+    envelopes_.back().EncodeStart(out_);
+    out_->push_back(kInitialByteIndefiniteLengthMap);
+  }
+
+  void HandleObjectEnd() override {
+    out_->push_back(kStopByte);
+    assert(!envelopes_.empty());
+    envelopes_.back().EncodeStop(out_);
+    envelopes_.pop_back();
+  }
+
+  void HandleArrayBegin() override {
+    envelopes_.emplace_back();
+    envelopes_.back().EncodeStart(out_);
+    out_->push_back(kInitialByteIndefiniteLengthArray);
+  }
+
+  void HandleArrayEnd() override {
+    out_->push_back(kStopByte);
+    assert(!envelopes_.empty());
+    envelopes_.back().EncodeStop(out_);
+    envelopes_.pop_back();
+  }
+
+  void HandleString8(span<uint8_t> chars) override {
+    EncodeString8(chars, out_);
+  }
+
+  void HandleString16(span<uint16_t> chars) override {
+    for (uint16_t ch : chars) {
+      if (ch >= 0x7f) {
+        // If there's at least one non-7bit character, we encode as UTF16.
+        EncodeString16(chars, out_);
+        return;
+      }
+    }
+    std::vector<uint8_t> sevenbit_chars(chars.begin(), chars.end());
+    EncodeString8(span<uint8_t>(sevenbit_chars.data(), sevenbit_chars.size()),
+                  out_);
+  }
+
+  void HandleBinary(std::vector<uint8_t> bytes) override {
+    EncodeBinary(span<uint8_t>(bytes.data(), bytes.size()), out_);
+  }
+
+  void HandleDouble(double value) override { EncodeDouble(value, out_); }
+
+  void HandleInt32(int32_t value) override { EncodeInt32(value, out_); }
+
+  void HandleBool(bool value) override {
+    // See RFC 7049 Section 2.3, Table 2.
+    out_->push_back(value ? kEncodedTrue : kEncodedFalse);
+  }
+
+  void HandleNull() override {
+    // See RFC 7049 Section 2.3, Table 2.
+    out_->push_back(kEncodedNull);
+  }
+
+  void HandleError(Status error) override {
+    assert(!error.ok());
+    *status_ = error;
+    out_->clear();
+  }
+
+ private:
+  std::vector<uint8_t>* out_;
+  std::vector<EnvelopeEncoder> envelopes_;
+  Status* status_;
+};
+}  // namespace
+
+std::unique_ptr<JSONParserHandler> NewJSONToCBOREncoder(
+    std::vector<uint8_t>* out, Status* status) {
+  return std::unique_ptr<JSONParserHandler>(new JSONToCBOREncoder(out, status));
+}
+
+namespace {
+// Below are three parsing routines for CBOR, which cover enough
+// to roundtrip JSON messages.
+bool ParseMap(int32_t stack_depth, CBORTokenizer* tokenizer,
+              JSONParserHandler* out);
+bool ParseArray(int32_t stack_depth, CBORTokenizer* tokenizer,
+                JSONParserHandler* out);
+bool ParseValue(int32_t stack_depth, CBORTokenizer* tokenizer,
+                JSONParserHandler* out);
+
+void ParseUTF16String(CBORTokenizer* tokenizer, JSONParserHandler* out) {
+  std::vector<uint16_t> value;
+  span<uint8_t> rep = tokenizer->GetString16WireRep();
+  for (std::ptrdiff_t ii = 0; ii < rep.size(); ii += 2)
+    value.push_back((rep[ii + 1] << 8) | rep[ii]);
+  out->HandleString16(span<uint16_t>(value.data(), value.size()));
+  tokenizer->Next();
+}
+
+bool ParseUTF8String(CBORTokenizer* tokenizer, JSONParserHandler* out) {
+  assert(tokenizer->TokenTag() == CBORTokenTag::STRING8);
+  out->HandleString8(tokenizer->GetString8());
+  tokenizer->Next();
+  return true;
+}
+
+bool ParseValue(int32_t stack_depth, CBORTokenizer* tokenizer,
+                JSONParserHandler* out) {
+  if (stack_depth > kStackLimit) {
+    out->HandleError(
+        Status{Error::CBOR_STACK_LIMIT_EXCEEDED, tokenizer->Status().pos});
+    return false;
+  }
+  // Skip past the envelope to get to what's inside.
+  if (tokenizer->TokenTag() == CBORTokenTag::ENVELOPE)
+    tokenizer->EnterEnvelope();
+  switch (tokenizer->TokenTag()) {
+    case CBORTokenTag::ERROR_VALUE:
+      out->HandleError(tokenizer->Status());
+      return false;
+    case CBORTokenTag::DONE:
+      out->HandleError(Status{Error::CBOR_UNEXPECTED_EOF_EXPECTED_VALUE,
+                              tokenizer->Status().pos});
+      return false;
+    case CBORTokenTag::TRUE_VALUE:
+      out->HandleBool(true);
+      tokenizer->Next();
+      return true;
+    case CBORTokenTag::FALSE_VALUE:
+      out->HandleBool(false);
+      tokenizer->Next();
+      return true;
+    case CBORTokenTag::NULL_VALUE:
+      out->HandleNull();
+      tokenizer->Next();
+      return true;
+    case CBORTokenTag::INT32:
+      out->HandleInt32(tokenizer->GetInt32());
+      tokenizer->Next();
+      return true;
+    case CBORTokenTag::DOUBLE:
+      out->HandleDouble(tokenizer->GetDouble());
+      tokenizer->Next();
+      return true;
+    case CBORTokenTag::STRING8:
+      return ParseUTF8String(tokenizer, out);
+    case CBORTokenTag::STRING16:
+      ParseUTF16String(tokenizer, out);
+      return true;
+    case CBORTokenTag::BINARY: {
+      span<uint8_t> binary = tokenizer->GetBinary();
+      out->HandleBinary(std::vector<uint8_t>(binary.begin(), binary.end()));
+      tokenizer->Next();
+      return true;
+    }
+    case CBORTokenTag::MAP_START:
+      return ParseMap(stack_depth + 1, tokenizer, out);
+    case CBORTokenTag::ARRAY_START:
+      return ParseArray(stack_depth + 1, tokenizer, out);
+    default:
+      out->HandleError(
+          Status{Error::CBOR_UNSUPPORTED_VALUE, tokenizer->Status().pos});
+      return false;
+  }
+}
+
+// |bytes| must start with the indefinite length array byte, so basically,
+// ParseArray may only be called after an indefinite length array has been
+// detected.
+bool ParseArray(int32_t stack_depth, CBORTokenizer* tokenizer,
+                JSONParserHandler* out) {
+  assert(tokenizer->TokenTag() == CBORTokenTag::ARRAY_START);
+  tokenizer->Next();
+  out->HandleArrayBegin();
+  while (tokenizer->TokenTag() != CBORTokenTag::STOP) {
+    if (tokenizer->TokenTag() == CBORTokenTag::DONE) {
+      out->HandleError(
+          Status{Error::CBOR_UNEXPECTED_EOF_IN_ARRAY, tokenizer->Status().pos});
+      return false;
+    }
+    if (tokenizer->TokenTag() == CBORTokenTag::ERROR_VALUE) {
+      out->HandleError(tokenizer->Status());
+      return false;
+    }
+    // Parse value.
+    if (!ParseValue(stack_depth, tokenizer, out)) return false;
+  }
+  out->HandleArrayEnd();
+  tokenizer->Next();
+  return true;
+}
+
+// |bytes| must start with the indefinite length array byte, so basically,
+// ParseArray may only be called after an indefinite length array has been
+// detected.
+bool ParseMap(int32_t stack_depth, CBORTokenizer* tokenizer,
+              JSONParserHandler* out) {
+  assert(tokenizer->TokenTag() == CBORTokenTag::MAP_START);
+  out->HandleObjectBegin();
+  tokenizer->Next();
+  while (tokenizer->TokenTag() != CBORTokenTag::STOP) {
+    if (tokenizer->TokenTag() == CBORTokenTag::DONE) {
+      out->HandleError(
+          Status{Error::CBOR_UNEXPECTED_EOF_IN_MAP, tokenizer->Status().pos});
+      return false;
+    }
+    if (tokenizer->TokenTag() == CBORTokenTag::ERROR_VALUE) {
+      out->HandleError(tokenizer->Status());
+      return false;
+    }
+    // Parse key.
+    if (tokenizer->TokenTag() == CBORTokenTag::STRING8) {
+      if (!ParseUTF8String(tokenizer, out)) return false;
+    } else if (tokenizer->TokenTag() == CBORTokenTag::STRING16) {
+      ParseUTF16String(tokenizer, out);
+    } else {
+      out->HandleError(
+          Status{Error::CBOR_INVALID_MAP_KEY, tokenizer->Status().pos});
+      return false;
+    }
+    // Parse value.
+    if (!ParseValue(stack_depth, tokenizer, out)) return false;
+  }
+  out->HandleObjectEnd();
+  tokenizer->Next();
+  return true;
+}
+}  // namespace
+
+void ParseCBOR(span<uint8_t> bytes, JSONParserHandler* json_out) {
+  if (bytes.empty()) {
+    json_out->HandleError(Status{Error::CBOR_NO_INPUT, 0});
+    return;
+  }
+  if (bytes[0] != kInitialByteForEnvelope) {
+    json_out->HandleError(Status{Error::CBOR_INVALID_START_BYTE, 0});
+    return;
+  }
+  CBORTokenizer tokenizer(bytes);
+  if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) {
+    json_out->HandleError(tokenizer.Status());
+    return;
+  }
+  // We checked for the envelope start byte above, so the tokenizer
+  // must agree here, since it's not an error.
+  assert(tokenizer.TokenTag() == CBORTokenTag::ENVELOPE);
+  tokenizer.EnterEnvelope();
+  if (tokenizer.TokenTag() != CBORTokenTag::MAP_START) {
+    json_out->HandleError(
+        Status{Error::CBOR_MAP_START_EXPECTED, tokenizer.Status().pos});
+    return;
+  }
+  if (!ParseMap(/*stack_depth=*/1, &tokenizer, json_out)) return;
+  if (tokenizer.TokenTag() == CBORTokenTag::DONE) return;
+  if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) {
+    json_out->HandleError(tokenizer.Status());
+    return;
+  }
+  json_out->HandleError(
+      Status{Error::CBOR_TRAILING_JUNK, tokenizer.Status().pos});
+}
+
+CBORTokenizer::CBORTokenizer(span<uint8_t> bytes) : bytes_(bytes) {
+  ReadNextToken(/*enter_envelope=*/false);
+}
+CBORTokenizer::~CBORTokenizer() {}
+
+CBORTokenTag CBORTokenizer::TokenTag() const { return token_tag_; }
+
+void CBORTokenizer::Next() {
+  if (token_tag_ == CBORTokenTag::ERROR_VALUE || token_tag_ == CBORTokenTag::DONE)
+    return;
+  ReadNextToken(/*enter_envelope=*/false);
+}
+
+void CBORTokenizer::EnterEnvelope() {
+  assert(token_tag_ == CBORTokenTag::ENVELOPE);
+  ReadNextToken(/*enter_envelope=*/true);
+}
+
+Status CBORTokenizer::Status() const { return status_; }
+
+int32_t CBORTokenizer::GetInt32() const {
+  assert(token_tag_ == CBORTokenTag::INT32);
+  // The range checks happen in ::ReadNextToken().
+  return static_cast<uint32_t>(
+      token_start_type_ == MajorType::UNSIGNED
+          ? token_start_internal_value_
+          : -static_cast<int64_t>(token_start_internal_value_) - 1);
+}
+
+double CBORTokenizer::GetDouble() const {
+  assert(token_tag_ == CBORTokenTag::DOUBLE);
+  union {
+    uint64_t from_uint64;
+    double to_double;
+  } reinterpret;
+  reinterpret.from_uint64 = ReadBytesMostSignificantByteFirst<uint64_t>(
+      bytes_.subspan(status_.pos + 1));
+  return reinterpret.to_double;
+}
+
+span<uint8_t> CBORTokenizer::GetString8() const {
+  assert(token_tag_ == CBORTokenTag::STRING8);
+  auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
+  return bytes_.subspan(status_.pos + (token_byte_length_ - length), length);
+}
+
+span<uint8_t> CBORTokenizer::GetString16WireRep() const {
+  assert(token_tag_ == CBORTokenTag::STRING16);
+  auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
+  return bytes_.subspan(status_.pos + (token_byte_length_ - length), length);
+}
+
+span<uint8_t> CBORTokenizer::GetBinary() const {
+  assert(token_tag_ == CBORTokenTag::BINARY);
+  auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
+  return bytes_.subspan(status_.pos + (token_byte_length_ - length), length);
+}
+
+void CBORTokenizer::ReadNextToken(bool enter_envelope) {
+  if (enter_envelope) {
+    status_.pos += kEncodedEnvelopeHeaderSize;
+  } else {
+    status_.pos =
+        status_.pos == Status::npos() ? 0 : status_.pos + token_byte_length_;
+  }
+  status_.error = Error::OK;
+  if (status_.pos >= bytes_.size()) {
+    token_tag_ = CBORTokenTag::DONE;
+    return;
+  }
+  switch (bytes_[status_.pos]) {
+    case kStopByte:
+      SetToken(CBORTokenTag::STOP, 1);
+      return;
+    case kInitialByteIndefiniteLengthMap:
+      SetToken(CBORTokenTag::MAP_START, 1);
+      return;
+    case kInitialByteIndefiniteLengthArray:
+      SetToken(CBORTokenTag::ARRAY_START, 1);
+      return;
+    case kEncodedTrue:
+      SetToken(CBORTokenTag::TRUE_VALUE, 1);
+      return;
+    case kEncodedFalse:
+      SetToken(CBORTokenTag::FALSE_VALUE, 1);
+      return;
+    case kEncodedNull:
+      SetToken(CBORTokenTag::NULL_VALUE, 1);
+      return;
+    case kExpectedConversionToBase64Tag: {  // BINARY
+      int8_t bytes_read =
+          ReadTokenStart(bytes_.subspan(status_.pos + 1), &token_start_type_,
+                         &token_start_internal_value_);
+      int64_t token_byte_length = 1 + bytes_read + token_start_internal_value_;
+      if (-1 == bytes_read || token_start_type_ != MajorType::BYTE_STRING ||
+          status_.pos + token_byte_length > bytes_.size()) {
+        SetError(Error::CBOR_INVALID_BINARY);
+        return;
+      }
+      SetToken(CBORTokenTag::BINARY,
+               static_cast<std::ptrdiff_t>(token_byte_length));
+      return;
+    }
+    case kInitialByteForDouble: {  // DOUBLE
+      if (status_.pos + kEncodedDoubleSize > bytes_.size()) {
+        SetError(Error::CBOR_INVALID_DOUBLE);
+        return;
+      }
+      SetToken(CBORTokenTag::DOUBLE, kEncodedDoubleSize);
+      return;
+    }
+    case kInitialByteForEnvelope: {  // ENVELOPE
+      if (status_.pos + kEncodedEnvelopeHeaderSize > bytes_.size()) {
+        SetError(Error::CBOR_INVALID_ENVELOPE);
+        return;
+      }
+      // The envelope must be a byte string with 32 bit length.
+      if (bytes_[status_.pos + 1] != kInitialByteFor32BitLengthByteString) {
+        SetError(Error::CBOR_INVALID_ENVELOPE);
+        return;
+      }
+      // Read the length of the byte string.
+      token_start_internal_value_ = ReadBytesMostSignificantByteFirst<uint32_t>(
+          bytes_.subspan(status_.pos + 2));
+      // Make sure the payload is contained within the message.
+      if (token_start_internal_value_ + kEncodedEnvelopeHeaderSize +
+              status_.pos >
+          static_cast<std::size_t>(bytes_.size())) {
+        SetError(Error::CBOR_INVALID_ENVELOPE);
+        return;
+      }
+      auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
+      SetToken(CBORTokenTag::ENVELOPE,
+               kEncodedEnvelopeHeaderSize + length);
+      return;
+    }
+    default: {
+      span<uint8_t> remainder =
+          bytes_.subspan(status_.pos, bytes_.size() - status_.pos);
+      assert(!remainder.empty());
+      int8_t token_start_length = ReadTokenStart(remainder, &token_start_type_,
+                                                 &token_start_internal_value_);
+      bool success = token_start_length != -1;
+      switch (token_start_type_) {
+        case MajorType::UNSIGNED:  // INT32.
+          if (!success || std::numeric_limits<int32_t>::max() <
+                              token_start_internal_value_) {
+            SetError(Error::CBOR_INVALID_INT32);
+            return;
+          }
+          SetToken(CBORTokenTag::INT32, token_start_length);
+          return;
+        case MajorType::NEGATIVE:  // INT32.
+          if (!success ||
+              std::numeric_limits<int32_t>::min() >
+                  -static_cast<int64_t>(token_start_internal_value_) - 1) {
+            SetError(Error::CBOR_INVALID_INT32);
+            return;
+          }
+          SetToken(CBORTokenTag::INT32, token_start_length);
+          return;
+        case MajorType::STRING: {  // STRING8.
+          if (!success || remainder.size() < static_cast<int64_t>(
+                                                 token_start_internal_value_)) {
+            SetError(Error::CBOR_INVALID_STRING8);
+            return;
+          }
+          auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
+          SetToken(CBORTokenTag::STRING8, token_start_length + length);
+          return;
+        }
+        case MajorType::BYTE_STRING: {  // STRING16.
+          if (!success ||
+              remainder.size() <
+                  static_cast<int64_t>(token_start_internal_value_) ||
+              // Must be divisible by 2 since UTF16 is 2 bytes per character.
+              token_start_internal_value_ & 1) {
+            SetError(Error::CBOR_INVALID_STRING16);
+            return;
+          }
+          auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
+          SetToken(CBORTokenTag::STRING16, token_start_length + length);
+          return;
+        }
+        case MajorType::ARRAY:
+        case MajorType::MAP:
+        case MajorType::TAG:
+        case MajorType::SIMPLE_VALUE:
+          SetError(Error::CBOR_UNSUPPORTED_VALUE);
+          return;
+      }
+    }
+  }
+}
+
+void CBORTokenizer::SetToken(CBORTokenTag token_tag,
+                             std::ptrdiff_t token_byte_length) {
+  token_tag_ = token_tag;
+  token_byte_length_ = token_byte_length;
+}
+
+void CBORTokenizer::SetError(Error error) {
+  token_tag_ = CBORTokenTag::ERROR_VALUE;
+  status_.error = error;
+}
+
+#if 0
+void DumpCBOR(span<uint8_t> cbor) {
+  std::string indent;
+  CBORTokenizer tokenizer(cbor);
+  while (true) {
+    fprintf(stderr, "%s", indent.c_str());
+    switch (tokenizer.TokenTag()) {
+      case CBORTokenTag::ERROR_VALUE:
+        fprintf(stderr, "ERROR {status.error=%d, status.pos=%ld}\n",
+               tokenizer.Status().error, tokenizer.Status().pos);
+        return;
+      case CBORTokenTag::DONE:
+        fprintf(stderr, "DONE\n");
+        return;
+      case CBORTokenTag::TRUE_VALUE:
+        fprintf(stderr, "TRUE_VALUE\n");
+        break;
+      case CBORTokenTag::FALSE_VALUE:
+        fprintf(stderr, "FALSE_VALUE\n");
+        break;
+      case CBORTokenTag::NULL_VALUE:
+        fprintf(stderr, "NULL_VALUE\n");
+        break;
+      case CBORTokenTag::INT32:
+        fprintf(stderr, "INT32 [%d]\n", tokenizer.GetInt32());
+        break;
+      case CBORTokenTag::DOUBLE:
+        fprintf(stderr, "DOUBLE [%lf]\n", tokenizer.GetDouble());
+        break;
+      case CBORTokenTag::STRING8: {
+        span<uint8_t> v = tokenizer.GetString8();
+        std::string t(v.begin(), v.end());
+        fprintf(stderr, "STRING8 [%s]\n", t.c_str());
+        break;
+      }
+      case CBORTokenTag::STRING16: {
+        span<uint8_t> v = tokenizer.GetString16WireRep();
+        std::string t(v.begin(), v.end());
+        fprintf(stderr, "STRING16 [%s]\n", t.c_str());
+        break;
+      }
+      case CBORTokenTag::BINARY: {
+        span<uint8_t> v = tokenizer.GetBinary();
+        std::string t(v.begin(), v.end());
+        fprintf(stderr, "BINARY [%s]\n", t.c_str());
+        break;
+      }
+      case CBORTokenTag::MAP_START:
+        fprintf(stderr, "MAP_START\n");
+        indent += "  ";
+        break;
+      case CBORTokenTag::ARRAY_START:
+        fprintf(stderr, "ARRAY_START\n");
+        indent += "  ";
+        break;
+      case CBORTokenTag::STOP:
+        fprintf(stderr, "STOP\n");
+        indent.erase(0, 2);
+        break;
+      case CBORTokenTag::ENVELOPE:
+        fprintf(stderr, "ENVELOPE\n");
+        tokenizer.EnterEnvelope();
+        continue;
+    }
+    tokenizer.Next();
+  }
+}
+#endif
+
+
+{% for namespace in config.protocol.namespace %}
+} // namespace {{namespace}}
+{% endfor %}
+
diff --git a/third_party/inspector_protocol/encoding/encoding.h b/third_party/inspector_protocol/lib/CBOR_h.template
similarity index 65%
rename from third_party/inspector_protocol/encoding/encoding.h
rename to third_party/inspector_protocol/lib/CBOR_h.template
index b958ff4..9d28adb 100644
--- a/third_party/inspector_protocol/encoding/encoding.h
+++ b/third_party/inspector_protocol/lib/CBOR_h.template
@@ -1,21 +1,75 @@
+{# This template is generated by gen_cbor_templates.py. #}
+// Generated by lib/CBOR_h.template.
+
 // Copyright 2019 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef INSPECTOR_PROTOCOL_ENCODING_ENCODING_H_
-#define INSPECTOR_PROTOCOL_ENCODING_ENCODING_H_
+#ifndef {{"_".join(config.protocol.namespace)}}_CBOR_h
+#define {{"_".join(config.protocol.namespace)}}_CBOR_h
 
 #include <cstddef>
 #include <cstdint>
 #include <memory>
-#include <string>
 #include <vector>
 
-namespace inspector_protocol_encoding {
+{% for namespace in config.protocol.namespace %}
+namespace {{namespace}} {
+{% endfor %}
 
-// =============================================================================
-// span - sequence of bytes
-// =============================================================================
+// ===== encoding/status.h =====
+
+// Error codes.
+enum class Error {
+  OK = 0,
+  // JSON parsing errors - json_parser.{h,cc}.
+  JSON_PARSER_UNPROCESSED_INPUT_REMAINS = 0x01,
+  JSON_PARSER_STACK_LIMIT_EXCEEDED = 0x02,
+  JSON_PARSER_NO_INPUT = 0x03,
+  JSON_PARSER_INVALID_TOKEN = 0x04,
+  JSON_PARSER_INVALID_NUMBER = 0x05,
+  JSON_PARSER_INVALID_STRING = 0x06,
+  JSON_PARSER_UNEXPECTED_ARRAY_END = 0x07,
+  JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED = 0x08,
+  JSON_PARSER_STRING_LITERAL_EXPECTED = 0x09,
+  JSON_PARSER_COLON_EXPECTED = 0x0a,
+  JSON_PARSER_UNEXPECTED_OBJECT_END = 0x0b,
+  JSON_PARSER_COMMA_OR_OBJECT_END_EXPECTED = 0x0c,
+  JSON_PARSER_VALUE_EXPECTED = 0x0d,
+
+  CBOR_INVALID_INT32 = 0x0e,
+  CBOR_INVALID_DOUBLE = 0x0f,
+  CBOR_INVALID_ENVELOPE = 0x10,
+  CBOR_INVALID_STRING8 = 0x11,
+  CBOR_INVALID_STRING16 = 0x12,
+  CBOR_INVALID_BINARY = 0x13,
+  CBOR_UNSUPPORTED_VALUE = 0x14,
+  CBOR_NO_INPUT = 0x15,
+  CBOR_INVALID_START_BYTE = 0x16,
+  CBOR_UNEXPECTED_EOF_EXPECTED_VALUE = 0x17,
+  CBOR_UNEXPECTED_EOF_IN_ARRAY = 0x18,
+  CBOR_UNEXPECTED_EOF_IN_MAP = 0x19,
+  CBOR_INVALID_MAP_KEY = 0x1a,
+  CBOR_STACK_LIMIT_EXCEEDED = 0x1b,
+  CBOR_STRING8_MUST_BE_7BIT = 0x1c,
+  CBOR_TRAILING_JUNK = 0x1d,
+  CBOR_MAP_START_EXPECTED = 0x1e,
+};
+
+// A status value with position that can be copied. The default status
+// is OK. Usually, error status values should come with a valid position.
+struct Status {
+  static constexpr std::ptrdiff_t npos() { return -1; }
+
+  bool ok() const { return error == Error::OK; }
+
+  Error error = Error::OK;
+  std::ptrdiff_t pos = npos();
+  Status(Error error, std::ptrdiff_t pos) : error(error), pos(pos) {}
+  Status() = default;
+};
+
+// ===== encoding/span.h =====
 
 // This template is similar to std::span, which will be included in C++20.  Like
 // std::span it uses ptrdiff_t, which is signed (and thus a bit annoying
@@ -53,78 +107,19 @@
   index_type size_;
 };
 
-template <typename T>
-span<T> SpanFromVector(const std::vector<T>& v) {
-  return span<T>(v.data(), v.size());
-}
+// ===== encoding/json_parser_handler.h =====
 
-inline span<uint8_t> SpanFromStdString(const std::string& v) {
-  return span<uint8_t>(reinterpret_cast<const uint8_t*>(v.data()), v.size());
-}
-
-// Error codes.
-enum class Error {
-  OK = 0,
-  // JSON parsing errors - json_parser.{h,cc}.
-  JSON_PARSER_UNPROCESSED_INPUT_REMAINS = 0x01,
-  JSON_PARSER_STACK_LIMIT_EXCEEDED = 0x02,
-  JSON_PARSER_NO_INPUT = 0x03,
-  JSON_PARSER_INVALID_TOKEN = 0x04,
-  JSON_PARSER_INVALID_NUMBER = 0x05,
-  JSON_PARSER_INVALID_STRING = 0x06,
-  JSON_PARSER_UNEXPECTED_ARRAY_END = 0x07,
-  JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED = 0x08,
-  JSON_PARSER_STRING_LITERAL_EXPECTED = 0x09,
-  JSON_PARSER_COLON_EXPECTED = 0x0a,
-  JSON_PARSER_UNEXPECTED_MAP_END = 0x0b,
-  JSON_PARSER_COMMA_OR_MAP_END_EXPECTED = 0x0c,
-  JSON_PARSER_VALUE_EXPECTED = 0x0d,
-
-  CBOR_INVALID_INT32 = 0x0e,
-  CBOR_INVALID_DOUBLE = 0x0f,
-  CBOR_INVALID_ENVELOPE = 0x10,
-  CBOR_INVALID_STRING8 = 0x11,
-  CBOR_INVALID_STRING16 = 0x12,
-  CBOR_INVALID_BINARY = 0x13,
-  CBOR_UNSUPPORTED_VALUE = 0x14,
-  CBOR_NO_INPUT = 0x15,
-  CBOR_INVALID_START_BYTE = 0x16,
-  CBOR_UNEXPECTED_EOF_EXPECTED_VALUE = 0x17,
-  CBOR_UNEXPECTED_EOF_IN_ARRAY = 0x18,
-  CBOR_UNEXPECTED_EOF_IN_MAP = 0x19,
-  CBOR_INVALID_MAP_KEY = 0x1a,
-  CBOR_STACK_LIMIT_EXCEEDED = 0x1b,
-  CBOR_STRING8_MUST_BE_7BIT = 0x1c,
-  CBOR_TRAILING_JUNK = 0x1d,
-  CBOR_MAP_START_EXPECTED = 0x1e,
-};
-
-// A status value with position that can be copied. The default status
-// is OK. Usually, error status values should come with a valid position.
-struct Status {
-  static constexpr std::ptrdiff_t npos() { return -1; }
-
-  bool ok() const { return error == Error::OK; }
-
-  Error error = Error::OK;
-  std::ptrdiff_t pos = npos();
-  Status(Error error, std::ptrdiff_t pos) : error(error), pos(pos) {}
-  Status() = default;
-};
-
-// Handler interface for parser events emitted by a streaming parser.
-// See cbor::NewCBOREncoder, cbor::ParseCBOR, json::NewJSONEncoder,
-// json::ParseJSON.
-class StreamingParserHandler {
+// Handler interface for JSON parser events. See also json_parser.h.
+class JSONParserHandler {
  public:
-  virtual ~StreamingParserHandler() = default;
-  virtual void HandleMapBegin() = 0;
-  virtual void HandleMapEnd() = 0;
+  virtual ~JSONParserHandler() = default;
+  virtual void HandleObjectBegin() = 0;
+  virtual void HandleObjectEnd() = 0;
   virtual void HandleArrayBegin() = 0;
   virtual void HandleArrayEnd() = 0;
   virtual void HandleString8(span<uint8_t> chars) = 0;
   virtual void HandleString16(span<uint16_t> chars) = 0;
-  virtual void HandleBinary(span<uint8_t> bytes) = 0;
+  virtual void HandleBinary(std::vector<uint8_t> bytes) = 0;
   virtual void HandleDouble(double value) = 0;
   virtual void HandleInt32(int32_t value) = 0;
   virtual void HandleBool(bool value) = 0;
@@ -137,7 +132,97 @@
   virtual void HandleError(Status error) = 0;
 };
 
+// ===== encoding/cbor_internals.h =====
+
 namespace cbor {
+enum class MajorType;
+}
+
+namespace cbor_internals {
+
+// Reads the start of a token with definitive size from |bytes|.
+// |type| is the major type as specified in RFC 7049 Section 2.1.
+// |value| is the payload (e.g. for MajorType::UNSIGNED) or is the size
+// (e.g. for BYTE_STRING).
+// If successful, returns the number of bytes read. Otherwise returns -1.
+int8_t ReadTokenStart(span<uint8_t> bytes, cbor::MajorType* type,
+                      uint64_t* value);
+
+// Writes the start of a token with |type|. The |value| may indicate the size,
+// or it may be the payload if the value is an unsigned integer.
+void WriteTokenStart(cbor::MajorType type, uint64_t value,
+                     std::vector<uint8_t>* encoded);
+}  // namespace cbor_internals
+
+// ===== encoding/cbor.h =====
+
+
+namespace cbor {
+
+// The major types from RFC 7049 Section 2.1.
+enum class MajorType {
+  UNSIGNED = 0,
+  NEGATIVE = 1,
+  BYTE_STRING = 2,
+  STRING = 3,
+  ARRAY = 4,
+  MAP = 5,
+  TAG = 6,
+  SIMPLE_VALUE = 7
+};
+
+// Indicates the number of bits the "initial byte" needs to be shifted to the
+// right after applying |kMajorTypeMask| to produce the major type in the
+// lowermost bits.
+static constexpr uint8_t kMajorTypeBitShift = 5u;
+// Mask selecting the low-order 5 bits of the "initial byte", which is where
+// the additional information is encoded.
+static constexpr uint8_t kAdditionalInformationMask = 0x1f;
+// Mask selecting the high-order 3 bits of the "initial byte", which indicates
+// the major type of the encoded value.
+static constexpr uint8_t kMajorTypeMask = 0xe0;
+// Indicates the integer is in the following byte.
+static constexpr uint8_t kAdditionalInformation1Byte = 24u;
+// Indicates the integer is in the next 2 bytes.
+static constexpr uint8_t kAdditionalInformation2Bytes = 25u;
+// Indicates the integer is in the next 4 bytes.
+static constexpr uint8_t kAdditionalInformation4Bytes = 26u;
+// Indicates the integer is in the next 8 bytes.
+static constexpr uint8_t kAdditionalInformation8Bytes = 27u;
+
+// Encodes the initial byte, consisting of the |type| in the first 3 bits
+// followed by 5 bits of |additional_info|.
+constexpr uint8_t EncodeInitialByte(MajorType type, uint8_t additional_info) {
+  return (static_cast<uint8_t>(type) << kMajorTypeBitShift) |
+         (additional_info & kAdditionalInformationMask);
+}
+
+// TAG 24 indicates that what follows is a byte string which is
+// encoded in CBOR format. We use this as a wrapper for
+// maps and arrays, allowing us to skip them, because the
+// byte string carries its size (byte length).
+// https://tools.ietf.org/html/rfc7049#section-2.4.4.1
+static constexpr uint8_t kInitialByteForEnvelope =
+    EncodeInitialByte(MajorType::TAG, 24);
+// The initial byte for a byte string with at most 2^32 bytes
+// of payload. This is used for envelope encoding, even if
+// the byte string is shorter.
+static constexpr uint8_t kInitialByteFor32BitLengthByteString =
+    EncodeInitialByte(MajorType::BYTE_STRING, 26);
+
+// See RFC 7049 Section 2.2.1, indefinite length arrays / maps have additional
+// info = 31.
+static constexpr uint8_t kInitialByteIndefiniteLengthArray =
+    EncodeInitialByte(MajorType::ARRAY, 31);
+static constexpr uint8_t kInitialByteIndefiniteLengthMap =
+    EncodeInitialByte(MajorType::MAP, 31);
+// See RFC 7049 Section 2.3, Table 1; this is used for finishing indefinite
+// length maps / arrays.
+static constexpr uint8_t kStopByte =
+    EncodeInitialByte(MajorType::SIMPLE_VALUE, 31);
+
+}  // namespace cbor
+
 // The binary encoding for the inspector protocol follows the CBOR specification
 // (RFC 7049). Additional constraints:
 // - Only indefinite length maps and arrays are supported.
@@ -154,38 +239,12 @@
 //   as CBOR BYTE_STRING (major type 2). For such strings, the number of
 //   bytes encoded must be even.
 // - UTF8 strings (major type 3) are supported.
-// - 7 bit US-ASCII strings must always be encoded as UTF8 strings, never
+// - 7 bit US-ASCII strings must always be encoded as UTF8 strings, not
 //   as UTF16 strings.
 // - Arbitrary byte arrays, in the inspector protocol called 'binary',
 //   are encoded as BYTE_STRING (major type 2), prefixed with a byte
 //   indicating base64 when rendered as JSON.
 
-// =============================================================================
-// Detecting CBOR content
-// =============================================================================
-
-// The first byte for an envelope, which we use for wrapping dictionaries
-// and arrays; and the byte that indicates a byte string with 32 bit length.
-// These two bytes start an envelope, and thereby also any CBOR message
-// produced or consumed by this protocol. See also |EnvelopeEncoder| below.
-uint8_t InitialByteForEnvelope();
-uint8_t InitialByteFor32BitLengthByteString();
-
-// Checks whether |msg| is a cbor message.
-bool IsCBORMessage(span<uint8_t> msg);
-
-// =============================================================================
-// Encoding individual CBOR items
-// =============================================================================
-
-// Some constants for CBOR tokens that only take a single byte on the wire.
-uint8_t EncodeTrue();
-uint8_t EncodeFalse();
-uint8_t EncodeNull();
-uint8_t EncodeIndefiniteLengthArrayStart();
-uint8_t EncodeIndefiniteLengthMapStart();
-uint8_t EncodeStop();
-
 // Encodes |value| as |UNSIGNED| (major type 0) iff >= 0, or |NEGATIVE|
 // (major type 1) iff < 0.
 void EncodeInt32(int32_t value, std::vector<uint8_t>* out);
@@ -216,9 +275,13 @@
 // with additional info = 27, followed by 8 bytes in big endian.
 void EncodeDouble(double value, std::vector<uint8_t>* out);
 
-// =============================================================================
-// cbor::EnvelopeEncoder - for wrapping submessages
-// =============================================================================
+// Some constants for CBOR tokens that only take a single byte on the wire.
+uint8_t EncodeTrue();
+uint8_t EncodeFalse();
+uint8_t EncodeNull();
+uint8_t EncodeIndefiniteLengthArrayStart();
+uint8_t EncodeIndefiniteLengthMapStart();
+uint8_t EncodeStop();
 
 // An envelope indicates the byte length of a wrapped item.
 // We use this for maps and array, which allows the decoder
@@ -241,23 +304,20 @@
   std::size_t byte_size_pos_ = 0;
 };
 
-// =============================================================================
-// cbor::NewCBOREncoder - for encoding from a streaming parser
-// =============================================================================
+// This can be used to convert from JSON to CBOR, by passing the
+// return value to the routines in json_parser.h.  The handler will encode into
+// |out|, and iff an error occurs it will set |status| to an error and clear
+// |out|. Otherwise, |status.ok()| will be |true|.
+std::unique_ptr<JSONParserHandler> NewJSONToCBOREncoder(
+    std::vector<uint8_t>* out, Status* status);
 
-// This can be used to convert to CBOR, by passing the return value to a parser
-// that drives it. The handler will encode into |out|, and iff an error occurs
-// it will set |status| to an error and clear |out|. Otherwise, |status.ok()|
-// will be |true|.
-std::unique_ptr<StreamingParserHandler> NewCBOREncoder(
-    std::vector<uint8_t>* out,
-    Status* status);
+// Parses a CBOR encoded message from |bytes|, sending JSON events to
+// |json_out|. If an error occurs, sends |out->HandleError|, and parsing stops.
+// The client is responsible for discarding the already received information in
+// that case.
+void ParseCBOR(span<uint8_t> bytes, JSONParserHandler* json_out);
 
-// =============================================================================
-// cbor::CBORTokenizer - for parsing individual CBOR items
-// =============================================================================
-
-// Tags for the tokens within a CBOR message that CBORTokenizer understands.
+// Tags for the tokens within a CBOR message that CBORStream understands.
 // Note that this is not the same terminology as the CBOR spec (RFC 7049),
 // but rather, our adaptation. For instance, we lump unsigned and signed
 // major type into INT32 here (and disallow values outside the int32_t range).
@@ -297,18 +357,6 @@
   DONE,
 };
 
-// The major types from RFC 7049 Section 2.1.
-enum class MajorType {
-  UNSIGNED = 0,
-  NEGATIVE = 1,
-  BYTE_STRING = 2,
-  STRING = 3,
-  ARRAY = 4,
-  MAP = 5,
-  TAG = 6,
-  SIMPLE_VALUE = 7
-};
-
 // CBORTokenizer segments a CBOR message, presenting the tokens therein as
 // numbers, strings, etc. This is not a complete CBOR parser, but makes it much
 // easier to implement one (e.g. ParseCBOR, above). It can also be used to parse
@@ -355,9 +403,6 @@
   // To be called only if ::TokenTag() == CBORTokenTag::BINARY.
   span<uint8_t> GetBinary() const;
 
-  // To be called only if ::TokenTag() == CBORTokenTag::ENVELOPE.
-  span<uint8_t> GetEnvelopeContents() const;
-
  private:
   void ReadNextToken(bool enter_envelope);
   void SetToken(CBORTokenTag token, std::ptrdiff_t token_byte_length);
@@ -367,70 +412,14 @@
   CBORTokenTag token_tag_;
   struct Status status_;
   std::ptrdiff_t token_byte_length_;
-  MajorType token_start_type_;
+  cbor::MajorType token_start_type_;
   uint64_t token_start_internal_value_;
 };
 
-// =============================================================================
-// cbor::ParseCBOR - for receiving streaming parser events for CBOR messages
-// =============================================================================
+void DumpCBOR(span<uint8_t> cbor);
 
-// Parses a CBOR encoded message from |bytes|, sending events to
-// |out|. If an error occurs, sends |out->HandleError|, and parsing stops.
-// The client is responsible for discarding the already received information in
-// that case.
-void ParseCBOR(span<uint8_t> bytes, StreamingParserHandler* out);
 
-namespace internals {  // Exposed only for writing tests.
-int8_t ReadTokenStart(span<uint8_t> bytes,
-                      cbor::MajorType* type,
-                      uint64_t* value);
-
-void WriteTokenStart(cbor::MajorType type,
-                     uint64_t value,
-                     std::vector<uint8_t>* encoded);
-}  // namespace internals
-}  // namespace cbor
-
-namespace json {
-// Client code must provide an instance. Implementation should delegate
-// to whatever is appropriate.
-class Platform {
- public:
-  virtual ~Platform() = default;
-  // Parses |str| into |result|. Returns false iff there are
-  // leftover characters or parsing errors.
-  virtual bool StrToD(const char* str, double* result) const = 0;
-
-  // Prints |value| in a format suitable for JSON.
-  virtual std::unique_ptr<char[]> DToStr(double value) const = 0;
-};
-
-// =============================================================================
-// json::NewJSONEncoder - for encoding streaming parser events as JSON
-// =============================================================================
-
-// Returns a handler object which will write ascii characters to |out|.
-// |status->ok()| will be false iff the handler routine HandleError() is called.
-// In that case, we'll stop emitting output.
-// Except for calling the HandleError routine at any time, the client
-// code must call the Handle* methods in an order in which they'd occur
-// in valid JSON; otherwise we may crash (the code uses assert).
-std::unique_ptr<StreamingParserHandler> NewJSONEncoder(const Platform* platform,
-                                                       std::string* out,
-                                                       Status* status);
-
-// =============================================================================
-// json::ParseJSON - for receiving streaming parser events for JSON
-// =============================================================================
-
-void ParseJSON(const Platform* platform,
-               span<uint8_t> chars,
-               StreamingParserHandler* handler);
-void ParseJSON(const Platform* platform,
-               span<uint16_t> chars,
-               StreamingParserHandler* handler);
-}  // namespace json
-}  // namespace inspector_protocol_encoding
-
-#endif  // INSPECTOR_PROTOCOL_ENCODING_ENCODING_H_
+{% for namespace in config.protocol.namespace %}
+} // namespace {{namespace}}
+{% endfor %}
+#endif // !defined({{"_".join(config.protocol.namespace)}}_CBOR_h)
diff --git a/third_party/inspector_protocol/lib/Values_cpp.template b/third_party/inspector_protocol/lib/Values_cpp.template
index 2d4463e2..20899a3 100644
--- a/third_party/inspector_protocol/lib/Values_cpp.template
+++ b/third_party/inspector_protocol/lib/Values_cpp.template
@@ -66,21 +66,21 @@
 
 // Below are three parsing routines for CBOR, which cover enough
 // to roundtrip JSON messages.
-std::unique_ptr<DictionaryValue> parseMap(int32_t stack_depth, cbor::CBORTokenizer* tokenizer);
-std::unique_ptr<ListValue> parseArray(int32_t stack_depth, cbor::CBORTokenizer* tokenizer);
-std::unique_ptr<Value> parseValue(int32_t stack_depth, cbor::CBORTokenizer* tokenizer);
+std::unique_ptr<DictionaryValue> parseMap(int32_t stack_depth, CBORTokenizer* tokenizer);
+std::unique_ptr<ListValue> parseArray(int32_t stack_depth, CBORTokenizer* tokenizer);
+std::unique_ptr<Value> parseValue(int32_t stack_depth, CBORTokenizer* tokenizer);
 
 // |bytes| must start with the indefinite length array byte, so basically,
 // ParseArray may only be called after an indefinite length array has been
 // detected.
-std::unique_ptr<ListValue> parseArray(int32_t stack_depth, cbor::CBORTokenizer* tokenizer) {
-  DCHECK(tokenizer->TokenTag() == cbor::CBORTokenTag::ARRAY_START);
+std::unique_ptr<ListValue> parseArray(int32_t stack_depth, CBORTokenizer* tokenizer) {
+  DCHECK(tokenizer->TokenTag() == CBORTokenTag::ARRAY_START);
   tokenizer->Next();
   auto list = ListValue::create();
-  while (tokenizer->TokenTag() != cbor::CBORTokenTag::STOP) {
+  while (tokenizer->TokenTag() != CBORTokenTag::STOP) {
     // Error::CBOR_UNEXPECTED_EOF_IN_ARRAY
-    if (tokenizer->TokenTag() == cbor::CBORTokenTag::DONE) return nullptr;
-    if (tokenizer->TokenTag() == cbor::CBORTokenTag::ERROR_VALUE) return nullptr;
+    if (tokenizer->TokenTag() == CBORTokenTag::DONE) return nullptr;
+    if (tokenizer->TokenTag() == CBORTokenTag::ERROR_VALUE) return nullptr;
     // Parse value.
     auto value = parseValue(stack_depth, tokenizer);
     if (!value) return nullptr;
@@ -91,51 +91,51 @@
 }
 
 std::unique_ptr<Value> parseValue(
-    int32_t stack_depth, cbor::CBORTokenizer* tokenizer) {
+    int32_t stack_depth, CBORTokenizer* tokenizer) {
   // Error::CBOR_STACK_LIMIT_EXCEEDED
   if (stack_depth > kStackLimitValues) return nullptr;
   // Skip past the envelope to get to what's inside.
-  if (tokenizer->TokenTag() == cbor::CBORTokenTag::ENVELOPE)
+  if (tokenizer->TokenTag() == CBORTokenTag::ENVELOPE)
     tokenizer->EnterEnvelope();
   switch (tokenizer->TokenTag()) {
-    case cbor::CBORTokenTag::ERROR_VALUE:
+    case CBORTokenTag::ERROR_VALUE:
       return nullptr;
-    case cbor::CBORTokenTag::DONE:
+    case CBORTokenTag::DONE:
       // Error::CBOR_UNEXPECTED_EOF_EXPECTED_VALUE
       return nullptr;
-    case cbor::CBORTokenTag::TRUE_VALUE: {
+    case CBORTokenTag::TRUE_VALUE: {
       std::unique_ptr<Value> value = FundamentalValue::create(true);
       tokenizer->Next();
       return value;
     }
-    case cbor::CBORTokenTag::FALSE_VALUE: {
+    case CBORTokenTag::FALSE_VALUE: {
       std::unique_ptr<Value> value = FundamentalValue::create(false);
       tokenizer->Next();
       return value;
     }
-    case cbor::CBORTokenTag::NULL_VALUE: {
+    case CBORTokenTag::NULL_VALUE: {
       std::unique_ptr<Value> value = FundamentalValue::null();
       tokenizer->Next();
       return value;
     }
-    case cbor::CBORTokenTag::INT32: {
+    case CBORTokenTag::INT32: {
       std::unique_ptr<Value> value = FundamentalValue::create(tokenizer->GetInt32());
       tokenizer->Next();
       return value;
     }
-    case cbor::CBORTokenTag::DOUBLE: {
+    case CBORTokenTag::DOUBLE: {
       std::unique_ptr<Value> value = FundamentalValue::create(tokenizer->GetDouble());
       tokenizer->Next();
       return value;
     }
-    case cbor::CBORTokenTag::STRING8: {
+    case CBORTokenTag::STRING8: {
       span<uint8_t> str = tokenizer->GetString8();
       std::unique_ptr<Value> value =
           StringValue::create(StringUtil::fromUTF8(str.data(), str.size()));
       tokenizer->Next();
       return value;
     }
-    case cbor::CBORTokenTag::STRING16: {
+    case CBORTokenTag::STRING16: {
       span<uint8_t> wire = tokenizer->GetString16WireRep();
       DCHECK_EQ(wire.size() & 1, 0);
       std::unique_ptr<Value> value = StringValue::create(StringUtil::fromUTF16(
@@ -143,14 +143,14 @@
       tokenizer->Next();
       return value;
     }
-    case cbor::CBORTokenTag::BINARY: {
+    case CBORTokenTag::BINARY: {
       span<uint8_t> payload = tokenizer->GetBinary();
       tokenizer->Next();
       return BinaryValue::create(Binary::fromSpan(payload.data(), payload.size()));
     }
-    case cbor::CBORTokenTag::MAP_START:
+    case CBORTokenTag::MAP_START:
       return parseMap(stack_depth + 1, tokenizer);
-    case cbor::CBORTokenTag::ARRAY_START:
+    case CBORTokenTag::ARRAY_START:
       return parseArray(stack_depth + 1, tokenizer);
     default:
       // Error::CBOR_UNSUPPORTED_VALUE
@@ -162,22 +162,22 @@
 // ParseArray may only be called after an indefinite length array has been
 // detected.
 std::unique_ptr<DictionaryValue> parseMap(
-    int32_t stack_depth, cbor::CBORTokenizer* tokenizer) {
+    int32_t stack_depth, CBORTokenizer* tokenizer) {
   auto dict = DictionaryValue::create();
   tokenizer->Next();
-  while (tokenizer->TokenTag() != cbor::CBORTokenTag::STOP) {
-    if (tokenizer->TokenTag() == cbor::CBORTokenTag::DONE) {
+  while (tokenizer->TokenTag() != CBORTokenTag::STOP) {
+    if (tokenizer->TokenTag() == CBORTokenTag::DONE) {
       // Error::CBOR_UNEXPECTED_EOF_IN_MAP
       return nullptr;
     }
-    if (tokenizer->TokenTag() == cbor::CBORTokenTag::ERROR_VALUE) return nullptr;
+    if (tokenizer->TokenTag() == CBORTokenTag::ERROR_VALUE) return nullptr;
     // Parse key.
     String key;
-    if (tokenizer->TokenTag() == cbor::CBORTokenTag::STRING8) {
+    if (tokenizer->TokenTag() == CBORTokenTag::STRING8) {
       span<uint8_t> key_span = tokenizer->GetString8();
       key = StringUtil::fromUTF8(key_span.data(), key_span.size());
       tokenizer->Next();
-    } else if (tokenizer->TokenTag() == cbor::CBORTokenTag::STRING16) {
+    } else if (tokenizer->TokenTag() == CBORTokenTag::STRING16) {
       return nullptr;  // STRING16 not supported yet.
     } else {
       // Error::CBOR_INVALID_MAP_KEY
@@ -202,21 +202,22 @@
   if (bytes.empty()) return nullptr;
 
   // Error::CBOR_INVALID_START_BYTE
-  if (bytes[0] != cbor::InitialByteForEnvelope()) return nullptr;
+  // TODO(johannes): EncodeInitialByteForEnvelope() method.
+  if (bytes[0] != 0xd8) return nullptr;
 
-  cbor::CBORTokenizer tokenizer(bytes);
-  if (tokenizer.TokenTag() == cbor::CBORTokenTag::ERROR_VALUE) return nullptr;
+  CBORTokenizer tokenizer(bytes);
+  if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) return nullptr;
 
   // We checked for the envelope start byte above, so the tokenizer
   // must agree here, since it's not an error.
-  DCHECK(tokenizer.TokenTag() == cbor::CBORTokenTag::ENVELOPE);
+  DCHECK(tokenizer.TokenTag() == CBORTokenTag::ENVELOPE);
   tokenizer.EnterEnvelope();
   // Error::MAP_START_EXPECTED
-  if (tokenizer.TokenTag() != cbor::CBORTokenTag::MAP_START) return nullptr;
+  if (tokenizer.TokenTag() != CBORTokenTag::MAP_START) return nullptr;
   std::unique_ptr<Value> result = parseMap(/*stack_depth=*/1, &tokenizer);
   if (!result) return nullptr;
-  if (tokenizer.TokenTag() == cbor::CBORTokenTag::DONE) return result;
-  if (tokenizer.TokenTag() == cbor::CBORTokenTag::ERROR_VALUE) return nullptr;
+  if (tokenizer.TokenTag() == CBORTokenTag::DONE) return result;
+  if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) return nullptr;
   // Error::CBOR_TRAILING_JUNK
   return nullptr;
 }
@@ -254,7 +255,7 @@
 
 void Value::writeBinary(std::vector<uint8_t>* bytes) const {
     DCHECK(m_type == TypeNull);
-    bytes->push_back(cbor::EncodeNull());
+    bytes->push_back(EncodeNull());
 }
 
 std::unique_ptr<Value> Value::clone() const
@@ -331,13 +332,13 @@
 void FundamentalValue::writeBinary(std::vector<uint8_t>* bytes) const {
     switch (type()) {
     case TypeDouble:
-        cbor::EncodeDouble(m_doubleValue, bytes);
+        EncodeDouble(m_doubleValue, bytes);
         return;
     case TypeInteger:
-        cbor::EncodeInt32(m_integerValue, bytes);
+        EncodeInt32(m_integerValue, bytes);
         return;
     case TypeBoolean:
-        bytes->push_back(m_boolValue ? cbor::EncodeTrue() : cbor::EncodeFalse());
+        bytes->push_back(m_boolValue ? EncodeTrue() : EncodeFalse());
         return;
     default:
         DCHECK(false);
@@ -380,19 +381,19 @@
 //   transcodes to UTF8 if needed.
 void EncodeString(const String& s, std::vector<uint8_t>* out) {
   if (StringUtil::CharacterCount(s) == 0) {
-    cbor::EncodeString8(span<uint8_t>(nullptr, 0), out);  // Empty string.
+    EncodeString8(span<uint8_t>(nullptr, 0), out);  // Empty string.
   } else if (StringUtil::CharactersLatin1(s)) {
-    cbor::EncodeFromLatin1(span<uint8_t>(StringUtil::CharactersLatin1(s),
-		                         StringUtil::CharacterCount(s)),
-                           out);
+    EncodeFromLatin1(span<uint8_t>(StringUtil::CharactersLatin1(s),
+                                   StringUtil::CharacterCount(s)),
+                     out);
   } else if (StringUtil::CharactersUTF16(s)) {
-    cbor::EncodeFromUTF16(span<uint16_t>(StringUtil::CharactersUTF16(s),
-                                         StringUtil::CharacterCount(s)),
-                          out);
+    EncodeFromUTF16(span<uint16_t>(StringUtil::CharactersUTF16(s),
+                                   StringUtil::CharacterCount(s)),
+                    out);
   } else if (StringUtil::CharactersUTF8(s)) {
-    cbor::EncodeString8(span<uint8_t>(StringUtil::CharactersUTF8(s),
-                                      StringUtil::CharacterCount(s)),
-                        out);
+    EncodeString8(span<uint8_t>(StringUtil::CharactersUTF8(s),
+                                StringUtil::CharacterCount(s)),
+                  out);
   }
 }
 }  // namespace
@@ -419,8 +420,7 @@
 }
 
 void BinaryValue::writeBinary(std::vector<uint8_t>* bytes) const {
-    cbor::EncodeBinary(span<uint8_t>(m_binaryValue.data(),
-                                     m_binaryValue.size()), bytes);
+    EncodeBinary(span<uint8_t>(m_binaryValue.data(), m_binaryValue.size()), bytes);
 }
 
 std::unique_ptr<Value> BinaryValue::clone() const
@@ -583,9 +583,9 @@
 }
 
 void DictionaryValue::writeBinary(std::vector<uint8_t>* bytes) const {
-    cbor::EnvelopeEncoder encoder;
+    EnvelopeEncoder encoder;
     encoder.EncodeStart(bytes);
-    bytes->push_back(cbor::EncodeIndefiniteLengthMapStart());
+    bytes->push_back(EncodeIndefiniteLengthMapStart());
     for (size_t i = 0; i < m_order.size(); ++i) {
         const String& key = m_order[i];
         Dictionary::const_iterator value = m_data.find(key);
@@ -593,7 +593,7 @@
         EncodeString(key, bytes);
         value->second->writeBinary(bytes);
     }
-    bytes->push_back(cbor::EncodeStop());
+    bytes->push_back(EncodeStop());
     encoder.EncodeStop(bytes);
 }
 
@@ -632,13 +632,13 @@
 }
 
 void ListValue::writeBinary(std::vector<uint8_t>* bytes) const {
-    cbor::EnvelopeEncoder encoder;
+    EnvelopeEncoder encoder;
     encoder.EncodeStart(bytes);
-    bytes->push_back(cbor::EncodeIndefiniteLengthArrayStart());
+    bytes->push_back(EncodeIndefiniteLengthArrayStart());
     for (size_t i = 0; i < m_data.size(); ++i) {
         m_data[i]->writeBinary(bytes);
     }
-    bytes->push_back(cbor::EncodeStop());
+    bytes->push_back(EncodeStop());
     encoder.EncodeStop(bytes);
 }
 
diff --git a/third_party/inspector_protocol/lib/base_string_adapter_cc.template b/third_party/inspector_protocol/lib/base_string_adapter_cc.template
index 94bcd88..24855d4 100644
--- a/third_party/inspector_protocol/lib/base_string_adapter_cc.template
+++ b/third_party/inspector_protocol/lib/base_string_adapter_cc.template
@@ -256,34 +256,34 @@
   if (in.size() < 1 + 1 + 4 + 1 + 1)
     return false;
   const uint8_t* envelope = reinterpret_cast<const uint8_t*>(in.data());
-  if (cbor::InitialByteForEnvelope() != envelope[0])
+  if (cbor::kInitialByteForEnvelope != envelope[0])
     return false;
-  if (cbor::InitialByteFor32BitLengthByteString() != envelope[1])
+  if (cbor::kInitialByteFor32BitLengthByteString != envelope[1])
     return false;
-  if (cbor::EncodeIndefiniteLengthMapStart() != envelope[6])
+  if (cbor::kInitialByteIndefiniteLengthMap != envelope[6])
     return false;
 
   uint32_t envelope_size = ReadEnvelopeSize(envelope + 2);
   if (envelope_size + 2 + 4 != in.size())
     return false;
-  if (cbor::EncodeStop() != static_cast<uint8_t>(*in.rbegin()))
+  if (cbor::kStopByte != static_cast<uint8_t>(*in.rbegin()))
     return false;
 
   std::vector<uint8_t> encoded_entry;
   encoded_entry.reserve(1 + 4 + key.size() + 1 + 4 + value.size());
   span<uint8_t> key_span(
       reinterpret_cast<const uint8_t*>(key.data()), key.size());
-  cbor::EncodeString8(key_span, &encoded_entry);
+  EncodeString8(key_span, &encoded_entry);
   span<uint8_t> value_span(
       reinterpret_cast<const uint8_t*>(value.data()), value.size());
-  cbor::EncodeString8(value_span, &encoded_entry);
+  EncodeString8(value_span, &encoded_entry);
 
   out->clear();
   out->reserve(in.size() + encoded_entry.size());
   out->append(in.begin(), in.end() - 1);
   out->append(reinterpret_cast<const char*>(encoded_entry.data()),
       encoded_entry.size());
-  out->append(1, static_cast<char>(cbor::EncodeStop()));
+  out->append(1, static_cast<char>(cbor::kStopByte));
   std::size_t new_size = envelope_size + out->size() - in.size();
   if (new_size > static_cast<std::size_t>(
       std::numeric_limits<uint32_t>::max())) {
diff --git a/third_party/inspector_protocol/lib/encoding_cpp.template b/third_party/inspector_protocol/lib/encoding_cpp.template
deleted file mode 100644
index 84251d9..0000000
--- a/third_party/inspector_protocol/lib/encoding_cpp.template
+++ /dev/null
@@ -1,1807 +0,0 @@
-{# This template is generated by gen_cbor_templates.py. #}
-// Generated by lib/encoding_cpp.template.
-
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-#include <cassert>
-#include <cstring>
-#include <limits>
-#include <stack>
-
-{% for namespace in config.protocol.namespace %}
-namespace {{namespace}} {
-{% endfor %}
-
-// ===== encoding/encoding.cc =====
-
-namespace cbor {
-namespace {
-// Indicates the number of bits the "initial byte" needs to be shifted to the
-// right after applying |kMajorTypeMask| to produce the major type in the
-// lowermost bits.
-static constexpr uint8_t kMajorTypeBitShift = 5u;
-// Mask selecting the low-order 5 bits of the "initial byte", which is where
-// the additional information is encoded.
-static constexpr uint8_t kAdditionalInformationMask = 0x1f;
-// Mask selecting the high-order 3 bits of the "initial byte", which indicates
-// the major type of the encoded value.
-static constexpr uint8_t kMajorTypeMask = 0xe0;
-// Indicates the integer is in the following byte.
-static constexpr uint8_t kAdditionalInformation1Byte = 24u;
-// Indicates the integer is in the next 2 bytes.
-static constexpr uint8_t kAdditionalInformation2Bytes = 25u;
-// Indicates the integer is in the next 4 bytes.
-static constexpr uint8_t kAdditionalInformation4Bytes = 26u;
-// Indicates the integer is in the next 8 bytes.
-static constexpr uint8_t kAdditionalInformation8Bytes = 27u;
-
-// Encodes the initial byte, consisting of the |type| in the first 3 bits
-// followed by 5 bits of |additional_info|.
-constexpr uint8_t EncodeInitialByte(MajorType type, uint8_t additional_info) {
-  return (static_cast<uint8_t>(type) << kMajorTypeBitShift) |
-         (additional_info & kAdditionalInformationMask);
-}
-
-// TAG 24 indicates that what follows is a byte string which is
-// encoded in CBOR format. We use this as a wrapper for
-// maps and arrays, allowing us to skip them, because the
-// byte string carries its size (byte length).
-// https://tools.ietf.org/html/rfc7049#section-2.4.4.1
-static constexpr uint8_t kInitialByteForEnvelope =
-    EncodeInitialByte(MajorType::TAG, 24);
-// The initial byte for a byte string with at most 2^32 bytes
-// of payload. This is used for envelope encoding, even if
-// the byte string is shorter.
-static constexpr uint8_t kInitialByteFor32BitLengthByteString =
-    EncodeInitialByte(MajorType::BYTE_STRING, 26);
-
-// See RFC 7049 Section 2.2.1, indefinite length arrays / maps have additional
-// info = 31.
-static constexpr uint8_t kInitialByteIndefiniteLengthArray =
-    EncodeInitialByte(MajorType::ARRAY, 31);
-static constexpr uint8_t kInitialByteIndefiniteLengthMap =
-    EncodeInitialByte(MajorType::MAP, 31);
-// See RFC 7049 Section 2.3, Table 1; this is used for finishing indefinite
-// length maps / arrays.
-static constexpr uint8_t kStopByte =
-    EncodeInitialByte(MajorType::SIMPLE_VALUE, 31);
-
-// See RFC 7049 Section 2.3, Table 2.
-static constexpr uint8_t kEncodedTrue =
-    EncodeInitialByte(MajorType::SIMPLE_VALUE, 21);
-static constexpr uint8_t kEncodedFalse =
-    EncodeInitialByte(MajorType::SIMPLE_VALUE, 20);
-static constexpr uint8_t kEncodedNull =
-    EncodeInitialByte(MajorType::SIMPLE_VALUE, 22);
-static constexpr uint8_t kInitialByteForDouble =
-    EncodeInitialByte(MajorType::SIMPLE_VALUE, 27);
-
-// See RFC 7049 Table 3 and Section 2.4.4.2. This is used as a prefix for
-// arbitrary binary data encoded as BYTE_STRING.
-static constexpr uint8_t kExpectedConversionToBase64Tag =
-    EncodeInitialByte(MajorType::TAG, 22);
-
-// Writes the bytes for |v| to |out|, starting with the most significant byte.
-// See also: https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html
-template <typename T>
-void WriteBytesMostSignificantByteFirst(T v, std::vector<uint8_t>* out) {
-  for (int shift_bytes = sizeof(T) - 1; shift_bytes >= 0; --shift_bytes)
-    out->push_back(0xff & (v >> (shift_bytes * 8)));
-}
-
-// Extracts sizeof(T) bytes from |in| to extract a value of type T
-// (e.g. uint64_t, uint32_t, ...), most significant byte first.
-// See also: https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html
-template <typename T>
-T ReadBytesMostSignificantByteFirst(span<uint8_t> in) {
-  assert(static_cast<std::size_t>(in.size()) >= sizeof(T));
-  T result = 0;
-  for (std::size_t shift_bytes = 0; shift_bytes < sizeof(T); ++shift_bytes)
-    result |= T(in[sizeof(T) - 1 - shift_bytes]) << (shift_bytes * 8);
-  return result;
-}
-}  // namespace
-
-namespace internals {
-// Reads the start of a token with definitive size from |bytes|.
-// |type| is the major type as specified in RFC 7049 Section 2.1.
-// |value| is the payload (e.g. for MajorType::UNSIGNED) or is the size
-// (e.g. for BYTE_STRING).
-// If successful, returns the number of bytes read. Otherwise returns -1.
-int8_t ReadTokenStart(span<uint8_t> bytes, MajorType* type, uint64_t* value) {
-  if (bytes.empty())
-    return -1;
-  uint8_t initial_byte = bytes[0];
-  *type = MajorType((initial_byte & kMajorTypeMask) >> kMajorTypeBitShift);
-
-  uint8_t additional_information = initial_byte & kAdditionalInformationMask;
-  if (additional_information < 24) {
-    // Values 0-23 are encoded directly into the additional info of the
-    // initial byte.
-    *value = additional_information;
-    return 1;
-  }
-  if (additional_information == kAdditionalInformation1Byte) {
-    // Values 24-255 are encoded with one initial byte, followed by the value.
-    if (bytes.size() < 2)
-      return -1;
-    *value = ReadBytesMostSignificantByteFirst<uint8_t>(bytes.subspan(1));
-    return 2;
-  }
-  if (additional_information == kAdditionalInformation2Bytes) {
-    // Values 256-65535: 1 initial byte + 2 bytes payload.
-    if (static_cast<std::size_t>(bytes.size()) < 1 + sizeof(uint16_t))
-      return -1;
-    *value = ReadBytesMostSignificantByteFirst<uint16_t>(bytes.subspan(1));
-    return 3;
-  }
-  if (additional_information == kAdditionalInformation4Bytes) {
-    // 32 bit uint: 1 initial byte + 4 bytes payload.
-    if (static_cast<std::size_t>(bytes.size()) < 1 + sizeof(uint32_t))
-      return -1;
-    *value = ReadBytesMostSignificantByteFirst<uint32_t>(bytes.subspan(1));
-    return 5;
-  }
-  if (additional_information == kAdditionalInformation8Bytes) {
-    // 64 bit uint: 1 initial byte + 8 bytes payload.
-    if (static_cast<std::size_t>(bytes.size()) < 1 + sizeof(uint64_t))
-      return -1;
-    *value = ReadBytesMostSignificantByteFirst<uint64_t>(bytes.subspan(1));
-    return 9;
-  }
-  return -1;
-}
-
-// Writes the start of a token with |type|. The |value| may indicate the size,
-// or it may be the payload if the value is an unsigned integer.
-void WriteTokenStart(MajorType type,
-                     uint64_t value,
-                     std::vector<uint8_t>* encoded) {
-  if (value < 24) {
-    // Values 0-23 are encoded directly into the additional info of the
-    // initial byte.
-    encoded->push_back(EncodeInitialByte(type, /*additional_info=*/value));
-    return;
-  }
-  if (value <= std::numeric_limits<uint8_t>::max()) {
-    // Values 24-255 are encoded with one initial byte, followed by the value.
-    encoded->push_back(EncodeInitialByte(type, kAdditionalInformation1Byte));
-    encoded->push_back(value);
-    return;
-  }
-  if (value <= std::numeric_limits<uint16_t>::max()) {
-    // Values 256-65535: 1 initial byte + 2 bytes payload.
-    encoded->push_back(EncodeInitialByte(type, kAdditionalInformation2Bytes));
-    WriteBytesMostSignificantByteFirst<uint16_t>(value, encoded);
-    return;
-  }
-  if (value <= std::numeric_limits<uint32_t>::max()) {
-    // 32 bit uint: 1 initial byte + 4 bytes payload.
-    encoded->push_back(EncodeInitialByte(type, kAdditionalInformation4Bytes));
-    WriteBytesMostSignificantByteFirst<uint32_t>(static_cast<uint32_t>(value),
-                                                 encoded);
-    return;
-  }
-  // 64 bit uint: 1 initial byte + 8 bytes payload.
-  encoded->push_back(EncodeInitialByte(type, kAdditionalInformation8Bytes));
-  WriteBytesMostSignificantByteFirst<uint64_t>(value, encoded);
-}
-}  // namespace internals
-
-// =============================================================================
-// Detecting CBOR content
-// =============================================================================
-
-uint8_t InitialByteForEnvelope() {
-  return kInitialByteForEnvelope;
-}
-uint8_t InitialByteFor32BitLengthByteString() {
-  return kInitialByteFor32BitLengthByteString;
-}
-bool IsCBORMessage(span<uint8_t> msg) {
-  return msg.size() >= 6 && msg[0] == InitialByteForEnvelope() &&
-         msg[1] == InitialByteFor32BitLengthByteString();
-}
-
-// =============================================================================
-// Encoding invidiual CBOR items
-// =============================================================================
-
-uint8_t EncodeTrue() {
-  return kEncodedTrue;
-}
-uint8_t EncodeFalse() {
-  return kEncodedFalse;
-}
-uint8_t EncodeNull() {
-  return kEncodedNull;
-}
-
-uint8_t EncodeIndefiniteLengthArrayStart() {
-  return kInitialByteIndefiniteLengthArray;
-}
-
-uint8_t EncodeIndefiniteLengthMapStart() {
-  return kInitialByteIndefiniteLengthMap;
-}
-
-uint8_t EncodeStop() {
-  return kStopByte;
-}
-
-void EncodeInt32(int32_t value, std::vector<uint8_t>* out) {
-  if (value >= 0) {
-    internals::WriteTokenStart(MajorType::UNSIGNED, value, out);
-  } else {
-    uint64_t representation = static_cast<uint64_t>(-(value + 1));
-    internals::WriteTokenStart(MajorType::NEGATIVE, representation, out);
-  }
-}
-
-void EncodeString16(span<uint16_t> in, std::vector<uint8_t>* out) {
-  uint64_t byte_length = static_cast<uint64_t>(in.size_bytes());
-  internals::WriteTokenStart(MajorType::BYTE_STRING, byte_length, out);
-  // When emitting UTF16 characters, we always write the least significant byte
-  // first; this is because it's the native representation for X86.
-  // TODO(johannes): Implement a more efficient thing here later, e.g.
-  // casting *iff* the machine has this byte order.
-  // The wire format for UTF16 chars will probably remain the same
-  // (least significant byte first) since this way we can have
-  // golden files, unittests, etc. that port easily and universally.
-  // See also:
-  // https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html
-  for (const uint16_t two_bytes : in) {
-    out->push_back(two_bytes);
-    out->push_back(two_bytes >> 8);
-  }
-}
-
-void EncodeString8(span<uint8_t> in, std::vector<uint8_t>* out) {
-  internals::WriteTokenStart(MajorType::STRING,
-                             static_cast<uint64_t>(in.size_bytes()), out);
-  out->insert(out->end(), in.begin(), in.end());
-}
-
-void EncodeFromLatin1(span<uint8_t> latin1, std::vector<uint8_t>* out) {
-  for (std::ptrdiff_t ii = 0; ii < latin1.size(); ++ii) {
-    if (latin1[ii] <= 127)
-      continue;
-    // If there's at least one non-ASCII char, convert to UTF8.
-    std::vector<uint8_t> utf8(latin1.begin(), latin1.begin() + ii);
-    for (; ii < latin1.size(); ++ii) {
-      if (latin1[ii] <= 127) {
-        utf8.push_back(latin1[ii]);
-      } else {
-        // 0xC0 means it's a UTF8 sequence with 2 bytes.
-        utf8.push_back((latin1[ii] >> 6) | 0xc0);
-        utf8.push_back((latin1[ii] | 0x80) & 0xbf);
-      }
-    }
-    EncodeString8(SpanFromVector(utf8), out);
-    return;
-  }
-  EncodeString8(latin1, out);
-}
-
-void EncodeFromUTF16(span<uint16_t> utf16, std::vector<uint8_t>* out) {
-  // If there's at least one non-ASCII char, encode as STRING16 (UTF16).
-  for (uint16_t ch : utf16) {
-    if (ch <= 127)
-      continue;
-    EncodeString16(utf16, out);
-    return;
-  }
-  // It's all US-ASCII, strip out every second byte and encode as UTF8.
-  internals::WriteTokenStart(MajorType::STRING,
-                             static_cast<uint64_t>(utf16.size()), out);
-  out->insert(out->end(), utf16.begin(), utf16.end());
-}
-
-void EncodeBinary(span<uint8_t> in, std::vector<uint8_t>* out) {
-  out->push_back(kExpectedConversionToBase64Tag);
-  uint64_t byte_length = static_cast<uint64_t>(in.size_bytes());
-  internals::WriteTokenStart(MajorType::BYTE_STRING, byte_length, out);
-  out->insert(out->end(), in.begin(), in.end());
-}
-
-// A double is encoded with a specific initial byte
-// (kInitialByteForDouble) plus the 64 bits of payload for its value.
-constexpr std::ptrdiff_t kEncodedDoubleSize = 1 + sizeof(uint64_t);
-
-// An envelope is encoded with a specific initial byte
-// (kInitialByteForEnvelope), plus the start byte for a BYTE_STRING with a 32
-// bit wide length, plus a 32 bit length for that string.
-constexpr std::ptrdiff_t kEncodedEnvelopeHeaderSize = 1 + 1 + sizeof(uint32_t);
-
-void EncodeDouble(double value, std::vector<uint8_t>* out) {
-  // The additional_info=27 indicates 64 bits for the double follow.
-  // See RFC 7049 Section 2.3, Table 1.
-  out->push_back(kInitialByteForDouble);
-  union {
-    double from_double;
-    uint64_t to_uint64;
-  } reinterpret;
-  reinterpret.from_double = value;
-  WriteBytesMostSignificantByteFirst<uint64_t>(reinterpret.to_uint64, out);
-}
-
-// =============================================================================
-// cbor::EnvelopeEncoder - for wrapping submessages
-// =============================================================================
-
-void EnvelopeEncoder::EncodeStart(std::vector<uint8_t>* out) {
-  assert(byte_size_pos_ == 0);
-  out->push_back(kInitialByteForEnvelope);
-  out->push_back(kInitialByteFor32BitLengthByteString);
-  byte_size_pos_ = out->size();
-  out->resize(out->size() + sizeof(uint32_t));
-}
-
-bool EnvelopeEncoder::EncodeStop(std::vector<uint8_t>* out) {
-  assert(byte_size_pos_ != 0);
-  // The byte size is the size of the payload, that is, all the
-  // bytes that were written past the byte size position itself.
-  uint64_t byte_size = out->size() - (byte_size_pos_ + sizeof(uint32_t));
-  // We store exactly 4 bytes, so at most INT32MAX, with most significant
-  // byte first.
-  if (byte_size > std::numeric_limits<uint32_t>::max())
-    return false;
-  for (int shift_bytes = sizeof(uint32_t) - 1; shift_bytes >= 0;
-       --shift_bytes) {
-    (*out)[byte_size_pos_++] = 0xff & (byte_size >> (shift_bytes * 8));
-  }
-  return true;
-}
-
-// =============================================================================
-// cbor::NewCBOREncoder - for encoding from a streaming parser
-// =============================================================================
-
-namespace {
-class CBOREncoder : public StreamingParserHandler {
- public:
-  CBOREncoder(std::vector<uint8_t>* out, Status* status)
-      : out_(out), status_(status) {
-    *status_ = Status();
-  }
-
-  void HandleMapBegin() override {
-    envelopes_.emplace_back();
-    envelopes_.back().EncodeStart(out_);
-    out_->push_back(kInitialByteIndefiniteLengthMap);
-  }
-
-  void HandleMapEnd() override {
-    out_->push_back(kStopByte);
-    assert(!envelopes_.empty());
-    envelopes_.back().EncodeStop(out_);
-    envelopes_.pop_back();
-  }
-
-  void HandleArrayBegin() override {
-    envelopes_.emplace_back();
-    envelopes_.back().EncodeStart(out_);
-    out_->push_back(kInitialByteIndefiniteLengthArray);
-  }
-
-  void HandleArrayEnd() override {
-    out_->push_back(kStopByte);
-    assert(!envelopes_.empty());
-    envelopes_.back().EncodeStop(out_);
-    envelopes_.pop_back();
-  }
-
-  void HandleString8(span<uint8_t> chars) override {
-    EncodeString8(chars, out_);
-  }
-
-  void HandleString16(span<uint16_t> chars) override {
-    EncodeFromUTF16(chars, out_);
-  }
-
-  void HandleBinary(span<uint8_t> bytes) override { EncodeBinary(bytes, out_); }
-
-  void HandleDouble(double value) override { EncodeDouble(value, out_); }
-
-  void HandleInt32(int32_t value) override { EncodeInt32(value, out_); }
-
-  void HandleBool(bool value) override {
-    // See RFC 7049 Section 2.3, Table 2.
-    out_->push_back(value ? kEncodedTrue : kEncodedFalse);
-  }
-
-  void HandleNull() override {
-    // See RFC 7049 Section 2.3, Table 2.
-    out_->push_back(kEncodedNull);
-  }
-
-  void HandleError(Status error) override {
-    assert(!error.ok());
-    *status_ = error;
-    out_->clear();
-  }
-
- private:
-  std::vector<uint8_t>* out_;
-  std::vector<EnvelopeEncoder> envelopes_;
-  Status* status_;
-};
-}  // namespace
-
-std::unique_ptr<StreamingParserHandler> NewCBOREncoder(
-    std::vector<uint8_t>* out,
-    Status* status) {
-  return std::unique_ptr<StreamingParserHandler>(new CBOREncoder(out, status));
-}
-
-// =============================================================================
-// cbor::CBORTokenizer - for parsing individual CBOR items
-// =============================================================================
-
-CBORTokenizer::CBORTokenizer(span<uint8_t> bytes) : bytes_(bytes) {
-  ReadNextToken(/*enter_envelope=*/false);
-}
-CBORTokenizer::~CBORTokenizer() {}
-
-CBORTokenTag CBORTokenizer::TokenTag() const {
-  return token_tag_;
-}
-
-void CBORTokenizer::Next() {
-  if (token_tag_ == CBORTokenTag::ERROR_VALUE ||
-      token_tag_ == CBORTokenTag::DONE)
-    return;
-  ReadNextToken(/*enter_envelope=*/false);
-}
-
-void CBORTokenizer::EnterEnvelope() {
-  assert(token_tag_ == CBORTokenTag::ENVELOPE);
-  ReadNextToken(/*enter_envelope=*/true);
-}
-
-Status CBORTokenizer::Status() const {
-  return status_;
-}
-
-int32_t CBORTokenizer::GetInt32() const {
-  assert(token_tag_ == CBORTokenTag::INT32);
-  // The range checks happen in ::ReadNextToken().
-  return static_cast<uint32_t>(
-      token_start_type_ == MajorType::UNSIGNED
-          ? token_start_internal_value_
-          : -static_cast<int64_t>(token_start_internal_value_) - 1);
-}
-
-double CBORTokenizer::GetDouble() const {
-  assert(token_tag_ == CBORTokenTag::DOUBLE);
-  union {
-    uint64_t from_uint64;
-    double to_double;
-  } reinterpret;
-  reinterpret.from_uint64 = ReadBytesMostSignificantByteFirst<uint64_t>(
-      bytes_.subspan(status_.pos + 1));
-  return reinterpret.to_double;
-}
-
-span<uint8_t> CBORTokenizer::GetString8() const {
-  assert(token_tag_ == CBORTokenTag::STRING8);
-  auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
-  return bytes_.subspan(status_.pos + (token_byte_length_ - length), length);
-}
-
-span<uint8_t> CBORTokenizer::GetString16WireRep() const {
-  assert(token_tag_ == CBORTokenTag::STRING16);
-  auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
-  return bytes_.subspan(status_.pos + (token_byte_length_ - length), length);
-}
-
-span<uint8_t> CBORTokenizer::GetBinary() const {
-  assert(token_tag_ == CBORTokenTag::BINARY);
-  auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
-  return bytes_.subspan(status_.pos + (token_byte_length_ - length), length);
-}
-
-span<uint8_t> CBORTokenizer::GetEnvelopeContents() const {
-  assert(token_tag_ == CBORTokenTag::ENVELOPE);
-  auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
-  return bytes_.subspan(status_.pos + kEncodedEnvelopeHeaderSize, length);
-}
-
-void CBORTokenizer::ReadNextToken(bool enter_envelope) {
-  if (enter_envelope) {
-    status_.pos += kEncodedEnvelopeHeaderSize;
-  } else {
-    status_.pos =
-        status_.pos == Status::npos() ? 0 : status_.pos + token_byte_length_;
-  }
-  status_.error = Error::OK;
-  if (status_.pos >= bytes_.size()) {
-    token_tag_ = CBORTokenTag::DONE;
-    return;
-  }
-  switch (bytes_[status_.pos]) {
-    case kStopByte:
-      SetToken(CBORTokenTag::STOP, 1);
-      return;
-    case kInitialByteIndefiniteLengthMap:
-      SetToken(CBORTokenTag::MAP_START, 1);
-      return;
-    case kInitialByteIndefiniteLengthArray:
-      SetToken(CBORTokenTag::ARRAY_START, 1);
-      return;
-    case kEncodedTrue:
-      SetToken(CBORTokenTag::TRUE_VALUE, 1);
-      return;
-    case kEncodedFalse:
-      SetToken(CBORTokenTag::FALSE_VALUE, 1);
-      return;
-    case kEncodedNull:
-      SetToken(CBORTokenTag::NULL_VALUE, 1);
-      return;
-    case kExpectedConversionToBase64Tag: {  // BINARY
-      int8_t bytes_read = internals::ReadTokenStart(
-          bytes_.subspan(status_.pos + 1), &token_start_type_,
-          &token_start_internal_value_);
-      int64_t token_byte_length = 1 + bytes_read + token_start_internal_value_;
-      if (-1 == bytes_read || token_start_type_ != MajorType::BYTE_STRING ||
-          status_.pos + token_byte_length > bytes_.size()) {
-        SetError(Error::CBOR_INVALID_BINARY);
-        return;
-      }
-      SetToken(CBORTokenTag::BINARY,
-               static_cast<std::ptrdiff_t>(token_byte_length));
-      return;
-    }
-    case kInitialByteForDouble: {  // DOUBLE
-      if (status_.pos + kEncodedDoubleSize > bytes_.size()) {
-        SetError(Error::CBOR_INVALID_DOUBLE);
-        return;
-      }
-      SetToken(CBORTokenTag::DOUBLE, kEncodedDoubleSize);
-      return;
-    }
-    case kInitialByteForEnvelope: {  // ENVELOPE
-      if (status_.pos + kEncodedEnvelopeHeaderSize > bytes_.size()) {
-        SetError(Error::CBOR_INVALID_ENVELOPE);
-        return;
-      }
-      // The envelope must be a byte string with 32 bit length.
-      if (bytes_[status_.pos + 1] != kInitialByteFor32BitLengthByteString) {
-        SetError(Error::CBOR_INVALID_ENVELOPE);
-        return;
-      }
-      // Read the length of the byte string.
-      token_start_internal_value_ = ReadBytesMostSignificantByteFirst<uint32_t>(
-          bytes_.subspan(status_.pos + 2));
-      // Make sure the payload is contained within the message.
-      if (token_start_internal_value_ + kEncodedEnvelopeHeaderSize +
-              status_.pos >
-          static_cast<std::size_t>(bytes_.size())) {
-        SetError(Error::CBOR_INVALID_ENVELOPE);
-        return;
-      }
-      auto length = static_cast<std::ptrdiff_t>(token_start_internal_value_);
-      SetToken(CBORTokenTag::ENVELOPE, kEncodedEnvelopeHeaderSize + length);
-      return;
-    }
-    default: {
-      span<uint8_t> remainder =
-          bytes_.subspan(status_.pos, bytes_.size() - status_.pos);
-      assert(!remainder.empty());
-      int8_t token_start_length = internals::ReadTokenStart(
-          remainder, &token_start_type_, &token_start_internal_value_);
-      bool success = token_start_length != -1;
-      switch (token_start_type_) {
-        case MajorType::UNSIGNED:  // INT32.
-          if (!success || std::numeric_limits<int32_t>::max() <
-                              token_start_internal_value_) {
-            SetError(Error::CBOR_INVALID_INT32);
-            return;
-          }
-          SetToken(CBORTokenTag::INT32, token_start_length);
-          return;
-        case MajorType::NEGATIVE:  // INT32.
-          if (!success ||
-              std::numeric_limits<int32_t>::min() >
-                  -static_cast<int64_t>(token_start_internal_value_) - 1) {
-            SetError(Error::CBOR_INVALID_INT32);
-            return;
-          }
-          SetToken(CBORTokenTag::INT32, token_start_length);
-          return;
-        case MajorType::STRING: {  // STRING8.
-          if (!success || remainder.size() < static_cast<int64_t>(
-                                                 token_start_internal_value_)) {
-            SetError(Error::CBOR_INVALID_STRING8);
-            return;
-          }
-          auto length =
-              static_cast<std::ptrdiff_t>(token_start_internal_value_);
-          SetToken(CBORTokenTag::STRING8, token_start_length + length);
-          return;
-        }
-        case MajorType::BYTE_STRING: {  // STRING16.
-          if (!success ||
-              remainder.size() <
-                  static_cast<int64_t>(token_start_internal_value_) ||
-              // Must be divisible by 2 since UTF16 is 2 bytes per character.
-              token_start_internal_value_ & 1) {
-            SetError(Error::CBOR_INVALID_STRING16);
-            return;
-          }
-          auto length =
-              static_cast<std::ptrdiff_t>(token_start_internal_value_);
-          SetToken(CBORTokenTag::STRING16, token_start_length + length);
-          return;
-        }
-        case MajorType::ARRAY:
-        case MajorType::MAP:
-        case MajorType::TAG:
-        case MajorType::SIMPLE_VALUE:
-          SetError(Error::CBOR_UNSUPPORTED_VALUE);
-          return;
-      }
-    }
-  }
-}
-
-void CBORTokenizer::SetToken(CBORTokenTag token_tag,
-                             std::ptrdiff_t token_byte_length) {
-  token_tag_ = token_tag;
-  token_byte_length_ = token_byte_length;
-}
-
-void CBORTokenizer::SetError(Error error) {
-  token_tag_ = CBORTokenTag::ERROR_VALUE;
-  status_.error = error;
-}
-
-// =============================================================================
-// cbor::ParseCBOR - for receiving streaming parser events for CBOR messages
-// =============================================================================
-
-namespace {
-// When parsing CBOR, we limit recursion depth for objects and arrays
-// to this constant.
-static constexpr int kStackLimit = 1000;
-
-// Below are three parsing routines for CBOR, which cover enough
-// to roundtrip JSON messages.
-bool ParseMap(int32_t stack_depth,
-              CBORTokenizer* tokenizer,
-              StreamingParserHandler* out);
-bool ParseArray(int32_t stack_depth,
-                CBORTokenizer* tokenizer,
-                StreamingParserHandler* out);
-bool ParseValue(int32_t stack_depth,
-                CBORTokenizer* tokenizer,
-                StreamingParserHandler* out);
-
-void ParseUTF16String(CBORTokenizer* tokenizer, StreamingParserHandler* out) {
-  std::vector<uint16_t> value;
-  span<uint8_t> rep = tokenizer->GetString16WireRep();
-  for (std::ptrdiff_t ii = 0; ii < rep.size(); ii += 2)
-    value.push_back((rep[ii + 1] << 8) | rep[ii]);
-  out->HandleString16(span<uint16_t>(value.data(), value.size()));
-  tokenizer->Next();
-}
-
-bool ParseUTF8String(CBORTokenizer* tokenizer, StreamingParserHandler* out) {
-  assert(tokenizer->TokenTag() == CBORTokenTag::STRING8);
-  out->HandleString8(tokenizer->GetString8());
-  tokenizer->Next();
-  return true;
-}
-
-bool ParseValue(int32_t stack_depth,
-                CBORTokenizer* tokenizer,
-                StreamingParserHandler* out) {
-  if (stack_depth > kStackLimit) {
-    out->HandleError(
-        Status{Error::CBOR_STACK_LIMIT_EXCEEDED, tokenizer->Status().pos});
-    return false;
-  }
-  // Skip past the envelope to get to what's inside.
-  if (tokenizer->TokenTag() == CBORTokenTag::ENVELOPE)
-    tokenizer->EnterEnvelope();
-  switch (tokenizer->TokenTag()) {
-    case CBORTokenTag::ERROR_VALUE:
-      out->HandleError(tokenizer->Status());
-      return false;
-    case CBORTokenTag::DONE:
-      out->HandleError(Status{Error::CBOR_UNEXPECTED_EOF_EXPECTED_VALUE,
-                              tokenizer->Status().pos});
-      return false;
-    case CBORTokenTag::TRUE_VALUE:
-      out->HandleBool(true);
-      tokenizer->Next();
-      return true;
-    case CBORTokenTag::FALSE_VALUE:
-      out->HandleBool(false);
-      tokenizer->Next();
-      return true;
-    case CBORTokenTag::NULL_VALUE:
-      out->HandleNull();
-      tokenizer->Next();
-      return true;
-    case CBORTokenTag::INT32:
-      out->HandleInt32(tokenizer->GetInt32());
-      tokenizer->Next();
-      return true;
-    case CBORTokenTag::DOUBLE:
-      out->HandleDouble(tokenizer->GetDouble());
-      tokenizer->Next();
-      return true;
-    case CBORTokenTag::STRING8:
-      return ParseUTF8String(tokenizer, out);
-    case CBORTokenTag::STRING16:
-      ParseUTF16String(tokenizer, out);
-      return true;
-    case CBORTokenTag::BINARY: {
-      out->HandleBinary(tokenizer->GetBinary());
-      tokenizer->Next();
-      return true;
-    }
-    case CBORTokenTag::MAP_START:
-      return ParseMap(stack_depth + 1, tokenizer, out);
-    case CBORTokenTag::ARRAY_START:
-      return ParseArray(stack_depth + 1, tokenizer, out);
-    default:
-      out->HandleError(
-          Status{Error::CBOR_UNSUPPORTED_VALUE, tokenizer->Status().pos});
-      return false;
-  }
-}
-
-// |bytes| must start with the indefinite length array byte, so basically,
-// ParseArray may only be called after an indefinite length array has been
-// detected.
-bool ParseArray(int32_t stack_depth,
-                CBORTokenizer* tokenizer,
-                StreamingParserHandler* out) {
-  assert(tokenizer->TokenTag() == CBORTokenTag::ARRAY_START);
-  tokenizer->Next();
-  out->HandleArrayBegin();
-  while (tokenizer->TokenTag() != CBORTokenTag::STOP) {
-    if (tokenizer->TokenTag() == CBORTokenTag::DONE) {
-      out->HandleError(
-          Status{Error::CBOR_UNEXPECTED_EOF_IN_ARRAY, tokenizer->Status().pos});
-      return false;
-    }
-    if (tokenizer->TokenTag() == CBORTokenTag::ERROR_VALUE) {
-      out->HandleError(tokenizer->Status());
-      return false;
-    }
-    // Parse value.
-    if (!ParseValue(stack_depth, tokenizer, out))
-      return false;
-  }
-  out->HandleArrayEnd();
-  tokenizer->Next();
-  return true;
-}
-
-// |bytes| must start with the indefinite length array byte, so basically,
-// ParseArray may only be called after an indefinite length array has been
-// detected.
-bool ParseMap(int32_t stack_depth,
-              CBORTokenizer* tokenizer,
-              StreamingParserHandler* out) {
-  assert(tokenizer->TokenTag() == CBORTokenTag::MAP_START);
-  out->HandleMapBegin();
-  tokenizer->Next();
-  while (tokenizer->TokenTag() != CBORTokenTag::STOP) {
-    if (tokenizer->TokenTag() == CBORTokenTag::DONE) {
-      out->HandleError(
-          Status{Error::CBOR_UNEXPECTED_EOF_IN_MAP, tokenizer->Status().pos});
-      return false;
-    }
-    if (tokenizer->TokenTag() == CBORTokenTag::ERROR_VALUE) {
-      out->HandleError(tokenizer->Status());
-      return false;
-    }
-    // Parse key.
-    if (tokenizer->TokenTag() == CBORTokenTag::STRING8) {
-      if (!ParseUTF8String(tokenizer, out))
-        return false;
-    } else if (tokenizer->TokenTag() == CBORTokenTag::STRING16) {
-      ParseUTF16String(tokenizer, out);
-    } else {
-      out->HandleError(
-          Status{Error::CBOR_INVALID_MAP_KEY, tokenizer->Status().pos});
-      return false;
-    }
-    // Parse value.
-    if (!ParseValue(stack_depth, tokenizer, out))
-      return false;
-  }
-  out->HandleMapEnd();
-  tokenizer->Next();
-  return true;
-}
-}  // namespace
-
-void ParseCBOR(span<uint8_t> bytes, StreamingParserHandler* out) {
-  if (bytes.empty()) {
-    out->HandleError(Status{Error::CBOR_NO_INPUT, 0});
-    return;
-  }
-  if (bytes[0] != kInitialByteForEnvelope) {
-    out->HandleError(Status{Error::CBOR_INVALID_START_BYTE, 0});
-    return;
-  }
-  CBORTokenizer tokenizer(bytes);
-  if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) {
-    out->HandleError(tokenizer.Status());
-    return;
-  }
-  // We checked for the envelope start byte above, so the tokenizer
-  // must agree here, since it's not an error.
-  assert(tokenizer.TokenTag() == CBORTokenTag::ENVELOPE);
-  tokenizer.EnterEnvelope();
-  if (tokenizer.TokenTag() != CBORTokenTag::MAP_START) {
-    out->HandleError(
-        Status{Error::CBOR_MAP_START_EXPECTED, tokenizer.Status().pos});
-    return;
-  }
-  if (!ParseMap(/*stack_depth=*/1, &tokenizer, out))
-    return;
-  if (tokenizer.TokenTag() == CBORTokenTag::DONE)
-    return;
-  if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) {
-    out->HandleError(tokenizer.Status());
-    return;
-  }
-  out->HandleError(Status{Error::CBOR_TRAILING_JUNK, tokenizer.Status().pos});
-}
-}  // namespace cbor
-
-namespace json {
-
-// =============================================================================
-// json::NewJSONEncoder - for encoding streaming parser events as JSON
-// =============================================================================
-
-namespace {
-// Prints |value| to |out| with 4 hex digits, most significant chunk first.
-void PrintHex(uint16_t value, std::string* out) {
-  for (int ii = 3; ii >= 0; --ii) {
-    int four_bits = 0xf & (value >> (4 * ii));
-    out->append(1, four_bits + ((four_bits <= 9) ? '0' : ('a' - 10)));
-  }
-}
-
-// In the writer below, we maintain a stack of State instances.
-// It is just enough to emit the appropriate delimiters and brackets
-// in JSON.
-enum class Container {
-  // Used for the top-level, initial state.
-  NONE,
-  // Inside a JSON object.
-  MAP,
-  // Inside a JSON array.
-  ARRAY
-};
-class State {
- public:
-  explicit State(Container container) : container_(container) {}
-  void StartElement(std::string* out) {
-    assert(container_ != Container::NONE || size_ == 0);
-    if (size_ != 0) {
-      char delim = (!(size_ & 1) || container_ == Container::ARRAY) ? ',' : ':';
-      out->append(1, delim);
-    }
-    ++size_;
-  }
-  Container container() const { return container_; }
-
- private:
-  Container container_ = Container::NONE;
-  int size_ = 0;
-};
-
-constexpr char kBase64Table[] =
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-    "abcdefghijklmnopqrstuvwxyz0123456789+/";
-
-void Base64Encode(const span<uint8_t>& in, std::string* out) {
-  // The following three cases are based on the tables in the example
-  // section in https://en.wikipedia.org/wiki/Base64. We process three
-  // input bytes at a time, emitting 4 output bytes at a time.
-  std::ptrdiff_t ii = 0;
-
-  // While possible, process three input bytes.
-  for (; ii + 3 <= in.size(); ii += 3) {
-    uint32_t twentyfour_bits = (in[ii] << 16) | (in[ii + 1] << 8) | in[ii + 2];
-    out->push_back(kBase64Table[(twentyfour_bits >> 18)]);
-    out->push_back(kBase64Table[(twentyfour_bits >> 12) & 0x3f]);
-    out->push_back(kBase64Table[(twentyfour_bits >> 6) & 0x3f]);
-    out->push_back(kBase64Table[twentyfour_bits & 0x3f]);
-  }
-  if (ii + 2 <= in.size()) {  // Process two input bytes.
-    uint32_t twentyfour_bits = (in[ii] << 16) | (in[ii + 1] << 8);
-    out->push_back(kBase64Table[(twentyfour_bits >> 18)]);
-    out->push_back(kBase64Table[(twentyfour_bits >> 12) & 0x3f]);
-    out->push_back(kBase64Table[(twentyfour_bits >> 6) & 0x3f]);
-    out->push_back('=');  // Emit padding.
-    return;
-  }
-  if (ii + 1 <= in.size()) {  // Process a single input byte.
-    uint32_t twentyfour_bits = (in[ii] << 16);
-    out->push_back(kBase64Table[(twentyfour_bits >> 18)]);
-    out->push_back(kBase64Table[(twentyfour_bits >> 12) & 0x3f]);
-    out->push_back('=');  // Emit padding.
-    out->push_back('=');  // Emit padding.
-  }
-}
-
-// Implements a handler for JSON parser events to emit a JSON string.
-class JSONEncoder : public StreamingParserHandler {
- public:
-  JSONEncoder(const Platform* platform, std::string* out, Status* status)
-      : platform_(platform), out_(out), status_(status) {
-    *status_ = Status();
-    state_.emplace(Container::NONE);
-  }
-
-  void HandleMapBegin() override {
-    if (!status_->ok())
-      return;
-    assert(!state_.empty());
-    state_.top().StartElement(out_);
-    state_.emplace(Container::MAP);
-    out_->append("{");
-  }
-
-  void HandleMapEnd() override {
-    if (!status_->ok())
-      return;
-    assert(state_.size() >= 2 && state_.top().container() == Container::MAP);
-    state_.pop();
-    out_->append("}");
-  }
-
-  void HandleArrayBegin() override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    state_.emplace(Container::ARRAY);
-    out_->append("[");
-  }
-
-  void HandleArrayEnd() override {
-    if (!status_->ok())
-      return;
-    assert(state_.size() >= 2 && state_.top().container() == Container::ARRAY);
-    state_.pop();
-    out_->append("]");
-  }
-
-  void HandleString16(span<uint16_t> chars) override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    out_->append("\"");
-    for (const uint16_t ch : chars) {
-      if (ch == '"') {
-        out_->append("\\\"");
-      } else if (ch == '\\') {
-        out_->append("\\\\");
-      } else if (ch == '\b') {
-        out_->append("\\b");
-      } else if (ch == '\f') {
-        out_->append("\\f");
-      } else if (ch == '\n') {
-        out_->append("\\n");
-      } else if (ch == '\r') {
-        out_->append("\\r");
-      } else if (ch == '\t') {
-        out_->append("\\t");
-      } else if (ch >= 32 && ch <= 126) {
-        out_->append(1, ch);
-      } else {
-        out_->append("\\u");
-        PrintHex(ch, out_);
-      }
-    }
-    out_->append("\"");
-  }
-
-  void HandleString8(span<uint8_t> chars) override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    out_->append("\"");
-    for (std::ptrdiff_t ii = 0; ii < chars.size(); ++ii) {
-      uint8_t c = chars[ii];
-      if (c == '"') {
-        out_->append("\\\"");
-      } else if (c == '\\') {
-        out_->append("\\\\");
-      } else if (c == '\b') {
-        out_->append("\\b");
-      } else if (c == '\f') {
-        out_->append("\\f");
-      } else if (c == '\n') {
-        out_->append("\\n");
-      } else if (c == '\r') {
-        out_->append("\\r");
-      } else if (c == '\t') {
-        out_->append("\\t");
-      } else if (c >= 32 && c <= 126) {
-        out_->append(1, c);
-      } else if (c < 32) {
-        out_->append("\\u");
-        PrintHex(static_cast<uint16_t>(c), out_);
-      } else {
-        // Inspect the leading byte to figure out how long the utf8
-        // byte sequence is; while doing this initialize |codepoint|
-        // with the first few bits.
-        // See table in: https://en.wikipedia.org/wiki/UTF-8
-        // byte one is 110x xxxx -> 2 byte utf8 sequence
-        // byte one is 1110 xxxx -> 3 byte utf8 sequence
-        // byte one is 1111 0xxx -> 4 byte utf8 sequence
-        uint32_t codepoint;
-        int num_bytes_left;
-        if ((c & 0xe0) == 0xc0) {  // 2 byte utf8 sequence
-          num_bytes_left = 1;
-          codepoint = c & 0x1f;
-        } else if ((c & 0xf0) == 0xe0) {  // 3 byte utf8 sequence
-          num_bytes_left = 2;
-          codepoint = c & 0x0f;
-        } else if ((c & 0xf8) == 0xf0) {  // 4 byte utf8 sequence
-          codepoint = c & 0x07;
-          num_bytes_left = 3;
-        } else {
-          continue;  // invalid leading byte
-        }
-
-        // If we have enough bytes in our input, decode the remaining ones
-        // belonging to this Unicode character into |codepoint|.
-        if (ii + num_bytes_left > chars.size())
-          continue;
-        while (num_bytes_left > 0) {
-          c = chars[++ii];
-          --num_bytes_left;
-          // Check the next byte is a continuation byte, that is 10xx xxxx.
-          if ((c & 0xc0) != 0x80)
-            continue;
-          codepoint = (codepoint << 6) | (c & 0x3f);
-        }
-
-        // Disallow overlong encodings for ascii characters, as these
-        // would include " and other characters significant to JSON
-        // string termination / control.
-        if (codepoint < 0x7f)
-          continue;
-        // Invalid in UTF8, and can't be represented in UTF16 anyway.
-        if (codepoint > 0x10ffff)
-          continue;
-
-        // So, now we transcode to UTF16,
-        // using the math described at https://en.wikipedia.org/wiki/UTF-16,
-        // for either one or two 16 bit characters.
-        if (codepoint < 0xffff) {
-          out_->append("\\u");
-          PrintHex(static_cast<uint16_t>(codepoint), out_);
-          continue;
-        }
-        codepoint -= 0x10000;
-        // high surrogate
-        out_->append("\\u");
-        PrintHex(static_cast<uint16_t>((codepoint >> 10) + 0xd800), out_);
-        // low surrogate
-        out_->append("\\u");
-        PrintHex(static_cast<uint16_t>((codepoint & 0x3ff) + 0xdc00), out_);
-      }
-    }
-    out_->append("\"");
-  }
-
-  void HandleBinary(span<uint8_t> bytes) override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    out_->append("\"");
-    Base64Encode(bytes, out_);
-    out_->append("\"");
-  }
-
-  void HandleDouble(double value) override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    std::unique_ptr<char[]> str_value = platform_->DToStr(value);
-
-    // DToStr may fail to emit a 0 before the decimal dot. E.g. this is
-    // the case in base::NumberToString in Chromium (which is based on
-    // dmg_fp). So, much like
-    // https://cs.chromium.org/chromium/src/base/json/json_writer.cc
-    // we probe for this and emit the leading 0 anyway if necessary.
-    const char* chars = str_value.get();
-    if (chars[0] == '.') {
-      out_->append("0");
-    } else if (chars[0] == '-' && chars[1] == '.') {
-      out_->append("-0");
-      ++chars;
-    }
-    out_->append(chars);
-  }
-
-  void HandleInt32(int32_t value) override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    out_->append(std::to_string(value));
-  }
-
-  void HandleBool(bool value) override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    out_->append(value ? "true" : "false");
-  }
-
-  void HandleNull() override {
-    if (!status_->ok())
-      return;
-    state_.top().StartElement(out_);
-    out_->append("null");
-  }
-
-  void HandleError(Status error) override {
-    assert(!error.ok());
-    *status_ = error;
-    out_->clear();
-  }
-
- private:
-  const Platform* platform_;
-  std::string* out_;
-  Status* status_;
-  std::stack<State> state_;
-};
-}  // namespace
-
-std::unique_ptr<StreamingParserHandler> NewJSONEncoder(const Platform* platform,
-                                                       std::string* out,
-                                                       Status* status) {
-  return std::unique_ptr<StreamingParserHandler>(
-      new JSONEncoder(platform, out, status));
-}
-
-// =============================================================================
-// json::ParseJSON - for receiving streaming parser events for JSON.
-// =============================================================================
-
-namespace {
-const int kStackLimit = 1000;
-
-enum Token {
-  ObjectBegin,
-  ObjectEnd,
-  ArrayBegin,
-  ArrayEnd,
-  StringLiteral,
-  Number,
-  BoolTrue,
-  BoolFalse,
-  NullToken,
-  ListSeparator,
-  ObjectPairSeparator,
-  InvalidToken,
-  NoInput
-};
-
-const char* const kNullString = "null";
-const char* const kTrueString = "true";
-const char* const kFalseString = "false";
-
-template <typename Char>
-class JsonParser {
- public:
-  JsonParser(const Platform* platform, StreamingParserHandler* handler)
-      : platform_(platform), handler_(handler) {}
-
-  void Parse(const Char* start, std::size_t length) {
-    start_pos_ = start;
-    const Char* end = start + length;
-    const Char* tokenEnd;
-    ParseValue(start, end, &tokenEnd, 0);
-    if (tokenEnd != end) {
-      HandleError(Error::JSON_PARSER_UNPROCESSED_INPUT_REMAINS, tokenEnd);
-    }
-  }
-
- private:
-  bool CharsToDouble(const uint16_t* chars,
-                     std::size_t length,
-                     double* result) {
-    std::string buffer;
-    buffer.reserve(length + 1);
-    for (std::size_t ii = 0; ii < length; ++ii) {
-      bool is_ascii = !(chars[ii] & ~0x7F);
-      if (!is_ascii)
-        return false;
-      buffer.push_back(static_cast<char>(chars[ii]));
-    }
-    return platform_->StrToD(buffer.c_str(), result);
-  }
-
-  bool CharsToDouble(const uint8_t* chars, std::size_t length, double* result) {
-    std::string buffer(reinterpret_cast<const char*>(chars), length);
-    return platform_->StrToD(buffer.c_str(), result);
-  }
-
-  static bool ParseConstToken(const Char* start,
-                              const Char* end,
-                              const Char** token_end,
-                              const char* token) {
-    // |token| is \0 terminated, it's one of the constants at top of the file.
-    while (start < end && *token != '\0' && *start++ == *token++) {
-    }
-    if (*token != '\0')
-      return false;
-    *token_end = start;
-    return true;
-  }
-
-  static bool ReadInt(const Char* start,
-                      const Char* end,
-                      const Char** token_end,
-                      bool allow_leading_zeros) {
-    if (start == end)
-      return false;
-    bool has_leading_zero = '0' == *start;
-    int length = 0;
-    while (start < end && '0' <= *start && *start <= '9') {
-      ++start;
-      ++length;
-    }
-    if (!length)
-      return false;
-    if (!allow_leading_zeros && length > 1 && has_leading_zero)
-      return false;
-    *token_end = start;
-    return true;
-  }
-
-  static bool ParseNumberToken(const Char* start,
-                               const Char* end,
-                               const Char** token_end) {
-    // We just grab the number here. We validate the size in DecodeNumber.
-    // According to RFC4627, a valid number is: [minus] int [frac] [exp]
-    if (start == end)
-      return false;
-    Char c = *start;
-    if ('-' == c)
-      ++start;
-
-    if (!ReadInt(start, end, &start, /*allow_leading_zeros=*/false))
-      return false;
-    if (start == end) {
-      *token_end = start;
-      return true;
-    }
-
-    // Optional fraction part
-    c = *start;
-    if ('.' == c) {
-      ++start;
-      if (!ReadInt(start, end, &start, /*allow_leading_zeros=*/true))
-        return false;
-      if (start == end) {
-        *token_end = start;
-        return true;
-      }
-      c = *start;
-    }
-
-    // Optional exponent part
-    if ('e' == c || 'E' == c) {
-      ++start;
-      if (start == end)
-        return false;
-      c = *start;
-      if ('-' == c || '+' == c) {
-        ++start;
-        if (start == end)
-          return false;
-      }
-      if (!ReadInt(start, end, &start, /*allow_leading_zeros=*/true))
-        return false;
-    }
-
-    *token_end = start;
-    return true;
-  }
-
-  static bool ReadHexDigits(const Char* start,
-                            const Char* end,
-                            const Char** token_end,
-                            int digits) {
-    if (end - start < digits)
-      return false;
-    for (int i = 0; i < digits; ++i) {
-      Char c = *start++;
-      if (!(('0' <= c && c <= '9') || ('a' <= c && c <= 'f') ||
-            ('A' <= c && c <= 'F')))
-        return false;
-    }
-    *token_end = start;
-    return true;
-  }
-
-  static bool ParseStringToken(const Char* start,
-                               const Char* end,
-                               const Char** token_end) {
-    while (start < end) {
-      Char c = *start++;
-      if ('\\' == c) {
-        if (start == end)
-          return false;
-        c = *start++;
-        // Make sure the escaped char is valid.
-        switch (c) {
-          case 'x':
-            if (!ReadHexDigits(start, end, &start, 2))
-              return false;
-            break;
-          case 'u':
-            if (!ReadHexDigits(start, end, &start, 4))
-              return false;
-            break;
-          case '\\':
-          case '/':
-          case 'b':
-          case 'f':
-          case 'n':
-          case 'r':
-          case 't':
-          case 'v':
-          case '"':
-            break;
-          default:
-            return false;
-        }
-      } else if ('"' == c) {
-        *token_end = start;
-        return true;
-      }
-    }
-    return false;
-  }
-
-  static bool SkipComment(const Char* start,
-                          const Char* end,
-                          const Char** comment_end) {
-    if (start == end)
-      return false;
-
-    if (*start != '/' || start + 1 >= end)
-      return false;
-    ++start;
-
-    if (*start == '/') {
-      // Single line comment, read to newline.
-      for (++start; start < end; ++start) {
-        if (*start == '\n' || *start == '\r') {
-          *comment_end = start + 1;
-          return true;
-        }
-      }
-      *comment_end = end;
-      // Comment reaches end-of-input, which is fine.
-      return true;
-    }
-
-    if (*start == '*') {
-      Char previous = '\0';
-      // Block comment, read until end marker.
-      for (++start; start < end; previous = *start++) {
-        if (previous == '*' && *start == '/') {
-          *comment_end = start + 1;
-          return true;
-        }
-      }
-      // Block comment must close before end-of-input.
-      return false;
-    }
-
-    return false;
-  }
-
-  static bool IsSpaceOrNewLine(Char c) {
-    // \v = vertial tab; \f = form feed page break.
-    return c == ' ' || c == '\n' || c == '\v' || c == '\f' || c == '\r' ||
-           c == '\t';
-  }
-
-  static void SkipWhitespaceAndComments(const Char* start,
-                                        const Char* end,
-                                        const Char** whitespace_end) {
-    while (start < end) {
-      if (IsSpaceOrNewLine(*start)) {
-        ++start;
-      } else if (*start == '/') {
-        const Char* comment_end;
-        if (!SkipComment(start, end, &comment_end))
-          break;
-        start = comment_end;
-      } else {
-        break;
-      }
-    }
-    *whitespace_end = start;
-  }
-
-  static Token ParseToken(const Char* start,
-                          const Char* end,
-                          const Char** tokenStart,
-                          const Char** token_end) {
-    SkipWhitespaceAndComments(start, end, tokenStart);
-    start = *tokenStart;
-
-    if (start == end)
-      return NoInput;
-
-    switch (*start) {
-      case 'n':
-        if (ParseConstToken(start, end, token_end, kNullString))
-          return NullToken;
-        break;
-      case 't':
-        if (ParseConstToken(start, end, token_end, kTrueString))
-          return BoolTrue;
-        break;
-      case 'f':
-        if (ParseConstToken(start, end, token_end, kFalseString))
-          return BoolFalse;
-        break;
-      case '[':
-        *token_end = start + 1;
-        return ArrayBegin;
-      case ']':
-        *token_end = start + 1;
-        return ArrayEnd;
-      case ',':
-        *token_end = start + 1;
-        return ListSeparator;
-      case '{':
-        *token_end = start + 1;
-        return ObjectBegin;
-      case '}':
-        *token_end = start + 1;
-        return ObjectEnd;
-      case ':':
-        *token_end = start + 1;
-        return ObjectPairSeparator;
-      case '0':
-      case '1':
-      case '2':
-      case '3':
-      case '4':
-      case '5':
-      case '6':
-      case '7':
-      case '8':
-      case '9':
-      case '-':
-        if (ParseNumberToken(start, end, token_end))
-          return Number;
-        break;
-      case '"':
-        if (ParseStringToken(start + 1, end, token_end))
-          return StringLiteral;
-        break;
-    }
-    return InvalidToken;
-  }
-
-  static int HexToInt(Char c) {
-    if ('0' <= c && c <= '9')
-      return c - '0';
-    if ('A' <= c && c <= 'F')
-      return c - 'A' + 10;
-    if ('a' <= c && c <= 'f')
-      return c - 'a' + 10;
-    assert(false);  // Unreachable.
-    return 0;
-  }
-
-  static bool DecodeString(const Char* start,
-                           const Char* end,
-                           std::vector<uint16_t>* output) {
-    if (start == end)
-      return true;
-    if (start > end)
-      return false;
-    output->reserve(end - start);
-    while (start < end) {
-      uint16_t c = *start++;
-      // If the |Char| we're dealing with is really a byte, then
-      // we have utf8 here, and we need to check for multibyte characters
-      // and transcode them to utf16 (either one or two utf16 chars).
-      if (sizeof(Char) == sizeof(uint8_t) && c >= 0x7f) {
-        // Inspect the leading byte to figure out how long the utf8
-        // byte sequence is; while doing this initialize |codepoint|
-        // with the first few bits.
-        // See table in: https://en.wikipedia.org/wiki/UTF-8
-        // byte one is 110x xxxx -> 2 byte utf8 sequence
-        // byte one is 1110 xxxx -> 3 byte utf8 sequence
-        // byte one is 1111 0xxx -> 4 byte utf8 sequence
-        uint32_t codepoint;
-        int num_bytes_left;
-        if ((c & 0xe0) == 0xc0) {  // 2 byte utf8 sequence
-          num_bytes_left = 1;
-          codepoint = c & 0x1f;
-        } else if ((c & 0xf0) == 0xe0) {  // 3 byte utf8 sequence
-          num_bytes_left = 2;
-          codepoint = c & 0x0f;
-        } else if ((c & 0xf8) == 0xf0) {  // 4 byte utf8 sequence
-          codepoint = c & 0x07;
-          num_bytes_left = 3;
-        } else {
-          return false;  // invalid leading byte
-        }
-
-        // If we have enough bytes in our inpput, decode the remaining ones
-        // belonging to this Unicode character into |codepoint|.
-        if (start + num_bytes_left > end)
-          return false;
-        while (num_bytes_left > 0) {
-          c = *start++;
-          --num_bytes_left;
-          // Check the next byte is a continuation byte, that is 10xx xxxx.
-          if ((c & 0xc0) != 0x80)
-            return false;
-          codepoint = (codepoint << 6) | (c & 0x3f);
-        }
-
-        // Disallow overlong encodings for ascii characters, as these
-        // would include " and other characters significant to JSON
-        // string termination / control.
-        if (codepoint < 0x7f)
-          return false;
-        // Invalid in UTF8, and can't be represented in UTF16 anyway.
-        if (codepoint > 0x10ffff)
-          return false;
-
-        // So, now we transcode to UTF16,
-        // using the math described at https://en.wikipedia.org/wiki/UTF-16,
-        // for either one or two 16 bit characters.
-        if (codepoint < 0xffff) {
-          output->push_back(codepoint);
-          continue;
-        }
-        codepoint -= 0x10000;
-        output->push_back((codepoint >> 10) + 0xd800);    // high surrogate
-        output->push_back((codepoint & 0x3ff) + 0xdc00);  // low surrogate
-        continue;
-      }
-      if ('\\' != c) {
-        output->push_back(c);
-        continue;
-      }
-      if (start == end)
-        return false;
-      c = *start++;
-
-      if (c == 'x') {
-        // \x is not supported.
-        return false;
-      }
-
-      switch (c) {
-        case '"':
-        case '/':
-        case '\\':
-          break;
-        case 'b':
-          c = '\b';
-          break;
-        case 'f':
-          c = '\f';
-          break;
-        case 'n':
-          c = '\n';
-          break;
-        case 'r':
-          c = '\r';
-          break;
-        case 't':
-          c = '\t';
-          break;
-        case 'v':
-          c = '\v';
-          break;
-        case 'u':
-          c = (HexToInt(*start) << 12) + (HexToInt(*(start + 1)) << 8) +
-              (HexToInt(*(start + 2)) << 4) + HexToInt(*(start + 3));
-          start += 4;
-          break;
-        default:
-          return false;
-      }
-      output->push_back(c);
-    }
-    return true;
-  }
-
-  void ParseValue(const Char* start,
-                  const Char* end,
-                  const Char** value_token_end,
-                  int depth) {
-    if (depth > kStackLimit) {
-      HandleError(Error::JSON_PARSER_STACK_LIMIT_EXCEEDED, start);
-      return;
-    }
-    const Char* token_start;
-    const Char* token_end;
-    Token token = ParseToken(start, end, &token_start, &token_end);
-    switch (token) {
-      case NoInput:
-        HandleError(Error::JSON_PARSER_NO_INPUT, token_start);
-        return;
-      case InvalidToken:
-        HandleError(Error::JSON_PARSER_INVALID_TOKEN, token_start);
-        return;
-      case NullToken:
-        handler_->HandleNull();
-        break;
-      case BoolTrue:
-        handler_->HandleBool(true);
-        break;
-      case BoolFalse:
-        handler_->HandleBool(false);
-        break;
-      case Number: {
-        double value;
-        if (!CharsToDouble(token_start, token_end - token_start, &value)) {
-          HandleError(Error::JSON_PARSER_INVALID_NUMBER, token_start);
-          return;
-        }
-        if (value >= std::numeric_limits<int32_t>::min() &&
-            value <= std::numeric_limits<int32_t>::max() &&
-            static_cast<int32_t>(value) == value)
-          handler_->HandleInt32(static_cast<int32_t>(value));
-        else
-          handler_->HandleDouble(value);
-        break;
-      }
-      case StringLiteral: {
-        std::vector<uint16_t> value;
-        bool ok = DecodeString(token_start + 1, token_end - 1, &value);
-        if (!ok) {
-          HandleError(Error::JSON_PARSER_INVALID_STRING, token_start);
-          return;
-        }
-        handler_->HandleString16(span<uint16_t>(value.data(), value.size()));
-        break;
-      }
-      case ArrayBegin: {
-        handler_->HandleArrayBegin();
-        start = token_end;
-        token = ParseToken(start, end, &token_start, &token_end);
-        while (token != ArrayEnd) {
-          ParseValue(start, end, &token_end, depth + 1);
-          if (error_)
-            return;
-
-          // After a list value, we expect a comma or the end of the list.
-          start = token_end;
-          token = ParseToken(start, end, &token_start, &token_end);
-          if (token == ListSeparator) {
-            start = token_end;
-            token = ParseToken(start, end, &token_start, &token_end);
-            if (token == ArrayEnd) {
-              HandleError(Error::JSON_PARSER_UNEXPECTED_ARRAY_END, token_start);
-              return;
-            }
-          } else if (token != ArrayEnd) {
-            // Unexpected value after list value. Bail out.
-            HandleError(Error::JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED,
-                        token_start);
-            return;
-          }
-        }
-        handler_->HandleArrayEnd();
-        break;
-      }
-      case ObjectBegin: {
-        handler_->HandleMapBegin();
-        start = token_end;
-        token = ParseToken(start, end, &token_start, &token_end);
-        while (token != ObjectEnd) {
-          if (token != StringLiteral) {
-            HandleError(Error::JSON_PARSER_STRING_LITERAL_EXPECTED,
-                        token_start);
-            return;
-          }
-          std::vector<uint16_t> key;
-          if (!DecodeString(token_start + 1, token_end - 1, &key)) {
-            HandleError(Error::JSON_PARSER_INVALID_STRING, token_start);
-            return;
-          }
-          handler_->HandleString16(span<uint16_t>(key.data(), key.size()));
-          start = token_end;
-
-          token = ParseToken(start, end, &token_start, &token_end);
-          if (token != ObjectPairSeparator) {
-            HandleError(Error::JSON_PARSER_COLON_EXPECTED, token_start);
-            return;
-          }
-          start = token_end;
-
-          ParseValue(start, end, &token_end, depth + 1);
-          if (error_)
-            return;
-          start = token_end;
-
-          // After a key/value pair, we expect a comma or the end of the
-          // object.
-          token = ParseToken(start, end, &token_start, &token_end);
-          if (token == ListSeparator) {
-            start = token_end;
-            token = ParseToken(start, end, &token_start, &token_end);
-            if (token == ObjectEnd) {
-              HandleError(Error::JSON_PARSER_UNEXPECTED_MAP_END, token_start);
-              return;
-            }
-          } else if (token != ObjectEnd) {
-            // Unexpected value after last object value. Bail out.
-            HandleError(Error::JSON_PARSER_COMMA_OR_MAP_END_EXPECTED,
-                        token_start);
-            return;
-          }
-        }
-        handler_->HandleMapEnd();
-        break;
-      }
-
-      default:
-        // We got a token that's not a value.
-        HandleError(Error::JSON_PARSER_VALUE_EXPECTED, token_start);
-        return;
-    }
-
-    SkipWhitespaceAndComments(token_end, end, value_token_end);
-  }
-
-  void HandleError(Error error, const Char* pos) {
-    assert(error != Error::OK);
-    if (!error_) {
-      handler_->HandleError(Status{error, pos - start_pos_});
-      error_ = true;
-    }
-  }
-
-  const Char* start_pos_ = nullptr;
-  bool error_ = false;
-  const Platform* platform_;
-  StreamingParserHandler* handler_;
-};
-}  // namespace
-
-void ParseJSON(const Platform* platform,
-               span<uint8_t> chars,
-               StreamingParserHandler* handler) {
-  JsonParser<uint8_t> parser(platform, handler);
-  parser.Parse(chars.data(), chars.size());
-}
-
-void ParseJSON(const Platform* platform,
-               span<uint16_t> chars,
-               StreamingParserHandler* handler) {
-  JsonParser<uint16_t> parser(platform, handler);
-  parser.Parse(chars.data(), chars.size());
-}
-}  // namespace json
-
-{% for namespace in config.protocol.namespace %}
-} // namespace {{namespace}}
-{% endfor %}
-
diff --git a/third_party/inspector_protocol/lib/encoding_h.template b/third_party/inspector_protocol/lib/encoding_h.template
deleted file mode 100644
index aba28c8..0000000
--- a/third_party/inspector_protocol/lib/encoding_h.template
+++ /dev/null
@@ -1,446 +0,0 @@
-{# This template is generated by gen_cbor_templates.py. #}
-// Generated by lib/encoding_h.template.
-
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef {{"_".join(config.protocol.namespace)}}_encoding_h
-#define {{"_".join(config.protocol.namespace)}}_encoding_h
-
-#include <cstddef>
-#include <cstdint>
-#include <memory>
-#include <string>
-#include <vector>
-
-{% for namespace in config.protocol.namespace %}
-namespace {{namespace}} {
-{% endfor %}
-
-// ===== encoding/encoding.h =====
-
-
-// =============================================================================
-// span - sequence of bytes
-// =============================================================================
-
-// This template is similar to std::span, which will be included in C++20.  Like
-// std::span it uses ptrdiff_t, which is signed (and thus a bit annoying
-// sometimes when comparing with size_t), but other than this it's much simpler.
-template <typename T>
-class span {
- public:
-  using index_type = std::ptrdiff_t;
-
-  span() : data_(nullptr), size_(0) {}
-  span(const T* data, index_type size) : data_(data), size_(size) {}
-
-  const T* data() const { return data_; }
-
-  const T* begin() const { return data_; }
-  const T* end() const { return data_ + size_; }
-
-  const T& operator[](index_type idx) const { return data_[idx]; }
-
-  span<T> subspan(index_type offset, index_type count) const {
-    return span(data_ + offset, count);
-  }
-
-  span<T> subspan(index_type offset) const {
-    return span(data_ + offset, size_ - offset);
-  }
-
-  bool empty() const { return size_ == 0; }
-
-  index_type size() const { return size_; }
-  index_type size_bytes() const { return size_ * sizeof(T); }
-
- private:
-  const T* data_;
-  index_type size_;
-};
-
-template <typename T>
-span<T> SpanFromVector(const std::vector<T>& v) {
-  return span<T>(v.data(), v.size());
-}
-
-inline span<uint8_t> SpanFromStdString(const std::string& v) {
-  return span<uint8_t>(reinterpret_cast<const uint8_t*>(v.data()), v.size());
-}
-
-// Error codes.
-enum class Error {
-  OK = 0,
-  // JSON parsing errors - json_parser.{h,cc}.
-  JSON_PARSER_UNPROCESSED_INPUT_REMAINS = 0x01,
-  JSON_PARSER_STACK_LIMIT_EXCEEDED = 0x02,
-  JSON_PARSER_NO_INPUT = 0x03,
-  JSON_PARSER_INVALID_TOKEN = 0x04,
-  JSON_PARSER_INVALID_NUMBER = 0x05,
-  JSON_PARSER_INVALID_STRING = 0x06,
-  JSON_PARSER_UNEXPECTED_ARRAY_END = 0x07,
-  JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED = 0x08,
-  JSON_PARSER_STRING_LITERAL_EXPECTED = 0x09,
-  JSON_PARSER_COLON_EXPECTED = 0x0a,
-  JSON_PARSER_UNEXPECTED_MAP_END = 0x0b,
-  JSON_PARSER_COMMA_OR_MAP_END_EXPECTED = 0x0c,
-  JSON_PARSER_VALUE_EXPECTED = 0x0d,
-
-  CBOR_INVALID_INT32 = 0x0e,
-  CBOR_INVALID_DOUBLE = 0x0f,
-  CBOR_INVALID_ENVELOPE = 0x10,
-  CBOR_INVALID_STRING8 = 0x11,
-  CBOR_INVALID_STRING16 = 0x12,
-  CBOR_INVALID_BINARY = 0x13,
-  CBOR_UNSUPPORTED_VALUE = 0x14,
-  CBOR_NO_INPUT = 0x15,
-  CBOR_INVALID_START_BYTE = 0x16,
-  CBOR_UNEXPECTED_EOF_EXPECTED_VALUE = 0x17,
-  CBOR_UNEXPECTED_EOF_IN_ARRAY = 0x18,
-  CBOR_UNEXPECTED_EOF_IN_MAP = 0x19,
-  CBOR_INVALID_MAP_KEY = 0x1a,
-  CBOR_STACK_LIMIT_EXCEEDED = 0x1b,
-  CBOR_STRING8_MUST_BE_7BIT = 0x1c,
-  CBOR_TRAILING_JUNK = 0x1d,
-  CBOR_MAP_START_EXPECTED = 0x1e,
-};
-
-// A status value with position that can be copied. The default status
-// is OK. Usually, error status values should come with a valid position.
-struct Status {
-  static constexpr std::ptrdiff_t npos() { return -1; }
-
-  bool ok() const { return error == Error::OK; }
-
-  Error error = Error::OK;
-  std::ptrdiff_t pos = npos();
-  Status(Error error, std::ptrdiff_t pos) : error(error), pos(pos) {}
-  Status() = default;
-};
-
-// Handler interface for parser events emitted by a streaming parser.
-// See cbor::NewCBOREncoder, cbor::ParseCBOR, json::NewJSONEncoder,
-// json::ParseJSON.
-class StreamingParserHandler {
- public:
-  virtual ~StreamingParserHandler() = default;
-  virtual void HandleMapBegin() = 0;
-  virtual void HandleMapEnd() = 0;
-  virtual void HandleArrayBegin() = 0;
-  virtual void HandleArrayEnd() = 0;
-  virtual void HandleString8(span<uint8_t> chars) = 0;
-  virtual void HandleString16(span<uint16_t> chars) = 0;
-  virtual void HandleBinary(span<uint8_t> bytes) = 0;
-  virtual void HandleDouble(double value) = 0;
-  virtual void HandleInt32(int32_t value) = 0;
-  virtual void HandleBool(bool value) = 0;
-  virtual void HandleNull() = 0;
-
-  // The parser may send one error even after other events have already
-  // been received. Client code is reponsible to then discard the
-  // already processed events.
-  // |error| must be an eror, as in, |error.is_ok()| can't be true.
-  virtual void HandleError(Status error) = 0;
-};
-
-namespace cbor {
-// The binary encoding for the inspector protocol follows the CBOR specification
-// (RFC 7049). Additional constraints:
-// - Only indefinite length maps and arrays are supported.
-// - Maps and arrays are wrapped with an envelope, that is, a
-//   CBOR tag with value 24 followed by a byte string specifying
-//   the byte length of the enclosed map / array. The byte string
-//   must use a 32 bit wide length.
-// - At the top level, a message must be an indefinite length map
-//   wrapped by an envelope.
-// - Maximal size for messages is 2^32 (4 GB).
-// - For scalars, we support only the int32_t range, encoded as
-//   UNSIGNED/NEGATIVE (major types 0 / 1).
-// - UTF16 strings, including with unbalanced surrogate pairs, are encoded
-//   as CBOR BYTE_STRING (major type 2). For such strings, the number of
-//   bytes encoded must be even.
-// - UTF8 strings (major type 3) are supported.
-// - 7 bit US-ASCII strings must always be encoded as UTF8 strings, never
-//   as UTF16 strings.
-// - Arbitrary byte arrays, in the inspector protocol called 'binary',
-//   are encoded as BYTE_STRING (major type 2), prefixed with a byte
-//   indicating base64 when rendered as JSON.
-
-// =============================================================================
-// Detecting CBOR content
-// =============================================================================
-
-// The first byte for an envelope, which we use for wrapping dictionaries
-// and arrays; and the byte that indicates a byte string with 32 bit length.
-// These two bytes start an envelope, and thereby also any CBOR message
-// produced or consumed by this protocol. See also |EnvelopeEncoder| below.
-uint8_t InitialByteForEnvelope();
-uint8_t InitialByteFor32BitLengthByteString();
-
-// Checks whether |msg| is a cbor message.
-bool IsCBORMessage(span<uint8_t> msg);
-
-// =============================================================================
-// Encoding individual CBOR items
-// =============================================================================
-
-// Some constants for CBOR tokens that only take a single byte on the wire.
-uint8_t EncodeTrue();
-uint8_t EncodeFalse();
-uint8_t EncodeNull();
-uint8_t EncodeIndefiniteLengthArrayStart();
-uint8_t EncodeIndefiniteLengthMapStart();
-uint8_t EncodeStop();
-
-// Encodes |value| as |UNSIGNED| (major type 0) iff >= 0, or |NEGATIVE|
-// (major type 1) iff < 0.
-void EncodeInt32(int32_t value, std::vector<uint8_t>* out);
-
-// Encodes a UTF16 string as a BYTE_STRING (major type 2). Each utf16
-// character in |in| is emitted with most significant byte first,
-// appending to |out|.
-void EncodeString16(span<uint16_t> in, std::vector<uint8_t>* out);
-
-// Encodes a UTF8 string |in| as STRING (major type 3).
-void EncodeString8(span<uint8_t> in, std::vector<uint8_t>* out);
-
-// Encodes the given |latin1| string as STRING8.
-// If any non-ASCII character is present, it will be represented
-// as a 2 byte UTF8 sequence.
-void EncodeFromLatin1(span<uint8_t> latin1, std::vector<uint8_t>* out);
-
-// Encodes the given |utf16| string as STRING8 if it's entirely US-ASCII.
-// Otherwise, encodes as STRING16.
-void EncodeFromUTF16(span<uint16_t> utf16, std::vector<uint8_t>* out);
-
-// Encodes arbitrary binary data in |in| as a BYTE_STRING (major type 2) with
-// definitive length, prefixed with tag 22 indicating expected conversion to
-// base64 (see RFC 7049, Table 3 and Section 2.4.4.2).
-void EncodeBinary(span<uint8_t> in, std::vector<uint8_t>* out);
-
-// Encodes / decodes a double as Major type 7 (SIMPLE_VALUE),
-// with additional info = 27, followed by 8 bytes in big endian.
-void EncodeDouble(double value, std::vector<uint8_t>* out);
-
-// =============================================================================
-// cbor::EnvelopeEncoder - for wrapping submessages
-// =============================================================================
-
-// An envelope indicates the byte length of a wrapped item.
-// We use this for maps and array, which allows the decoder
-// to skip such (nested) values whole sale.
-// It's implemented as a CBOR tag (major type 6) with additional
-// info = 24, followed by a byte string with a 32 bit length value;
-// so the maximal structure that we can wrap is 2^32 bits long.
-// See also: https://tools.ietf.org/html/rfc7049#section-2.4.4.1
-class EnvelopeEncoder {
- public:
-  // Emits the envelope start bytes and records the position for the
-  // byte size in |byte_size_pos_|. Also emits empty bytes for the
-  // byte sisze so that encoding can continue.
-  void EncodeStart(std::vector<uint8_t>* out);
-  // This records the current size in |out| at position byte_size_pos_.
-  // Returns true iff successful.
-  bool EncodeStop(std::vector<uint8_t>* out);
-
- private:
-  std::size_t byte_size_pos_ = 0;
-};
-
-// =============================================================================
-// cbor::NewCBOREncoder - for encoding from a streaming parser
-// =============================================================================
-
-// This can be used to convert to CBOR, by passing the return value to a parser
-// that drives it. The handler will encode into |out|, and iff an error occurs
-// it will set |status| to an error and clear |out|. Otherwise, |status.ok()|
-// will be |true|.
-std::unique_ptr<StreamingParserHandler> NewCBOREncoder(
-    std::vector<uint8_t>* out,
-    Status* status);
-
-// =============================================================================
-// cbor::CBORTokenizer - for parsing individual CBOR items
-// =============================================================================
-
-// Tags for the tokens within a CBOR message that CBORTokenizer understands.
-// Note that this is not the same terminology as the CBOR spec (RFC 7049),
-// but rather, our adaptation. For instance, we lump unsigned and signed
-// major type into INT32 here (and disallow values outside the int32_t range).
-enum class CBORTokenTag {
-  // Encountered an error in the structure of the message. Consult
-  // status() for details.
-  ERROR_VALUE,
-  // Booleans and NULL.
-  TRUE_VALUE,
-  FALSE_VALUE,
-  NULL_VALUE,
-  // An int32_t (signed 32 bit integer).
-  INT32,
-  // A double (64 bit floating point).
-  DOUBLE,
-  // A UTF8 string.
-  STRING8,
-  // A UTF16 string.
-  STRING16,
-  // A binary string.
-  BINARY,
-  // Starts an indefinite length map; after the map start we expect
-  // alternating keys and values, followed by STOP.
-  MAP_START,
-  // Starts an indefinite length array; after the array start we
-  // expect values, followed by STOP.
-  ARRAY_START,
-  // Ends a map or an array.
-  STOP,
-  // An envelope indicator, wrapping a map or array.
-  // Internally this carries the byte length of the wrapped
-  // map or array. While CBORTokenizer::Next() will read / skip the entire
-  // envelope, CBORTokenizer::EnterEnvelope() reads the tokens
-  // inside of it.
-  ENVELOPE,
-  // We've reached the end there is nothing else to read.
-  DONE,
-};
-
-// The major types from RFC 7049 Section 2.1.
-enum class MajorType {
-  UNSIGNED = 0,
-  NEGATIVE = 1,
-  BYTE_STRING = 2,
-  STRING = 3,
-  ARRAY = 4,
-  MAP = 5,
-  TAG = 6,
-  SIMPLE_VALUE = 7
-};
-
-// CBORTokenizer segments a CBOR message, presenting the tokens therein as
-// numbers, strings, etc. This is not a complete CBOR parser, but makes it much
-// easier to implement one (e.g. ParseCBOR, above). It can also be used to parse
-// messages partially.
-class CBORTokenizer {
- public:
-  explicit CBORTokenizer(span<uint8_t> bytes);
-  ~CBORTokenizer();
-
-  // Identifies the current token that we're looking at,
-  // or ERROR_VALUE (in which ase ::Status() has details)
-  // or DONE (if we're past the last token).
-  CBORTokenTag TokenTag() const;
-
-  // Advances to the next token.
-  void Next();
-  // Can only be called if TokenTag() == CBORTokenTag::ENVELOPE.
-  // While Next() would skip past the entire envelope / what it's
-  // wrapping, EnterEnvelope positions the cursor inside of the envelope,
-  // letting the client explore the nested structure.
-  void EnterEnvelope();
-
-  // If TokenTag() is CBORTokenTag::ERROR_VALUE, then Status().error describes
-  // the error more precisely; otherwise it'll be set to Error::OK.
-  // In either case, Status().pos is the current position.
-  struct Status Status() const;
-
-  // The following methods retrieve the token values. They can only
-  // be called if TokenTag() matches.
-
-  // To be called only if ::TokenTag() == CBORTokenTag::INT32.
-  int32_t GetInt32() const;
-
-  // To be called only if ::TokenTag() == CBORTokenTag::DOUBLE.
-  double GetDouble() const;
-
-  // To be called only if ::TokenTag() == CBORTokenTag::STRING8.
-  span<uint8_t> GetString8() const;
-
-  // Wire representation for STRING16 is low byte first (little endian).
-  // To be called only if ::TokenTag() == CBORTokenTag::STRING16.
-  span<uint8_t> GetString16WireRep() const;
-
-  // To be called only if ::TokenTag() == CBORTokenTag::BINARY.
-  span<uint8_t> GetBinary() const;
-
-  // To be called only if ::TokenTag() == CBORTokenTag::ENVELOPE.
-  span<uint8_t> GetEnvelopeContents() const;
-
- private:
-  void ReadNextToken(bool enter_envelope);
-  void SetToken(CBORTokenTag token, std::ptrdiff_t token_byte_length);
-  void SetError(Error error);
-
-  span<uint8_t> bytes_;
-  CBORTokenTag token_tag_;
-  struct Status status_;
-  std::ptrdiff_t token_byte_length_;
-  MajorType token_start_type_;
-  uint64_t token_start_internal_value_;
-};
-
-// =============================================================================
-// cbor::ParseCBOR - for receiving streaming parser events for CBOR messages
-// =============================================================================
-
-// Parses a CBOR encoded message from |bytes|, sending events to
-// |out|. If an error occurs, sends |out->HandleError|, and parsing stops.
-// The client is responsible for discarding the already received information in
-// that case.
-void ParseCBOR(span<uint8_t> bytes, StreamingParserHandler* out);
-
-namespace internals {  // Exposed only for writing tests.
-int8_t ReadTokenStart(span<uint8_t> bytes,
-                      cbor::MajorType* type,
-                      uint64_t* value);
-
-void WriteTokenStart(cbor::MajorType type,
-                     uint64_t value,
-                     std::vector<uint8_t>* encoded);
-}  // namespace internals
-}  // namespace cbor
-
-namespace json {
-// Client code must provide an instance. Implementation should delegate
-// to whatever is appropriate.
-class Platform {
- public:
-  virtual ~Platform() = default;
-  // Parses |str| into |result|. Returns false iff there are
-  // leftover characters or parsing errors.
-  virtual bool StrToD(const char* str, double* result) const = 0;
-
-  // Prints |value| in a format suitable for JSON.
-  virtual std::unique_ptr<char[]> DToStr(double value) const = 0;
-};
-
-// =============================================================================
-// json::NewJSONEncoder - for encoding streaming parser events as JSON
-// =============================================================================
-
-// Returns a handler object which will write ascii characters to |out|.
-// |status->ok()| will be false iff the handler routine HandleError() is called.
-// In that case, we'll stop emitting output.
-// Except for calling the HandleError routine at any time, the client
-// code must call the Handle* methods in an order in which they'd occur
-// in valid JSON; otherwise we may crash (the code uses assert).
-std::unique_ptr<StreamingParserHandler> NewJSONEncoder(const Platform* platform,
-                                                       std::string* out,
-                                                       Status* status);
-
-// =============================================================================
-// json::ParseJSON - for receiving streaming parser events for JSON
-// =============================================================================
-
-void ParseJSON(const Platform* platform,
-               span<uint8_t> chars,
-               StreamingParserHandler* handler);
-void ParseJSON(const Platform* platform,
-               span<uint16_t> chars,
-               StreamingParserHandler* handler);
-}  // namespace json
-
-{% for namespace in config.protocol.namespace %}
-} // namespace {{namespace}}
-{% endfor %}
-#endif // !defined({{"_".join(config.protocol.namespace)}}_encoding_h)
diff --git a/third_party/inspector_protocol/roll.py b/third_party/inspector_protocol/roll.py
index deb1b28..59699e6 100755
--- a/third_party/inspector_protocol/roll.py
+++ b/third_party/inspector_protocol/roll.py
@@ -13,6 +13,7 @@
 
 
 FILES_TO_SYNC = [
+    'BUILD.gn',
     'README.md',
     'check_protocol_compatibility.py',
     'code_generator.py',
diff --git a/third_party/protobuf/BUILD.gn b/third_party/protobuf/BUILD.gn
index 8e02f21..3024abd5 100644
--- a/third_party/protobuf/BUILD.gn
+++ b/third_party/protobuf/BUILD.gn
@@ -683,6 +683,7 @@
   ]
 }
 
+# Build time dependency for action rules.
 group("py_proto") {
   public_deps = [
     ":copy_google",
@@ -690,6 +691,11 @@
     ":copy_google_protobuf_internal",
     ":copy_six",
   ]
+}
+
+# Runtime dependency if the target needs the python scripts.
+group("py_proto_runtime") {
+  deps = [":py_proto"]
 
   # Targets that depend on this should depend on the copied data files.
   data = get_target_outputs(":copy_google")
diff --git a/third_party/sqlite/amalgamation/sqlite3.c b/third_party/sqlite/amalgamation/sqlite3.c
index 1b990ba6..55060d4 100644
--- a/third_party/sqlite/amalgamation/sqlite3.c
+++ b/third_party/sqlite/amalgamation/sqlite3.c
@@ -40282,10 +40282,6 @@
     UNIXVFS("unix",          autolockIoFinder ),
 #elif OS_VXWORKS
     UNIXVFS("unix",          vxworksIoFinder ),
-#elif __Fuchsia__
-    /* None of the system calls for other exclusion methods are currently
-    ** implemented on Fuchsia, so use simple dot-file locking for now. */
-    UNIXVFS("unix",          dotlockIoFinder ),
 #else
     UNIXVFS("unix",          posixIoFinder ),
 #endif
@@ -221524,7 +221520,7 @@
 #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
 
 /************** End of stmt.c ************************************************/
-#if __LINE__!=221527
+#if __LINE__!=221523
 #undef SQLITE_SOURCE_ID
 #define SQLITE_SOURCE_ID      "2019-02-25 16:06:06 bd49a8271d650fa89e446b42e513b595a717b9212c91dd384aab871fc1d0alt2"
 #endif
diff --git a/third_party/sqlite/patches/0001-Modify-default-VFS-to-support-WebDatabase.patch b/third_party/sqlite/patches/0001-Modify-default-VFS-to-support-WebDatabase.patch
index a881277c..1fb9032 100644
--- a/third_party/sqlite/patches/0001-Modify-default-VFS-to-support-WebDatabase.patch
+++ b/third_party/sqlite/patches/0001-Modify-default-VFS-to-support-WebDatabase.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: dumi <dumi@chromium.org>
 Date: Mon, 20 Jul 2009 23:40:51 +0000
-Subject: [PATCH 01/11] Modify default VFS to support WebDatabase.
+Subject: [PATCH 01/10] Modify default VFS to support WebDatabase.
 
 The renderer WebDatabase implementation needs to broker certain requests
 to the browser.  This modifies SQLite to allow monkey-patching the VFS
diff --git a/third_party/sqlite/patches/0002-Virtual-table-supporting-recovery-of-corrupted-datab.patch b/third_party/sqlite/patches/0002-Virtual-table-supporting-recovery-of-corrupted-datab.patch
index a79a522d..d50a4e1 100644
--- a/third_party/sqlite/patches/0002-Virtual-table-supporting-recovery-of-corrupted-datab.patch
+++ b/third_party/sqlite/patches/0002-Virtual-table-supporting-recovery-of-corrupted-datab.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Scott Hess <shess@chromium.org>
 Date: Sat, 20 Jul 2013 11:42:21 -0700
-Subject: [PATCH 02/11] Virtual table supporting recovery of corrupted
+Subject: [PATCH 02/10] Virtual table supporting recovery of corrupted
  databases.
 
 "recover" implements a virtual table which uses the SQLite pager layer
diff --git a/third_party/sqlite/patches/0003-Custom-shell.c-helpers-to-load-Chromium-s-ICU-data.patch b/third_party/sqlite/patches/0003-Custom-shell.c-helpers-to-load-Chromium-s-ICU-data.patch
index b0a16fe..fc45018f 100644
--- a/third_party/sqlite/patches/0003-Custom-shell.c-helpers-to-load-Chromium-s-ICU-data.patch
+++ b/third_party/sqlite/patches/0003-Custom-shell.c-helpers-to-load-Chromium-s-ICU-data.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: "tc@google.com" <tc@google.com>
 Date: Tue, 6 Jan 2009 22:39:41 +0000
-Subject: [PATCH 03/11] Custom shell.c helpers to load Chromium's ICU data.
+Subject: [PATCH 03/10] Custom shell.c helpers to load Chromium's ICU data.
 
 History uses fts3 with an icu-based segmenter.  These changes allow building a
 sqlite3 binary for Linux or Windows which can read those files.
diff --git a/third_party/sqlite/patches/0004-fts3-Disable-fts3_tokenizer-and-fts4.patch b/third_party/sqlite/patches/0004-fts3-Disable-fts3_tokenizer-and-fts4.patch
index 67eb49c..989564a 100644
--- a/third_party/sqlite/patches/0004-fts3-Disable-fts3_tokenizer-and-fts4.patch
+++ b/third_party/sqlite/patches/0004-fts3-Disable-fts3_tokenizer-and-fts4.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Scott Hess <shess@chromium.org>
 Date: Tue, 16 Dec 2014 13:02:27 -0800
-Subject: [PATCH 04/11] [fts3] Disable fts3_tokenizer and fts4.
+Subject: [PATCH 04/10] [fts3] Disable fts3_tokenizer and fts4.
 
 fts3_tokenizer allows a SQLite user to specify a pointer to call as a
 function, which has obvious sercurity implications.  Disable fts4 until
diff --git a/third_party/sqlite/patches/0006-Fix-compilation-with-SQLITE_OMIT_WINDOWFUNC.patch b/third_party/sqlite/patches/0005-Fix-compilation-with-SQLITE_OMIT_WINDOWFUNC.patch
similarity index 93%
rename from third_party/sqlite/patches/0006-Fix-compilation-with-SQLITE_OMIT_WINDOWFUNC.patch
rename to third_party/sqlite/patches/0005-Fix-compilation-with-SQLITE_OMIT_WINDOWFUNC.patch
index 129309c1..1b13c52e 100644
--- a/third_party/sqlite/patches/0006-Fix-compilation-with-SQLITE_OMIT_WINDOWFUNC.patch
+++ b/third_party/sqlite/patches/0005-Fix-compilation-with-SQLITE_OMIT_WINDOWFUNC.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Victor Costan <pwnall@chromium.org>
 Date: Sun, 10 Feb 2019 13:12:57 -0800
-Subject: [PATCH 06/11] Fix compilation with SQLITE_OMIT_WINDOWFUNC.
+Subject: [PATCH 05/10] Fix compilation with SQLITE_OMIT_WINDOWFUNC.
 
 ---
  third_party/sqlite/src/src/resolve.c | 2 ++
diff --git a/third_party/sqlite/patches/0005-fuchsia-Use-dot-file-locking-for-sqlite.patch b/third_party/sqlite/patches/0005-fuchsia-Use-dot-file-locking-for-sqlite.patch
deleted file mode 100644
index 8d6ff4b9..0000000
--- a/third_party/sqlite/patches/0005-fuchsia-Use-dot-file-locking-for-sqlite.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Scott Graham <scottmg@chromium.org>
-Date: Mon, 11 Sep 2017 13:37:46 -0700
-Subject: [PATCH 05/11] fuchsia: Use dot-file locking for sqlite
-
----
- third_party/sqlite/src/src/os_unix.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/third_party/sqlite/src/src/os_unix.c b/third_party/sqlite/src/src/os_unix.c
-index d0e1c39bc4b8..d0736e0a63de 100644
---- a/third_party/sqlite/src/src/os_unix.c
-+++ b/third_party/sqlite/src/src/os_unix.c
-@@ -7873,6 +7873,10 @@ int sqlite3_os_init(void){
-     UNIXVFS("unix",          autolockIoFinder ),
- #elif OS_VXWORKS
-     UNIXVFS("unix",          vxworksIoFinder ),
-+#elif __Fuchsia__
-+    /* None of the system calls for other exclusion methods are currently
-+    ** implemented on Fuchsia, so use simple dot-file locking for now. */
-+    UNIXVFS("unix",          dotlockIoFinder ),
- #else
-     UNIXVFS("unix",          posixIoFinder ),
- #endif
--- 
-2.21.0.225.g810b269d1ac-goog
-
diff --git a/third_party/sqlite/patches/0007-Fix-dbfuzz2.c-compilation-errors-on-Windows.patch b/third_party/sqlite/patches/0006-Fix-dbfuzz2.c-compilation-errors-on-Windows.patch
similarity index 94%
rename from third_party/sqlite/patches/0007-Fix-dbfuzz2.c-compilation-errors-on-Windows.patch
rename to third_party/sqlite/patches/0006-Fix-dbfuzz2.c-compilation-errors-on-Windows.patch
index 7cc4db65..c4b3ff6 100644
--- a/third_party/sqlite/patches/0007-Fix-dbfuzz2.c-compilation-errors-on-Windows.patch
+++ b/third_party/sqlite/patches/0006-Fix-dbfuzz2.c-compilation-errors-on-Windows.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Victor Costan <pwnall@chromium.org>
 Date: Sun, 10 Feb 2019 15:18:43 -0800
-Subject: [PATCH 07/11] Fix dbfuzz2.c compilation errors on Windows.
+Subject: [PATCH 06/10] Fix dbfuzz2.c compilation errors on Windows.
 
 ---
  third_party/sqlite/src/test/dbfuzz2.c | 4 ++++
diff --git a/third_party/sqlite/patches/0008-Fix-Heap-buffer-overflow-in-vdbeRecordCompareInt.patch b/third_party/sqlite/patches/0007-Fix-Heap-buffer-overflow-in-vdbeRecordCompareInt.patch
similarity index 93%
rename from third_party/sqlite/patches/0008-Fix-Heap-buffer-overflow-in-vdbeRecordCompareInt.patch
rename to third_party/sqlite/patches/0007-Fix-Heap-buffer-overflow-in-vdbeRecordCompareInt.patch
index 78c5dd9..4e0eaca 100644
--- a/third_party/sqlite/patches/0008-Fix-Heap-buffer-overflow-in-vdbeRecordCompareInt.patch
+++ b/third_party/sqlite/patches/0007-Fix-Heap-buffer-overflow-in-vdbeRecordCompareInt.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Tue, 5 Mar 2019 13:49:51 -0800
-Subject: [PATCH 08/11] Fix Heap-buffer-overflow in vdbeRecordCompareInt
+Subject: [PATCH 07/10] Fix Heap-buffer-overflow in vdbeRecordCompareInt
 
 This backports https://www.sqlite.org/src/info/c1ac00706bae45fe
 
diff --git a/third_party/sqlite/patches/0009-fix-heap-buffer-overflow-in-cellsizeptr.patch b/third_party/sqlite/patches/0008-fix-heap-buffer-overflow-in-cellsizeptr.patch
similarity index 95%
rename from third_party/sqlite/patches/0009-fix-heap-buffer-overflow-in-cellsizeptr.patch
rename to third_party/sqlite/patches/0008-fix-heap-buffer-overflow-in-cellsizeptr.patch
index 56044458..dda29f0 100644
--- a/third_party/sqlite/patches/0009-fix-heap-buffer-overflow-in-cellsizeptr.patch
+++ b/third_party/sqlite/patches/0008-fix-heap-buffer-overflow-in-cellsizeptr.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Tue, 5 Mar 2019 14:13:19 -0800
-Subject: [PATCH 09/11] fix heap-buffer-overflow in cellsizeptr
+Subject: [PATCH 08/10] fix heap-buffer-overflow in cellsizeptr
 
 This backports https://www.sqlite.org/src/info/e7aca0714bc475e0
 
diff --git a/third_party/sqlite/patches/0010-fix-integer-overflow-in-checkList.patch b/third_party/sqlite/patches/0009-fix-integer-overflow-in-checkList.patch
similarity index 96%
rename from third_party/sqlite/patches/0010-fix-integer-overflow-in-checkList.patch
rename to third_party/sqlite/patches/0009-fix-integer-overflow-in-checkList.patch
index 80c10bc..795f704 100644
--- a/third_party/sqlite/patches/0010-fix-integer-overflow-in-checkList.patch
+++ b/third_party/sqlite/patches/0009-fix-integer-overflow-in-checkList.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Tue, 5 Mar 2019 14:17:05 -0800
-Subject: [PATCH 10/11] fix integer overflow in checkList
+Subject: [PATCH 09/10] fix integer overflow in checkList
 
 This backports https://www.sqlite.org/src/info/05b87e0755638d31
 
diff --git a/third_party/sqlite/patches/0011-Fix-Heap-use-after-free-in-releasePageNotNull.patch b/third_party/sqlite/patches/0010-Fix-Heap-use-after-free-in-releasePageNotNull.patch
similarity index 94%
rename from third_party/sqlite/patches/0011-Fix-Heap-use-after-free-in-releasePageNotNull.patch
rename to third_party/sqlite/patches/0010-Fix-Heap-use-after-free-in-releasePageNotNull.patch
index dca77bc..ad9d4aa 100644
--- a/third_party/sqlite/patches/0011-Fix-Heap-use-after-free-in-releasePageNotNull.patch
+++ b/third_party/sqlite/patches/0010-Fix-Heap-use-after-free-in-releasePageNotNull.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Tue, 12 Mar 2019 17:30:33 -0700
-Subject: [PATCH 11/11] Fix Heap-use-after-free in releasePageNotNull
+Subject: [PATCH 10/10] Fix Heap-use-after-free in releasePageNotNull
 
 This backports https://www.sqlite.org/src/info/b0d5cf40bba34e45
 
@@ -28,6 +28,6 @@
      pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC);
      if( pPager->tempFile ){
        /* Do not discard pages from an in-memory database since we might
---
+-- 
 2.21.0.225.g810b269d1ac-goog
 
diff --git a/third_party/sqlite/src/src/os_unix.c b/third_party/sqlite/src/src/os_unix.c
index d0736e0a..d0e1c39 100644
--- a/third_party/sqlite/src/src/os_unix.c
+++ b/third_party/sqlite/src/src/os_unix.c
@@ -7873,10 +7873,6 @@
     UNIXVFS("unix",          autolockIoFinder ),
 #elif OS_VXWORKS
     UNIXVFS("unix",          vxworksIoFinder ),
-#elif __Fuchsia__
-    /* None of the system calls for other exclusion methods are currently
-    ** implemented on Fuchsia, so use simple dot-file locking for now. */
-    UNIXVFS("unix",          dotlockIoFinder ),
 #else
     UNIXVFS("unix",          posixIoFinder ),
 #endif
diff --git a/third_party/webxr_test_pages/webxr-samples/input-selection.html b/third_party/webxr_test_pages/webxr-samples/input-selection.html
index 973d0f8..69af1b5 100644
--- a/third_party/webxr_test_pages/webxr-samples/input-selection.html
+++ b/third_party/webxr_test_pages/webxr-samples/input-selection.html
@@ -60,7 +60,7 @@
       import {Node} from './js/cottontail/src/core/node.js';
       import {PbrMaterial} from './js/cottontail/src/materials/pbr.js';
       import {BoxBuilder} from './js/cottontail/src/geometry/box-builder.js';
-      import {mat4} from './js/cottontail/src/math/gl-matrix.js';
+      import {mat4, vec3, quat} from './js/cottontail/src/math/gl-matrix.js';
 
       // If requested, initialize the WebXR polyfill
       if (QueryArgs.getBool('allowPolyfill', false)) {
@@ -87,6 +87,12 @@
 
       let boxes = [];
 
+      let trackingSpaceOriginInWorldSpace = vec3.create();
+      let trackingSpaceHeadingDegrees = 0;  // around +Y axis, positive angles rotate left
+      let floorSize = 10;
+      let floorPosition = [0, -floorSize / 2 + 0.01, 0];
+      let floorNode = null;
+
       function initXR() {
         xrButton = new XRDeviceButton({
           onRequestSession: onRequestSession,
@@ -149,6 +155,25 @@
         addBox(-1.0, 1.6, -1.3, 1.0, 0.0, 0.0);
         addBox(0.0, 1.7, -1.5, 0.0, 1.0, 0.0);
         addBox(1.0, 1.6, -1.3, 0.0, 0.0, 1.0);
+
+        addFloorBox();
+      }
+
+      function addFloorBox() {
+        let boxBuilder = new BoxBuilder();
+        boxBuilder.pushCube([0, 0, 0], floorSize);
+        let boxPrimitive = boxBuilder.finishPrimitive(renderer);
+
+        let boxMaterial = new PbrMaterial();
+        boxMaterial.baseColorFactor.value = [0.3, 0.3, 0.3, 1.0];
+        let boxRenderPrimitive = renderer.createRenderPrimitive(boxPrimitive, boxMaterial);
+
+        floorNode = new Node();
+        floorNode.addRenderPrimitive(boxRenderPrimitive);
+        floorNode.selectable = true;
+        scene.addNode(floorNode);
+        mat4.identity(floorNode.matrix);
+        mat4.translate(floorNode.matrix, floorNode.matrix, floorPosition);
       }
 
       function onRequestSession() {
@@ -186,29 +211,86 @@
         });
       }
 
-      function onSelect(ev) {
-        let refSpace = ev.frame.session.mode.startsWith('immersive') ?
-                         xrImmersiveRefSpace :
-                         xrNonImmersiveRefSpace;
+      let playerInWorldSpaceOld = vec3.create();
+      let playerInWorldSpaceNew = vec3.create();
+      let playerOffsetInWorldSpaceOld = vec3.create();
+      let playerOffsetInWorldSpaceNew = vec3.create();
+      let rotationDeltaQuat = quat.create();
 
-        let inputPose = ev.frame.getInputPose(ev.inputSource, refSpace);
-        if (!inputPose) {
+      function onSelect(ev) {
+        let refSpace = getRefSpace(ev.frame.session);
+
+        let headPose = ev.frame.getViewerPose(refSpace);
+        if (!headPose) return;
+
+        // Get the position offset in world space from the tracking space origin
+        // to the player's feet. The headPose position is the head position in world space.
+        // Subtract the tracking space origin position in world space to get a relative world space vector.
+        vec3.set(playerInWorldSpaceOld, headPose.transform.position.x, 0, headPose.transform.position.z);
+        vec3.sub(playerOffsetInWorldSpaceOld, playerInWorldSpaceOld, trackingSpaceOriginInWorldSpace);
+
+        // based on https://github.com/immersive-web/webxr/blob/master/input-explainer.md#targeting-ray-pose
+        let inputSourcePose = ev.frame.getPose(ev.inputSource.targetRaySpace, refSpace);
+        if (!inputSourcePose) {
           return;
         }
 
-        if (inputPose.targetRay) {
-          let hitResult = scene.hitTest(inputPose.targetRay)
-          if (hitResult) {
-            // Check to see if the hit result was one of our boxes.
-            for (let box of boxes) {
-              if (hitResult.node == box.node) {
-                // Change the box color to something random.
-                let uniforms = box.renderPrimitive.uniforms;
-                uniforms.baseColorFactor.value = [Math.random(), Math.random(), Math.random(), 1.0];
+        vec3.copy(playerInWorldSpaceNew, playerInWorldSpaceOld);
+        let rotationDelta = 0;
+
+        // Hit test results can change teleport position and orientation.
+        let targetRay = new XRRay(inputSourcePose.transform);
+        let hitResult = scene.hitTest(targetRay)
+        if (hitResult) {
+          // Check to see if the hit result was one of our boxes.
+          for (let i = 0; i < boxes.length; ++i) {
+            let box = boxes[i];
+            if (hitResult.node == box.node) {
+              // Change the box color to something random.
+              let uniforms = box.renderPrimitive.uniforms;
+              uniforms.baseColorFactor.value = [Math.random(), Math.random(), Math.random(), 1.0];
+              if (i == 0) {
+                // turn left
+                rotationDelta = 30;
+              } else if (i == 1) {
+                // reset heading by undoing the current rotation
+                rotationDelta = -trackingSpaceHeadingDegrees;
+              } else if (i == 2) {
+                // turn right
+                rotationDelta = -30;
               }
+              console.log('rotate by', rotationDelta);
+            }
+            if (hitResult.node == floorNode) {
+               // New position uses x/z values of the hit test result, keeping y at 0 (floor level)
+               playerInWorldSpaceNew[0] = hitResult.intersection[0];
+               playerInWorldSpaceNew[1] = 0;
+               playerInWorldSpaceNew[2] = hitResult.intersection[2];
+               console.log('teleport to', playerInWorldSpaceNew);
             }
           }
         }
+
+        // Get the new world space offset vector from tracking space origin
+        // to the player's feet, for the updated tracking space rotation.
+        // Formally, this is the old world-space player offset transformed
+        // into tracking space using the old originOffset's rotation component,
+        // then transformed back into world space using the inverse of the
+        // new originOffset. This simplifies to a rotation of the old player
+        // offset by (new angle - old angle):
+        //   worldOffsetNew = inv(rot_of(originoffsetNew)) * rot_of(originoffsetOld) * worldOffsetOld
+        //       = inv(rotY(-angleNew)) * rotY(-angleOld) * worldOffsetOld
+        //       = rotY(angleNew) * rotY(-angleOld) * worldOffsetOld
+        //       = rotY(angleNew - angleOld) * worldOffsetOld
+        quat.identity(rotationDeltaQuat);
+        quat.rotateY(rotationDeltaQuat, rotationDeltaQuat, rotationDelta * Math.PI / 180);
+        vec3.transformQuat(playerOffsetInWorldSpaceNew, playerOffsetInWorldSpaceOld, rotationDeltaQuat);
+        trackingSpaceHeadingDegrees += rotationDelta;
+
+        // Update tracking space origin so that origin + playerOffset == player location in world space
+        vec3.sub(trackingSpaceOriginInWorldSpace, playerInWorldSpaceNew, playerOffsetInWorldSpaceNew);
+
+        console.log('teleport to', trackingSpaceOriginInWorldSpace);
       }
 
       function onEndSession(session) {
@@ -225,15 +307,32 @@
         }
       }
 
+      let invPosition = vec3.create();
+      let invOrientation = quat.create();
+
+      function getRefSpace(session) {
+        return session.mode.startsWith('immersive') ?
+               xrImmersiveRefSpace :
+               xrNonImmersiveRefSpace;
+      }
+
       function onXRFrame(time, frame) {
         let session = frame.session;
-        let refSpace = session.mode.startsWith('immersive') ?
-                         xrImmersiveRefSpace :
-                         xrNonImmersiveRefSpace;
+        let refSpace = getRefSpace(session);
+
+        quat.identity(invOrientation);
+        quat.rotateY(invOrientation, invOrientation, -trackingSpaceHeadingDegrees * Math.PI / 180);
+        vec3.negate(invPosition, trackingSpaceOriginInWorldSpace);
+        vec3.transformQuat(invPosition, invPosition, invOrientation);
+        let xform = new XRRigidTransform(
+          {x: invPosition[0], y: invPosition[1], z: invPosition[2]},
+          {x: invOrientation[0], y: invOrientation[1], z: invOrientation[2], w: invOrientation[3]});
+
+        // Update originOffset to use the teleported player position and orientation
+        refSpace.originOffset = xform;
+
         let pose = frame.getViewerPose(refSpace);
-
         scene.startFrame();
-
         session.requestAnimationFrame(onXRFrame);
 
         // Update the matrix for each box
@@ -247,12 +346,10 @@
 
         // In this sample and most samples after it we'll use a helper function
         // to automatically add the right meshes for the session's input sources
-        // each frame. This also does simple hit detection to position the 
+        // each frame. This also does simple hit detection to position the
         // cursors correctly on the surface of selectable nodes.
         scene.updateInputSources(frame, refSpace);
-
         scene.drawXRFrame(frame, pose);
-
         scene.endFrame();
       }
 
diff --git a/third_party/webxr_test_pages/webxr-samples/input-tracking.html b/third_party/webxr_test_pages/webxr-samples/input-tracking.html
index c860656..efedc1d4 100644
--- a/third_party/webxr_test_pages/webxr-samples/input-tracking.html
+++ b/third_party/webxr_test_pages/webxr-samples/input-tracking.html
@@ -172,28 +172,29 @@
         let inputSources = session.getInputSources();
 
         for (let inputSource of inputSources) {
-          let inputPose = frame.getInputPose(inputSource, refSpace);
+          // If we have a grip matrix use it to render a mesh showing the
+          // position of the controller.
+          // Based on https://github.com/immersive-web/webxr/blob/master/input-explainer.md#placing-renderable-models
+          if (inputSource.gripSpace) {
+            let pose = frame.getPose(inputSource.gripSpace, refSpace);
+            if (pose) {
+              scene.inputRenderer.addController(pose.transform.matrix);
+            }
+          }
 
           // We may not get a pose back in cases where the input source has lost
           // tracking or does not know where it is relative to the given frame
           // of reference.
-          if (!inputPose) {
-            continue;
-          }
-
-          if (inputPose.gripTransform && inputPose.gripTransform.matrix) {
-            // If we have a grip matrix use it to render a mesh showing the
-            // position of the controller.
-            scene.inputRenderer.addController(inputPose.gripTransform.matrix);
-          }
-
-          if (inputPose.targetRay) {
+          // Based on https://github.com/immersive-web/webxr/blob/master/input-explainer.md#targeting-ray-pose
+          let pose = frame.getPose(inputSource.targetRaySpace, refSpace);
+          if (pose) {
+            let targetRay = new XRRay(pose.transform);
             if (inputSource.targetRayMode == 'tracked-pointer') {
               // If we have a pointer matrix and the pointer origin is the users
               // hand (as opposed to their head or the screen) use it to render
               // a ray coming out of the input device to indicate the pointer
               // direction.
-              scene.inputRenderer.addLaserPointer(inputPose.targetRay);
+              scene.inputRenderer.addLaserPointer(targetRay);
             }
 
             // If we have a pointer matrix we can also use it to render a cursor
@@ -203,14 +204,14 @@
             // not calculating any intersections in this sample.
             let cursorDistance = 2.0;
             let cursorPos = vec3.fromValues(
-                inputPose.targetRay.origin.x,
-                inputPose.targetRay.origin.y,
-                inputPose.targetRay.origin.z
+                targetRay.origin.x,
+                targetRay.origin.y,
+                targetRay.origin.z
                 );
             vec3.add(cursorPos, cursorPos, [
-                inputPose.targetRay.direction.x * cursorDistance,
-                inputPose.targetRay.direction.y * cursorDistance,
-                inputPose.targetRay.direction.z * cursorDistance,
+                targetRay.direction.x * cursorDistance,
+                targetRay.direction.y * cursorDistance,
+                targetRay.direction.z * cursorDistance,
                 ]);
 
             scene.inputRenderer.addCursor(cursorPos);
diff --git a/third_party/webxr_test_pages/webxr-samples/js/cottontail/src/scenes/scene.js b/third_party/webxr_test_pages/webxr-samples/js/cottontail/src/scenes/scene.js
index 65590ba..28819963 100644
--- a/third_party/webxr_test_pages/webxr-samples/js/cottontail/src/scenes/scene.js
+++ b/third_party/webxr_test_pages/webxr-samples/js/cottontail/src/scenes/scene.js
@@ -93,31 +93,30 @@
     this._hoverFrame++;
 
     for (let inputSource of inputSources) {
-      let inputPose = frame.getInputPose(inputSource, refSpace);
-
-      if (!inputPose) {
-        continue;
-      }
-
       // Any time that we have a grip matrix, we'll render a controller.
-      if (inputPose.gripTransform && inputPose.gripTransform.matrix) {
-        this.inputRenderer.addController(inputPose.gripTransform.matrix);
+      if (inputSource.gripSpace) {
+        let pose = frame.getPose(inputSource.gripSpace, refSpace);
+        if (pose) {
+          this.inputRenderer.addController(pose.transform.matrix);
+        }
       }
 
-      if (inputPose.targetRay) {
+      let inputPose = frame.getPose(inputSource.targetRaySpace, refSpace);
+      if (inputPose) {
+        let targetRay = new XRRay(inputPose.transform);
         if (inputSource.targetRayMode == 'tracked-pointer') {
           // If we have a pointer matrix and the pointer origin is the users
           // hand (as opposed to their head or the screen) use it to render
           // a ray coming out of the input device to indicate the pointer
           // direction.
-          this.inputRenderer.addLaserPointer(inputPose.targetRay);
+          this.inputRenderer.addLaserPointer(targetRay);
         }
 
         // If we have a pointer matrix we can also use it to render a cursor
         // for both handheld and gaze-based input sources.
 
         // Check and see if the pointer is pointing at any selectable objects.
-        let hitResult = this.hitTest(inputPose.targetRay);
+        let hitResult = this.hitTest(targetRay);
 
         if (hitResult) {
           // Render a cursor at the intersection point.
@@ -142,13 +141,11 @@
   }
 
   handleSelect(inputSource, frame, refSpace) {
-    let inputPose = frame.getInputPose(inputSource, refSpace);
-
-    if (!inputPose) {
-      return;
+    let inputPose = frame.getPose(inputSource.targetRaySpace, refSpace);
+    if (inputPose) {
+      let targetRay = new XRRay(inputPose.transform);
+      this.handleSelectPointer(targetRay);
     }
-
-    this.handleSelectPointer(inputPose.targetRay);
   }
 
   handleSelectPointer(targetRay) {
diff --git a/third_party/webxr_test_pages/webxr-samples/positional-audio.html b/third_party/webxr_test_pages/webxr-samples/positional-audio.html
index 737f972..18ade3f 100644
--- a/third_party/webxr_test_pages/webxr-samples/positional-audio.html
+++ b/third_party/webxr_test_pages/webxr-samples/positional-audio.html
@@ -394,20 +394,25 @@
       let draggingTransform = mat4.create();
 
       function hitTest(inputSource, frame, refSpace) {
-        let inputPose = frame.getInputPose(inputSource, refSpace);
-        if (!inputPose) {
-          return;
-        }
-
-        if (inputPose.targetRay) {
-          let hitResult = scene.hitTest(inputPose.targetRay)
+        let pose = frame.getPose(inputSource.targetRaySpace, refSpace);
+        if (pose) {
+          let targetRay = new XRRay(pose.transform);
+          let hitResult = scene.hitTest(targetRay)
           if (hitResult) {
             for (let source of audioSources) {
               if (hitResult.node ==  source.node) {
                 draggingSource = source;
                 draggingInput = inputSource;
-                mat4.invert(draggingTransform, inputPose.targetRay.matrix);
+                mat4.invert(draggingTransform, targetRay.matrix);
                 mat4.multiply(draggingTransform, draggingTransform, source.node.matrix);
+
+                // teleport to audio speaker
+                refSpace.originOffset = new XRRigidTransform({
+                  x : draggingSource.position[0],
+                  y : draggingSource.position[1],
+                  z : draggingSource.position[2]
+                },
+                refSpace.originOffset.orientation);
                 return true;
               }
             }
@@ -444,10 +449,10 @@
         scene.updateInputSources(frame, refSpace);
 
         if (draggingSource) {
-          let draggingPose = frame.getInputPose(draggingInput, refSpace);
+          let draggingPose = frame.getPose(draggingInput.targetRaySpace, refSpace);
           if (draggingPose) {
             let pos = draggingSource.position;
-            mat4.multiply(tmpMatrix, draggingPose.targetRay.matrix, draggingTransform);
+            mat4.multiply(tmpMatrix, draggingPose.transform.matrix, draggingTransform);
             vec3.transformMat4(pos, [0, 0, 0], tmpMatrix);
             draggingSource.source.setPosition(pos[0], pos[1], pos[2]);
           }
diff --git a/third_party/webxr_test_pages/webxr-samples/proposals/phone-ar-hit-test.html b/third_party/webxr_test_pages/webxr-samples/proposals/phone-ar-hit-test.html
index 70eaf4e..62e7f85 100644
--- a/third_party/webxr_test_pages/webxr-samples/proposals/phone-ar-hit-test.html
+++ b/third_party/webxr_test_pages/webxr-samples/proposals/phone-ar-hit-test.html
@@ -221,20 +221,17 @@
         } else {
           // Otherwise we'll use the target ray from the input source that generated
           // this event to fire off a new hit test.
-          let inputPose = event.frame.getInputPose(event.inputSource, xrRefSpace);
-          if (!inputPose) {
-            return;
-          }
-
-          if (inputPose.targetRay) {
+          let inputPose = event.frame.getPose(event.inputSource.targetRaySpace, xrRefSpace);
+          if (inputPose) {
+            let targetRay = new XRRay(inputPose.transform);
             vec3.set(rayOrigin,
-                inputPose.targetRay.origin.x,
-                inputPose.targetRay.origin.y,
-                inputPose.targetRay.origin.z);
+                targetRay.origin.x,
+                targetRay.origin.y,
+                targetRay.origin.z);
             vec3.set(rayDirection,
-                inputPose.targetRay.direction.x,
-                inputPose.targetRay.direction.y,
-                inputPose.targetRay.direction.z);
+                targetRay.direction.x,
+                targetRay.direction.y,
+                targetRay.direction.z);
 
             let ray = new XRRay(DOMPointFromVec3(rayOrigin), DOMPointFromVec3(rayDirection));
             event.frame.session.requestHitTest(ray, xrRefSpace).then((results) => {
diff --git a/third_party/webxr_test_pages/webxr-samples/tests/pointer-painter.html b/third_party/webxr_test_pages/webxr-samples/tests/pointer-painter.html
index 736fe6fe..15160b95 100644
--- a/third_party/webxr_test_pages/webxr-samples/tests/pointer-painter.html
+++ b/third_party/webxr_test_pages/webxr-samples/tests/pointer-painter.html
@@ -164,24 +164,22 @@
         let refSpace = session.mode.startsWith('immersive') ?
                          xrImmersiveRefSpace :
                          xrNonImmersiveRefSpace;
-        let inputPose = ev.frame.getInputPose(ev.inputSource, refSpace);
-        if (!inputPose) {
-          return;
-        }
 
-        if (inputPose.targetRay) {
-          scene.inputRenderer.addLaserPointer(inputPose.targetRay);
+        let inputPose = ev.frame.getPose(ev.inputSource.targetRaySpace, refSpace);
+        if (inputPose) {
+          let targetRay = new XRRay(inputPose.transform);
+          scene.inputRenderer.addLaserPointer(targetRay);
 
           let cursorDistance = 2.0;
           let cursorPos = vec3.fromValues(
-              inputPose.targetRay.origin.x,
-              inputPose.targetRay.origin.y,
-              inputPose.targetRay.origin.z
+              targetRay.origin.x,
+              targetRay.origin.y,
+              targetRay.origin.z
               );
           vec3.add(cursorPos, cursorPos, [
-              inputPose.targetRay.direction.x * cursorDistance,
-              inputPose.targetRay.direction.y * cursorDistance,
-              inputPose.targetRay.direction.z * cursorDistance,
+              targetRay.direction.x * cursorDistance,
+              targetRay.direction.y * cursorDistance,
+              targetRay.direction.z * cursorDistance,
               ]);
           scene.inputRenderer.addCursor(cursorPos);
         }
@@ -191,18 +189,19 @@
         let inputSources = session.getInputSources();
 
         for (let inputSource of inputSources) {
-          let inputPose = frame.getInputPose(inputSource, refSpace);
-
-          if (!inputPose) {
-            continue;
+          if (inputSource.gripSpace) {
+            let pose = frame.getPose(inputSource.gripSpace, refSpace);
+            if (pose) {
+              scene.inputRenderer.addController(pose.transform.matrix);
+            }
           }
 
-          if (inputPose.gripTransform && inputPose.gripTransform.matrix) {
-            scene.inputRenderer.addController(inputPose.gripTransform.matrix);
-          }
-
-          if (inputPose.targetRay && selecting) {
-            scene.inputRenderer.addLaserPointer(inputPose.targetRay);
+          if (selecting) {
+            let pose = frame.getPose(inputSource.targetRaySpace, refSpace);
+            if (pose) {
+              let targetRay = new XRRay(pose.transform);
+              scene.inputRenderer.addLaserPointer(targetRay);
+            }
           }
         }
       }
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 6692cac..d2957771 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -39812,6 +39812,9 @@
 </enum>
 
 <enum name="NuxEmailInterstitialInteractions">
+  <obsolete>
+    Removed from code March 2019.
+  </obsolete>
   <summary>
     Interactions a user can take on the email interstitial onboarding step.
   </summary>
@@ -53214,6 +53217,9 @@
 </enum>
 
 <enum name="TokenBinding.KeyMatch">
+  <obsolete>
+    Deprecated 3/2019 in crbug.com/856433.
+  </obsolete>
   <int value="0" label="No keys"/>
   <int value="1" label="Keys match"/>
   <int value="2" label="Socket (Channel ID) key missing"/>
@@ -53223,6 +53229,9 @@
 </enum>
 
 <enum name="TokenBinding.StoreEphemerality">
+  <obsolete>
+    Deprecated 3/2019 in crbug.com/856433.
+  </obsolete>
   <int value="0" label="CID_EPHEMERAL_COOKIE_EPHEMERAL">
     This value has been deprecated and replaced by EPHEMERAL_MATCH and
     EPHEMERAL_MISMATCH.
@@ -53245,6 +53254,9 @@
 </enum>
 
 <enum name="TokenBinding.Support">
+  <obsolete>
+    Deprecated 3/2019 in crbug.com/856433.
+  </obsolete>
   <int value="0" label="DISABLED"/>
   <int value="1" label="CLIENT_ONLY"/>
   <int value="2" label="CLIENT_AND_SERVER"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 1322d9f4..10e368c 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -38351,7 +38351,10 @@
 </histogram>
 
 <histogram name="FirstRun.NewUserExperience.EmailInterstitialInteraction"
-    enum="NuxEmailInterstitialInteractions" expires_after="2019-03-31">
+    enum="NuxEmailInterstitialInteractions" expires_after="M74">
+  <obsolete>
+    Removed from code March 2019.
+  </obsolete>
   <owner>hcarmona@chromium.org</owner>
   <owner>scottchen@chromium.org</owner>
   <summary>
@@ -38361,7 +38364,7 @@
 </histogram>
 
 <histogram name="FirstRun.NewUserExperience.EmailProvidersInteraction"
-    enum="NuxEmailProvidersInteractions" expires_after="2019-03-31">
+    enum="NuxEmailProvidersInteractions" expires_after="M75">
   <owner>hcarmona@chromium.org</owner>
   <owner>scottchen@chromium.org</owner>
   <summary>
@@ -38375,7 +38378,7 @@
 </histogram>
 
 <histogram name="FirstRun.NewUserExperience.EmailProvidersSelection"
-    enum="NuxEmailProvidersSelections" expires_after="2019-03-31">
+    enum="NuxEmailProvidersSelections" expires_after="M75">
   <owner>hcarmona@chromium.org</owner>
   <owner>scottchen@chromium.org</owner>
   <summary>
@@ -38386,7 +38389,7 @@
 </histogram>
 
 <histogram name="FirstRun.NewUserExperience.GoogleAppsInteraction"
-    enum="NuxGoogleAppsInteractions" expires_after="2019-03-31">
+    enum="NuxGoogleAppsInteractions" expires_after="M75">
   <owner>hcarmona@chromium.org</owner>
   <owner>scottchen@chromium.org</owner>
   <summary>
@@ -38398,7 +38401,7 @@
 </histogram>
 
 <histogram name="FirstRun.NewUserExperience.GoogleAppsSelection"
-    enum="NuxGoogleAppsSelections" expires_after="2019-03-31">
+    enum="NuxGoogleAppsSelections" expires_after="M75">
   <owner>hcarmona@chromium.org</owner>
   <owner>scottchen@chromium.org</owner>
   <summary>
@@ -38409,7 +38412,7 @@
 </histogram>
 
 <histogram name="FirstRun.NewUserExperience.LandingPageInteraction"
-    enum="NuxLandingPageInteractions" expires_after="2019-03-31">
+    enum="NuxLandingPageInteractions" expires_after="M75">
   <owner>hcarmona@chromium.org</owner>
   <owner>scottchen@chromium.org</owner>
   <summary>
@@ -38432,7 +38435,7 @@
 </histogram>
 
 <histogram name="FirstRun.NewUserExperience.SetAsDefaultInteraction"
-    enum="NuxSetAsDefaultInteractions" expires_after="2019-03-31">
+    enum="NuxSetAsDefaultInteractions" expires_after="M75">
   <owner>hcarmona@chromium.org</owner>
   <owner>scottchen@chromium.org</owner>
   <summary>
@@ -38442,7 +38445,7 @@
 </histogram>
 
 <histogram name="FirstRun.NewUserExperience.SignInInterstitialInteraction"
-    enum="NuxSignInInterstitialInteractions" expires_after="2019-03-31">
+    enum="NuxSignInInterstitialInteractions" expires_after="M75">
   <owner>hcarmona@chromium.org</owner>
   <owner>scottchen@chromium.org</owner>
   <summary>
@@ -67644,11 +67647,19 @@
 </histogram>
 
 <histogram name="Net.TokenBinding.HeaderCreationTime" units="ms">
+  <obsolete>
+    Token Binding was removed in Q4 2018 and this histogram was removed in
+    3/2019.
+  </obsolete>
   <owner>nharper@chromium.org</owner>
   <summary>Time spent creating a Token-Binding header.</summary>
 </histogram>
 
 <histogram name="Net.TokenBinding.KeyMatch" enum="TokenBinding.KeyMatch">
+  <obsolete>
+    Token Binding was removed in Q4 2018 and this histogram was removed in
+    3/2019.
+  </obsolete>
   <owner>nharper@chromium.org</owner>
   <summary>
     Logs on each request that is sent on a connection where Channel ID was sent
@@ -67659,6 +67670,10 @@
 
 <histogram name="Net.TokenBinding.StoreEphemerality"
     enum="TokenBinding.StoreEphemerality">
+  <obsolete>
+    Token Binding was removed in Q4 2018 and this histogram was removed in
+    3/2019.
+  </obsolete>
   <owner>nharper@chromium.org</owner>
   <summary>
     For each request to accounts.google.com on a connection where Channel ID was
@@ -67668,6 +67683,10 @@
 </histogram>
 
 <histogram name="Net.TokenBinding.Support" enum="TokenBinding.Support">
+  <obsolete>
+    Token Binding was removed in Q4 2018 and this histogram was removed in
+    3/2019.
+  </obsolete>
   <owner>nharper@chromium.org</owner>
   <summary>
     The number of secure HTTP requests broken down by support for Token Binding,
diff --git a/ui/file_manager/base/js/volume_manager_types.js b/ui/file_manager/base/js/volume_manager_types.js
index b20383a0..15b7705c 100644
--- a/ui/file_manager/base/js/volume_manager_types.js
+++ b/ui/file_manager/base/js/volume_manager_types.js
@@ -388,9 +388,9 @@
  */
 VolumeManagerCommon.VOLUME_ALREADY_MOUNTED = 'volume_already_mounted';
 
-VolumeManagerCommon.TEAM_DRIVES_DIRECTORY_NAME = 'team_drives';
-VolumeManagerCommon.TEAM_DRIVES_DIRECTORY_PATH =
-    '/' + VolumeManagerCommon.TEAM_DRIVES_DIRECTORY_NAME;
+VolumeManagerCommon.SHARED_DRIVES_DIRECTORY_NAME = 'team_drives';
+VolumeManagerCommon.SHARED_DRIVES_DIRECTORY_PATH =
+    '/' + VolumeManagerCommon.SHARED_DRIVES_DIRECTORY_NAME;
 
 /**
  * This is the top level directory name for Computers in drive that are using
diff --git a/ui/file_manager/file_manager/background/js/volume_info_impl.js b/ui/file_manager/file_manager/background/js/volume_info_impl.js
index 0b4d41b..320937cf 100644
--- a/ui/file_manager/file_manager/background/js/volume_info_impl.js
+++ b/ui/file_manager/file_manager/background/js/volume_info_impl.js
@@ -48,7 +48,7 @@
   this.fileSystem_ = fileSystem;
   this.label_ = label;
   this.displayRoot_ = null;
-  this.teamDriveDisplayRoot_ = null;
+  this.sharedDriveDisplayRoot_ = null;
   this.computersDisplayRoot_ = null;
 
   /**
@@ -127,7 +127,7 @@
    * volume.
    */
   get teamDriveDisplayRoot() {
-    return this.teamDriveDisplayRoot_;
+    return this.sharedDriveDisplayRoot_;
   },
   /**
    * @return {DirectoryEntry} The display root path of Computers directory.
@@ -258,19 +258,19 @@
 };
 
 /**
- * Sets |teamDriveDisplayRoot_| if team drives are enabled.
+ * Sets |sharedDriveDisplayRoot_| if team drives are enabled.
  *
  * The return value will resolve once this operation is complete.
  * @return {!Promise<void>}
  */
-VolumeInfoImpl.prototype.resolveTeamDrivesRoot_ = function() {
+VolumeInfoImpl.prototype.resolveSharedDrivesRoot_ = function() {
   return VolumeInfoImpl
       .resolveFileSystemUrl_(
           this.fileSystem_.root.toURL() +
-          VolumeManagerCommon.TEAM_DRIVES_DIRECTORY_NAME)
+          VolumeManagerCommon.SHARED_DRIVES_DIRECTORY_NAME)
       .then(
-          teamDrivesRoot => {
-            this.teamDriveDisplayRoot_ = teamDrivesRoot;
+          sharedDrivesRoot => {
+            this.sharedDriveDisplayRoot_ = sharedDrivesRoot;
           },
           error => {
             if (error.name != 'NotFoundError') {
@@ -324,7 +324,7 @@
   return Promise
       .all([
         VolumeInfoImpl.resolveFileSystemUrl_(displayRootURL),
-        this.resolveTeamDrivesRoot_(),
+        this.resolveSharedDrivesRoot_(),
         this.resolveComputersRoot_(),
       ])
       .then(([displayRoot]) => {
diff --git a/ui/file_manager/file_manager/background/js/volume_manager_impl.js b/ui/file_manager/file_manager/background/js/volume_manager_impl.js
index ef34c84a..2fd9cac5 100644
--- a/ui/file_manager/file_manager/background/js/volume_manager_impl.js
+++ b/ui/file_manager/file_manager/background/js/volume_manager_impl.js
@@ -337,10 +337,10 @@
       isReadOnly = volumeInfo.isReadOnly;
       isRootEntry = entry.fullPath === '/root';
     } else if (
-        entry.fullPath == VolumeManagerCommon.TEAM_DRIVES_DIRECTORY_PATH ||
+        entry.fullPath == VolumeManagerCommon.SHARED_DRIVES_DIRECTORY_PATH ||
         entry.fullPath.indexOf(
-            VolumeManagerCommon.TEAM_DRIVES_DIRECTORY_PATH + '/') === 0) {
-      if (entry.fullPath == VolumeManagerCommon.TEAM_DRIVES_DIRECTORY_PATH) {
+            VolumeManagerCommon.SHARED_DRIVES_DIRECTORY_PATH + '/') === 0) {
+      if (entry.fullPath == VolumeManagerCommon.SHARED_DRIVES_DIRECTORY_PATH) {
         rootType = VolumeManagerCommon.RootType.TEAM_DRIVES_GRAND_ROOT;
         isReadOnly = true;
         isRootEntry = true;
@@ -374,8 +374,8 @@
           isReadOnly = volumeInfo.isReadOnly;
         }
       }
-    } else if (entry.fullPath == '/other' ||
-               entry.fullPath.indexOf('/other/') === 0) {
+    } else if (
+        entry.fullPath == '/other' || entry.fullPath.indexOf('/other/') === 0) {
       rootType = VolumeManagerCommon.RootType.DRIVE_OTHER;
       isReadOnly = true;
       isRootEntry = entry.fullPath === '/other';
diff --git a/ui/file_manager/file_manager/common/js/util.js b/ui/file_manager/file_manager/common/js/util.js
index 73ea9cd..3fb3b07 100644
--- a/ui/file_manager/file_manager/common/js/util.js
+++ b/ui/file_manager/file_manager/common/js/util.js
@@ -503,7 +503,7 @@
     return false;
   }
   const tree = entry.fullPath.split('/');
-  return tree.length == 3 && util.isTeamDriveEntry(entry);
+  return tree.length == 3 && util.isSharedDriveEntry(entry);
 };
 
 /**
@@ -516,21 +516,21 @@
     return false;
   }
   const tree = entry.fullPath.split('/');
-  return tree.length == 2 && util.isTeamDriveEntry(entry);
+  return tree.length == 2 && util.isSharedDriveEntry(entry);
 };
 
 /**
- * Obtains whether an entry is descendant of the Team Drives directory.
+ * Obtains whether an entry is descendant of the Shared Drives directory.
  * @param {!Entry|!FilesAppEntry} entry Entry or a fake entry.
- * @return {boolean} True if the given entry is under Team Drives.
+ * @return {boolean} True if the given entry is under Shared Drives.
  */
-util.isTeamDriveEntry = entry => {
+util.isSharedDriveEntry = entry => {
   if (!entry.fullPath) {
     return false;
   }
   const tree = entry.fullPath.split('/');
   return tree[0] == '' &&
-      tree[1] == VolumeManagerCommon.TEAM_DRIVES_DIRECTORY_NAME;
+      tree[1] == VolumeManagerCommon.SHARED_DRIVES_DIRECTORY_NAME;
 };
 
 /**
@@ -540,7 +540,7 @@
  *     under Team Drives.
  */
 util.getTeamDriveName = entry => {
-  if (!entry.fullPath || !util.isTeamDriveEntry(entry)) {
+  if (!entry.fullPath || !util.isSharedDriveEntry(entry)) {
     return '';
   }
   const tree = entry.fullPath.split('/');
diff --git a/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js b/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
index 092350c..44e5f887 100644
--- a/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
+++ b/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
@@ -290,11 +290,11 @@
     sourceEntries) {
   assert(sourceEntries.length != 0);
   const source = {
-    isTeamDrive: util.isTeamDriveEntry(sourceEntries[0]),
+    isTeamDrive: util.isSharedDriveEntry(sourceEntries[0]),
     teamDriveName: util.getTeamDriveName(sourceEntries[0])
   };
   const destination = {
-    isTeamDrive: util.isTeamDriveEntry(this.destinationEntry),
+    isTeamDrive: util.isSharedDriveEntry(this.destinationEntry),
     teamDriveName: util.getTeamDriveName(this.destinationEntry)
   };
   if (this.isMove) {
@@ -745,7 +745,7 @@
     // files stored in a Team Drive.
     if (sourceEntries.some(
             entry =>
-                util.isTeamDriveEntry(entry) && FileType.isHosted(entry)) &&
+                util.isSharedDriveEntry(entry) && FileType.isHosted(entry)) &&
         destinationIsOutsideOfDrive) {
       // For now, just don't execute the paste.
       // TODO(sashab): Display a warning message, and disallow drag-drop
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 0476b01..24969093 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
@@ -43,7 +43,7 @@
     // Team drives are descendants of the Drive root volume item "Google Drive".
     // When we looking for an item in team drives, recursively search inside the
     // "Google Drive" root item.
-    if (util.isTeamDriveEntry(entry) && item instanceof DriveVolumeItem) {
+    if (util.isSharedDriveEntry(entry) && item instanceof DriveVolumeItem) {
       return item.getItemByEntry(entry);
     }
 
@@ -77,7 +77,7 @@
     // Team drives are descendants of the Drive root volume item "Google Drive".
     // When we looking for an item in team drives, recursively search inside the
     // "Google Drive" root item.
-    if (util.isTeamDriveEntry(entry) && item instanceof DriveVolumeItem) {
+    if (util.isSharedDriveEntry(entry) && item instanceof DriveVolumeItem) {
       item.selectByEntry(entry);
       return true;
     }
@@ -1391,7 +1391,7 @@
  * @override
  */
 DriveVolumeItem.prototype.updateItemByEntry = function(changedDirectoryEntry) {
-  const isTeamDriveChild = util.isTeamDriveEntry(changedDirectoryEntry);
+  const isTeamDriveChild = util.isSharedDriveEntry(changedDirectoryEntry);
 
   // If Team Drive grand root has been removed and we receive an update for an
   // team drive, we need to create the Team Drive grand root.
@@ -1446,7 +1446,7 @@
     if (!item.entry) {
       continue;
     }
-    if (util.isTeamDriveEntry(item.entry)) {
+    if (util.isSharedDriveEntry(item.entry)) {
       return 2;
     }
   }
@@ -1473,9 +1473,6 @@
   const labelId = item.labelElement.id;
   item.__proto__ = ShortcutItem.prototype;
 
-  if (window.IN_TEST) {
-    item.setAttribute('dir-type', 'ShortcutItem');
-  }
   item.parentTree_ = tree;
   item.dirEntry_ = modelItem.entry;
   item.modelItem_ = modelItem;
@@ -1493,10 +1490,10 @@
 
   item.label = modelItem.entry.name;
 
-  // Set the 'label' attribute of this element so it can be selected by tests.
-  // TODO(sashab): Figure out a reliable way to select elements in the directory
-  // tree by label and remove this.
-  item.setAttribute('label', item.label);
+  if (window.IN_TEST) {
+    item.setAttribute('dir-type', 'ShortcutItem');
+    item.setAttribute('entry-label', item.label);
+  }
   return item;
 }
 
diff --git a/ui/file_manager/file_manager/foreground/js/ui/location_line.js b/ui/file_manager/file_manager/foreground/js/ui/location_line.js
index 7d97d9d0..3b2e49a65 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/location_line.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/location_line.js
@@ -107,7 +107,7 @@
   } else if (
       locationInfo.rootType === VolumeManagerCommon.RootType.TEAM_DRIVE) {
     displayRootUrl = this.replaceRootName_(
-        displayRootUrl, VolumeManagerCommon.TEAM_DRIVES_DIRECTORY_PATH);
+        displayRootUrl, VolumeManagerCommon.SHARED_DRIVES_DIRECTORY_PATH);
     components.push(new LocationLine.PathComponent(
         util.getRootTypeLabel(locationInfo), displayRootUrl));
   } else if (locationInfo.rootType === VolumeManagerCommon.RootType.COMPUTER) {
@@ -123,9 +123,9 @@
   // Get relative path to display root (e.g. /root/foo/bar -> foo/bar).
   let relativePath = entry.fullPath.slice(displayRootFullPath.length);
   if (entry.fullPath.startsWith(
-          VolumeManagerCommon.TEAM_DRIVES_DIRECTORY_PATH)) {
+          VolumeManagerCommon.SHARED_DRIVES_DIRECTORY_PATH)) {
     relativePath = entry.fullPath.slice(
-        VolumeManagerCommon.TEAM_DRIVES_DIRECTORY_PATH.length);
+        VolumeManagerCommon.SHARED_DRIVES_DIRECTORY_PATH.length);
   } else if (entry.fullPath.startsWith(
                  VolumeManagerCommon.COMPUTERS_DIRECTORY_PATH)) {
     relativePath = entry.fullPath.slice(
diff --git a/ui/file_manager/integration_tests/file_manager/background.js b/ui/file_manager/integration_tests/file_manager/background.js
index 2b0c51cc..fa3f246b 100644
--- a/ui/file_manager/integration_tests/file_manager/background.js
+++ b/ui/file_manager/integration_tests/file_manager/background.js
@@ -450,7 +450,7 @@
       ['[command="#create-folder-shortcut"]:not([hidden]):not([disabled])']));
 
   await remoteCall.waitForElement(
-      appId, `.tree-item[label="${directoryName}"]`);
+      appId, `.tree-item[entry-label="${directoryName}"]`);
 }
 
 /**
diff --git a/ui/file_manager/integration_tests/file_manager/directory_tree_context_menu.js b/ui/file_manager/integration_tests/file_manager/directory_tree_context_menu.js
index ca4336d..70e6789e 100644
--- a/ui/file_manager/integration_tests/file_manager/directory_tree_context_menu.js
+++ b/ui/file_manager/integration_tests/file_manager/directory_tree_context_menu.js
@@ -193,25 +193,46 @@
 /**
  * Checks all visible items in the context menu for directory tree.
  * @param {!string} appId
- * @param {!string} treeItemQuery Query to item to be tested with context menu.
+ * @param {!string} breadcrumbsPath Path based on the entry labels like:
+ *     /My files/Downloads/photos to item to be tested with context menu.
  * @param {!Array<!Array<string|boolean>>} menuStates Mapping each command to
  *     it's enabled state.
  * @param {boolean=} rootsMenu True if the item uses #roots-context-menu instead
  *     of #directory-tree-context-menu
+ * @param {string=} shortcutToPath For shortcuts it navigates to a different
+ *   breadcrumbs path, like /My Drive/ShortcutName.
  */
-async function checkContextMenu(appId, treeItemQuery, menuStates, rootsMenu) {
+async function checkContextMenu(appId, breadcrumbsPath, menuStates, rootsMenu, shortcutToPath) {
   // Focus the directory tree.
   chrome.test.assertTrue(
       !!await remoteCall.callRemoteTestUtil(
           'focus', appId, ['#directory-tree']),
       'focus failed: #directory-tree');
 
-  // Right click desired item in the directory tree.
-  await remoteCall.waitForElement(appId, treeItemQuery);
+  const paths = breadcrumbsPath.split('/').filter(path => path);
+  const leaf = paths.pop();
+
+  // Expand all parents of the leaf element.
+  let query = '#directory-tree';
+  for (const parentLabel of paths) {
+    query += ` [entry-label="${parentLabel}"]`;
+    // Only expand if element isn't expanded yet.
+    const elements = await remoteCall.callRemoteTestUtil(
+        'queryAllElements', appId, [query + '[expanded]']);
+    if (!elements.length) {
+      await remoteCall.waitForElement(appId, query + hasChildren);
+      await expandTreeItem(appId, query);
+    }
+  }
+
+  // Navigate to leaf entry.
+  query += ` [entry-label="${leaf}"]`;
   chrome.test.assertTrue(
-      !!await remoteCall.callRemoteTestUtil(
-          'fakeMouseRightClick', appId, [treeItemQuery]),
-      'fakeMouseRightClick failed');
+      !!await remoteCall.callRemoteTestUtil('fakeMouseClick', appId, [query]),
+      'fakeMouseClick failed');
+  // Wait to navigation to leaf entry to finish.
+  await remoteCall.waitUntilCurrentDirectoryIsChanged(
+      appId, (shortcutToPath || breadcrumbsPath));
 
   // Selector for a both context menu used on directory tree, only one should be
   // visible at the time.
@@ -219,47 +240,70 @@
       '#roots-context-menu:not([hidden]) cr-menu-item:not([hidden])' :
       '#directory-tree-context-menu:not([hidden]) cr-menu-item:not([hidden])';
 
-  // Wait for each menu item to be in the desired state.
-  for (let [command, enabled] of menuStates) {
-    const menuItemQuery = menuQuery +
-        (enabled ? ':not([disabled])' : '[disabled]') +
-        `[command="${command}"]`;
-    await remoteCall.waitForElement(appId, menuItemQuery);
-  }
+  // Right click desired item in the directory tree.
+  await remoteCall.waitForElement(appId, query);
+  chrome.test.assertTrue(
+      !!await remoteCall.callRemoteTestUtil(
+          'fakeMouseRightClick', appId, [query]),
+      'fakeMouseRightClick failed');
+
+  // Wait for context menu to appear.
+  await remoteCall.waitForElement(appId, menuQuery);
 
   function stateString(state) {
     return state ? 'enabled' : 'disabled';
   }
 
-  // Grab all commands together and check they are in the expected order and
-  // state.
-  const actualItems = await remoteCall.callRemoteTestUtil(
-      'queryAllElements', appId, [menuQuery]);
-  let isDiff = false;
-  let msg = '\nContext menu in the wrong order/state:';
-  for (let i = 0; i < Math.max(menuStates.length, actualItems.length); i++) {
-    let expectedCommand = undefined;
-    let expectedState = undefined;
-    let actualCommand = undefined;
-    let actualState = undefined;
-    if (menuStates[i]) {
-      expectedCommand = menuStates[i][0];
-      expectedState = menuStates[i][1];
+  let msg;
+  async function isCommandsEnabledAndOrdered() {
+    // Grab all commands together and check they are in the expected order and
+    // state.
+    const actualItems = await remoteCall.callRemoteTestUtil(
+        'queryAllElements', appId, [menuQuery]);
+    let correctCommands = true;
+    msg = '\nContext menu in the wrong order/state for: ' + breadcrumbsPath;
+    for (let i = 0; i < Math.max(menuStates.length, actualItems.length); i++) {
+      let expectedCommand = undefined;
+      let expectedState = undefined;
+      let actualCommand = undefined;
+      let actualState = undefined;
+      if (menuStates[i]) {
+        expectedCommand = menuStates[i][0];
+        expectedState = menuStates[i][1];
+      }
+      if (actualItems[i]) {
+        actualCommand = actualItems[i].attributes['command'];
+        actualState = actualItems[i].attributes['disabled'] ? false : true;
+      }
+      msg += '\n';
+      if (expectedCommand !== actualCommand || expectedState !== actualState) {
+        correctCommands = false;
+      }
+      msg += ` index: ${i}`;
+      msg += `\n\t expected: ${expectedCommand} ${stateString(expectedState)}`;
+      msg += `\n\t      got: ${actualCommand} ${stateString(actualState)}`;
     }
-    if (actualItems[i]) {
-      actualCommand = actualItems[i].attributes['command'];
-      actualState = actualItems[i].attributes['disabled'] ? false : true;
-    }
-    msg += '\n';
-    if (expectedCommand !== actualCommand || expectedState !== actualState) {
-      isDiff = true;
-    }
-    msg += ` index: ${i}`;
-    msg += `\n\t expected: ${expectedCommand} ${stateString(expectedState)}`;
-    msg += `\n\t      got: ${actualCommand} ${stateString(actualState)}`;
+    return correctCommands;
   }
 
-  if (isDiff) {
+  // Check if commands are the way we expect, otherwise we try one more time.
+  if (await isCommandsEnabledAndOrdered()) {
+    return;
+  }
+  console.warn('Menus items did not match (trying again)...\n' + msg);
+  await wait(REPEAT_UNTIL_INTERVAL);
+
+  // Try the context menu one more time.
+  await remoteCall.waitForElement(appId, query);
+  chrome.test.assertTrue(
+      !!await remoteCall.callRemoteTestUtil(
+          'fakeMouseRightClick', appId, [query]),
+      'fakeMouseRightClick failed');
+
+  // Wait for context menu to appear.
+  await remoteCall.waitForElement(appId, menuQuery);
+
+  if (!await isCommandsEnabledAndOrdered()) {
     chrome.test.assertTrue(false, msg);
   }
 }
@@ -567,6 +611,15 @@
           'focus', appId, ['#directory-tree']),
       'focus failed: #directory-tree');
 
+  // Select Recent root.
+  chrome.test.assertTrue(
+      !!await remoteCall.callRemoteTestUtil('fakeMouseClick', appId, [query]),
+      'fakeMouseClick failed');
+
+  // Wait it to navigate to it.
+  await remoteCall.waitUntilCurrentDirectoryIsChanged(
+      appId, '/Recent');
+
   // Right click Recent root.
   chrome.test.assertTrue(
       !!await remoteCall.callRemoteTestUtil(
@@ -589,17 +642,18 @@
       ['#share-with-linux', true],
   ];
   const entry = ENTRIES.directoryD;
-  const query =
-      `#directory-tree [dir-type='ShortcutItem'][label='${entry.nameText}']`;
+  const entryName = entry.nameText;
 
   // Open Files app on Drive.
   const appId = await setupAndWaitUntilReady(RootPath.DRIVE, [], [entry]);
 
   // Create a shortcut to directory D.
-  await createShortcut(appId, entry.nameText);
+  await createShortcut(appId, entryName);
 
   // Check the context menu is on desired state.
-  await checkContextMenu(appId, query, menus, true /* rootMenu */);
+  await checkContextMenu(
+      appId, `/${entryName}`, menus, true /* rootMenu */,
+      `/My Drive/${entryName}`);
 };
 
 /**
@@ -627,10 +681,6 @@
     ['#delete', true],
     ['#new-folder', true],
   ];
-  const myFilesQuery = '#directory-tree [entry-label="My files"]';
-  const downloadsQuery = '#directory-tree [entry-label="Downloads"]';
-  const photosQuery =
-      '#directory-tree [full-path-for-testing="/Downloads/photos"]';
 
   // Open Files app on local Downloads.
   const appId = await setupAndWaitUntilReady(
@@ -638,17 +688,15 @@
 
   // Check the context menu is on desired state for MyFiles.
   await checkContextMenu(
-      appId, myFilesQuery, myFilesMenus, false /* rootMenu */);
+      appId, '/My files', myFilesMenus, false /* rootMenu */);
 
   // Check the context menu for MyFiles>Downloads.
   await checkContextMenu(
-      appId, downloadsQuery, downloadsMenus, false /* rootMenu */);
-
-  // Expand Downloads to display photos folder.
-  await expandTreeItem(appId, downloadsQuery);
+      appId, '/My files/Downloads', downloadsMenus, false /* rootMenu */);
 
   // Check the context menu for MyFiles>Downloads>photos.
-  await checkContextMenu(appId, photosQuery, photosMenus, false /* rootMenu */);
+  await checkContextMenu(
+      appId, '/My files/Downloads/photos', photosMenus, false /* rootMenu */);
 };
 
 /**
@@ -667,7 +715,6 @@
     ['#new-folder', true],
   ];
   const linuxQuery = '#directory-tree [entry-label="Linux files"]';
-  const folderQuery = linuxQuery + ' [entry-label="photos"]';
 
   // Add a crostini folder.
   await addEntries(['crostini'], [ENTRIES.photos]);
@@ -691,13 +738,12 @@
           '[dir-type="SubDirectoryItem"][entry-label="Linux files"]');
 
   // Check the context menu for Linux files.
-  await checkContextMenu(appId, linuxQuery, linuxMenus, false /* rootMenu */);
-
-  // Expand Crostini to display its folders, it dismisses the context menu.
-  await expandTreeItem(appId, linuxQuery);
+  await checkContextMenu(
+      appId, '/My files/Linux files', linuxMenus, false /* rootMenu */);
 
   // Check the context menu for a folder in Linux files.
-  await checkContextMenu(appId, folderQuery, folderMenus, false /* rootMenu */);
+  await checkContextMenu(
+      appId, '/My files/Linux files/photos', folderMenus, false /* rootMenu */);
 };
 
 /**
@@ -718,9 +764,6 @@
     ['#new-folder', true],
   ];
 
-  const playFilesQuery = '#directory-tree [entry-label="Play files"]';
-  const folderQuery = playFilesQuery + ' [entry-label="Documents"]';
-
   // Add an Android folder.
   await addEntries(['android_files'], [ENTRIES.directoryDocuments]);
 
@@ -730,13 +773,12 @@
 
   // Check the context menu for Play files.
   await checkContextMenu(
-      appId, playFilesQuery, playFilesMenus, false /* rootMenu */);
-
-  // Expand Play files to display its folders, it dismisses the context menu.
-  await expandTreeItem(appId, playFilesQuery);
+      appId, '/My files/Play files', playFilesMenus, false /* rootMenu */);
 
   // Check the context menu for a folder in Play files.
-  await checkContextMenu(appId, folderQuery, folderMenus, false /* rootMenu */);
+  await checkContextMenu(
+      appId, '/My files/Play files/Documents', folderMenus,
+      false /* rootMenu */);
 };
 
 /**
@@ -769,12 +811,6 @@
     ['#new-folder', true],
   ];
 
-  const singleUsbQuery = '#directory-tree [entry-label="fake-usb"]';
-  const partitionsRootQuery = '#directory-tree [entry-label="Drive Label"]';
-  const partition1Query = '#directory-tree [entry-label="partition-1"]';
-  const singleUsbFolderQuery = singleUsbQuery + ' [entry-label="A"]';
-  const partition1FolderQuery = partition1Query + ' [entry-label="Folder"]';
-
   // Mount removable volumes.
   await sendTestMessage({name: 'mountUsbWithPartitions'});
   await sendTestMessage({name: 'mountFakeUsb'});
@@ -785,25 +821,24 @@
 
   // Check the context menu for single partition USB.
   await checkContextMenu(
-      appId, singleUsbQuery, singleUsbMenus, true /* rootMenu */);
+      appId, '/fake-usb', singleUsbMenus, true /* rootMenu */);
+
+  // Check the context menu for a folder inside a singlue USB partition.
+  await checkContextMenu(
+      appId, '/fake-usb/A', folderMenus, false /* rootMenu */);
 
   // Check the context menu for multiple partitions USB (root).
   await checkContextMenu(
-      appId, partitionsRootQuery, partitionsRootMenus, true /* rootMenu */);
+      appId, '/Drive Label', partitionsRootMenus, true /* rootMenu */);
 
   // Check the context menu for multiple partitions USB (actual partition).
   await checkContextMenu(
-      appId, partition1Query, partition1Menus, false /* rootMenu */);
-
-  // Check the context menu for a folder inside a singlue USB partition.
-  await expandTreeItem(appId, singleUsbQuery);
-  await checkContextMenu(
-      appId, singleUsbFolderQuery, folderMenus, false /* rootMenu */);
+      appId, '/Drive Label/partition-1', partition1Menus, false /* rootMenu */);
 
   // Check the context menu for a folder inside a partition1.
-  await expandTreeItem(appId, partition1Query);
   await checkContextMenu(
-      appId, partition1FolderQuery, folderMenus, false /* rootMenu */);
+      appId, '/Drive Label/partition-1/Folder', folderMenus,
+      false /* rootMenu */);
 
 };
 
@@ -822,8 +857,6 @@
     ['#delete', false],
     ['#new-folder', false],
   ];
-  const fspQuery = '#directory-tree [entry-label="Test (1)"]';
-  const folderQuery = fspQuery + ' [entry-label="folder"]';
 
   // Install a FSP.
   const manifest = 'manifest_source_file.json';
@@ -833,13 +866,12 @@
   const appId =
       await setupAndWaitUntilReady(RootPath.DOWNLOADS, [ENTRIES.beautiful], []);
 
-  // Check the context menu for FSP.
-  await remoteCall.waitForElement(appId, fspQuery + hasChildren);
-  await checkContextMenu(appId, fspQuery, fspMenus, true /* rootMenu */);
+  // Check the context menu for FSP root.
+  await checkContextMenu(appId, '/Test (1)', fspMenus, true /* rootMenu */);
 
   // Check the context menu for a folder inside a FSP.
-  await expandTreeItem(appId, fspQuery);
-  await checkContextMenu(appId, folderQuery, folderMenus, false /* rootMenu */);
+  await checkContextMenu(
+      appId, '/Test (1)/folder', folderMenus, false /* rootMenu */);
 };
 
 /**
@@ -856,7 +888,6 @@
   ];
   const documentsProviderQuery =
       '#directory-tree [entry-label="DocumentsProvider"]';
-  const folderQuery = documentsProviderQuery + ' [entry-label="photos"]';
 
   // Add a DocumentsProvider folder.
   await addEntries(['documents_provider'], [ENTRIES.photos]);
@@ -868,6 +899,22 @@
   // Wait for DocumentsProvider to appear.
   await remoteCall.waitForElement(appId, documentsProviderQuery + hasChildren);
 
+  // Select DocumentsProvider root.
+  chrome.test.assertTrue(
+      !!await remoteCall.callRemoteTestUtil(
+          'fakeMouseClick', appId, [documentsProviderQuery]),
+      'fakeMouseClick failed');
+
+  // Wait it to navigate to it.
+  await remoteCall.waitUntilCurrentDirectoryIsChanged(
+      appId, '/DocumentsProvider');
+
+  // Right click DocumentsProvider root.
+  chrome.test.assertTrue(
+      !!await remoteCall.callRemoteTestUtil(
+          'fakeMouseRightClick', appId, [documentsProviderQuery]),
+      'fakeMouseRightClick failed');
+
   // Check that both menus are still hidden, because DocumentsProvider root
   // doesn't show any context menu.
   await remoteCall.waitForElement(appId, '#roots-context-menu[hidden]');
@@ -875,8 +922,8 @@
       appId, '#directory-tree-context-menu[hidden]');
 
   // Check the context menu for a folder inside a DocumentsProvider.
-  await expandTreeItem(appId, documentsProviderQuery);
-  await checkContextMenu(appId, folderQuery, folderMenus, false /* rootMenu */);
+  await checkContextMenu(
+      appId, '/DocumentsProvider/photos', folderMenus, false /* rootMenu */);
 };
 
 })();
diff --git a/ui/file_manager/integration_tests/file_manager/folder_shortcuts.js b/ui/file_manager/integration_tests/file_manager/folder_shortcuts.js
index e50a59f..960a230 100644
--- a/ui/file_manager/integration_tests/file_manager/folder_shortcuts.js
+++ b/ui/file_manager/integration_tests/file_manager/folder_shortcuts.js
@@ -44,7 +44,7 @@
   A: {
     contents: [ENTRIES.directoryB.getExpectedRow()],
     name: 'A',
-    navItem: '.tree-item[label="A"]',
+    navItem: '.tree-item[dir-type="ShortcutItem"][entry-label="A"]',
     treeItem: TREEITEM_A
   },
   B: {
@@ -55,13 +55,13 @@
   C: {
     contents: [],
     name: 'C',
-    navItem: '.tree-item[label="C"]',
+    navItem: '.tree-item[dir-type="ShortcutItem"][entry-label="C"]',
     treeItem: TREEITEM_C
   },
   D: {
     contents: [ENTRIES.directoryE.getExpectedRow()],
     name: 'D',
-    navItem: '.tree-item[label="D"]',
+    navItem: '.tree-item[dir-type="ShortcutItem"][entry-label="D"]',
     treeItem: TREEITEM_D
   },
   E: {
diff --git a/ui/strings/translations/ui_strings_ca.xtb b/ui/strings/translations/ui_strings_ca.xtb
index b36aa45..cdb4451 100644
--- a/ui/strings/translations/ui_strings_ca.xtb
+++ b/ui/strings/translations/ui_strings_ca.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">D'esquerra a dreta</translation>
 <translation id="1383876407941801731">Cerca</translation>
 <translation id="1398853756734560583">Maximitza</translation>
+<translation id="1409544243779336081">Recomanació d'aplicació</translation>
 <translation id="1413622004203049571">Desactiva les notificacions de <ph name="NOTIFIER_NAME" /></translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 minut i }other{# minuts i }}</translation>
 <translation id="1643823602425662293">Notificació</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">Ara no</translation>
 <translation id="348799646910989694">El prestatge s'amaga automàticament</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 dia restant}other{# dies restants}}</translation>
+<translation id="3600969208114796418">Fitxer <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
 <translation id="3608915363409716668">Més de <ph name="MAXIMUM_VALUE" /></translation>
 <translation id="3618849550573277856">Cerca "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="364720409959344976">Selecció d'una carpeta per penjar</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">Fitxer multimèdia: atura</translation>
 <translation id="6845383723252244143">Selecció d'una carpeta</translation>
 <translation id="6845533974506654842">prem</translation>
+<translation id="686304767576508198">Compartit des de</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{1 hora restant}other{# hores restants}}</translation>
 <translation id="688711909580084195">Pàgina web sense títol</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
diff --git a/ui/strings/translations/ui_strings_cs.xtb b/ui/strings/translations/ui_strings_cs.xtb
index 371c8b78..adfb46c 100644
--- a/ui/strings/translations/ui_strings_cs.xtb
+++ b/ui/strings/translations/ui_strings_cs.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">Zleva doprava</translation>
 <translation id="1383876407941801731">Vyhledávání</translation>
 <translation id="1398853756734560583">Maximalizovat</translation>
+<translation id="1409544243779336081">Doporučení aplikace</translation>
 <translation id="1413622004203049571">Deaktivovat oznámení ze služby <ph name="NOTIFIER_NAME" /></translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 minuta a  }few{# minuty a  }many{# minuty a  }other{# minut a  }}</translation>
 <translation id="1643823602425662293">Oznámení</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">Teď ne</translation>
 <translation id="348799646910989694">Polička byla automaticky skryta</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Zbývá 1 den}few{Zbývají # dny}many{Zbývá # dne}other{Zbývá # dnů}}</translation>
+<translation id="3600969208114796418">Soubor <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
 <translation id="3608915363409716668">&gt; <ph name="MAXIMUM_VALUE" /></translation>
 <translation id="3618849550573277856">Vyhledat „<ph name="LOOKUP_STRING" />“</translation>
 <translation id="364720409959344976">Vyberte složku pro nahrávání</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">Média – zastavit</translation>
 <translation id="6845383723252244143">Vybrat složku</translation>
 <translation id="6845533974506654842">zmáčknout</translation>
+<translation id="686304767576508198">Sdíleno uživatelem</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{Zbývá 1 hodina}few{Zbývají # hodiny}many{Zbývá # hodiny}other{Zbývá # hodiny}}</translation>
 <translation id="688711909580084195">Nepojmenovaná webová stránka</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
diff --git a/ui/strings/translations/ui_strings_es.xtb b/ui/strings/translations/ui_strings_es.xtb
index dac7b9d..e19d0f0 100644
--- a/ui/strings/translations/ui_strings_es.xtb
+++ b/ui/strings/translations/ui_strings_es.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">De izquierda a derecha</translation>
 <translation id="1383876407941801731">Buscar</translation>
 <translation id="1398853756734560583">Maximizar</translation>
+<translation id="1409544243779336081">Aplicación recomendada</translation>
 <translation id="1413622004203049571">Inhabilitar notificaciones de <ph name="NOTIFIER_NAME" /></translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 minuto y }other{# minutos y }}</translation>
 <translation id="1643823602425662293">Notificación</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">Ahora no</translation>
 <translation id="348799646910989694">La estantería se ocultará automáticamente</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Queda 1 día}other{Quedan # días}}</translation>
+<translation id="3600969208114796418">Archivo <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
 <translation id="3608915363409716668">Más de <ph name="MAXIMUM_VALUE" /></translation>
 <translation id="3618849550573277856">Buscar <ph name="LOOKUP_STRING" /></translation>
 <translation id="364720409959344976">Seleccionar una carpeta para subirla</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">Detener contenido multimedia</translation>
 <translation id="6845383723252244143">Seleccionar carpeta</translation>
 <translation id="6845533974506654842">pulsar</translation>
+<translation id="686304767576508198">Compartido desde</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{Queda 1 hora}other{Quedan # horas}}</translation>
 <translation id="688711909580084195">Página web sin título</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
diff --git a/ui/strings/translations/ui_strings_fi.xtb b/ui/strings/translations/ui_strings_fi.xtb
index d5250c5..8d33ba9 100644
--- a/ui/strings/translations/ui_strings_fi.xtb
+++ b/ui/strings/translations/ui_strings_fi.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">Vasemmalta oikealle</translation>
 <translation id="1383876407941801731">Haku</translation>
 <translation id="1398853756734560583">Suurenna</translation>
+<translation id="1409544243779336081">Sovellussuositus</translation>
 <translation id="1413622004203049571">Poista ilmoitukset käytöstä sovellukselta <ph name="NOTIFIER_NAME" /></translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 minuutti ja }other{# minuuttia ja }}</translation>
 <translation id="1643823602425662293">Ilmoitus</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">Ei nyt</translation>
 <translation id="348799646910989694">Hylly piilotettu automaattisesti</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 päivä jäljellä}other{# päivää jäljellä}}</translation>
+<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" />-tiedosto</translation>
 <translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
 <translation id="3618849550573277856">Hae ”<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Valitse lähetettävä kansio</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">Media: pysäytä</translation>
 <translation id="6845383723252244143">Valitse kansio</translation>
 <translation id="6845533974506654842">paina</translation>
+<translation id="686304767576508198">Jaettu kohteesta</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{1 tunti jäljellä}other{# tuntia jäljellä}}</translation>
 <translation id="688711909580084195">Nimetön verkkosivu</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> Pt/s</translation>
diff --git a/ui/strings/translations/ui_strings_fil.xtb b/ui/strings/translations/ui_strings_fil.xtb
index c7a9822..a18d417 100644
--- a/ui/strings/translations/ui_strings_fil.xtb
+++ b/ui/strings/translations/ui_strings_fil.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">Kaliwa papuntang Kanan</translation>
 <translation id="1383876407941801731">Hanapin</translation>
 <translation id="1398853756734560583">Maximize</translation>
+<translation id="1409544243779336081">Rekomendasyon sa app</translation>
 <translation id="1413622004203049571">I-disable ang mga notification mula sa <ph name="NOTIFIER_NAME" /></translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 minuto at }one{# minuto at }other{# na minuto at }}</translation>
 <translation id="1643823602425662293">Notification</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">Hindi ngayon</translation>
 <translation id="348799646910989694">Awtomatikong itinago ang shelf</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 araw na lang ang natitira}one{# araw na lang ang natitira}other{# na araw na lang ang natitira}}</translation>
+<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> File</translation>
 <translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
 <translation id="3618849550573277856">Hanapin ang “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Pumili ng Folder na I-a-upload</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">Media Ihinto</translation>
 <translation id="6845383723252244143">Piliin ang Folder</translation>
 <translation id="6845533974506654842">pindutin</translation>
+<translation id="686304767576508198">Ibinahagi mula sa</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{1 oras na lang ang natitira}one{# oras na lang ang natitira}other{# na oras na lang ang natitira}}</translation>
 <translation id="688711909580084195">Walang Pamagat na Webpage</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> (na) PB/s</translation>
diff --git a/ui/strings/translations/ui_strings_fr.xtb b/ui/strings/translations/ui_strings_fr.xtb
index 974d923a..4b96de1 100644
--- a/ui/strings/translations/ui_strings_fr.xtb
+++ b/ui/strings/translations/ui_strings_fr.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">De gauche à droite</translation>
 <translation id="1383876407941801731">Rechercher</translation>
 <translation id="1398853756734560583">Agrandir</translation>
+<translation id="1409544243779336081">Recommandation d'application</translation>
 <translation id="1413622004203049571">Désactiver les notifications <ph name="NOTIFIER_NAME" /></translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 minute et  }one{# minute et  }other{# minutes et  }}</translation>
 <translation id="1643823602425662293">Notification</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">Pas maintenant</translation>
 <translation id="348799646910989694">Étagère automatiquement masquée</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 jour restant}one{# jour restant}other{# jours restants}}</translation>
+<translation id="3600969208114796418">Fichier <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
 <translation id="3608915363409716668">+ de <ph name="MAXIMUM_VALUE" /></translation>
 <translation id="3618849550573277856">Rechercher "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="364720409959344976">Sélectionner le dossier d'importation</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">Contenu multimédia : arrêt</translation>
 <translation id="6845383723252244143">Sélectionner un dossier</translation>
 <translation id="6845533974506654842">appuyer</translation>
+<translation id="686304767576508198">Partagé par</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{1 heure restante}one{# heure restante}other{# heures restantes}}</translation>
 <translation id="688711909580084195">Page Web sans titre</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> Po/s</translation>
diff --git a/ui/strings/translations/ui_strings_iw.xtb b/ui/strings/translations/ui_strings_iw.xtb
index 2d9e79b..30c5ea24 100644
--- a/ui/strings/translations/ui_strings_iw.xtb
+++ b/ui/strings/translations/ui_strings_iw.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">משמאל לימין</translation>
 <translation id="1383876407941801731">חפש</translation>
 <translation id="1398853756734560583">הגדל</translation>
+<translation id="1409544243779336081">המלצה על אפליקציה</translation>
 <translation id="1413622004203049571">השבת הודעות מאת <ph name="NOTIFIER_NAME" /></translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{דקה אחת ו }two{# דקות ו }many{# דקות ו }other{# דקות ו }}</translation>
 <translation id="1643823602425662293">הודעה</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">לא עכשיו</translation>
 <translation id="348799646910989694">המדף יוסתר באופן אוטומטי</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{נותר יום אחד}two{נותרו יומיים}many{נותרו # ימים}other{נותרו # ימים}}</translation>
+<translation id="3600969208114796418">קובץ <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
 <translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
 <translation id="3618849550573277856">חפש “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">בחירת תיקיה להעלאה</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">עצור מדיה</translation>
 <translation id="6845383723252244143">בחר תיקייה</translation>
 <translation id="6845533974506654842">לחץ</translation>
+<translation id="686304767576508198">שותף מ-</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{נותרה שעה אחת}two{נותרו שעתיים}many{נותרו # שעות}other{נותרו # שעות}}</translation>
 <translation id="688711909580084195">דף אינטרנט ללא כותרת</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
diff --git a/ui/strings/translations/ui_strings_ko.xtb b/ui/strings/translations/ui_strings_ko.xtb
index 9a441e1..9d8fa4e46 100644
--- a/ui/strings/translations/ui_strings_ko.xtb
+++ b/ui/strings/translations/ui_strings_ko.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">왼쪽에서 오른쪽으로</translation>
 <translation id="1383876407941801731">검색</translation>
 <translation id="1398853756734560583">최대화</translation>
+<translation id="1409544243779336081">앱 추천</translation>
 <translation id="1413622004203049571"><ph name="NOTIFIER_NAME" />의 알림 사용 중지</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1분 }other{#분 }}</translation>
 <translation id="1643823602425662293">알림</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">나중에</translation>
 <translation id="348799646910989694">실행기 자동 숨김</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1일 남음}other{#일 남음}}</translation>
+<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> 파일</translation>
 <translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" /> 이상</translation>
 <translation id="3618849550573277856">'<ph name="LOOKUP_STRING" />' 찾기</translation>
 <translation id="364720409959344976">업로드할 폴더 선택</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">미디어 중지</translation>
 <translation id="6845383723252244143">폴더 선택</translation>
 <translation id="6845533974506654842">누르기</translation>
+<translation id="686304767576508198">공유한 사용자</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{1시간 남음}other{#시간 남음}}</translation>
 <translation id="688711909580084195">제목 없는 웹페이지</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" />PB/s</translation>
diff --git a/ui/strings/translations/ui_strings_mr.xtb b/ui/strings/translations/ui_strings_mr.xtb
index 912a882..722fc65b 100644
--- a/ui/strings/translations/ui_strings_mr.xtb
+++ b/ui/strings/translations/ui_strings_mr.xtb
@@ -145,7 +145,7 @@
 <translation id="6808150112686056157">मीडिया थांबवा</translation>
 <translation id="6845383723252244143">फोल्डर निवडा</translation>
 <translation id="6845533974506654842">दाबा</translation>
-<translation id="686304767576508198">ने शेअर केले</translation>
+<translation id="686304767576508198">वरून शेअर केले</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{1 तास शिल्लक}one{# तास शिल्लक}other{# तास शिल्लक}}</translation>
 <translation id="688711909580084195">अशीर्षकांकीत वेबपृष्‍ठ</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
diff --git a/ui/strings/translations/ui_strings_no.xtb b/ui/strings/translations/ui_strings_no.xtb
index c284d767..900ede25 100644
--- a/ui/strings/translations/ui_strings_no.xtb
+++ b/ui/strings/translations/ui_strings_no.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">Venstre til høyre</translation>
 <translation id="1383876407941801731">Søk</translation>
 <translation id="1398853756734560583">Maksimer</translation>
+<translation id="1409544243779336081">Appanbefaling</translation>
 <translation id="1413622004203049571">Deaktiver varsler fra <ph name="NOTIFIER_NAME" /></translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 minutt og }other{# minutter og }}</translation>
 <translation id="1643823602425662293">Varsel</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">Ikke nå</translation>
 <translation id="348799646910989694">Hyllen skjules automatisk</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 dag igjen}other{# dager igjen}}</translation>
+<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" />-fil</translation>
 <translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
 <translation id="3618849550573277856">Slå opp «<ph name="LOOKUP_STRING" />»</translation>
 <translation id="364720409959344976">Velg mappen du vil laste opp</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">Media – stopp</translation>
 <translation id="6845383723252244143">Velg mappe</translation>
 <translation id="6845533974506654842">trykk</translation>
+<translation id="686304767576508198">Delt av</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{1 time igjen}other{# timer igjen}}</translation>
 <translation id="688711909580084195">Nettside uten tittel</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> PB per sek</translation>
diff --git a/ui/strings/translations/ui_strings_sv.xtb b/ui/strings/translations/ui_strings_sv.xtb
index 3986416..688f41e 100644
--- a/ui/strings/translations/ui_strings_sv.xtb
+++ b/ui/strings/translations/ui_strings_sv.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">Vänster till höger</translation>
 <translation id="1383876407941801731">Sök</translation>
 <translation id="1398853756734560583">Maximera</translation>
+<translation id="1409544243779336081">Apprekommendation</translation>
 <translation id="1413622004203049571">Inaktivera aviseringar från <ph name="NOTIFIER_NAME" /></translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 minut och }other{# minuter och }}</translation>
 <translation id="1643823602425662293">Avisering</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">Inte nu</translation>
 <translation id="348799646910989694">Hyllan döljs automatiskt</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 dag kvar}other{# dagar kvar}}</translation>
+<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" />-fil</translation>
 <translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
 <translation id="3618849550573277856">Sök efter ”<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Välj en mapp för uppladdning</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">Stoppa</translation>
 <translation id="6845383723252244143">Välj mapp</translation>
 <translation id="6845533974506654842">tryck</translation>
+<translation id="686304767576508198">Har delats från</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{1 timme kvar}other{# timmar kvar}}</translation>
 <translation id="688711909580084195">Namnlös webbsida</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> PB/sek</translation>
diff --git a/ui/strings/translations/ui_strings_ta.xtb b/ui/strings/translations/ui_strings_ta.xtb
index b76ed58..1a0cd70 100644
--- a/ui/strings/translations/ui_strings_ta.xtb
+++ b/ui/strings/translations/ui_strings_ta.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">இடமிருந்து வலம்</translation>
 <translation id="1383876407941801731">தேடல்</translation>
 <translation id="1398853756734560583">பெரிதாக்கு</translation>
+<translation id="1409544243779336081">ஆப்ஸ் பரிந்துரை</translation>
 <translation id="1413622004203049571"><ph name="NOTIFIER_NAME" /> இடமிருந்து வரும் அறிவிப்புகளை முடக்கு</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 நிமிடம், }other{# நிமிடங்கள், }}</translation>
 <translation id="1643823602425662293">அறிவிப்பு</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">இப்பொழுது இல்லை</translation>
 <translation id="348799646910989694">ஷெல்ஃப் தானாகவே மறைக்கப்படும்</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 நாள் உள்ளது}other{# நாட்கள் உள்ளன}}</translation>
+<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> கோப்பு</translation>
 <translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
 <translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” எனத் தேடு</translation>
 <translation id="364720409959344976">பதிவேற்றுவதற்குக் கோப்புறையைத் தேர்ந்தெடு</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">ஊடகத்தை நிறுத்து</translation>
 <translation id="6845383723252244143">கோப்புறையைத் தேர்ந்தெடு</translation>
 <translation id="6845533974506654842">அழுத்துக</translation>
+<translation id="686304767576508198">இதிலிருந்து பகிரப்பட்டது:</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{1 மணிநேரம் உள்ளது}other{# மணிநேரம் உள்ளது}}</translation>
 <translation id="688711909580084195">தலைப்பிடாத வலைப்பக்கம்</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> பெ.பை/வி</translation>
diff --git a/ui/strings/translations/ui_strings_te.xtb b/ui/strings/translations/ui_strings_te.xtb
index bb4de50..8e09746 100644
--- a/ui/strings/translations/ui_strings_te.xtb
+++ b/ui/strings/translations/ui_strings_te.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">ఎడమ నుండి కుడికి</translation>
 <translation id="1383876407941801731">వెతుకు</translation>
 <translation id="1398853756734560583">గరిష్ఠీకరించు</translation>
+<translation id="1409544243779336081">యాప్ సిఫార్సు</translation>
 <translation id="1413622004203049571"><ph name="NOTIFIER_NAME" /> నుండి వచ్చే నోటిఫికేషన్‌లను నిలిపివేయి</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 నిమిషం మరియు }other{# నిమిషాలు మరియు }}</translation>
 <translation id="1643823602425662293">నోటిఫికేషన్</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">ఇప్పుడు కాదు</translation>
 <translation id="348799646910989694">అర ఆటోమేటిక్‌గా దాచి పెట్టబడుతుంది</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 రోజు మిగిలి ఉంది}other{# రోజులు మిగిలి ఉన్నాయి}}</translation>
+<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> ఫైల్</translation>
 <translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
 <translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />”ని వెతకండి</translation>
 <translation id="364720409959344976">అప్‌లోడ్ చేయడానికి ఫోల్డర్‌ని ఎంచుకోండి</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">మీడియా ఆపివేయి</translation>
 <translation id="6845383723252244143">ఫోల్డర్‌ను ఎంచుకో</translation>
 <translation id="6845533974506654842">నొక్కండి</translation>
+<translation id="686304767576508198">షేర్ చేసినది</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{1 గంట మిగిలి ఉంది}other{# గంటలు మిగిలి ఉన్నాయి}}</translation>
 <translation id="688711909580084195">శీర్షికలేని వెబ్‌పేజీ</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
diff --git a/ui/strings/translations/ui_strings_th.xtb b/ui/strings/translations/ui_strings_th.xtb
index b1bf29b..008f1f7 100644
--- a/ui/strings/translations/ui_strings_th.xtb
+++ b/ui/strings/translations/ui_strings_th.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">ซ้ายไปขวา</translation>
 <translation id="1383876407941801731">ค้นหา</translation>
 <translation id="1398853756734560583">ย่อ</translation>
+<translation id="1409544243779336081">แอปแนะนำ</translation>
 <translation id="1413622004203049571">ปิดการแจ้งเตือนจาก <ph name="NOTIFIER_NAME" /></translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 นาทีกับอีก }other{# นาทีกับอีก }}</translation>
 <translation id="1643823602425662293">การแจ้งเตือน</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">ไม่ใช่ตอนนี้</translation>
 <translation id="348799646910989694">ซ่อนชั้นวางโดยอัตโนมัติ</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{เหลือ 1 วัน}other{เหลือ # วัน}}</translation>
+<translation id="3600969208114796418">ไฟล์ <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
 <translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
 <translation id="3618849550573277856">ค้นหา “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">เลือกโฟลเดอร์เพื่ออัปโหลด</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">หยุดสื่อ</translation>
 <translation id="6845383723252244143">เลือกโฟลเดอร์</translation>
 <translation id="6845533974506654842">กด</translation>
+<translation id="686304767576508198">แชร์จาก</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{เหลือ 1 ชั่วโมง}other{เหลือ # ชั่วโมง}}</translation>
 <translation id="688711909580084195">หน้าเว็บที่ไม่มีชื่อ</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> PB/วินาที</translation>
diff --git a/ui/strings/translations/ui_strings_tr.xtb b/ui/strings/translations/ui_strings_tr.xtb
index 1b047e2..dde5cc9 100644
--- a/ui/strings/translations/ui_strings_tr.xtb
+++ b/ui/strings/translations/ui_strings_tr.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">Soldan Sağa</translation>
 <translation id="1383876407941801731">Ara</translation>
 <translation id="1398853756734560583">Büyüt</translation>
+<translation id="1409544243779336081">Uygulama önerisi</translation>
 <translation id="1413622004203049571"><ph name="NOTIFIER_NAME" /> bildirimlerini devre dışı bırak</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 dakika ve }other{# dakika ve }}</translation>
 <translation id="1643823602425662293">Bildirim</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">Şimdi değil</translation>
 <translation id="348799646910989694">Raf otomatik olarak gizlenecek</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{1 gün kaldı}other{# gün kaldı}}</translation>
+<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> Dosya</translation>
 <translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" /> +</translation>
 <translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” Araması Yap</translation>
 <translation id="364720409959344976">Yüklenecek Klasörü Seçin</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">Medyayı Durdur</translation>
 <translation id="6845383723252244143">Klasörü Seçin</translation>
 <translation id="6845533974506654842">bas</translation>
+<translation id="686304767576508198">Paylaşan:</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{1 saat kaldı}other{# saat kaldı}}</translation>
 <translation id="688711909580084195">Başlıksız Web Sayfası</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> PB/sn</translation>
diff --git a/ui/strings/translations/ui_strings_uk.xtb b/ui/strings/translations/ui_strings_uk.xtb
index 4c8b76ae..16b13cf 100644
--- a/ui/strings/translations/ui_strings_uk.xtb
+++ b/ui/strings/translations/ui_strings_uk.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">Зліва направо</translation>
 <translation id="1383876407941801731">Пошук</translation>
 <translation id="1398853756734560583">Збільшити</translation>
+<translation id="1409544243779336081">Рекомендовані додатки</translation>
 <translation id="1413622004203049571">Вимкнути сповіщення від <ph name="NOTIFIER_NAME" /></translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 хвилина та }one{# хвилина та }few{# хвилини та }many{# хвилин і }other{# хвилини та }}</translation>
 <translation id="1643823602425662293">Сповіщення</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">Не зараз</translation>
 <translation id="348799646910989694">Автоматичне ховання полиці</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Залишився 1 день}one{Залишився # день}few{Залишилося # дні}many{Залишилося # днів}other{Залишилося # дня}}</translation>
+<translation id="3600969208114796418">Файл <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
 <translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
 <translation id="3618849550573277856">Шукати "<ph name="LOOKUP_STRING" />"</translation>
 <translation id="364720409959344976">Виберіть папку для завантаження</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">Зупинити</translation>
 <translation id="6845383723252244143">Вибір папки</translation>
 <translation id="6845533974506654842">натиснути</translation>
+<translation id="686304767576508198">Хто поділився:</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{Залишилась 1 година}one{Залишилася # година}few{Залишилося # години}many{Залишилося # годин}other{Залишилося # години}}</translation>
 <translation id="688711909580084195">Веб-сторінка без назви</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> Пб/сек.</translation>
diff --git a/ui/strings/translations/ui_strings_vi.xtb b/ui/strings/translations/ui_strings_vi.xtb
index ef4bcfe..9395fbf 100644
--- a/ui/strings/translations/ui_strings_vi.xtb
+++ b/ui/strings/translations/ui_strings_vi.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">Trái sang Phải</translation>
 <translation id="1383876407941801731">Tìm kiếm</translation>
 <translation id="1398853756734560583">Phóng to</translation>
+<translation id="1409544243779336081">Đề xuất ứng dụng</translation>
 <translation id="1413622004203049571">Tắt thông báo từ <ph name="NOTIFIER_NAME" /></translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 phút và }other{# phút và }}</translation>
 <translation id="1643823602425662293">Thông báo</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">Không phải bây giờ</translation>
 <translation id="348799646910989694">Giá tự động ẩn</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Còn 1 ngày}other{Còn # ngày}}</translation>
+<translation id="3600969208114796418">Tệp <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
 <translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
 <translation id="3618849550573277856">Tra cứu “<ph name="LOOKUP_STRING" />”</translation>
 <translation id="364720409959344976">Chọn thư mục để tải lên</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">Dừng trình phát phương tiện</translation>
 <translation id="6845383723252244143">Chọn Thư mục</translation>
 <translation id="6845533974506654842">nhấn</translation>
+<translation id="686304767576508198">Được chia sẻ từ</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{Còn 1 giờ}other{Còn # giờ}}</translation>
 <translation id="688711909580084195">Trang web không có tiêu đề</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> PB/giây</translation>
diff --git a/ui/strings/translations/ui_strings_zh-TW.xtb b/ui/strings/translations/ui_strings_zh-TW.xtb
index 53bb21e..a7b6d87 100644
--- a/ui/strings/translations/ui_strings_zh-TW.xtb
+++ b/ui/strings/translations/ui_strings_zh-TW.xtb
@@ -14,6 +14,7 @@
 <translation id="1368832886055348810">由左至右</translation>
 <translation id="1383876407941801731">搜尋</translation>
 <translation id="1398853756734560583">放到最大</translation>
+<translation id="1409544243779336081">推薦的應用程式</translation>
 <translation id="1413622004203049571">停用「<ph name="NOTIFIER_NAME" />」的通知</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 分鐘 }other{# 分鐘 }}</translation>
 <translation id="1643823602425662293">通知</translation>
@@ -69,6 +70,7 @@
 <translation id="3479552764303398839">現在不要</translation>
 <translation id="348799646910989694">自動隱藏檔案櫃</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{還剩 1 天}other{還剩 # 天}}</translation>
+<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> 檔案</translation>
 <translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
 <translation id="3618849550573277856">查詢「<ph name="LOOKUP_STRING" />」</translation>
 <translation id="364720409959344976">選取要上傳的資料夾</translation>
@@ -143,6 +145,7 @@
 <translation id="6808150112686056157">停止媒體播放</translation>
 <translation id="6845383723252244143">選取資料夾</translation>
 <translation id="6845533974506654842">按下</translation>
+<translation id="686304767576508198">分享者:</translation>
 <translation id="6863590663815976734">{HOURS,plural, =1{還剩 1 小時}other{還剩 # 小時}}</translation>
 <translation id="688711909580084195">無標題網頁</translation>
 <translation id="6907759265145635167"><ph name="QUANTITY" /> PB/秒</translation>
diff --git a/ui/views/linux_ui/linux_ui.h b/ui/views/linux_ui/linux_ui.h
index 6743cb66..9206e18 100644
--- a/ui/views/linux_ui/linux_ui.h
+++ b/ui/views/linux_ui/linux_ui.h
@@ -64,21 +64,19 @@
  public:
   // Describes the window management actions that could be taken in response to
   // a middle click in the non client area.
-  enum NonClientWindowFrameAction {
-    WINDOW_FRAME_ACTION_NONE,
-    WINDOW_FRAME_ACTION_LOWER,
-    WINDOW_FRAME_ACTION_MINIMIZE,
-    WINDOW_FRAME_ACTION_TOGGLE_MAXIMIZE,
-    WINDOW_FRAME_ACTION_MENU,
+  enum class WindowFrameAction {
+    kNone,
+    kLower,
+    kMinimize,
+    kToggleMaximize,
+    kMenu,
   };
 
-  // The types of clicks that might invoke a NonClientWindowFrameAction.
-  enum NonClientWindowFrameActionSourceType {
-    WINDOW_FRAME_ACTION_SOURCE_DOUBLE_CLICK = 0,
-    WINDOW_FRAME_ACTION_SOURCE_MIDDLE_CLICK,
-    WINDOW_FRAME_ACTION_SOURCE_RIGHT_CLICK,
-
-    WINDOW_FRAME_ACTION_SOURCE_LAST
+  // The types of clicks that might invoke a WindowFrameAction.
+  enum class WindowFrameActionSource {
+    kDoubleClick,
+    kMiddleClick,
+    kRightClick,
   };
 
   typedef base::Callback<ui::NativeTheme*(aura::Window* window)>
@@ -160,8 +158,8 @@
 
   // What action we should take when the user clicks on the non-client area.
   // |source| describes the type of click.
-  virtual NonClientWindowFrameAction GetNonClientWindowFrameAction(
-      NonClientWindowFrameActionSourceType source) = 0;
+  virtual WindowFrameAction GetWindowFrameAction(
+      WindowFrameActionSource source) = 0;
 
   // Notifies the window manager that start up has completed.
   // This needs to be called explicitly both on the primary and the "remote"
diff --git a/ui/views/widget/desktop_aura/window_event_filter.cc b/ui/views/widget/desktop_aura/window_event_filter.cc
index 2a57a88e..8850f4e 100644
--- a/ui/views/widget/desktop_aura/window_event_filter.cc
+++ b/ui/views/widget/desktop_aura/window_event_filter.cc
@@ -66,21 +66,21 @@
   aura::Window* target = static_cast<aura::Window*>(event->target());
   LinuxUI* linux_ui = LinuxUI::instance();
 
-  views::LinuxUI::NonClientWindowFrameActionSourceType action_type;
-  views::LinuxUI::NonClientWindowFrameAction default_action;
+  views::LinuxUI::WindowFrameActionSource action_type;
+  views::LinuxUI::WindowFrameAction default_action;
 
   if (event->IsRightMouseButton()) {
-    action_type = LinuxUI::WINDOW_FRAME_ACTION_SOURCE_RIGHT_CLICK;
-    default_action = LinuxUI::WINDOW_FRAME_ACTION_MENU;
+    action_type = LinuxUI::WindowFrameActionSource::kRightClick;
+    default_action = LinuxUI::WindowFrameAction::kMenu;
   } else if (event->IsMiddleMouseButton()) {
-    action_type = LinuxUI::WINDOW_FRAME_ACTION_SOURCE_MIDDLE_CLICK;
-    default_action = LinuxUI::WINDOW_FRAME_ACTION_NONE;
+    action_type = LinuxUI::WindowFrameActionSource::kMiddleClick;
+    default_action = LinuxUI::WindowFrameAction::kNone;
   } else if (event->IsLeftMouseButton() &&
              event->flags() & ui::EF_IS_DOUBLE_CLICK) {
     click_component_ = HTNOWHERE;
     if (previous_click_component == HTCAPTION) {
-      action_type = LinuxUI::WINDOW_FRAME_ACTION_SOURCE_DOUBLE_CLICK;
-      default_action = LinuxUI::WINDOW_FRAME_ACTION_TOGGLE_MAXIMIZE;
+      action_type = LinuxUI::WindowFrameActionSource::kDoubleClick;
+      default_action = LinuxUI::WindowFrameAction::kToggleMaximize;
     } else {
       return;
     }
@@ -89,27 +89,26 @@
     return;
   }
 
-  LinuxUI::NonClientWindowFrameAction action =
-      linux_ui ? linux_ui->GetNonClientWindowFrameAction(action_type)
-               : default_action;
+  LinuxUI::WindowFrameAction action =
+      linux_ui ? linux_ui->GetWindowFrameAction(action_type) : default_action;
   switch (action) {
-    case LinuxUI::WINDOW_FRAME_ACTION_NONE:
+    case LinuxUI::WindowFrameAction::kNone:
       break;
-    case LinuxUI::WINDOW_FRAME_ACTION_LOWER:
+    case LinuxUI::WindowFrameAction::kLower:
       LowerWindow();
       event->SetHandled();
       break;
-    case LinuxUI::WINDOW_FRAME_ACTION_MINIMIZE:
+    case LinuxUI::WindowFrameAction::kMinimize:
       window_tree_host_->Minimize();
       event->SetHandled();
       break;
-    case LinuxUI::WINDOW_FRAME_ACTION_TOGGLE_MAXIMIZE:
+    case LinuxUI::WindowFrameAction::kToggleMaximize:
       if (target->GetProperty(aura::client::kResizeBehaviorKey) &
           ws::mojom::kResizeBehaviorCanMaximize)
         ToggleMaximizedState();
       event->SetHandled();
       break;
-    case LinuxUI::WINDOW_FRAME_ACTION_MENU:
+    case LinuxUI::WindowFrameAction::kMenu:
       views::Widget* widget = views::Widget::GetWidgetForNativeView(target);
       if (!widget)
         break;